UNPKG

@itwin/presentation-hierarchies-react

Version:

React components based on `@itwin/presentation-hierarchies`

131 lines 6.19 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); exports.useUnifiedTreeSelection = useUnifiedTreeSelection; const react_1 = require("react"); const core_bentley_1 = require("@itwin/core-bentley"); const presentation_hierarchies_1 = require("@itwin/presentation-hierarchies"); const unified_selection_1 = require("@itwin/unified-selection"); const UnifiedSelectionContext_js_1 = require("../UnifiedSelectionContext.js"); const TreeModel_js_1 = require("./TreeModel.js"); /** @internal */ function useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, createSelectableForGenericNode, }) { const [options, setOptions] = (0, react_1.useState)(() => ({ isNodeSelected: /* c8 ignore next */ () => false, selectNodes: /* c8 ignore next */ () => { }, })); const deprecatedSelectionStorage = (0, UnifiedSelectionContext_js_1.useUnifiedSelectionStorage)(); selectionStorage ??= deprecatedSelectionStorage; createSelectableForGenericNode ??= defaultCreateSelectableForGenericNode; (0, react_1.useEffect)(() => { if (!selectionStorage) { // TODO: make selectionStorage prop required setOptions({ isNodeSelected: () => false, selectNodes: () => { }, }); return; } setOptions(createOptions(sourceName, selectionStorage, createSelectableForGenericNode, getTreeModelNode)); return selectionStorage.selectionChangeEvent.addListener((args) => { if (args.level > 0) { return; } setOptions(createOptions(sourceName, selectionStorage, createSelectableForGenericNode, getTreeModelNode)); }); }, [selectionStorage, createSelectableForGenericNode, getTreeModelNode, sourceName]); return options; } const defaultCreateSelectableForGenericNode = (node, treeModelNodeId) => ({ identifier: treeModelNodeId, data: node, async *loadInstanceKeys() { }, }); function createOptions(source, storage, createSelectableForGenericNode, getNode) { return { isNodeSelected: (nodeId) => { const node = getNode(nodeId); if (!node || !(0, TreeModel_js_1.isTreeModelHierarchyNode)(node)) { return false; } return Object.entries(groupNodeSelectablesByIModelKey(node, createSelectableForGenericNode)).some(([imodelKey, nodeSelectables]) => { const storageSelectables = storage.getSelection({ imodelKey, level: 0 }); return unified_selection_1.Selectables.hasAny(storageSelectables, nodeSelectables); }); }, selectNodes: (nodeIds, changeType) => { const imodelSelectables = {}; for (const nodeId of nodeIds) { const node = getNode(nodeId); if (!node || !(0, TreeModel_js_1.isTreeModelHierarchyNode)(node)) { return; } Object.entries(groupNodeSelectablesByIModelKey(node, createSelectableForGenericNode)).forEach(([imodelKey, nodeSelectables]) => { let selectablesList = imodelSelectables[imodelKey]; if (!selectablesList) { selectablesList = []; imodelSelectables[imodelKey] = selectablesList; } nodeSelectables.forEach((selectable) => selectablesList.push(selectable)); }); } Object.entries(imodelSelectables).forEach(([imodelKey, selectables]) => { const actionProps = { imodelKey, source, selectables, level: 0 }; switch (changeType) { case "add": storage.addToSelection(actionProps); return; case "remove": storage.removeFromSelection(actionProps); return; case "replace": storage.replaceSelection(actionProps); return; } }); }, }; } function groupNodeSelectablesByIModelKey(modelNode, createSelectableForGenericNode) { const hierarchyNode = modelNode.nodeData; if (presentation_hierarchies_1.HierarchyNode.isInstancesNode(hierarchyNode)) { return groupIModelInstanceKeys(hierarchyNode.key.instanceKeys); } if (presentation_hierarchies_1.HierarchyNode.isGroupingNode(hierarchyNode)) { return Object.entries(groupIModelInstanceKeys(hierarchyNode.groupedInstanceKeys)).reduce((imodelSelectables, [imodelKey, instanceKeys]) => ({ ...imodelSelectables, [imodelKey]: [ { identifier: modelNode.id, data: hierarchyNode, async *loadInstanceKeys() { for (const key of instanceKeys) { yield key; } }, }, ], }), {}); } (0, core_bentley_1.assert)(presentation_hierarchies_1.HierarchyNode.isGeneric(hierarchyNode)); return { // note: generic nodes aren't associated with an imodel [""]: [createSelectableForGenericNode(hierarchyNode, modelNode.id)], }; } function groupIModelInstanceKeys(instanceKeys) { return instanceKeys.reduce((imodelSelectables, key) => { const imodelKey = key.imodelKey ?? ""; let selectablesList = imodelSelectables[imodelKey]; if (!selectablesList) { selectablesList = []; imodelSelectables[imodelKey] = selectablesList; } selectablesList.push(key); return imodelSelectables; }, {}); } //# sourceMappingURL=UseUnifiedSelection.js.map