Добрый день, коллеги.
Кейс:
В диалоговое окно для выбора контрагента добавить строчку под заголовком:
В случае отсутствия нужного Контрагента в списке, необходимо добавить запись вручную
------
Не могу найти подобную реализацию в стандартной поставке. Если такой реализации нет, то решение создавать замещающий модуль BaseProfileSchema и там править lookupConfig?
Нравится
Эн нет. Так легко вы не отделаетесь. Любые модификации окошка выбора из справочника - это модификации модулей. В вашем случае -LookupPageViewGenerator, там, где генерируется header. Возможно ещё в LookupPage потребуется прописать видимость для подсказки (только для Account-справочника)
Эн нет. Так легко вы не отделаетесь. Любые модификации окошка выбора из справочника - это модификации модулей. В вашем случае -LookupPageViewGenerator, там, где генерируется header. Возможно ещё в LookupPage потребуется прописать видимость для подсказки (только для Account-справочника)
Если кому-то интересно решение, то:
Благодаря двум постам на сообществе:
https://community.terrasoft.ru/questions/problema-s-zameseniem-modula-lookuppageviewmodelgenerator
Пришел к не очень красивому, но все же решению
Дальше выжимки из двух постов и немного костылей:
Так и не получилось изменять diff окошка Lookup’а, но можно кастомить кнопки, так что я реализовал подсказку через кнопку, на нажатие которой ничего не происходит.
Много будет повторятся из постов, но что-то будет более подробно показано:
1. Сначала создаем Модуль UsrCustomLookupPage (например), наследование не определяем, но ставим зависимость:
Название ставим строго по списку, а саму зависимость ищем по заголовку:
LookupPage – Выбор из справочника
LookupPageViewGenerator – LookupPageViewGenerator
LookupUtilities – LookupUtilities
MaskHelper – MaskHelper
LookupPageCSS – Стили модуля справочника
Сам код, комменты есть, но суть в расширении LookupPage и переопределении двух методов renderLookupView, generateViewModel:
define("UsrCustomLookupPage", ["LookupPage", "LookupPageViewGenerator", "LookupPageViewModelGenerator", "ProcessModuleUtilities", "LookupUtilities", "css!LookupPageCSS"], function(LookupPage, LookupPageViewGenerator, LookupPageViewModelGenerator, ProcessModuleUtilities) { return Ext.define("Terrasoft.configuration.UsrCustomLookupPage", { alternateClassName: "Terrasoft.UsrCustomLookupPage", extend: "Terrasoft.LookupPage", gridWrapClasses: ["custom-lookup-control"], renderLookupView: function(schema, profile) { var config = this.getLookupConfig(schema, profile); var topPanelConfig = LookupPageViewGenerator.generateFixed(config); var buttonsConfig; //Получаем ссылку на аттрибут-массив конфигурационных объектов-кнопок //Используем Underscore.some с возможностью прерывания переборы по возврату от предиката "true" _.some(topPanelConfig.items, function(target) { //выделяем объект группы кнопок (Wrapper) по id контейнера if (target.id === "selectionControlsContainerLookupPage") { //в нем ищем подчиненные объекты являющиеся массивом _.some(target, function(target) { //согласно структуры конфигурационного объекта панели //"чистым" массивом является только объект с конфигами кнопок if (Array.isArray(target)) { //сохраняем ссылку на него в переменной для дальнейшего использования buttonsConfig = target; //Прерываем перебор return true; } }); //Прерываем перебор return true; } }); //Создаем новую кнопку, клонируя любую, первой как правило идет кнопка "Отмена" var newButton1 = Terrasoft.deepClone(buttonsConfig[0]); //Используем Underscore.extend для объединения склонированного объекта //с анонимным объектом-разницы в котором опишем необходимые изменения _.extend( newButton1, { //меняем стиль style: "white", caption: "ПОДСКАЗКА: В случае отсутствия нужного Контрагента в списке, необходимо добавить запись вручную" } ); // ставим свою кнопку в начало массива, то есть наверх (в окне Lookup'а) buttonsConfig.splice(0, 0, newButton1); // находим нашу кнопку в массиве и ставим обработчик события нажатия _.some(buttonsConfig, function(target) { if (target.caption === "ПОДСКАЗКА: В случае отсутствия нужного Контрагента в списке, необходимо добавить запись вручную") { // Устанавливаем обработчик target.click = { bindTo: "AddRequestButton" }; return true; } }); this.renderLookupControls(config, topPanelConfig); }, generateViewModel: function() { var viewModelConfig = LookupPageViewModelGenerator.generate(this.lookupInfo); if (!this.lookupInfo.columnValue && this.lookupInfo.searchValue) { viewModelConfig.values.searchData = this.lookupInfo.searchValue; viewModelConfig.values.previousSearchData = this.lookupInfo.searchValue; } //Добавляем свой пользовательский метод viewModelConfig.methods.AddRequestButton = function() { return true; }; var viewModel = this.Ext.create("Terrasoft.BaseViewModel", viewModelConfig); viewModel.Ext = this.Ext; viewModel.sandbox = this.sandbox; viewModel.Terrasoft = this.Terrasoft; if (this.lookupInfo.updateViewModel) { this.lookupInfo.updateViewModel.call(viewModel); } viewModel.initCaptionLookup(); viewModel.initHasActions(); viewModel.initLoadedColumns(); if (!this.Ext.isEmpty(this.lookupInfo.filterObjectPath)) { viewModel.updateFilterByFilterObjectPath(this.lookupInfo.filters, this.lookupInfo.filterObjectPath); } if (this.lookupInfo.hideActions) { viewModel.set("hasActions", false); } return viewModel; }, }); } );
2. Этот модуль вы можете добавлять к любому Lookup’у в lookupConfig в атрибут lookupPageName: "UsrCustomLookupPage". В моем случае я создал Замещающий клиентский модуль, который наследуется от BaseProfileSchema. Копируем весь код, кроме методов и добавляем модуль UsrCustomLookupPage:
define("BaseProfileSchema", ["ConfigurationEnums", "NetworkUtilities", "css!BaseProfileSchemaCSS", "ProfileSchemaMixin", "MiniPageUtilities", "UsrCustomLookupPage"], function(ConfigurationEnums, NetworkUtilities, UsrCustomLookupPage) { return { hideEmptyModelItems: true, mixins: { ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin", MiniPageUtilities: "Terrasoft.MiniPageUtilities" }, attributes: { /** * Value of master column. */ "MasterColumnValue": { dataValueType: Terrasoft.DataValueType.GUID, value: null }, /** * Master column info. */ "MasterColumnInfo": { dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT }, /** * Data-item-marker template. */ "DataItemMarkerTpl": { dataValueType: Terrasoft.DataValueType.TEXT, value: "{0} {1}Container" } }, messages: { /** * @message EntityInitialized * Master's entity initialized event. */ "EntityInitialized": { mode: this.Terrasoft.MessageMode.BROADCAST, direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE }, /** * @message GetEntityColumnChanges * Processes changes of entity column. */ "GetEntityColumnChanges": { mode: this.Terrasoft.MessageMode.BROADCAST, direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE }, /** * @message GetColumnsValues * Returns requested column values. */ "GetColumnsValues": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.PUBLISH }, /** * @message GetLookupQueryFilters * Gets lookup query filters. */ "GetLookupQueryFilters": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.PUBLISH }, /** * @message GetColumnInfo * Returns info by column. * @param {String} columnName Column name. */ "GetColumnInfo": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.PUBLISH }, /** * @message UpdateCardProperty * Changes the value card model. * @param {Object} config Config action. * @param {String} config.key Column name. * @param {Mixed} config.value Column value. * @param {Object} config.options Update column params. */ "UpdateCardProperty": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.PUBLISH }, /** * @message OpenCard * Opens card. * @param {Object} config Config for open card. * @param {String} config.moduleId Module identifier. * @param {String} config.schemaName Entity schema name. * @param {String} config.operation Record operation/ * @param {String} config.id Primary column value. * @param {Array} config.defaultValues Array of default values. */ "OpenCard": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.PUBLISH }, /** * @message CardModuleResponse * On card module response message. */ "CardModuleResponse": { mode: this.Terrasoft.MessageMode.PTP, direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE } }, methods: { getLookupConfig: function(config) { var masterColumnInfo = this.get("MasterColumnInfo"); var lookupListConfig = masterColumnInfo.lookupListConfig; var entitySchemaName = masterColumnInfo.referenceSchemaName || this.entitySchemaName; var masterColumnName = this.get("masterColumnName"); var lookupConfig = { entitySchemaName: entitySchemaName, multiSelect: false, columnName: masterColumnName, hideActions: true, lookupListConfig: lookupListConfig, columns: lookupListConfig && lookupListConfig.columns, filters: this.getLookupQueryFilters(masterColumnName), lookupPageName: "UsrCustomLookupPage" }; this.Ext.apply(lookupConfig, config); return lookupConfig; } } }; } );
Собственно все.
Больше всего мне не нравится, что выпадающий список «вид» сместился вниз из-за слишком длинной надписи кнопки подсказки. Может кто-нибудь знает как «вид» добавить в массив кнопок, ну или скрыть, в противном случае?
Neverhood,
Касаемо "Вида", то в сторону CSS посмотрите, думаю можно без проблем подвигать куда-надо, либо сам вид, либо вашу подсказку видоизменить и т.д.