Добрый день, коллеги.
Есть задача в разделе Обращения [Case] добавить справочник с множественным выбором.
Большая просьба подсказать, что я делаю не правильно?
1. Создал Объект, Название = [UsrTemplate], Заголовок = [Шаблоны].
Родительский объект = Базовый справочник
2. В объекте [Case] добавил Поле, тип справочник, Название = [UsrNewTemplateSpr].
Для поля [UsrNewTemplateSpr] в разделе Справочник выбрал значение [Шаблоны]
3. Наполнил справочник [Шаблоны] данными.
4. В схеме [CasePage] добавил код в разделе [methods]
methods: {
openUsrNewTemplateSprLookup: function()
{
var config =
{
entitySchemaName: "UsrTemplate",
multiSelect: true,
columns: ["Name"]
};
this.openLookup(config, this.addCallBack, this);
},
addCallBack: function(args)
{
this.selectedRows = args.selectedRows.getItems();
this.selectedItems = [];
/// this.selectedRows.forEach(function(item) {}, this);
},
},
5. Сохраняю схему, но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось сделать.
Очень надеюсь на обратную связь.
С уважением,
Дмитрий.
Нравится
mdv,
Не нужно было создавать замещающий модуль для этого, а нужно было добавить лок. строку в схему карточки CasePage.
Про фильтрацию можно почитать тут.
Фильтр может выглядеть так:
// UsrLogic название твоего поля в Entity Case и шаблонов const LogicId = this.get("UsrLogic").value; config.filters = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLogic", LogicId);
1) Привидите весь код страницы
2) Поясните что значит
>но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось
И как в раздел вы добавляете справочник?
Григорий Чех пишет:
1) Привидите весь код страницы
2) Поясните что значит
>но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось
И как в раздел вы добавляете справочник?
Григорий Чех,
Георгий, спасибо.
1) Код CasePage:
==
define("CasePage", [], function() {
return {
entitySchemaName: "Case",
attributes: {},
modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
businessRules: /**SCHEMA_BUSINESS_RULES*/{
"UsrNewTemplateSpr": {
"88cf5000-655d-4765-969d-14b79c4b2a87": {
"uId": "88cf5000-655d-4765-969d-14b79c4b2a87",
"enabled": true,
"removed": false,
"ruleType": 1,
"baseAttributePatch": "UsrLogic",
"comparisonType": 3,
"type": 1,
"attribute": "UsrLogic"
}
},
"UsrOldTemplateSpr": {
"ebd03987-37ae-4531-9338-c87ee009dbc5": {
"uId": "ebd03987-37ae-4531-9338-c87ee009dbc5",
"enabled": true,
"removed": false,
"ruleType": 1,
"baseAttributePatch": "UsrLogic",
"comparisonType": 3,
"type": 1,
"attribute": "UsrLogic"
}
}
}/**SCHEMA_BUSINESS_RULES*/,
methods: {
addCallBack: function(args)
{
this.selectedRows = args.selectedRows.getItems();
this.selectedItems = [];
/// this.selectedRows.forEach(function(item) {}, this);
},
openUsrNewTemplateSprLookup: function()
{
var config =
{
entitySchemaName: "UsrTemplate",
multiSelect: true,
columns: ["Name"]
};
this.openLookup(config, this.addCallBack, this);
},
},
dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "ProcessingTab",
"values": {
"order": 0
}
},
{
"operation": "merge",
"name": "ESNTab",
"values": {
"order": 5
}
},
{
"operation": "merge",
"name": "SolutionTab",
"values": {
"order": 1
}
},
{
"operation": "merge",
"name": "SatisfactionLevelComment",
"values": {
"layout": {
"colSpan": 24,
"rowSpan": 1,
"column": 0,
"row": 1
}
}
},
{
"operation": "merge",
"name": "CaseInformationTab",
"values": {
"order": 2
}
},
{
"operation": "insert",
"name": "UsrLogic9f0f812c-bb72-4617-8c90-6f19661b00d1",
"values": {
"layout": {
"colSpan": 24,
"rowSpan": 1,
"column": 0,
"row": 3,
"layoutName": "CaseInformation_gridLayout"
},
"bindTo": "UsrLogic"
},
"parentName": "CaseInformation_gridLayout",
"propertyName": "items",
"index": 3
},
{
"operation": "insert",
"name": "UsrNewTemplateSpr4dc847cf-00f3-4d64-a814-04acaed66407",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 4,
"layoutName": "CaseInformation_gridLayout"
},
"bindTo": "UsrNewTemplateSpr"
},
"parentName": "CaseInformation_gridLayout",
"propertyName": "items",
"index": 4
},
{
"operation": "insert",
"name": "UsrNewTemplate953c074b-a456-4786-98d2-5abb6a3bf38d",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 12,
"row": 4,
"layoutName": "CaseInformation_gridLayout"
},
"bindTo": "UsrNewTemplate"
},
"parentName": "CaseInformation_gridLayout",
"propertyName": "items",
"index": 5
},
{
"operation": "insert",
"name": "UsrOldTemplateSpr402b5c7a-3848-4df4-b26f-dc8fa1e56c48",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 5,
"layoutName": "CaseInformation_gridLayout"
},
"bindTo": "UsrOldTemplateSpr"
},
"parentName": "CaseInformation_gridLayout",
"propertyName": "items",
"index": 6
},
{
"operation": "insert",
"name": "UsrOldTemplate86822e69-1e25-442b-b648-ea0b5816675d",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 12,
"row": 5,
"layoutName": "CaseInformation_gridLayout"
},
"bindTo": "UsrOldTemplate"
},
"parentName": "CaseInformation_gridLayout",
"propertyName": "items",
"index": 7
},
{
"operation": "merge",
"name": "NotesFilesTab",
"values": {
"order": 4
}
},
{
"operation": "move",
"name": "ResoluitonContainer",
"parentName": "ProfileContainer",
"propertyName": "items",
"index": 0
},
{
"operation": "move",
"name": "ServiceItem",
"parentName": "ProfileContainer",
"propertyName": "items",
"index": 5
},
{
"operation": "move",
"name": "SolutionCaptionProfile",
"parentName": "ResolutionGridLayout",
"propertyName": "items",
"index": 0
},
{
"operation": "move",
"name": "ParentCase",
"parentName": "SolutionTab_gridLayout",
"propertyName": "items",
"index": 1
},
{
"operation": "move",
"name": "FirstSolutionProvidedOn",
"parentName": "TermsControlGroup_GridLayout",
"propertyName": "items",
"index": 3
}
]/**SCHEMA_DIFF*/
};
});
==
2) Нет возможности выбрать несколько записей справочника, только одну
mdv,
Насколько я знаю в системе нет возможности в справочное поле раздела засунуть больше 1-ой записи справочника. Для этого как правило создается деталька которая будет связывать записи раздела и записи справочника многие ко многим, при этом на обработчик события добавления записи на деталь вешается мультивыбор из справочника.
Ссылка на гайд как сделать.
Андреев Андрей Сергеевич пишет:
mdv,
Насколько я знаю в системе нет возможности в справочное поле раздела засунуть больше 1-ой записи справочника. Для этого как правило создается деталька которая будет связывать записи раздела и записи справочника многие ко многим, при этом на обработчик события добавления записи на деталь вешается мультивыбор из справочника.
Ссылка на гайд как сделать.
Андреев Андрей Сергеевич,
Андрей, спасибо, задача состоит в том, чтобы можно было выбрать несколько записей из справочника, а дальше в функции addCallBack: function(args) { } я выбранные записи сохраню в нужных дополнительных полях.
В системе же можно реализовать, чтобы в разделе открывался справочник с возможностью мультивыбора?
Спасибо.
mdv,
mdv пишет:
чтобы в разделе открывался справочник с возможностью мультивыбора?
что означает "в разделе"? насколько я понимаю заполнения поля происходят в карточке этого раздела.
Карточка вот так выглядит:
Если это не карточка, а раздел, то вам необходимо будет уточнить где вы там справочное поле заполняете, но судя по снипету кода что вы привели выше вы все таки с карточкой работаете, а не с разделом.
Правильно я понимаю, что вы хотите кликнув на справочное поле в карточке, чтобы у вас открылась карточка с мультивыбором и выбрав несколько они должны заполнится в такие же справочные поля? Но что при этом должно остаться в самом справочном поле на которое вы изначально кликали?
Андреев Андрей Сергеевич,
Андрей, не хотел утомлять описанием всей задачи, давайте все-таки постараюсь подробно описать бизнес-кейс.
Есть тип Обращений по актуализации Логик и Шаблонов, названия которых необходимо указать в обращении, в специально созданных текстовых полях. Затем в отчетах Excel удобно будет выбирать необходимую информацию по этому типу обращений с названиями логик и шаблонов.
Связь Логик и Шаблонов - одна (Логика) ко многим (Шаблоны).
Я настроил через бизнес-правила фильтр, чтобы при выборе значения в справочнике Логика, в справочнике Шаблоны отображаются все названия Шаблонов, которые связаны с выбранной Логикой.
На данный момент, задача заключается в следующем:
1. При открытии справочника "Шаблоны" сделать возможным выбор несколько записей.
2. Обработать значения выбранных записей из справочника "Шаблоны" и записать данные в дополнительно созданные текстовые поля в таблицу Обращение [CASE].
При открытии сейчас открывается справочник, как на рис.1.
Рис.1.
А хотелось, чтобы открывался справочник с мультивыбором, например, как на рис. 2
Спасибо.
mdv,
базовую логику можно попробовать изменить, но у меня есть другое решение которое как мне кажется лучше подходит потому что у тебя лукапное поле служит чисто для открытия окна выбора.
Вместо лукапного поля Новые шаблоны(выбор) добавить кнопку с обработчиком при нажатии:
// кнопка в массиве diff { "operation": "insert", "parentName": "Header", "propertyName": "items", "name": "SelectTemplateButton", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "style": Terrasoft.controls.ButtonEnums.style.GREEN, "caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"}, "classes": {"textClass": "actions-button-margin-right"}, // Тут обработчик "click": {"bindTo": "onOpenTemplateLookup"}, // Размещение в контейнере страницы вместо своего поля "layout": { "colSpan": 10, "rowSpan": 1, "column": 0, "row": 5, "layoutName": "Header" } } },
где в onOpenTemplateLookup:
onOpenTemplateButton: function { let config = { // Название схемы объекта, записи которого будут отображены в справочнике. entitySchemaName: "UseTemplates", // Возможность множественного выбора. multiSelect: true, // Колонки, которые будут использованы в справочнике, например, для сортировки. columns: ["Number", "Date", "Type"] }; // Тут фильтры накладываешь свои let FiltersGroup = this.Terrasoft.createFilterGroup(); config.filters = FiltersGroup; this.openLookup(config, this.addCallBack, this); }
Ну потом все как всегда, в колбеке свою логику пишешь и всё.
Андреев Андрей Сергеевич,
Андрей, не отображается кнопка на странице [Case] на вкладке [Информация по обращению].
Как Вы и советовали я в схеме [CasePage] закомментировал код справочника [Новые шаблоны (выбор)]. Справочник перестал отображаться.
/*{
"operation": "insert",
"name": "UsrNewTemplateSpr4dc847cf-00f3-4d64-a814-04acaed66407",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 5,
"layoutName": "CaseInformation_gridLayout"
},
"bindTo": "UsrNewTemplateSpr"
},
"parentName": "CaseInformation_gridLayout",
"propertyName": "items",
"index": 5
},*/
Затем по аналогии добавил код для кнопки [SelectTemplateButton]
{
"operation": "insert",
"parentName": "CaseInformation_gridLayout",
"name": "SelectTemplateButton",
"propertyName": "items",
"values": {
"itemType": Terrasoft.ViewItemType.BUTTON,
"style": Terrasoft.controls.ButtonEnums.style.GREEN,
"caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},
"classes": {"textClass": "actions-button-margin-right"},
"click": {"bindTo": "onOpenTemplateButton"},
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 5,
"layoutName": "CaseInformation_gridLayout"
},
"bindTo": "SelectTemplateButton",
},
"index": 5
},
В чем моя ошибка, почему кнопка не отображается на странице [Case] на вкладке [Информация по обращению]?
Спасибо.
mdv,
"caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},
Это локализованная строчка в схеме карточки и скорее всего у тебя её нет. Тебе нужно её добавить.
Сюда:
Название должно быть равно SelectTemplateCaption ну и значение сам подберешь.
Андреев Андрей Сергеевич,
Андрей, огромное спасибо.
Создал замещающий модуль от BaseModulePageV2 и добавил строчку SelectTemplateCaption, кнопка появилась, справочник с мультивыбором открывается.
Осталось настроить фильтрацию справочника [Шаблоны] по выбранному предварительно значению из справочника [Логики].
Спасибо.
mdv,
Не нужно было создавать замещающий модуль для этого, а нужно было добавить лок. строку в схему карточки CasePage.
Про фильтрацию можно почитать тут.
Фильтр может выглядеть так:
// UsrLogic название твоего поля в Entity Case и шаблонов const LogicId = this.get("UsrLogic").value; config.filters = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLogic", LogicId);
mdv,
Андреев Андрей Сергеевич,
Андрей, а можно реализовать фильтрацию многие ко многим?
Например, если я выбираю несколько логик, то при выборе шаблонов должны быть доступны только те шаблоны, которые связаны с выбранными логиками?
Я по аналогии с [Шаблонами] сделал кнопку для мультивыбора [Логики].
Для этого удалили в объекте [Case] поле справочник [UsrLogic], который был связан с объектом [UsrLogic].
По кнопке у меня открывается для мультивыбора содержимое объекта [UsrLogic].
Ниже обработчик на открытие справочника с мультивыбором шаблона, который написан по вашим рекомендациям, когда выбиралась только одна логика из справочника:
onOpenTemplateButton: function ()
{
let config = {
entitySchemaName: "UsrTemplate",
multiSelect: true,
columns: ["Name"]
};
let FiltersGroup = this.Terrasoft.createFilterGroup();
config.filters = FiltersGroup;
this.openLookup(config, this.addCallBack, this);
const LogicId = this.get("UsrLogic").value;
config.filters = Terrasoft.createColumnFilterWithParameter
(Terrasoft.ComparisonType.EQUAL, "Usrlogic", LogicId);
},
Спасибо.
mdv,
// Массив для Id-шек твоей логики которые ты должен сюда записать и потом фильтр что ниже прикрепить для фильтрации шаблонов. let logicIds = []; // .... тут должно быть заполнение массива. let logicFilters = this.Terrasoft.createColumnInFilterWithParameters("UsrLogic", logicIds); config.filters.add(logicFilter);
в колбеке выбора логик записывай выбранные записи сразу в массив logicIds или перед этим в атрибут. Про атрибуты можно почитать тут.
Андреев Андрей Сергеевич,
Андрей, спасибо.
Можно пару вопросов?
У меня нет ID-шек у объекта [Логики]. Есть только поля [Название] и [Описание] .
У объекта [Шаблоны] есть поля [Название], [Описание] и [UsrLogic]
Справочники [Логики] и [Шаблоны] связаны по полям
[Шаблоны].[UsrLogic] и [Логики].[Название]
Я правильно понимаю, что мне нужно в колбеке логик собрать массив из выбранных из справочника [Логики].[Название]?
т.е.
addCallBackNewLogic: function(args)
{
var items = args.selectedRows.collection.items;
var count = 0;
let logicIds = [];
Terrasoft.each(items, function (item) {
logicIds [count] = item.displayValue;
count++;
}, this);
},
Спасибо.
mdv,
Что-то мне не верится что у тебя нету Id(-шек). Скрин Entity Логики и Шаблонов скинь.
Что-то такое должно у тебя быть, если ты от базового(-ых) объектов наследовался:
Даже если, как ты говоришь, у тебя нету Id(-шек), тогда можно сделать следующим образом:
1. Оставить кнопку только выбрать шаблоны.
2. При нажатии открывается справочник выбор логик.
3. В колбеке выбора логик получается коллекция имен в дебагере можешь узнать как именно её получить. Далее, вызывается метод в который ты передаешь массив и по нему фильтруешь шаблоны и открываешь окно выбора.
4. А дальше все по плану.
mdv,
Раз:
Два:
и должны появится твои колонки в том числе и Id.
Андреев Андрей Сергеевич пишет:
mdv,
Что-то мне не верится что у тебя нету Id(-шек). Скрин Entity Логики и Шаблонов скинь.
Что-то такое должно у тебя быть, если ты от базового(-ых) объектов наследовался:Даже если, как ты говоришь, у тебя нету Id(-шек), тогда можно сделать следующим образом:
1. Оставить кнопку только выбрать шаблоны.
2. При нажатии открывается справочник выбор логик.
3. В колбеке выбора логик получается коллекция имен в дебагере можешь узнать как именно её получить. Далее, вызывается метод в который ты передаешь массив и по нему фильтруешь шаблоны и открываешь окно выбора.
4. А дальше все по плану.
Андреев Андрей Сергеевич,
Андрей, огромнейшее спасибо, реализовал вашу последнюю идею, всё получилось шикарно.
mdv,
Пожалуйста!
*Если не делал на основании Id, то лучше переделать на Id.