Здравствуйте коллеги. Имеется некий массив в детали, и кнопка на ней. Требуется выводить один элемент по нажатию кнопки, после следующего нажатия выводить следующий и убирать прошлый. Пожалуйста, дайте хоть какую нибудь подсказку
Нравится
Добрый день,
Мы подумали как можно это реализовать и возможный вариант такой:
1) В схеме детали нужно создать два аттрибута:
attributes: { "GridDataCollectionAttr": { dataValueType: Terrasoft.DataValueType.COLLECTION, value: {} }, "ClickNumber": { dataValueType: Terrasoft.DataValueType.INTEGER, value: 0 }, },
В первом GridDataCollectionAttr будет храниться скопированная коллекция реестра детали, во втором ClickNumber - количество кликов по кнопке.
2) В схеме детали нужно написать два метода (один - переопределение базового метода onGridDataLoaded, второй - кастомный метод, который будет динамически менять список реестра):
onGridDataLoaded: function() { this.callParent(arguments); const gridData = this.getGridData(); if (gridData && gridData.collection.length > 0) { // var test = {...gridData}; var gridDataCollectionClone = gridData.collection.clone(); // var test = Ext.clone(gridData); this.set("GridDataCollectionAttr", gridDataCollectionClone); gridData.clear(); // test.collection.addAll(gridDataCollectionClone.items); var copiedGridData = this.get("GridDataCollectionAttr"); var originalKey = copiedGridData.keys[0]; var originalItem = copiedGridData.getAt(0); gridData.insert(0, originalKey, originalItem); } }, onContactAddressLoadButtonClick: function() { var copiedGridData = this.get("GridDataCollectionAttr"); var copiedGridDataLength = copiedGridData.length; if (copiedGridDataLength != 0) { var numberOfClicks = this.get("ClickNumber"); numberOfClicks += 1; this.set("ClickNumber", numberOfClicks); if (copiedGridData.length == numberOfClicks) { this.set("ClickNumber", 0); numberOfClicks = 0; } const gridData = this.getGridData(); var keyToAdd = copiedGridData.keys[numberOfClicks]; var itemToAdd = copiedGridData.getAt(numberOfClicks); gridData.clear(); gridData.insert(0, keyToAdd, itemToAdd); console.log(copiedGridData); } }
3) В diff добавить саму кнопку:
{ "operation": "insert", "name": "ShowNextRecordButton", "parentName": "Detail", "propertyName": "tools", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "caption": {"bindTo": "Resources.Strings.ShowNextRecordButtonCaption"}, "click": {"bindTo": "onContactAddressLoadButtonClick"}, "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT } }
И добавить локализируемую строку ShowNextRecordButtonCaption в схему детали.
Задумка такая, что при первичной загрузке реестра выполняется проверка на то, есть ли в реестре записи или нет. Если их нет, то кастомизация ничего не сделает, реестр просто завершит загрузку. Если же реестр не пустой, то мы копируем его в аттрибут GridDataCollectionAttr, оригинальный реестр очищаем, из аттрибута берем первый элемент коллекции и записываем его в оригинальный реестр. По нажатию на кнопку мы проходим по копии и по номеру нажатия выбираем соответствующий элемент из копии, очищаем оригинальный грид и пишем выбранный из копии элемент в оригинальный грид. Если кол-во кликов по кнопке становится равным длине копии (аттрибута) - обнуляем счетчик и начинаем сначала.
Проверили код - работает, проверяли на детали с адресами контактов. Вам нужно просто все это же настроить для кастомной детали, код можно и не изменять.
Добрый день,
Мы подумали как можно это реализовать и возможный вариант такой:
1) В схеме детали нужно создать два аттрибута:
attributes: { "GridDataCollectionAttr": { dataValueType: Terrasoft.DataValueType.COLLECTION, value: {} }, "ClickNumber": { dataValueType: Terrasoft.DataValueType.INTEGER, value: 0 }, },
В первом GridDataCollectionAttr будет храниться скопированная коллекция реестра детали, во втором ClickNumber - количество кликов по кнопке.
2) В схеме детали нужно написать два метода (один - переопределение базового метода onGridDataLoaded, второй - кастомный метод, который будет динамически менять список реестра):
onGridDataLoaded: function() { this.callParent(arguments); const gridData = this.getGridData(); if (gridData && gridData.collection.length > 0) { // var test = {...gridData}; var gridDataCollectionClone = gridData.collection.clone(); // var test = Ext.clone(gridData); this.set("GridDataCollectionAttr", gridDataCollectionClone); gridData.clear(); // test.collection.addAll(gridDataCollectionClone.items); var copiedGridData = this.get("GridDataCollectionAttr"); var originalKey = copiedGridData.keys[0]; var originalItem = copiedGridData.getAt(0); gridData.insert(0, originalKey, originalItem); } }, onContactAddressLoadButtonClick: function() { var copiedGridData = this.get("GridDataCollectionAttr"); var copiedGridDataLength = copiedGridData.length; if (copiedGridDataLength != 0) { var numberOfClicks = this.get("ClickNumber"); numberOfClicks += 1; this.set("ClickNumber", numberOfClicks); if (copiedGridData.length == numberOfClicks) { this.set("ClickNumber", 0); numberOfClicks = 0; } const gridData = this.getGridData(); var keyToAdd = copiedGridData.keys[numberOfClicks]; var itemToAdd = copiedGridData.getAt(numberOfClicks); gridData.clear(); gridData.insert(0, keyToAdd, itemToAdd); console.log(copiedGridData); } }
3) В diff добавить саму кнопку:
{ "operation": "insert", "name": "ShowNextRecordButton", "parentName": "Detail", "propertyName": "tools", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "caption": {"bindTo": "Resources.Strings.ShowNextRecordButtonCaption"}, "click": {"bindTo": "onContactAddressLoadButtonClick"}, "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT } }
И добавить локализируемую строку ShowNextRecordButtonCaption в схему детали.
Задумка такая, что при первичной загрузке реестра выполняется проверка на то, есть ли в реестре записи или нет. Если их нет, то кастомизация ничего не сделает, реестр просто завершит загрузку. Если же реестр не пустой, то мы копируем его в аттрибут GridDataCollectionAttr, оригинальный реестр очищаем, из аттрибута берем первый элемент коллекции и записываем его в оригинальный реестр. По нажатию на кнопку мы проходим по копии и по номеру нажатия выбираем соответствующий элемент из копии, очищаем оригинальный грид и пишем выбранный из копии элемент в оригинальный грид. Если кол-во кликов по кнопке становится равным длине копии (аттрибута) - обнуляем счетчик и начинаем сначала.
Проверили код - работает, проверяли на детали с адресами контактов. Вам нужно просто все это же настроить для кастомной детали, код можно и не изменять.