Добрый день! 

Появилась необходимость изменить базовое поле поиска, при выборе в окне справочного поля, и подставить туда своё значение.

Как это выглядит на примере:

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

 

При открытии данного модального окна, должно быть своё предустановленное значение

Вопрос в том, как это реализовать. 



Поиски не увенчались успехом, застопорился на схеме LookupPage.js

var primaryDisplayColumn = entitySchema.primaryDisplayColumn;
if (primaryDisplayColumn) {
	this.lookupInfo.searchColumn = {
		value: primaryDisplayColumn.name,
		displayValue: primaryDisplayColumn.caption
	};
}

Значение для данной колонки берётся отсюда, но как его подменять для определённого поля - не сообразил

Нравится

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

В lookupListConfig просто укажи searchValue, пример:

columns: ["Id", "Name"],
searchValue: "Вериф",
columnName: "Name",
orders: [{
   columnPath: "Name",
   direction: Terrasoft.OrderDirection.ASC
}],

 

В lookupListConfig просто укажи searchValue, пример:

columns: ["Id", "Name"],
searchValue: "Вериф",
columnName: "Name",
orders: [{
   columnPath: "Name",
   direction: Terrasoft.OrderDirection.ASC
}],

 

Григорий Чех, columnName упорно изменяться не хочет. А именно значение в списке слева на первом скрине

Покажите свой код

Григорий Чех,

"Gun": {
   "dataValueType": Terrasoft.DataValueType.LOOKUP,
   "lookupListConfig": {
      columns: ["LkpGauges", "UsrConfigProduct"],
      searchValue: "Вериф", // Вот это работает, в инпуте value заполняется
      columnName: "UsrConfigProduct",
      orders: [{
          columnPath: "UsrConfigProduct"
          direction: Terrasoft.OrderDirection.ASC
      }],
      "filters": [ //Фильтры ]
   }
}

 

Григорий Чех,

Это справочное поле, не уверен, что сыграет роль. Но на всякий случай скажу. 

И еще, поле над которым производится действие, является полем в детали с редактируемым реестром

Это интересно. Т.е. теоретически можно прокинуть searchColumn в lookupInfo, но если у объекта есть колонка для отображения - всё перетрется.

варианта 2:

- Доделывать Lookup-модуль

- Оставить как есть, убрать в схеме детали отображаемое поле.

 

Попробуйте так

"Gun": {
   "lookupListConfig": {
      searchValue: "Вериф",
      searchColumn: "UsrConfigProduct"
   }
}

 

Варфоломеев Данила,

Вот в этом то и вопрос, на каком уровне это реализовать, и как. Либо в настройках lookupListConfig есть такая возможность, либо пробовать перехватывать и прокидывать значения 



Самое интересное в том, что у меня получалось прокинуть значения. Но при обращении к lookupinfo он забирает все равно свои значения, которые получил из схемы ConfItem.js (куда ссылается справочное поле). И там прописано поле для отображения

(PrimaryDisplayColumnName)

 

Варфоломеев Данила,

пробовал и так - не работает... 

Попробуй переопределить loadVocabulary как то так\:

loadVocabulary: function(args, tag) {
    var column = this.getColumnByName(tag);
    args.schemaName = column.referenceSchemaName; //подставь свой
     this.callParent(arguments);
 }

Если не получится отпишись, вечером смогу проєксперементировать.

Григорий Чех,

не совсем понял, что менять. Однако там все равно схема (ConfItem) по которой открытие справочника производится, я думаю, что её подменить можно, но это не то, что мы ищем



Прокинуть как-то туда primaryDisplayColumnName, у меня не увенчалось успехом

VadimCh пишет:

Однако там все равно схема (ConfItem) по которой открытие справочника производится

 Я немного неправильно описал.

Схема ConfItem генерится на основании объекта в конфигурации. На ConfItem ссылается справочное поле, которое вы пытаетесь открыть. Соответственно и берется PrimaryDisplayColumnName из ConfItem. Те 2 варианта так и остаются: либо менять PrimaryDisplayColumnName в null в каждом объекте на которое ссылается нужное вам справочное поле, либо переделать логику LookupPage.

Варфоломеев Данила,

В рамках реализации задачи, заместил LookupPage, и переработал тот кусок кода, который скидывал в посте, и присоединил новую схему

"lookupListConfig": {
  lookupPageName: "KmFiltrationBaseLookup",
}

Как по мне, про два варианта вы правы, но первый не подходит - если этот объект используется по всей системе не единожды. И везде требуется разная колонка, либо существует множество старых записей на основе колонки для отображения. При изменении колонки - старые записи будут отображаться не корректно

VadimCh,

А не могли бы Вы посоветовать что и где переработать, чтобы решить эту проблему?

Alex Zaslavsky,

Да, конечно



Чтобы решить именно эту проблему, требуется создать модуль, 

// Полный листинг схемы, создаем свой модуль, и пихаем туда эту схему, дав ей своё название
 
define("KmFiltrationBaseLookup", ["LookupPage", "LookupPageViewGenerator", "LookupPageViewModelGenerator",
"ProcessModuleUtilities", "LookupUtilities", "css!LookupPageCSS"],
	function(LookupPage, LookupPageViewGenerator, LookupPageViewModelGenerator, ProcessModuleUtilities) {
		return Ext.define("Terrasoft.configuration.KmFiltrationBaseLookup", {
			alternateClassName: "Terrasoft.KmKLSHLookupPage",
			extend: "Terrasoft.LookupPage",
			gridWrapClasses: ["custom-lookup-control"],
 
			init: function(callback, scope) {
				callback = callback || Terrasoft.emptyFn;
				if (this.viewModel) {
					callback.call(scope);
					return;
				}
				var lookupInfo = this.getLookupInfo();
				if (this.Ext.isArray(lookupInfo)) {
					var configIndex = 0;
					var parameters = this.parameters;
					if (!this.Ext.isEmpty(parameters)) {
						configIndex = parameters.index;
					}
					this.lookupInfo = lookupInfo[configIndex];
					this.lookupsInfo = lookupInfo;
				} else {
					this.lookupInfo = lookupInfo;
				}
				this.processModuleFlag = this.sandbox.publish("CardProccessModuleInfo", null, [this.sandbox.id]);
				this.initHistoryState();
				this.getSchemaAndProfile(this.lookupInfo.lookupPostfix, function(entitySchema, profile) {
					if (this.isDestroyed) {
						return;
					}
                    // Здесь сам объект, и сюда мы прокидываем свои свойства
                    // Свойства для каждой колонки находятся в схеме объекта (ConfItem.js Пример!)
					entitySchema.primaryDisplayColumn = {
						caption: "Модель",
						columnPath: "UsrConfigProduct.UsrName",
						dataValueType: 1,
						isInherited: false,
						isRequired: true,
						isValueCloneable: false,
						name: "UsrConfigProduct.UsrName",
						size: 250,
						uId: "c4f28c00-8c5d-46cd-98de-f38d2e52a2dc",
						usageType: 0
					};
 
					var primaryDisplayColumn = entitySchema.primaryDisplayColumn;
 
					if (primaryDisplayColumn) {
						this.lookupInfo.searchColumn = {
							value: primaryDisplayColumn.name,
							displayValue: primaryDisplayColumn.caption
						};
					}
					this.lookupInfo.entitySchema = entitySchema;
					this.lookupInfo.gridProfile = profile;
					var viewModel = this.viewModel = this.generateViewModel();
					viewModel.lookupInfo = this.lookupInfo;
					viewModel.load(profile, callback, scope);
				});
			}
		});
	}
);

 

Alex Zaslavsky,

 
			//в атрибутах её подключаем
			"Gun": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					lookupPageName: "KmFiltrationBaseLookup",
				}
			}

 

VadimCh,

Благодарю, попытаемся разобраться :)

Колонку для поиска можно изменить базовыми средствами.

Для этого нужно добавить атрибут в карточку редактирования: 

"AprCustomer": {

                "dataValueType": this.Terrasoft.DataValueType.LOOKUP,

                "lookupListConfig": {

                    "searchColumn": {

                        "value": "AprINN",

                        "displayValue": "ИНН"

                    }

                }

            },

Ilyas Ablitarov,

а где берется названия атрибута AprCustomer?

VadimCh, Этот способ помог мне закрыть мою задачу, работает, спасибо!

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

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

Кейс: 

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

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

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

------

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

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

Добрый день!

При открытии любого лукапа в системе, рядом с названием объекта справочника пишется undefined.  При этом в консоли никаких ошибок нет. Схем связанных с открытием лукапов не переопределял. Подскажите, пожалуйста, в чем может быть причина ошибки.

 

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

 

Нравится

3 комментария

Добрый день, было бы неплохо увидеть ошибки с консоли, раз вы не переопределяли ничего связанного со справочником.

Дмитрий, здравствуйте!

Значение, которое у Вас выводится как undefined, берется из локализируемой строки в схеме LookupPageViewModelGenerator, название строки - CaptionLookupPage. Проверьте, возможно, там затерлось значение, или эта локализируемая строка вообще отсутствует.

Юлия, спасибо! Действительно, схема LookupPageViewModelGenerator была мной переопределена, а параметр LookupPageCaptionPrefix был не заполнен.

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

Приветы,

 

Все методы работали. 

Разработка велась в "своем" пакете, а создавалось изначально поле в кастоме.

Решили перенести в свой пакет, перенес, в итоге то что в нем выбирается и страница его не пишет в Бд. Притом ранее созданные итемы с имеющимися данными в разделе отображаются, вот только при их открытии они не показываются и сохранение выбранного значения не происходит т. е. поле в бд есть, в объекте тоже, но как будто нет тк оно не изменяется при работе пользователя

 

Есть описание

{

                    "operation": "insert",

                    "name": "BpSpeekAddr",

                    "parentName": "GeneralInfoGridLayout",

                    "propertyName": "items",

                    "values": {

                        "dataValueType": this.Terrasoft.DataValueType.ENUM,

                        "caption": "Адрес собеседования",

                        "controlConfig": {

                            "list": {

                                "bindTo": "SpeakAddressItems"

                            },

                            "prepareList": { bindTo: "initSpeakAddressItems" },

                            "placeholder": {

                                "bindTo": "Адрес собеседования"

                            }

                        },

                        "layout": {

                "colSpan": 12,

                "rowSpan": 1,

                "column": 12,

                "row": 4,

                        }

                    }

                },

Нравится

1 комментарий

Возможно, одноврененно не перенесены какие-то вспомогательные сущности, например, схемы справочника, на которые ссылается поле. Если на старой базе они так и остались в Custom, то в перенос не попали.

Можно попробовать на новом месте создать аналогичное поле вручную, а затем сравнить с неработающим, будут ли какие-то отличия в сгенерированном коде или в поведении.

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

            attributes: {

                "SpeakAddress": {

                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                    dataValueType: Terrasoft.DataValueType.LOOKUP,

                    referenceSchemaName: "AccountAddress",

                    isLookup: true,

                    lookupListConfig: {

                        "filter": function () {

Как написать sql запрос

select ad.id, ad.Address

from 

  AddressType at, 

  AccountAddress ad

where 

    at.Name = 'Собеседования' and 

    at.Id = ad.AddressTypeId

                        }

                    }

                    //isRequired: true

                },

Нравится

5 комментариев

Здравствуйте попробуйте что то вроде такого:

 

lookupListConfig: {
    "filters": [ 
        function () {
            var addressTypeId = this.get("AddressType").value;            
            var filterGroup = Ext.create("Terrasoft.FilterGroup");
            filterGroup.add("CV", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"[AccountAddress:AddressType].Name", "Собеседования"));
            filterGroup.add("Type", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"[AccountAddress:AddressType].Id", addressTypeId));
            return filterGroup;
             }
    ]
}

 

как работать с фильтрами описано в статье - https://academy.terrasoft.ru/documents/technic-sdk/7-12/primenenie-filt…

Нигрескул Алексей,

Спасибо. 

Своими силами попробовал написать и совпало с вашим советом

 "filter": function () {

                            var filterGroup = Ext.create("Terrasoft.FilterGroup");

                            filterGroup.add("IsAddressType",

                                Terrasoft.createColumnFilterWithParameter(

                                    Terrasoft.ComparisonType.EQUAL,

                                    "[AccountAddress:AddressType].Id",

                                    "[AccountAddress.AddressType].Id"));//из таблицы

                            filterGroup.add("IsSpeak",

                                Terrasoft.createColumnFilterWithParameter(

                                    Terrasoft.ComparisonType.EQUAL,

                                    "[AccountAddress:AddressType].Name",

                                    "Собеседования"));

                            return filterGroup;

                        }

Делал как раз по той статье, клиентский esq синтаксис - это для наркоманов :)

QArt,

Нигрескул Алексей,

Не заработало

Добрый день.

Вот оптимизированный sql запрос:

Вот esq строка для фильтра:

Так же проверьте устраивает ли вас результат исходного sql запроса (т.е. выполните запрос непосредственно из SQL Server Management Studio)

 

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

Есть lookup как повесить на его onchage функцию???

 

Нравится

3 комментария

"UsrField1": {

                dependencies: [

                    {

                        columns: ["UsrField2"],

                        methodName: "someMethodName"

                    }

                ]

            }

Вы об этом? Если в поле "UsrField2" Вы что-то изменили, то запускается Ваш метод "someMethodName". 

Вот статья на академии: https://academy.terrasoft.ua/documents/technic-sdk/7-12/atributy-svoystvo-attributes

Там нужно посмотреть раздел "Дополнительные свойства атрибутов", свойство dependencies

Золотарев Артем Андреевич,

Спасибо, получилось!

 

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

Коллеги, как запретить добавлять новые города пользователям (в том числе и System adminsitator'ам) через такую прекрасную функциональность, как Создать в Lookup?

Это относится не только к городам, просто, как самый яркий пример.Изображение удалено.



Если честно, пользователи жмут, не думая. Потом чистить надоедает.

 

Нравится

12 комментариев

Добрый день, Владимир!

Данная логика настраивается на уровне системной операции с кодом "CanManageLookups". На детали "Доступ к операции" удалить те пользователи или роли, у которых нужно забрать права на данную функциональность. После этого не будет появляется кнопка «Создать» в самом поле страницы, если такой записи еще нет в справочнике. Минусом данного варианта является тот момент, что у пользователей не будет доступа к разделу "Справочники", так как это взаимосвязанный функционал. 

в LookupQuickAddMixin закомментировать или изменить строчку:

config.objects[Terrasoft.GUID_EMPTY] = this.getNewListItemConfig(config.filterValue);

Поскольку LookupQuickAddMixin - это миксин и напихан черт знает сколько по всей конфигурации, я бы заместил модуль. Ну а о тотальных проблемах с замещением модуля, я надеюсь, вы знаете. 

upd. меня опередили) в принципе совет сверху тоже подойдет, ибо там же в init стоит проверка 

RightUtilities.checkCanExecuteOperation({
	operation: "CanManageLookups"
}

 

Варфоломеев Данила,

расскажите, пожалуйста, вкратце о тотальных проблемах замещения модуля

Борис Леонов пишет:

вкратце о тотальных проблемах замещения модуля

Resources. это вкратце.

Подробнее: замещаем схему (модуля). копируем туда подчистую код. 

1) отсутствует вкладка less. надо модуль сохранить, перезайти заново и только тогда она появится

2) локализ. строки - они есть, но их нет. В буквальном смысле. Приходится перед всеми строками ставить точку, сохранять, потом убирать точки и пересохранять

3) с картинками такая же фигня как и со строками. Только ещё хуже - картинки приходится вытаскивать через браузер и перевставлять. Про то, что некоторые иконки иногда не отображаются, а вытащить их надо я промолчу (где-то в недрах форума валяется инструкция как по ссылке и названию вытащить ресурс).

4) все messages нужно перевбивать. руками. good luck have fun

мб что-то ещё. уже не помню)

Варфоломеев Данила,

очень сильно вкратце :)

Борис Леонов пишет:

очень сильно вкратце :)

 расписал) ух как горит пятая точка - проблемы не могут исправить 2 год как

Адасюк Валерий Викторович пишет:

Данная логика настраивается на уровне системной операции с кодом "CanManageLookups"

У меня ощущение, что на города это не действует. Кроме того, эта логика останется на Контрагенты, Контакты и другие Lookup-поля, которые ссылаются не на Справочники, а на Разделы 

Варфоломеев Данила,

ценная инфо, спасибо!

это не всегда происходит, случайным образом?

Пока придумали workaround - добавили в городах и других важных справочниках/разделах обязательное поле, чтобы открывалась карточка для создания, что предотвратит неосознанное создание записей

Борис Леонов,

Всегда, при замещении модуля. при замещении простых page и section(к примеру) всё отлично.

Варфоломеев Данила,

еще раз спасибо за информацию!

Радикальный вариант — пустым INSTEAD OF INSERT триггером на таблице городов. Или такой же логикой на уровне БП при добавлении записей в этой таблице.

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

Здравствуйте!

Пытаюсь реализовать сортировку справочного поля типа ENUM.

attributes: {
			"LeadType": {"isRequired": false},
			"Stage": {
				"lookupListConfig": {
					"filters": [
						function() {
							var filterGroup = Ext.create("Terrasoft.FilterGroup"), {
								sortProperty: "Number"
							});
							filterGroup.add("ActiveStage",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.EQUAL,
										"UsrShowInMiniPage", "1"));
							filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
							filterGroup.add("Sort",
								Terrasoft.createColumnFilterWithParameter(
									Terrasoft.ComparisonType.GREATER_OR_EQUAL,
										"Number", "0"));
							return filterGroup;
 
						}
					]
				}
			}
		},

Предположил, что sortProperty не срабатывает из-за отсутствия такой колонке в запросе, поэтому добавил еще одно условие, как все-таки правильно это сделать?

Нравится

6 комментариев

А если вот так?

"Stage": {
	"lookupListConfig": {
		"filters": [
			function() {
				var filterGroup = Ext.create("Terrasoft.FilterGroup"), {
					sortProperty: "Number"
				});
				filterGroup.add("ActiveStage",
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.EQUAL,
							"UsrShowInMiniPage", "1"));
				filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
				filterGroup.add("Sort",
					Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.GREATER_OR_EQUAL,
							"Number", "0"));
				return filterGroup;
 
			}
		],
		"columns": ["Number"]
	}
}

 

Добрый день.

Добавьте свойство orders в lookupListConfig. К примеру:

"Owner": {

    lookupListConfig: {

        columns: ["Name"],

        orders: [

            {

                columnPath: "Name",

                direction: Terrasoft.OrderDirection.DESC

            }

        ]

    }

},

Терещук Сергей,

Сортировка таким образом не работает. Ни при указании колонки "Name", ни при какой-либо другой колонки. Direction также не влияет на порядок отображения

Варфоломеев Данила,

Сортировка также не работает, тем не менее, колонка "Number" добавляется в ответ от сервера

Проблема в том, что Террасофт запилил поддержку orders только в BasePageV2. Если у вас мини-карточка или какая-то другая карточка, которая не наследуется от BasePageV2, то сортировка работать не будет. Но всегда можно заместить родителя и реализовать в нем сортировку по аналогии с базовой карточкой

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

Подскажите, пожалуйста, возможно ли в конфиге отфильтровать набор данных для Lookup по определенному полю. В моем случае - "BTNumber".
Вот текст конфига:
var config = {
entitySchemaName: "BTVwPCManifest",
multiSelect: true
};

Нравится

1 комментарий

Разобралась самостоятельно :exclaim:
Возможно, кому-то пригодится эта информация.

Это можно реализовать таким образом:
var config = {
entitySchemaName: "BTVwPCManifest",
multiSelect: true,
sortedColumns: [{
name:"BTNumber",
orderPosition: 0,
orderDirection: Terrasoft.OrderDirection.ASC
}]
};

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

Добрый день.
Версия 7.9

Кейс был такой: Нужно создать деталь с полем справочник (у меня это "UsrStore") c ссылкой на объект "Остаток продукта".

Я конечно уже сомневаюсь что решу этот кейс, но может кто то уже сталкивался с подобным.
После добавления такого поля, при выборе этого поля окно выбора висит и в консоли выдает такие вот ошибки:

1)

Uncaught iargumentName: ""__proto__: constructor$className: "Terrasoft.exceptions.ArgumentNullOrEmptyException"alternateClassName: "Terrasoft.ArgumentNullOrEmptyException"argumentName: nullconfig: e__proto__: Objectconstructor: function ()__proto__: Objectconstructor: function Object()hasOwnProperty: function hasOwnProperty()isPrototypeOf: function isPrototypeOf()propertyIsEnumerable: function propertyIsEnumerable()toLocaleString: function toLocaleString()toString: function toString()valueOf: function valueOf()__defineGetter__: function __defineGetter__()__defineSetter__: function __defineSetter__()__lookupGetter__: function __lookupGetter__()__lookupSetter__: function __lookupSetter__()get __proto__: function __proto__()set __proto__: function __proto__()configMap: Object__proto__: ObjectinitConfigList: Array(0)length: 0__proto__: Array(0)initConfigMap: Objectmessage: "Несуществующий или пустой аргумент"self: function i()superclass: constructortoString: function ()__proto__: constructor
/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:05:50 GMT+0200 (Финляндия (зима))
 stack: undefined
writeErrorMessage @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579

2)

LookupPageViewModelGenerator.js:284 Uncaught i {argumentName: ""}argumentName: ""__proto__: constructor
addColumn @ all-combined.js:846
addColumn @ all-combined.js:939
(anonymous) @ LookupPageViewModelGenerator.js:284
Terrasoft.utils.array.each @ all-combined.js:225
addSelectColumns @ LookupPageViewModelGenerator.js:282
Terrasoft.each.scope @ LookupPageViewModelGenerator.js:273
Terrasoft.utils.array.each @ all-combined.js:225
getSelect @ LookupPageViewModelGenerator.js:271
loadData @ LookupPageViewModelGenerator.js:344
load @ LookupPageViewModelGenerator.js:73
(anonymous) @ /0/configuration/fec43bee7d1bd6fa3769ce764f5b8168ru-RU/LookupPage.js:176
(anonymous) @ /0/configuration/fec43bee7d1bd6fa3769ce764f5b8168ru-RU/LookupPage.js:284
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457

3)

/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:11:48 GMT+0200 (Финляндия (зима))
 stack: undefined
writeErrorMessage @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579
(anonymous) @ /core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:740
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457

4)

/core/04566becfbd71b73c17d3b4e92cd2ba9/Terrasoft/amd/core.js?:579 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
title="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-combined.js

"
>a href="http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-...">http://176.104.2.162/core/9b78b22f0e6d6388b9ec0f8fae14cb84/combined/all-... line: 846
 column: 295
 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Несуществующий или пустой аргумент
 date: Fri Mar 24 2017 11:11:48 GMT+0200 (Финляндия (зима))
 stack: undefined

Нравится

2 комментария

По ошибкам сложно понять в чем дело, напишите в поддержку, с предоставлением доступа к сайту:
support@terrasoft.ru
Пусть посмотрят и исправят на месте.

Ок. Спасибо.

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