Технические вопросы
7.x

Сombo box поле на редактируемом гриде

Добрый день коллеги!Подсажите пожалуйста, можно ли настроить поле на редактируемом греде, чтобы оно было не look up (выбор справочника в новом окне), а combo box (выпадающим списком)? Спасибо!

Нравится

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

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

[javascript]
------ страница контакта ------

define("ContactPageV2", ["ContactPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
return {
entitySchemaName: "Contact",
details: /**SCHEMA_DETAILS*/{
"UsrContactInfob66277ee47c9": {
"schemaName": "UsrSchema1Detail",
"entitySchemaName": "UsrContactInfo",
"filter": {
"detailColumn": "UsrContact",
"masterColumn": "Id"
}
}
}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "UsrContactInfob66277ee47c9",
"values": {
"itemType": 2
},
"parentName": "GeneralInfoTab",
"propertyName": "items",
"index": 0
}
]/**SCHEMA_DIFF*/,
attributes: {},
methods: {},
rules: {},
userCode: {}
};
});

------ схема детали -----------

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
"ConfigurationGridUtilities"], function() {
return {
entitySchemaName: "UsrContactInfo",
attributes: {
"IsEditable": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},
mixins: {
ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
},
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"className": "Terrasoft.ConfigurationGrid",
"generator": "ConfigurationGridGenerator.generatePartial",
"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
"changeRow": {"bindTo": "changeRow"},
"unSelectRow": {"bindTo": "unSelectRow"},
"onGridClick": {"bindTo": "onGridClick"},
"activeRowActions": [
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "save",
"markerValue": "save",
"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "cancel",
"markerValue": "cancel",
"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "remove",
"markerValue": "remove",
"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
}
],
"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
"activeRowAction": {"bindTo": "onActiveRowAction"},
"multiSelect": false
}
}
]/**SCHEMA_DIFF*/,
methods: {}
};
});

------ схема страницы детали --

define("UsrUsrContactInfo1Page", [], function() {
return {
entitySchemaName: "UsrContactInfo",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "UsrContact440ad902-7e9b-426d-9162-654b6e410474",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 1,
"layoutName": "Header"
},
"labelConfig": {},
"enabled": true,
"bindTo": "UsrContact"
},
"parentName": "Header",
"propertyName": "items",
"index": 0
},
{
"operation": "insert",
"name": "UsrAccountac6b8364-bd8e-43b7-bd6d-589f7fe300a6",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 2,
"layoutName": "Header"
},
"labelConfig": {},
"enabled": true,
"bindTo": "UsrAccount"
},
"parentName": "Header",
"propertyName": "items",
"index": 1
},
{
"operation": "insert",
"name": "Name9870b437-3b62-4f5e-8879-e5f3d4277114",
"values": {
"layout": {
"colSpan": 12,
"rowSpan": 1,
"column": 0,
"row": 0,
"layoutName": "Header"
},
"bindTo": "Name"
},
"parentName": "Header",
"propertyName": "items",
"index": 2
}
]/**SCHEMA_DIFF*/,
methods: {},
rules: {}
};
});
[/javascript]

Здравствуйте Максим! Спасибо за Ваш ответ! Попробовал протестить этот вариант, но не получилось, подскажите пожалуйста, что я упустил...
Пробовал делать на детали "Карьера" на вкладке "место работы".

На замещающую страницу карточки контакта добавил деталь и diff для нее (хотя это наверное не обязательно)
[javascript]
define("ContactPageV2", [],
function(BaseFiltersGenerateModule, BusinessRuleModule, resources, ConfigurationConstants, ContactCareer) {
return {
entitySchemaName: "Contact",
messages: {},
attributes: {},
rules: {},
details: /**SCHEMA_DETAILS*/{
ContactCareer: {
schemaName: "ContactCareerDetailV2",
filter: {
masterColumn: "Id",
detailColumn: "Contact"
},
defaultValues: {
Contact: {
masterColumn: "Id"
}
}
}
}/**SCHEMA_DETAILS*/,
mixins: {},
methods: {},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"parentName": "JobTabContainer",
"propertyName": "items",
"name": "ContactCareer",
"values": {
"itemType": 2
}
}
]/**SCHEMA_DIFF*/
};
});
[/javascript]

на замещающей схеме детали все стандартно:

[javascript]
define("ContactCareerDetailV2", ["terrasoft", "ConfigurationGrid", "ConfigurationGridGenerator",
"ConfigurationGridUtilities"],
function(Terrasoft) {
return {
entitySchemaName: "ContactCareer",
attributes: {
"IsEditable": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},
methods: {},
mixins: {
ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"className": "Terrasoft.ConfigurationGrid",
"generator": "ConfigurationGridGenerator.generatePartial",
"generateControlsConfig": {"bindTo": "generateActiveRowControlsConfig"},
"changeRow": {"bindTo": "changeRow"},
"unSelectRow": {"bindTo": "unSelectRow"},
"onGridClick": {"bindTo": "onGridClick"},
"activeRowActions": [
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "save",
"markerValue": "save",
"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "cancel",
"markerValue": "cancel",
"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "remove",
"markerValue": "remove",
"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
}
],
"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
"activeRowAction": {"bindTo": "onActiveRowAction"},
"multiSelect": false
}
}
]/**SCHEMA_DIFF*/
};
});
[/javascript]

И на схеме страницы детали попытался одно из лукапных полей сделать выпадающим списком:
[javascript]
define("ContactCareerPageInContactV2", [], function() {
return {
entitySchemaName: "ContactCareer",
attributes: {},
methods: {},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "Job",
"parentName": "Header",
"propertyName": "items",
"values": {
"bindTo": "Job",
"layout": {
"column": 0,
"row": 2,
"colSpan": 12,
"layoutName": "Header"
},
"labelConfig": {},
"enabled" : true,
"contentType": Terrasoft.ContentType.ENUM
}
}
]/**SCHEMA_DIFF*/
};
});
[/javascript]

Здравствуйте, есть два варианта по которым у вас этот код мог не отработать.
Либо страница редактирования все же зарегистрирована не корректно, что можно проверить "отключив" редактируемый реестр, и попробовав добавить запись.
Либо страниц редактирования у объекта ContactCareer несколько.
Для таких случаев вы можете настроить конфиг полей в редактируемом реестре, прямо в схеме детали "ContactCareerDetailV2".

Т.к. редактируемый реестр получает конфиг с помощью метода "generateActiveRowControlsConfig" из "ConfigurationGridUtilities", его можно переопределить прямо на уровне детали. Код метода можно брать из примера, или из своей схемы "ConfigurationGridUtilities" если он будет отличатся, и доработать его чем-то вроде:

if (columnName = "Status") {
cellConfig.contentType = Terrasoft.ContentType.ENUM;
}
Сразу после создания в нем cellConfig.

Где Status - имя колонки которой вы хотите присвоить дополнительный конфиг.

Пример где в детали на основе объекта активности я сделал статус выпадающим списком:

[javascript]
define("UsrSchema1Detail", ["terrasoft", "BusinessRulesApplierV2", "ConfigurationEnums", "BusinessRuleModule",
"GridUtilitiesV2", "ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"], function(
Terrasoft, BusinessRulesApplier, ConfigurationEnums, BusinessRuleModule) {
return {
entitySchemaName: "Activity",
attributes: {
"IsEditable": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
value: true
}
},
mixins: {
ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
},
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"className": "Terrasoft.ConfigurationGrid",
"generator": "ConfigurationGridGenerator.generatePartial",
"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
"changeRow": {"bindTo": "changeRow"},
"unSelectRow": {"bindTo": "unSelectRow"},
"onGridClick": {"bindTo": "onGridClick"},
"activeRowActions": [
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "save",
"markerValue": "save",
"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "cancel",
"markerValue": "cancel",
"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
},
{
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
"tag": "remove",
"markerValue": "remove",
"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
}
],
"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
"activeRowAction": {"bindTo": "onActiveRowAction"},
"multiSelect": false
}
}
]/**SCHEMA_DIFF*/,
methods: {
generateActiveRowControlsConfig: function(id, columnsConfig, rowConfig) {
this.columnsConfig = columnsConfig;
var gridLayoutItems = [];
var currentColumnIndex = 0;
this.Terrasoft.each(columnsConfig, function(columnConfig) {
var columnName = columnConfig.key[0].name.bindTo;
var column = this.getColumnByColumnName(columnName);
var cellConfig = this.getCellControlsConfig(column);

cellConfig = this.Ext.apply({
layout: {
colSpan: columnConfig.cols,
column: currentColumnIndex,
row: 0,
rowSpan: 1
}
}, cellConfig);

if (columnName = "Status") {
cellConfig.contentType = Terrasoft.ContentType.ENUM;
}

gridLayoutItems.push(cellConfig);
currentColumnIndex += columnConfig.cols;
}, this);
var gridData = this.getGridData();
var activeRow = gridData.get(id);
var rowClass = {prototype: activeRow};
BusinessRulesApplier.applyRules(rowClass, gridLayoutItems);
var viewGenerator = this.Ext.create("Terrasoft.ViewGenerator");
viewGenerator.viewModelClass = {prototype: this};
var gridLayoutConfig = viewGenerator.generateGridLayout({
name: this.name,
items: gridLayoutItems
});
rowConfig.push(gridLayoutConfig);
},
}
};
});
[/javascript]

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

Большое спасибо! второй вариант с добавлением свойства напрямую в cellConfig работает отлично! :twisted:

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