Ошибка при инициализации детали в карточке раздела на портале

Версия 7.12.4.

Добавил деталь в р. "Обращения портала"

При инициализации детали получаю ошибку: 

Изображение удалено.

После отладки выявлено, что ошибка связана с вызовом не существующего сallback в методе initDetailRunProcessButtonMenu миксина  ProcessEntryPointUtilities.

В результате этой ошибки деталь не отображается в карточке Обращения на портале.



 

 

Нравится

9 комментариев

Если в стандартной детали логика этой же функции initDetailRunProcessButtonMenu отрабатывает нормально, дело может быть в неверно созданной Вашей. Попробуйте в обоих случаях посмотреть в отладчике запуск этой функции и посмотреть, в чём разница.

/**
 * Initializes "Run process" menu items in detail.
 * @param {Function} callback Callback function.
 * @param {Object} scope Execution context.
 * @protected
 */
initDetailRunProcessButtonMenu: function(callback, scope) {
	var processButtonMenu = this.get("RunProcessButtonMenuItems");
	if (!processButtonMenu) {
		processButtonMenu = this.Ext.create("Terrasoft.BaseViewModelCollection");
		this.set("RunProcessButtonMenuItems", processButtonMenu);
	}
	if (Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection()) {
		this._initDetailAvailableProcessList(processButtonMenu, callback, scope);
	} else {
		callback.call(scope);
	}
},

Возможно, для стандартной детали до else и не доходит.

Илья, добрый день.

В том то и дело, что 

Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection() и проверяет, не является ли пользователь пользователем портала, и в интерфейсе сотрудника возвращает true, и как следствие выполняется this._initDetailAvailableProcessList(processButtonMenu, callback, scope);

НО если пользователь является пользователем портала, то выполняется callback.call(scope);, а callback в этот метод не передается и равен undefind

Т.о. при выводе детали для пользователя портала  получаем ошибку

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

Мотков Илья,

Деталей на портале нет. 

Вопрос в том, почему в initDetailRunProcessButtonMenu не передаётся callback

Видимо, потому и не передаётся, что деталей нет и никто не планировал запускать там эту функцию. Посмотрите, во отладке что это за анонимная функция, которая её вызывает и в чём разница в запуске на портале и в обычном разделе.

Мотков Илья,

Метод initDetailRunProcessButtonMenu  вызывается в BaseGridDetailV2 в методе initData и не принимает аргументы (см. https://yadi.sk/i/UoJ5M8kHo9s1kw)

Но в условии else вызывается callback.call(scope);, который по определению вернёт ошибку( т.к. initDetailRunProcessButtonMenu  не принимает аргументов)

Сам метод initDetailRunProcessButtonMenu   описан в схеме-миксине ProcessEntryPointUtilities



Я пытаюсь указать на баг базовой функциональности, который ограничивает использование деталей на портале пользователей.



Для себя временной решение я уже нашёл, но хотелось бы получить исправление в коробочной версии.

Либо переделайте initData, чтобы передавала в функцию эти два параметра, либо в самой initDetailRunProcessButtonMenu добавьте проверку на заполненность параметра, либо, если initData — это единственное место в системе, где функцию initDetailRunProcessButtonMenu вызывают и else не сможет отработать в принципе, исключите нижнюю ветвь.

Мотков Илья,

Илья, решение я уже нашёл (заместил 

BaseGridDetailV2 и метод initDetailRunProcessButtonMenu.)

Целью этой публикации на community является обратить внимание поддержки Terrasoft на не корректную реализацию метода initDetailRunProcessButtonMenu и на проблемы, которые, эта реализация вызывает. 

Чтобы это по возможности было исправлено в следующих релизах.

Кстати, в следующих релизах обещают полностью новый портал, так что может и не потребуется ничего исправлять, если в логике не для портала функция вызывается правильно, с параметром.

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

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