Настроить обработку действия с использованием справочника для нескольких записей раздела

Средний

Пример. Для реестра раздела Активности (Activities) настроить обработку действия. Действие вызывает окно справочника Контакты (Contacts). Выбранный контакт устанавливается в качестве ответственного для выбранных активностей.

Создать схему замещающей модели представления раздела 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. Заполните свойства схемы.

    • Код (Code) — "ActivitySectionV2".
    • Заголовок (Title) — "Раздел активности" ("Activities section").
    • Родительский объект (Parent object) — выберите "ActivitySectionV2".
  4. Добавьте локализуемую строку с текстом пункта меню, который планируется добавить.

    1. В контекстном меню узла Локализуемые строки (Localizable strings) нажмите кнопку scr_add_button.png.
    2. Заполните свойства локализуемой строки.

      • Код (Code) — "SetOwnerCaption".
      • Значение (Value) — "Назначить ответственного" ("Assign Owner").
    3. Для добавления локализуемой строки нажмите Добавить (Add).
  5. Реализуйте логику работы пункта меню. Для этого в свойстве methods реализуйте методы:

    • isCustomActionEnabled() — определяет доступность добавленного пункта меню.
    • setOwner() — метод-обработчик действия, который вызывает открытие справочника Контакты (Contacts).
    • lookupCallback() — callback-метод, который устанавливает выбранный в справочнике контакт в качестве ответственного для выбранных активностей.
    • getSectionActions() — переопределенный метод родительской схемы, который возвращает коллекцию действий раздела.

    Исходный код схемы замещающей модели представления раздела представлен ниже.

    ActivitySectionV2
    define("ActivitySectionV2", ["ConfigurationConstants"], function(ConfigurationConstants) {
        return {
            /* Название схемы объекта раздела. */
            entitySchemaName: "Activity",
            /* Методы модели представления раздела. */
            methods: {
                /* Определяет доступность пункта меню. */
                isCustomActionEnabled: function() {
                    /* Попытка получить массив идентификаторов выбранных записей. */
                    var selectedRows = this.get("SelectedRows");
                    /* Если массив содержит элементы (выбрана хотя бы одна запись в реестре), то возвращается true, иначе — false. */
                    return selectedRows ? (selectedRows.length > 0) : false;
                },
                /* Метод-обработчик действия. Вызывает открытие справочника [Контакты]. */
                setOwner: function() {
                    /* Определяет конфигурацию справочника. */
                    var config = {
                        /* Cхема [Contact]. */
                        entitySchemaName: "Contact",
                        /* Множественный выбор отключен. */
                        multiSelect: false,
                        /* Отображаемая колонка — [Name]. */
                        columns: ["Name"]
                    };
                    /* Открывает справочник с определенной конфигурацией и callback-функцией, которая сработает после нажатия кнопки [Выбрать]. */
                    this.openLookup(config, this.lookupCallback, this);
                },
                /* Выполняет установку выбранного в справочнике контакта в качестве ответственного для выбранных активностей. */
                lookupCallback: function(args) {
                    /* Идентификатор выбранной из справочника записи. */
                    var activeRowId;
                    /* Получает выбранные в справочнике записи. */
                    var lookupSelectedRows = args.selectedRows.getItems();
                    if (lookupSelectedRows && lookupSelectedRows.length > 0) {
                        /* Получает Id первой выбранной в справочнике записи. */
                        activeRowId = lookupSelectedRows[0].Id;
                    }
                    /* Получает массив идентификаторов выбранных записей. */
                    var selectedRows = this.get("SelectedRows");
                    /* Обработка запускается в случае, если выбрана хотя бы одна запись и в справочнике выбран ответственный. */
                    if ((selectedRows.length > 0) && activeRowId) {
                        /* Создает экземпляр класса пакетных запросов. */
                        var batchQuery = this.Ext.create("Terrasoft.BatchQuery");
                        /* Обновляет каждую из выбранных записей. */
                        selectedRows.forEach(function(selectedRowId) {
                            /* Создает экземпляр класса UpdateQuery с корневой схемой Activity. */
                            var update = this.Ext.create("Terrasoft.UpdateQuery", {
                                rootSchemaName: "Activity"
                            });
                            /* Применяет фильтр для определения записи для обновления. */
                            update.enablePrimaryColumnFilter(selectedRowId);
                            /* Для колонки [Owner] устанавливается значение, равное идентификатору  выбранного из справочника контакта. */
                            update.setParameterValue("Owner", activeRowId, this..Terrasoft.DataValueType.GUID);
                            /* Добавляет запрос на обновление записи в пакетный запрос. */
                            batchQuery.add(update);
                        }, this);
                        /* Выполняет пакетный запрос к серверу. */
                        batchQuery.execute(function() {
                            /* Обновляет реестр. */
                            this.reloadGridData();
                        }, this);
                    }
                },
                /* Переопределение базового виртуального метода, который возвращает коллекцию действий раздела. */
                getSectionActions: function() {
                    /* Вызывается родительская реализация метода для получения коллекции проинициализированных действий раздела. */
                    var actionMenuItems = this.callParent(arguments);
                    /* Добавляет линию-разделитель. */
                    actionMenuItems.addItem(this.getButtonMenuItem({
                        Type: "Terrasoft.MenuSeparator",
                        Caption: ""
                    }));
                    /* Добавляет пункт меню в список действий раздела. */
                    actionMenuItems.addItem(this.getButtonMenuItem({
                        /* Привязка заголовка пункта меню к локализуемой строке схемы. */
                        "Caption": { bindTo: "Resources.Strings.SetOwnerCaption" },
                        /* Привязка метода-обработчика действия. */
                        "Click": { bindTo: "setOwner" },
                        /* Привязка свойства доступности пункта меню к значению, которое возвращает метод isCustomActionEnabled. */
                        "Enabled": { bindTo: "isCustomActionEnabled" },
                        /* Поддержка режима множественного выбора. */
                        "IsEnabledForSelectedAll": true
                    }));
                    /* Возврат дополненной коллекции действий раздела. */
                    return actionMenuItems;
                }
            }
        };
    });
    
  6. На панели инструментов дизайнера нажмите Сохранить (Save).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера:

  1. Очистите кэш браузера.
  2. Обновите страницу раздела Активности (Activities).

По умолчанию для реестра используется режим выбора одной записи. Для выбора в реестре нескольких записей в меню кнопки Действия (Actions) нажмите Выбрать несколько записей (Select multiple records). После этого изменяется визуальное представление реестра — появляются элементы для выбора записей.

В результате выполнения примера на страницу заказа добавлено действие Назначить ответственного (Assign Owner).

В результате выбора действия Назначить ответственного (Assign Owner) отображается окно справочника Контакты (Contacts). Выбранный контакт устанавливается в колонке Ответственный (Assignee) в качестве ответственного для выбранных активностей.

Для отмены режима выбора нескольких записей в меню кнопки Действия (Actions) нажмите Отменить множественный выбор (Cancel multiple selection).

Если в реестре раздела Активности (Activities) не выбрана ни одна запись, то действие Назначить ответственного (Assign Owner) неактивно.