Добрый день, коллеги.
Кейс:
В диалоговое окно для выбора контрагента добавить строчку под заголовком:
В случае отсутствия нужного Контрагента в списке, необходимо добавить запись вручную
------
Не могу найти подобную реализацию в стандартной поставке. Если такой реализации нет, то решение создавать замещающий модуль 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 посмотрите, думаю можно без проблем подвигать куда-надо, либо сам вид, либо вашу подсказку видоизменить и т.д.