Добрый день, подскажите, хотя бы алгоритмично, как создать деталь с древовидной структурой, вроде ProjectStructureDetail, хотел сделать по аналогии, но так и не нашел никакого упоминания о ней в ProjectPageV2
Нравится
Олег, здравствуйте!
К данному комментарию прикрепил наглядный пример по реализации иерархической детали.
realizaciyaierarhicheskoydetali.doc
Приятного дня!
Добрый день, спасибо за оперативный ответ, попробовал сделать по инструкции, но иерархичность грида не работает http://goo.gl/yCvmBG, кнопка добавления подчиненной записи вообще не активна, добавляются только по кнопке родительской записи, как обычные записи детали
В принципе не могу найти даже в базовой схеме детали метод getAddChildButtonEnabled
Пришлите список сервисов и сами сервисы в которые Вы вносили изменения на support@bpmonline.com для того чтобы мы детально проанализировали Вашу конфигурацию.
В тему письма впишите номер инцидента 0255638.
Отправил на почту письмо с детальным описанием проделанных действий.
P.S. с форума письмо на восстановление пароля содержит в теме [*****SPAM 4.1 *****] странно как то
Добрый день, по итогу общения по почте:
Согласно предоставленному файлу, в схеме детали после строки:
- "hierarchical": true
следует добавить:
- hierarchicalColumnName: "Parent"
Это как бы итак оговаривается в примере, причем там написано обратное, но я все же пробовал еще до подобного совета, результат тот же, деталь строится обычная, с обычным гридом
Олег, здравствуйте!
Для отображения кнопки «Добавить подчинённый элемент» добавьте в код детали:
getAddChildButtonEnabled: function() { return true; },
Попробуйте в код детали подключить следующий миксин:
define("HierarchicalSectionUtilities", ["HierarchicalSectionUtilitiesResources", "GridUtilitiesV2"], function(resources) { Ext.define("Terrasoft.configuration.mixins.HierarchicalSectionUtilities", { extend: "Terrasoft.BaseObject", alternateClassName: "Terrasoft.HierarchicalSectionUtilities", expandedElements: {}, expandHierarchyLevels: {}, ExpandItemId: null, ExpandedLevels: null, changeSorting: function() { this.clearExpandHierarchyLevels(); this.callParent(arguments); }, /** * Обработчик загрузки дочерних элементов. Осуществляет проверку загружености * дочерних элеметов выбранной записи. Запускает загрузку нового уровня. * @protected * @virtual * @param {String} primaryColumnValue Уникальный идентификатор записи * @param {Boolean} isExpanded Признак того, разворачивает или сворачивает пользователь дочерние элеметы * true - если разворачивает, false в обратном случае */ onExpandHierarchyLevels: function(primaryColumnValue, isExpanded) { if (!isExpanded || this.isItemExpanded(primaryColumnValue)) { return; } this.setExpandedItem(primaryColumnValue); this.set("ExpandItemId", primaryColumnValue); }, /** * Удаляет логику постраничности если загружаются дочерние объекты * @protected * @overridden */ initCanLoadMoreData: function() { var parentItem = this.get("ExpandItemId"); if (!parentItem) { this.callParent(arguments); } }, /** * получает коллекцию развернутых уровней * @returns {*} */ getExpandedItems: function() { return this.get("expandedElements"); }, /** * Устанавливает новый уровень развернутости иерархии * @param primaryColumnValue */ setExpandedItem: function(primaryColumnValue) { (this.getExpandedItems()[primaryColumnValue]) = { "page": 0 }; }, /** * Проверяет, были ли загруженны дочерные элементы выбранной записи * @protected * @virtual * @param primaryColumnValue Уникальный идетификатор записи * @return {boolean} */ isItemExpanded: function(primaryColumnValue) { return !!(this.getExpandedItems()[primaryColumnValue]); }, /** * Очищет информацию о загруженных и развернутых уровнях * @protected * @virtual */ clearExpandHierarchyLevels: function() { this.set("expandedElements", {}); this.set("expandHierarchyLevels", []); var grid = this.getCurrentGrid(); if (grid) { grid.expandHierarchyLevels = []; } }, /** * Убирает информацию о том, что элемент развернут из системных параметров * @protected * @virtual * @param {String} itemId Уникальный идентификатор записи */ removeExpandHierarchyLevel: function(itemId) { var expandHierarchyLevels = this.get("expandHierarchyLevels"); this.set("expandHierarchyLevels", Terrasoft.without(expandHierarchyLevels, itemId)); var grid = this.getCurrentGrid(); if (grid) { grid.expandHierarchyLevels = Terrasoft.without(grid.expandHierarchyLevels, itemId); } }, /** * Дополнительная обработка после удаления записи * Очищает иерархию и перезагружает реестр * @overridden * @protected */ onDeleted: function(result) { this.callParent(arguments); if (result.Success) { this.clearExpandHierarchyLevels(); this.loadGridData(); this.reloadGridData(); } }, reloadGridColumnsConfig: function(doReRender) { var profile = this.get("Profile"); var propertyName = this.getDataGridName(); var gridProfile = profile[propertyName]; if (!this.Ext.Object.isEmpty(gridProfile)) { /** * очень важны две следующие строки, благодаря им при перерисовке реестра в виде вертикального, не разрушаются стили иерархии, и она нормально отображается в вертикальном реестре. */ gridProfile.isTiled = false; gridProfile.type = "listed"; var grid = this.getCurrentGrid(); if (!grid) { return; } grid.type = gridProfile.type; var viewGenerator = Ext.create("Terrasoft.ViewGenerator"); viewGenerator.viewModelClass = this; var gridConfig; var bindings = this.Terrasoft.deepClone(grid.bindings); if (gridProfile.type === Terrasoft.GridType.LISTED) { gridConfig = { listedConfig: Ext.decode(gridProfile.listedConfig), type: gridProfile.type }; viewGenerator.actualizeListedGridConfig(gridConfig); grid.captionsConfig = gridConfig.listedConfig.captionsConfig; grid.columnsConfig = gridConfig.listedConfig.columnsConfig; grid.listedConfig = gridConfig.listedConfig; grid.initBindings(gridConfig.listedConfig); } else { gridConfig = { tiledConfig: Ext.decode(gridProfile.tiledConfig), type: gridProfile.type }; var isVertical = (propertyName.indexOf("VerticalProfile") > -1); gridConfig.isVertical = isVertical; grid.isEmptyRowVisible = !isVertical; viewGenerator.actualizeTiledGridConfig(gridConfig); grid.columnsConfig = gridConfig.tiledConfig.columnsConfig; grid.tiledConfig = gridConfig.tiledConfig; grid.initBindings(gridConfig.tiledConfig); } grid.bindings = bindings; if (doReRender) { grid.clear(); grid.prepareCollectionData(); if (grid.rendered) { grid.reRender(); } } } } }); return Terrasoft.HierarchicalSectionUtilities; } );
В результате деталь должна отобразиться нужным образом.
Также подобную реализацию можете посмотреть в разделе «Контрагенты» (деталь «Структура организации»).
Добрый день, наверное глупый вопрос, но найти ответа не смог, как подключить миксин? создал модуль, поместил в него код миксина, в код детали добавил :
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/, mixins: { HierarchicalSectionUtilities: "HierarchicalSectionUtilities" }, diff: /**SCHEMA_DIFF*/[
и при открытии страницы где расположена деталь в консоль выбивает ошибку
Добрый день, Олег!
Если нужно подключить указаный выше по комментариям мексин HierarchicalSectionUtilities, то нужно подключить/зарегистрировать модуль содержащий мексин в define и подключить его в секции mixins, как показано ниже:
define("SchemeModuleName", ["HierarchicalSectionUtilities"], function() { return { messages: {}, /** * Классы-миксины, расширяющие функциональность данного класа. */ mixins: { /** * @class HierarchicalSectionUtilities */ HierarchicalSectionUtilities: "Terrasoft.HierarchicalSectionUtilities" }, methods: {}, diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/ }; });
Добавил миксин, ситуация не изменилась, деталь так же имеет обычную структуру...
http://goo.gl/dexq8R
Олег, в рамках удаленного подключения была предоставлена консультация. В результате деталь отобразилась корректно.
Для того, чтобы деталь была древовидной необходимо было перенести все функции миксина в код детали (классы) и переопубликовать объект.