Здравствуйте коллеги. Имеется некий массив в детали, и кнопка на ней. Требуется выводить один элемент по нажатию кнопки, после следующего нажатия выводить следующий и убирать прошлый. Пожалуйста, дайте хоть какую нибудь подсказку

Нравится

1 комментарий
Лучший ответ

Добрый день,

 

Мы подумали как можно это реализовать и возможный вариант такой:

 

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

 

Проверили код - работает, проверяли на детали с адресами контактов. Вам нужно просто все это же настроить для кастомной детали, код можно и не изменять.

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