Управление видимостью кнопки на реестре детали
Здравствуйте.
Необходимо добавить на грид детали кнопку. Причем нужно, чтобы кнопка отображалась только на записях, у которых в определенной колонке имеется определенное значение.
На Комьюнити нашел пример для управления видимостью кнопок на реестре раздела. https://community.terrasoft.ru/forum/topic/15313
Однако в детали у меня этот пример не заработал. Вот мой код.
return {
entitySchemaName: "FinApplicationSettings",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"activeRowAction": {"bindTo": "onActiveRowAction"},
"activeRowActions": []
}
},
{
"operation": "insert",
"name": "Choose",
"parentName": "DataGrid",
"propertyName": "activeRowActions",
"values": {
"className": "Terrasoft.Button",
"style": this.Terrasoft.controls.ButtonEnums.style.GREEN,
"tag": "choose",
"caption": "Выбрать",
"visible": {"bindTo": "getChooseButtonVisible"}
}
}
]/**SCHEMA_DIFF*/,
methods:{
addColumnLink: function(item) {
debugger;
var self = this;
item.getChooseButtonVisible = function() {
return self.getChooseButtonVisible.call(self, this.get(this.primaryColumnName));
};
return this.callParent(arguments);
},
getChooseButtonVisible: function(activeRow) {
debugger;
if (!activeRow) return true;
var settingsSource = this.get("GridData").get(activeRow).get("FinAppSettSource");
return settingsSource && settingsSource.value == 'e7769f6c-d688-40a3-a609-e794ac5f862a' ? true : false;
}
};
});
Нравится
Здравствуйте, Андрей.
Реестр детали не предназначен для добавления в него Action buttton. Рекомендую Вам добавлять кнопку указывая родительским элементом Detail. В данном случае кнопка будет отображаться возле кнопок добавления записи и меню детали.
Свойство visible детали необходимо привязать к атрибуту булевого типа. Само же значение атрибута необходимо менять в зависимости от значений выделенной строки.
Пример:
define("UsrSchema6Detail", [], function() { return { entitySchemaName: "UsrTestTest", details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/, diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "name": "TestButton", "parentName": "Detail", "propertyName": "tools", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "click": {"bindTo": "testClick"}, "visible": {bindTo: "IsButtonVisible"}, "enabled": true, "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT, "caption": "Test button" } } ]/**SCHEMA_DIFF*/, methods: { testClick: function() { console.log("click"); }, onActiveRowChange: function() { var gridData = this.getGridData(); var activeRow = this.get("ActiveRow"); if(gridData && activeRow) { var currentRow = gridData.get(activeRow); this.set("IsButtonVisible", currentRow && currentRow.get("UsrSTRING") === '111'); return; } this.set("IsButtonVisible", false) }, }, attributes: { IsButtonVisible: { dataValueType: Terrasoft.DataValueType.BOOLEAN, dependencies: [{ columns: ["ActiveRow"], methodName: "onActiveRowChange" }], value: false } } }; });
Если же Вам необходимо добавить кнопку в сам грид, рекомендую Вам смотреть в схему BaseSectionV2 и делать по аналогии.
Илья, спасибо за ответ.
Вариант с кнопкой в заглавии детали не подходит, так как количество записей в детали может быть весьма большим. Поэтому желателен вариант именно с кнопкой на гриде. Кстати, забыл упомянуть, что debugger в методах addColumnLink и getChooseButtonVisible не срабатывают при выборе активной строки.
Для добавления кнопок в реестр, Вам стоит смотреть в сторону изменения DataGrid в схеме детали. К примеру, в секции (BaseSectionV2) он добавлен следующим образом:
{ "operation": "insert", "name": "DataGrid", "parentName": "DataGridContainer", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.GRID, "type": {"bindTo": "GridType"}, "listedZebra": true, "activeRow": {"bindTo": "ActiveRow"}, "collection": {"bindTo": "GridData"}, "isEmpty": {"bindTo": "IsGridEmpty"}, "isLoading": {"bindTo": "IsGridLoading"}, "multiSelect": {"bindTo": "MultiSelect"}, "primaryColumnName": "Id", "selectedRows": {"bindTo": "SelectedRows"}, "sortColumn": {"bindTo": "sortColumn"}, "sortColumnDirection": {"bindTo": "GridSortDirection"}, "sortColumnIndex": {"bindTo": "SortColumnIndex"}, "selectRow": {"bindTo": "rowSelected"}, "canExecute": {"bindTo": "canBeDestroyed"}, "linkClick": {"bindTo": "linkClicked"}, "linkMouseOver": {"bindTo": "linkMouseOver"}, "needLoadData": {"bindTo": "needLoadData"}, "activeRowAction": {"bindTo": "onActiveRowAction"}, "activeRowActions": [], "getEmptyMessageConfig": {"bindTo": "prepareEmptyGridMessageConfig"} } },
, а для деталей (BaseGridDetailV2)
{ "operation": "insert", "name": "DataGrid", "parentName": "Detail", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.GRID, "listedZebra": true, "collection": {"bindTo": "Collection"}, "activeRow": {"bindTo": "ActiveRow"}, "primaryColumnName": "Id", "isEmpty": {"bindTo": "IsGridEmpty"}, "isLoading": {"bindTo": "IsGridLoading"}, "multiSelect": {"bindTo": "MultiSelect"}, "selectedRows": {"bindTo": "SelectedRows"}, "sortColumn": {"bindTo": "sortColumn"}, "sortColumnDirection": {"bindTo": "GridSortDirection"}, "sortColumnIndex": {"bindTo": "SortColumnIndex"}, "linkClick": {"bindTo": "linkClicked"} } },
Также в детали логика обработки реестра отличается. Без переноса или написания заново данной логики, кнопка добавляться не будет.
Debbuger не отрабатывает по причине того, что сами методы не отрабатывают.
Возник аналогичный вопрос... Записей в детали очень много, действие надо выполнить над одной. В итоге приходится скролить наверх
Честно говоря, не помню чем тогда дело закончилось. Но сейчас, просматривая свой код, есть пара смущающих моментов. Во-первых метод addColumnLink явно не тот, в который стоит добавлять эту логику, а надо, скорее всего, использовать такой метод, который срабатывает при выборе строки, а addColumnLink срабатывает при прогрузке данных, ну и второе: у деталей данные хранятся не в атрибуте GridData, а в атрибуте Collection
Владимир Соколов,
Посмотрите эту тему https://community.terrasoft.ru/questions/problemy-s-nastroikoi-razdela-…
Там они с разделом работали. Для детали нужно расширять класс BaseGridRowViewModel