# Урок 6. Практика разработки. Часть 3 В данном уроке мы рассмотрим: 1. Диалог с пользователем 1. Мультиселект (множественный выбор) 1. Группировка объектов 1. Объектные характеристики ## Диалог с пользователем Диалоги позволяют задавать вопросы пользователю и получать от него ответы на эти вопросы. [Руководство разработчика: Выборки # Диалоги](books/AppGuide/040_selection/080_выборка.md#диалоги) ## Мультиселект Мультиселект - возможность выбрать несколько строк в списках или деревьях. [Руководство разработчика: Выборки # Мультиселект](books/AppGuide/040_selection/080_выборка.md#мультиселект) [Руководство разработчика: Выборки # Диалоги # Форма в режиме выбора значения](books/AppGuide/040_selection/080_выборка.md#форма-в-режиме-выбора-значения) ## Группировка объектов Группировка используется для систематизации хранения объектов и удобства восприятия пользователем, так же группировка позволяет массово управлять характеристиками и настройками объектов класса. [Руководство разработчика: Сервисные возможности для классов # Группировка](books/AppGuide/030_class/070_сервисы_класса.md#группировка) ## Объектные характеристики Характеристика – это качественное или количественное свойство объекта. Характеристиками в системе являются специальные атрибуты, которые содержат дополнительную пользовательскую информацию. [Руководство разработчика: Сервисные возможности для классов # Объектные характеристики](books/AppGuide/030_class/070_сервисы_класса.md#объектные-характеристики) ## Практические задания ### Диалог с пользователем 1. В классе `Lbr_Publisher` добавьте диалог, в котором у пользователя запрашивается подтверждение на удаление объекта. 1. Для заказов `Lbr_InOrder` и `Lbr_OutOrder` на закладках с детализацией реализуйте следующую логику для операции "Создать": - при нажатии на иконку операции открывается список книг в режиме выбора - если пользователь выбрал книгу и подтвердил выбор, то создается новая запись в детализации заказа. ### Мультиселект 1. Для заказов на закладке "Состав" измените работу операции "Создать" на мультиселект: - В `Api` классов `Lbr_OutOrderDet` и `Lbr_InOrderDet` реализуйте метод регистрации записи. Метод принимает `id` заказа и `id` книги, осуществляет поиск записи в с такими идентификаторами заказа и книги в классе, если запись есть, то возвращает ее `id`, если записи нет, то создает ее и возвращает ее `id`. - В операции создания открывать форму выбора книг в режиме мультиселекта, для каждой выбранной книги вызывать метод регистрации, таким образом книги в позициях заказа не будут дублироваться, если пользователь выбрал книгу, уже подобранную в заказ. 1. В списке книг (`Lbr_Book#List`) реализовать операцию подбора книг в заказы: - создать на тулбаре новую операцию - при нажатии на операцию создается диалог с произвольными кнопками, текст диалога `В какой тип заказа добавить выбранные книги?`, список кнопок: - Возврат - Выдача - Отмена - Если пользователь нажал "Отмена", то выполнение операции завершается без дальнейших действий. - Если пользователь выбрал "Возврат" или "Выдача", то открывается список заказов в режиме выбора с `мультиселектом` (Возврат - список `Lbr_InOrder`, Выдача - список `Lbr_OutOrder`). - Для каждого выбранного заказа выполняется следующая логика: - обходим все выделенные книги и регистрируем их для заказа методом регистрации созданном в пункте 1. ### Группировка объектов 1. Включите группировку для класса `Lbr_Publisher` - в `odm` укажите тип группировки "Множественная" - переформируйте исходный код и таблицы - соберите проект. 1. Настройте дерево групп: - Под корневой группой создайте 2 подгруппы: - Зарубежные издательства - Отечественные издательства 1. Выведите закладку с группами объекта в карточке (отображение `Card`). 1. Активируйте в выборке `Lbr_Publisher#List` операцию `Дополнительно` (имя метода `extraOperations`). 1. Под операцией `Дополнительно` создайте новую операцию `Статистика текущей группы`, выводящую статистику по группе, о количестве объектов в группе и количестве подгрупп. - Создайте новую операцию на тулбаре, укажите ей операцию-предка - Для определения текущей группы используйте `getVar("idGroup#")` - Используя диалоги, вывести на экран информацию вида: ``` Количество объектов в группе: 42 Количество объектов без учета подгрупп: 1 Количество подгрупп: 10 ``` - Запросить количество объектов в группе можно через таблицу `Btk_FlatObjectGroup` - Запросить количество объектов в группе без учета подгрупп можно через таблицу `Btk_ObjectGroup` - Запросить количество подгрупп можно через таблицу `Btk_GroupTree` по полю `idParent` и исключить запись, в которой `idParent` равняется `idChild` 1. Под операцией `Дополнительно` реализуйте операцию `Зарегистрировать объект в корневой группе`, которая добавляет объект в корневую группу, для этого: - Создайте новую операцию на тулбаре, укажите ей операцию-предка - Операция получает `rop` текущего объекта - Регистрирует объект в корневой группе методом `Btk_ObjectGroupApi#register` - параметр `bpMultiGroup` передавать в значении `1`, т.к. на классе включена множественная группировка. - параметр `bpMainGroup` передавать в значении `1`, так для объекта эта группа станет "Основной" - для получение `id` корневой группы используйте код `Btk_ClassApi().load(Lbr_PublisherApi().idClass).get(_.idGroupRoot)` ### Объектные характеристики 1. Добавьте в `odm` класса `Lbr_Publisher` логический атрибут `bIsForeign` - `Зарубежное издательство`, укажите ему свойство, что он является объектной характеристикой. 1. Настройке карточку объектных характеристик для класса `Lbr_Publisher`, зависящую от групп объекта. - укажите нужный тип карточки в `odm.xml` ```xml objectAttrCardType="group" ``` - выведите закладку в карточке объекта (используйте выборку `Btk_ObjectGroupAvi#List_Tab`). 1. Добавьте объектные характеристики, хранящиеся в json-контейнере, в карточке класса. - зайдите в карточку класса `Lbr_Publisher` и откройте закладку `Атрибуты` - выполните операцию создать - заполните поля для нового атрибута: - системное имя = dSanctionBegin - наименование = Дата начала санкций - тип данных = Date - Тип атрибута = Basic - сохраните результат. - создайте второй атрибут: - системное имя = idJsonAuthor - наименование = Любимый автор издательства - тип данных = Long - Тип атрибута = RefObject - Ссылается на класс = выберите `Lbr_Author` 1. Настройте вывод объектных характеристик на группах объекта. - Откройте интерфейс редактирования групп и закладку `Атрибуты группы` и включите редактирование в списке - Для корневой группы добавьте атрибут `bIsForeign` - Для группы "Зарубежные издательства" - добавьте атрибут `dSanctionBegin` - переопределите атрибут `bIsForeign`, установите значение по умолчанию `1`. В предложенном диалоге согласитесь установить значение по умолчанию для всех объектов с перезаписью имеющихся значений. - Для группы "Отечественные издательства" - добавьте атрибут `idJsonAuthor` - переопределите атрибут `bIsForeign`, установите значение по умолчанию `0`. В предложенном диалоге согласитесь установить значение по умолчанию для всех объектов с перезаписью имеющихся значений. - После настройки на карточке об. характеристик будут доступны атрибуты: - `bIsForeign` - для всех объектов, при включении в группу "Зарубежные издательства" будет устанавливаться значение `1`, при включении в "Отечественные издательства" будет устанавливаться значение `0` - `dSanctionBegin` - для объектов группы "Зарубежные издательства", снимите признак `Использовать для основных групп` - `idJsonAuthor` - для объектов группы "Отечественные издательства", снимите признак `Использовать для основных групп` 1. Под операцией `Дополнительно` сделайте операцию `Обновить характеристики`, которая будет обновлять значения характеристик объекта. - Создайте новую операцию на тулбаре, укажите ей операцию-предка - Проверяем какое это издательство, получая значение характеристики `bIsForeign` - Если зарубежное: - проверяем текущее значение характеристики `dSanctionBegin`, если оно заполнено, то выдаем сообщение `Для издательства <Наименование> уже введены санкции, начало санкций: <значение характеристики dSanctionBegin>` - если текущее значение `dSanctionBegin` не заполнено, то заполняем текущей датой, и выдаем сообщение `Для издательства <Наименование> успешно введены санкции` - Если отечественное: - проверяем текущее значение характеристики `idJsonAuthor`, если оно заполнено, то выдаем сообщение `Для издательства <Наименование> уже выбран любимый автор: ` - если текущее значение `idJsonAuthor` не заполнено, то открываем диалог выбора автора, и устанавливаем выбранное значение в характеристику ~~~{note} - Для получения значения характеристики, хранящейся в таблице класса используется стандартный способ, как и для других атрибутов класса. - Для получения значения json-характеристики используется метод `ru.bitec.app.btk.class_.attr.AttrApi#getAttrValue`. Пример вызова: ```scala val dDate = Lbr_PublisherApi().getAttrValue(rop, "dSanctionBegin").asNDate ``` - Для установки значения json-характеристики используется метод `ru.bitec.app.btk.class_.attr.AttrApi#setAttrValue`. Пример вызова: ```scala Lbr_PublisherApi().setAttrValue(rop, "dSanctionBegin", NDate.now()) ``` ~~~