7.5
древовидная структура детали
Технические вопросы
7.x

Древовидная струтура детали

Добрый день, подскажите, хотя бы алгоритмично, как создать деталь с древовидной структурой, вроде ProjectStructureDetail, хотел сделать по аналогии, но так и не нашел никакого упоминания о ней в ProjectPageV2

Нравится

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

Олег, здравствуйте!

К данному комментарию прикрепил наглядный пример по реализации иерархической детали.

realizaciyaierarhicheskoydetali.doc

Приятного дня!

Добрый день, спасибо за оперативный ответ, попробовал сделать по инструкции, но иерархичность грида не работает http://goo.gl/yCvmBG, кнопка добавления подчиненной записи вообще не активна, добавляются только по кнопке родительской записи, как обычные записи детали
В принципе не могу найти даже в базовой схеме детали метод getAddChildButtonEnabled

Пришлите список сервисов и сами сервисы в которые Вы вносили изменения на support@bpmonline.com для того чтобы мы детально проанализировали Вашу конфигурацию.
В тему письма впишите номер инцидента 0255638.

Отправил на почту письмо с детальным описанием проделанных действий.
P.S. с форума письмо на восстановление пароля содержит в теме [*****SPAM 4.1 *****] странно как то

Добрый день, по итогу общения по почте:

Согласно предоставленному файлу, в схеме детали после строки:
- "hierarchical": true
следует добавить:
- hierarchicalColumnName: "Parent"

Это как бы итак оговаривается в примере, причем там написано обратное, но я все же пробовал еще до подобного совета, результат тот же, деталь строится обычная, с обычным гридом

Олег, здравствуйте!

Для отображения кнопки «Добавить подчинённый элемент» добавьте в код детали:

[javascript]
getAddChildButtonEnabled: function() {
return true;
},
[/javascript]

Попробуйте в код детали подключить следующий миксин:

[javascript]
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;
}
);
[/javascript]

В результате деталь должна отобразиться нужным образом.
Также подобную реализацию можете посмотреть в разделе «Контрагенты» (деталь «Структура организации»).

Добрый день, наверное глупый вопрос, но найти ответа не смог, как подключить миксин? создал модуль, поместил в него код миксина, в код детали добавил :
[javascript]
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
mixins: {
HierarchicalSectionUtilities: "HierarchicalSectionUtilities"
},
diff: /**SCHEMA_DIFF*/[
[/javascript]
и при открытии страницы где расположена деталь в консоль выбивает ошибку

Добрый день, Олег!
Если нужно подключить указаный выше по комментариям мексин HierarchicalSectionUtilities, то нужно подключить/зарегистрировать модуль содержащий мексин в define и подключить его в секции mixins, как показано ниже:

[javascript]
define("SchemeModuleName", ["HierarchicalSectionUtilities"], function() {
return {
messages: {},
/**
* Классы-миксины, расширяющие функциональность данного класа.
*/
mixins: {
/**
* @class HierarchicalSectionUtilities
*/
HierarchicalSectionUtilities: "Terrasoft.HierarchicalSectionUtilities"
},
methods: {},
diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
};
});

[/javascript]

Добавил миксин, ситуация не изменилась, деталь так же имеет обычную структуру...
http://goo.gl/dexq8R

Олег, в рамках удаленного подключения была предоставлена консультация. В результате деталь отобразилась корректно.
Для того, чтобы деталь была древовидной необходимо было перенести все функции миксина в код детали (классы) и переопубликовать объект.

Огромное спасибо за помощь, понял свои ошибки

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