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

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

Нравится

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

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

------ страница контакта ------
 
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: {}
	};
});

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

На замещающую страницу карточки контакта добавил деталь и diff для нее (хотя это наверное не обязательно)

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*/
			};
		});

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

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*/
			};
		});

И на схеме страницы детали попытался одно из лукапных полей сделать выпадающим списком:

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*/
	};
});

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

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

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

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

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

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);
            },
        }
    };
});

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

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

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