Множество мультивалютных полей

Добрый день,

 

может кто-то уже сделал эту задачу. У меня есть 3 мультивалютных поля, взял пример BaseOrderPage,и https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-multivalyutnogo-polya. Но когда я меняю в одной поле, меняются все 3, но мне надо что бы у каждого поле было свое отдельное валюта. 

За ранее спасибо.

Нравится

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

Тот кто ищет - тот всегда найдет. Решение не мое, а найдено на просторах англоязычного community.

Суть в том, чтобы повторить логику для каждого из полей. Что делаем:

1. Заменяем prepareCurrencyMenu из MultiCurrencyEditUtilities

prepareCurrencyMenu: function() {
	this.mixins.MultiCurrencyEditUtilities.prepareCurrencyMenu.call(this);
	var currencyRateList = this.get("CurrencyRateList");
	if (!currencyRateList) {
		return;
	}
	var columnsList = ["NavDamageSize", "NavSumCurrency"];
	this.Terrasoft.each(columnsList, function(column) {
		var menu = this.Ext.create(this.Terrasoft.BaseViewModelCollection);
		currencyRateList.each(function(item) {
			var menuItem = Ext.create("Terrasoft.BaseViewModel", {
				values: {
					Id: item.value,
					Caption: item.Symbol || item.displayValue,
					MarkerValue: item.Symbol || item.displayValue,
					Tag: item.value,
					//Click: {"bindTo": "onCurrencyMenuItemClick"}
					Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}
				}
			});
			menu.addItem(menuItem);
		}, this);
		//this.set("CurrencyButtonMenuList", menu);
		this.set(column + "CurrencyButtonMenuList", menu);
	}, this);
},

2. делаем для каждого поля свой "on" + column + "CurrencyMenuItemClick" и column +"CurrencyButtonMenuList"

3. Переопределяем generateCurrencyButton из MultiCurrencyEditViewGenerator. я создал весьб свой класс на основе MultiCurrencyEditViewGenerator

generateCurrencyButton: function(config) {
	var buttonConfig = {
		id: "multiCurrencyButton-currency" + config.name,
		className: "Terrasoft.Button",
		classes: {
			wrapperClass: ["currency-button"]
		},
		style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		menu: {
			//items: {"bindTo": "CurrencyButtonMenuList"}
			items: {"bindTo": config.name + "CurrencyButtonMenuList"}//
		},
		enabled: true,
        markerValue: config.name + " MultiCurrencyButton"
	};
	return this.generateButton(buttonConfig);
},

4. Виртуальную колонку Currency и её метод убираем.

Результат:

Плюсы: для каждого поля можно выбрать свою валюты и изменение валюты не затронет другое поля. 

Минусы: потеряли треугольник у поля. По каким причинам не могу понять.

Владимир, возможно, вы во всех трёх полях сослались на одно справочное поле валюты, а не отдельные для каждого.

Я так полагаю проблема не в том, что на страницу добавлено одно кастомное поле валюта. Их скорее всего добавлено 3. А в том, что надо создавать виртуальную колонку Currency для совместимости с модулем MultiCurrencyEditUtilities.

Далее при инициализации страницы мы его заполняем. 

this.set("Currency", this.get("UsrCurrency"), {silent: true});

А Сама колонка Currency при изменении вызывает метод onVirtualCurrencyChange, который собственно меняет кастомное поле валюта.

onVirtualCurrencyChange: function() {
	var currency = this.get("Currency");
	this.set("UsrCurrency", currency);
}

Итого получаем, что для одного Мультивалютного поля все замечательно работает, а если их более одного, то как создавать поле Currency. 2 и более таких полей не создашь. 

Сам столкнулся с подобной ситуацией и не понимаю как мне добавить второе мультивалютное поле на страницу.

Тот кто ищет - тот всегда найдет. Решение не мое, а найдено на просторах англоязычного community.

Суть в том, чтобы повторить логику для каждого из полей. Что делаем:

1. Заменяем prepareCurrencyMenu из MultiCurrencyEditUtilities

prepareCurrencyMenu: function() {
	this.mixins.MultiCurrencyEditUtilities.prepareCurrencyMenu.call(this);
	var currencyRateList = this.get("CurrencyRateList");
	if (!currencyRateList) {
		return;
	}
	var columnsList = ["NavDamageSize", "NavSumCurrency"];
	this.Terrasoft.each(columnsList, function(column) {
		var menu = this.Ext.create(this.Terrasoft.BaseViewModelCollection);
		currencyRateList.each(function(item) {
			var menuItem = Ext.create("Terrasoft.BaseViewModel", {
				values: {
					Id: item.value,
					Caption: item.Symbol || item.displayValue,
					MarkerValue: item.Symbol || item.displayValue,
					Tag: item.value,
					//Click: {"bindTo": "onCurrencyMenuItemClick"}
					Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}
				}
			});
			menu.addItem(menuItem);
		}, this);
		//this.set("CurrencyButtonMenuList", menu);
		this.set(column + "CurrencyButtonMenuList", menu);
	}, this);
},

2. делаем для каждого поля свой "on" + column + "CurrencyMenuItemClick" и column +"CurrencyButtonMenuList"

3. Переопределяем generateCurrencyButton из MultiCurrencyEditViewGenerator. я создал весьб свой класс на основе MultiCurrencyEditViewGenerator

generateCurrencyButton: function(config) {
	var buttonConfig = {
		id: "multiCurrencyButton-currency" + config.name,
		className: "Terrasoft.Button",
		classes: {
			wrapperClass: ["currency-button"]
		},
		style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		menu: {
			//items: {"bindTo": "CurrencyButtonMenuList"}
			items: {"bindTo": config.name + "CurrencyButtonMenuList"}//
		},
		enabled: true,
        markerValue: config.name + " MultiCurrencyButton"
	};
	return this.generateButton(buttonConfig);
},

4. Виртуальную колонку Currency и её метод убираем.

Результат:

Плюсы: для каждого поля можно выбрать свою валюты и изменение валюты не затронет другое поля. 

Минусы: потеряли треугольник у поля. По каким причинам не могу понять.

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