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