Вопрос

Добавление статической подсказки в Lookup

Добрый день, коллеги.

Кейс: 

Изображение удалено.

В диалоговое окно для выбора контрагента добавить строчку под заголовком: 

В случае отсутствия нужного Контрагента в списке, необходимо добавить запись вручную

------

Не могу найти подобную реализацию в стандартной поставке. Если такой реализации нет, то решение создавать замещающий модуль BaseProfileSchema и там править lookupConfig?

Нравится

3 комментария
Лучший ответ

Эн нет. Так легко вы не отделаетесь. Любые модификации окошка выбора из справочника - это модификации модулей. В вашем случае -LookupPageViewGenerator, там, где генерируется header. Возможно ещё в  LookupPage потребуется прописать видимость для подсказки (только для Account-справочника)

Эн нет. Так легко вы не отделаетесь. Любые модификации окошка выбора из справочника - это модификации модулей. В вашем случае -LookupPageViewGenerator, там, где генерируется header. Возможно ещё в  LookupPage потребуется прописать видимость для подсказки (только для Account-справочника)

Если кому-то интересно решение, то:

Благодаря двум постам на сообществе:

https://community.terrasoft.ru/questions/problema-s-zameseniem-modula-lookuppageviewmodelgenerator

https://community.terrasoft.ru/search?search_api_fulltext=%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B9+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B+LookupPage&field_tags=&sort_by=search_api_relevance

Пришел к не очень красивому, но все же решению

Дальше выжимки из двух постов и немного костылей:

Так и не получилось изменять 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 посмотрите, думаю можно без проблем подвигать куда-надо, либо сам вид, либо вашу подсказку видоизменить и т.д.

Показать все комментарии