Нужно запретить добавлять одинаковые типы адресов, т.е., например, чтобы не было два юридических адреса.
Однако, в детали просто не получается сделать добавление неактивным. Вот такой код вызывается (проверено в отладчике), но не приводит ни к какому результату. Как правильно?
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; } } }; });
Нравится
деталь 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 //Метод осуществляющий контроль пункта подменю: "+" -> "Телефон" -> "Основной телефон" //Основополагающая логика: пункт не должен быть доступен если запись с типом "Основной телефон" //присутствует в детали (в т.ч. состоянии 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(); } } } }; });
далее