Вопрос

Управление деталью адресов контрагента

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

Однако, в детали просто не получается сделать добавление неактивным. Вот такой код вызывается (проверено в отладчике), но не приводит ни к какому результату. Как правильно?

define("AccountAddressDetailV2", [], function() {
	return {
		entitySchemaName: "AccountAddress",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			getEditPages: function() {
				var menuItems = this.callParent(arguments);
				for (var i = 0; i < menuItems.collection.items.length; i++) {
					menuItems.collection.items[i].values.Enabled = false;
//						{bindTo: "AddressNotExists_" + menuItems.collection.items[i].values.Tag};
				}
				return menuItems;
			}
		}
	};
});



 

Нравится

1 комментарий

деталь AccountAddressDetailV2 вероятнее всего является наследником базовой AccountCommunicationDetail или является отдельной ее имплементацией.

По этому можно предположить, что с ней можно "управиться" аналогичным образом, вам необходимо предусмотреть 2 варианта добавления, через пункт меню детали "Добавить", а так же не забыть о том что в контекстном меню отдельно взятого элемента тип записи можно изменить, т.е. "Домашний адрес" можно запросто сделать "Юридическим".

контролировать наличие пунктов контекстного меню динамически у меня не удалось, по этому проще просто исключить такую возможность.

Приведу пример замещающей схемы которая решает кейс:

Ограничить возможность добавления более 1-го пункта с типом "Основной телефон"

define("AccountCommunicationDetail", [], function() {
	return {
		methods: {
			//Далее в коментариях, "элемент детали" это отдельно взятая запись в коллекции детали,
			//т.е. одно отдельное средство связи в детали.
			"init": function() {
				this.callParent(arguments);
				//Подписка на изменение атрибута-флага, который принимает значение в true после полной загрузки данных
				//Установим метод-обработчик см.листинг-метку TAG1
				this.on(
					"change:IsDataLoaded",
					function() {
						if (arguments[1] === true) {
							this.mainPhoneInSubMenuExistsController();
						}
					},
					this
				);
			},
			//метод вызываемый при реализации действия "Добавить" или "Изменить" элемент детали
			"createOrUpdateCommunicationItem": function(typeId, config) {
				this.callParent(arguments);
				this.mainPhoneInSubMenuExistsController();
			},
			//метод вызываемый при реализации действия "Удалить" элемент детали
			"deleteCommunicationItem": function() {
				this.callParent(arguments);
				this.mainPhoneInSubMenuExistsController();
			},
			//метод формирующий список элементов для viewModel контекствного меню отдельного элемента детали
			//вызывается единожды при инициализации детали
			"getTypeMenuItems": function() {
				//получим список сформированный родительским методом
				var typeMenuItems = this.callParent(arguments);
 
				//ДЛЯ КАЖДОГО: элемента меню
				for (var each in typeMenuItems) {
					//ЕСЛИ: заголовок элемента "Основной телефон"
					if (typeMenuItems[each].caption === "Основной телефон") {
						//ТО: Удаляем соответствующий элемент из массива
						typeMenuItems.splice(each, 1);
						//Прерываем перебор массива
						break;
					}
				}
 
				//возвращаем модифицированное меню
				return typeMenuItems;
			},
			//TAG1
			//Метод осуществляющий контроль пункта подменю: "+" -&gt; "Телефон" -&gt; "Основной телефон"
			//Основополагающая логика: пункт не должен быть доступен если запись с типом "Основной телефон"
			//присутствует в детали (в т.ч. состоянии view), и становиться доступным при его удалении (в т.ч. состоянии view)
			"mainPhoneInSubMenuExistsController": function() {
				//Получим коллекцию ранее внесенных в деталь средств связи
				var existsCommunicationsCollection = this.get("Collection"),
					//Получим коллекцию сформированных элементов меню
					MenuItemsCollection = this.get("ToolsMenuItems");
 
				//Определим флаг наличия в ранее внесенных средствах связи, средства с типом "Основной телефон"
				var    mainPhoneNumberExistsFlag = existsCommunicationsCollection.collection.find(function(item) {
						var targetCollection = item.values ? item.values : item.changedValues;
						if (targetCollection.CommunicationType.displayValue === "Основной телефон") {
							return true;
						}
					}, this) ? true : false;
				//Определим объект элемента меню "Телефон"
				var    phoneMenuCollection = MenuItemsCollection.collection.find(function(item) {
						if (item.values.Caption === "Телефон") {
							return true;
						}
					}, this);
 
				if (mainPhoneNumberExistsFlag) {
					//Найдем в его коллекции элементов подменю пункт с заголовком "Основной телефон"
					var mainPhoneMenuItem = phoneMenuCollection.values.Items.collection.find(function(item) {
						if (item.values.Caption === "Основной телефон") {
							return true;
						}
					}, this);
					//попытка выполняется в блоке try...catch т.к. в некоторых случаях вызов
					//метода remove приводит к ошибке исполнения JS которая не влияет на результат
					//выполнения метода относительно коллекции, тем не менее прерывает выполнение здесь.
					//Проявляется при добавлении единственной записи в деталь в новой карточке контрагента
					//через поле в карточке, а не через меню детали
					try {
						//Удалим этот пункт меню из колекции подпунктов viewModel
						phoneMenuCollection.values.Items.collection.remove(mainPhoneMenuItem);
					} catch (e) {}
					//инициируем перестроение viewModel по его измененной модели
					MenuItemsCollection.loadAll();
				} else {
					//Вернем этот пункт в меню
					//выполнив новое построение колекции пунктов меню для viewModel
					this.initToolsMenuItems();
				}
			}
		}
	};
});

далее 

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