Здравствуйте коллеги. Имеется некий массив в детали, и кнопка на ней. Требуется выводить один элемент по нажатию кнопки, после следующего нажатия выводить следующий и убирать прошлый. Пожалуйста, дайте хоть какую нибудь подсказку
Нравится
Добрый день,
Мы подумали как можно это реализовать и возможный вариант такой:
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, оригинальный реестр очищаем, из аттрибута берем первый элемент коллекции и записываем его в оригинальный реестр. По нажатию на кнопку мы проходим по копии и по номеру нажатия выбираем соответствующий элемент из копии, очищаем оригинальный грид и пишем выбранный из копии элемент в оригинальный грид. Если кол-во кликов по кнопке становится равным длине копии (аттрибута) - обнуляем счетчик и начинаем сначала.
Проверили код - работает, проверяли на детали с адресами контактов. Вам нужно просто все это же настроить для кастомной детали, код можно и не изменять.