@itwin/presentation-hierarchies-react 2.0.0-alpha.63 → 2.0.0-alpha.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/lib/presentation-hierarchies-react/FlatTreeNode.d.ts +1 -2
  3. package/lib/presentation-hierarchies-react/FlatTreeNode.d.ts.map +1 -1
  4. package/lib/presentation-hierarchies-react/FlatTreeNode.js.map +1 -1
  5. package/lib/presentation-hierarchies-react/LocalizationContext.d.ts +1 -5
  6. package/lib/presentation-hierarchies-react/LocalizationContext.d.ts.map +1 -1
  7. package/lib/presentation-hierarchies-react/LocalizationContext.js.map +1 -1
  8. package/lib/presentation-hierarchies-react/Renderers.d.ts +0 -1
  9. package/lib/presentation-hierarchies-react/Renderers.d.ts.map +1 -1
  10. package/lib/presentation-hierarchies-react/TreeNode.d.ts +1 -2
  11. package/lib/presentation-hierarchies-react/TreeNode.d.ts.map +1 -1
  12. package/lib/presentation-hierarchies-react/UseIModelTree.d.ts +0 -1
  13. package/lib/presentation-hierarchies-react/UseIModelTree.d.ts.map +1 -1
  14. package/lib/presentation-hierarchies-react/UseIModelTree.js.map +1 -1
  15. package/lib/presentation-hierarchies-react/UseNodeHighlighting.d.ts +1 -4
  16. package/lib/presentation-hierarchies-react/UseNodeHighlighting.d.ts.map +1 -1
  17. package/lib/presentation-hierarchies-react/UseNodeHighlighting.js.map +1 -1
  18. package/lib/presentation-hierarchies-react/UseSelectionHandler.d.ts +1 -0
  19. package/lib/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +1 -1
  20. package/lib/presentation-hierarchies-react/UseSelectionHandler.js.map +1 -1
  21. package/lib/presentation-hierarchies-react/UseTree.d.ts +4 -11
  22. package/lib/presentation-hierarchies-react/UseTree.d.ts.map +1 -1
  23. package/lib/presentation-hierarchies-react/UseTree.js +2 -1
  24. package/lib/presentation-hierarchies-react/UseTree.js.map +1 -1
  25. package/lib/presentation-hierarchies-react/Utils.js.map +1 -1
  26. package/lib/presentation-hierarchies-react/internal/DisposePolyfill.js.map +1 -1
  27. package/lib/presentation-hierarchies-react/internal/LocalizedStrings.d.ts.map +1 -1
  28. package/lib/presentation-hierarchies-react/internal/LocalizedStrings.js.map +1 -1
  29. package/lib/presentation-hierarchies-react/internal/TreeActions.js +5 -0
  30. package/lib/presentation-hierarchies-react/internal/TreeActions.js.map +1 -1
  31. package/lib/presentation-hierarchies-react/internal/TreeLoader.js +3 -0
  32. package/lib/presentation-hierarchies-react/internal/TreeLoader.js.map +1 -1
  33. package/lib/presentation-hierarchies-react/internal/TreeModel.d.ts +2 -0
  34. package/lib/presentation-hierarchies-react/internal/TreeModel.js.map +1 -1
  35. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts +2 -1
  36. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +1 -1
  37. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.js +1 -1
  38. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +1 -1
  39. package/lib/presentation-hierarchies-react/internal/Utils.js.map +1 -1
  40. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.d.ts +1 -9
  41. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.d.ts.map +1 -1
  42. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js +45 -39
  43. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js.map +1 -1
  44. package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts +2 -7
  45. package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts.map +1 -1
  46. package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.js.map +1 -1
  47. package/lib/presentation-hierarchies-react/stratakit/TreeAction.d.ts +3 -3
  48. package/lib/presentation-hierarchies-react/stratakit/TreeAction.d.ts.map +1 -1
  49. package/lib/presentation-hierarchies-react/stratakit/TreeAction.js.map +1 -1
  50. package/lib/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts +1 -7
  51. package/lib/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts.map +1 -1
  52. package/lib/presentation-hierarchies-react/stratakit/TreeErrorRenderer.js.map +1 -1
  53. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.d.ts +0 -1
  54. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.d.ts.map +1 -1
  55. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.js.map +1 -1
  56. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts +0 -1
  57. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts.map +1 -1
  58. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.js.map +1 -1
  59. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts +3 -0
  60. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts.map +1 -1
  61. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js.map +1 -1
  62. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts +0 -1
  63. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts.map +1 -1
  64. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.js.map +1 -1
  65. package/lib/presentation-hierarchies-react-extract.d.ts +2 -1
  66. package/package.json +16 -15
@@ -1 +1 @@
1
- {"version":3,"file":"DisposePolyfill.js","names":["Symbol","dispose","asyncDispose"],"sources":["../../../src/presentation-hierarchies-react/internal/DisposePolyfill.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Polyfill for upcoming resource management feature: https://github.com/tc39/proposal-explicit-resource-management\n */\n(Symbol as any).dispose ??= Symbol(\"Symbol.dispose\");\n(Symbol as any).asyncDispose ??= Symbol(\"Symbol.asyncDispose\");\n"],"mappings":";;;;AAQA,OAAgBC,YAAYD,OAAO,iBAAiB;AACpD,OAAgBE,iBAAiBF,OAAO,sBAAsB"}
1
+ {"version":3,"file":"DisposePolyfill.js","names":["Symbol","dispose","asyncDispose"],"sources":["../../../src/presentation-hierarchies-react/internal/DisposePolyfill.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Polyfill for upcoming resource management feature: https://github.com/tc39/proposal-explicit-resource-management\n */\n(Symbol as any).dispose ??= Symbol(\"Symbol.dispose\");\n(Symbol as any).asyncDispose ??= Symbol(\"Symbol.asyncDispose\");\n"],"mappings":";;;;AAQA,OAAgBC,YAAYD,OAAO,gBAAgB;AACnD,OAAgBE,iBAAiBF,OAAO,qBAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedStrings.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/internal/LocalizedStrings.ts"],"mappings":";;;;;cAmLa,uBAAA"}
1
+ {"version":3,"file":"LocalizedStrings.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/internal/LocalizedStrings.ts"],"mappings":";;;;;cAmLa"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedStrings.js","names":["LOCALIZED_STRINGS","loading","filterHierarchyLevel","filterHierarchyLevelActiveDescription","clearHierarchyLevelFilter","noFilteredChildren","noFilteredChildrenChangeFilter","failedToCreateHierarchy","failedToCreateRootHierarchy","resultLimitExceeded","rootResultLimitExceeded","issuesForTree","issuesFound","noIssuesFound","increaseHierarchyLimit","increaseHierarchyLimitToUnlimited","increaseHierarchyLimitWithFiltering","retry","rename","more","confirm","cancel","newLabel","other","unspecified","AddPrefix","TPrefix","TPath","ObjectKeys","Acc","TObject","K","LocalizationKey","LOCALIZATION_NAMESPACE","LOCALIZATION_NAMESPACES"],"sources":["../../../src/presentation-hierarchies-react/internal/LocalizedStrings.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Localized strings used in the components.\n *\n * The version suffix in `LOCALIZATION_NAMESPACE` should be bumped when making changes to this object:\n * - minor bump when new strings are added or exists string values are changed,\n * - major bump when a string is removed.\n *\n * @internal\n */\nexport const LOCALIZED_STRINGS = {\n /**\n * Message displayed when nodes are loading.\n * Default value: `Loading...`.\n */\n loading: \"Loading...\",\n /**\n * Title for apply hierarchy filter button.\n * Default value: `Apply filter`.\n */\n filterHierarchyLevel: \"Apply filter\",\n /**\n * Accessible description for applied hierarchy filter button.\n * Default value: `Filter is applied`.\n */\n filterHierarchyLevelActiveDescription: \"Filter is applied\",\n /**\n * Title for clear hierarchy filter button.\n * Default value: `Clear active filter`.\n */\n clearHierarchyLevelFilter: \"Clear active filter\",\n /**\n * Message displayed when no nodes matching filter are found.\n * Default value: `No matches for current filter for {{node}}.`.\n */\n noFilteredChildren: \"No matches for current filter for {{node}}.\",\n /**\n * Label for change filter action.\n * Default value: `Change filter`.\n */\n noFilteredChildrenChangeFilter: \"Change filter\",\n /**\n * Message displayed when hierarchy creation for a node failed.\n * Default value: `Failed to create hierarchy for {{node}}.`.\n */\n failedToCreateHierarchy: \"Failed to create hierarchy for {{node}}.\",\n /**\n * Message displayed when hierarchy creation for a node failed.\n * Default value: `Failed to load tree.`.\n */\n failedToCreateRootHierarchy: \"Failed to load tree.\",\n /**\n * Message displayed when result limit exceeds hierarchy size limit.\n * Default value: `The hierarchy for {{node}} contains {{limit}}+ items. Try using filters or increase the limit.`.\n */\n resultLimitExceeded: \"The hierarchy for {{node}} contains {{limit}}+ items. Try using filters or increase the limit.\",\n /**\n * Message displayed when result limit exceeds hierarchy size limit.\n * Default value: `The root item hierarchy contains {{limit}}+ items. Try increasing the limit.`.\n */\n rootResultLimitExceeded: \"The root item hierarchy contains {{limit}}+ items. Try increasing the limit.\",\n /**\n * Name for the error region landmark.\n * Default value: `Issues for {{tree_label}}.`.\n */\n issuesForTree: \"Issues for {{tree_label}}.\",\n /**\n * Label displayed on the error region, when errors are detected.\n * Default value: `{{number_of_issues}} issue(s) found.`.\n */\n issuesFound: \"{{number_of_issues}} issue(s) found.\",\n /**\n * Label displayed on the error region, when no issues are found.\n * Default value: `No issues found.`.\n */\n noIssuesFound: \"No issues found.\",\n /**\n * Message displayed when hierarchy size limit can be overridden.\n * Default value: `Increase limit to {{limit}}`.\n */\n increaseHierarchyLimit: \"Increase limit to {{limit}}\",\n /**\n * Message displayed when hierarchy size limit can be overridden.\n * Default value: `Remove limit`.\n */\n increaseHierarchyLimitToUnlimited: \"Remove limit\",\n /**\n * Message displayed when hierarchy size limit can be overridden and hierarchy filtering is enabled.\n * Default value: `Add Filter`.\n */\n increaseHierarchyLimitWithFiltering: \"Add Filter\",\n /**\n * Label for retry action.\n * Default value: `Retry`.\n */\n retry: \"Retry\",\n /**\n * Label for rename action.\n * Default value: `Rename`.\n */\n rename: \"Rename\",\n /**\n * Label for more actions button.\n * Default value: `More`.\n */\n more: \"More\",\n /**\n * Label for confirm button.\n * Default value: `Confirm`.\n */\n confirm: \"Confirm\",\n /**\n * Label for cancel button.\n * Default value: `Cancel`.\n */\n cancel: \"Cancel\",\n /**\n * Label for tree node rename input.\n * Default value: `New label`.\n */\n newLabel: \"New label\",\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: \"Other\",\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: \"Unspecified\",\n};\n\ntype AddPrefix<TPrefix extends string, TPath extends string> = [TPrefix] extends [never]\n ? `${TPath}`\n : `${TPrefix}.${TPath}`;\n\n/**\n * Utility type that extracts all possible keys from a nested object as dot-separated strings\n *\n * Example:\n *\n * ```ts\n * type Example = {\n * a: {\n * b: string;\n * c: number;\n * };\n * d: boolean;\n * }\n * // ExampleKeys will be \"a.b\" | \"a.c\" | \"d\"\n * type ExampleKeys = ObjectKeys<Example>\n * ```\n */\ntype ObjectKeys<TObject extends object, Acc extends string = never> =\n | Acc\n | {\n [K in keyof TObject & string]: TObject[K] extends object\n ? ObjectKeys<TObject[K], AddPrefix<Acc, K>>\n : AddPrefix<Acc, K>;\n }[keyof TObject & string];\n\n/**\n * Type representing all possible localization keys\n * @internal\n */\nexport type LocalizationKey = ObjectKeys<typeof LOCALIZED_STRINGS>;\n\n/** @internal */\nexport const LOCALIZATION_NAMESPACE = \"PresentationHierarchies_1.0\";\n\n/**\n * Namespaces used for localization of presentation hierarchies components.\n * @alpha\n */\nexport const LOCALIZATION_NAMESPACES = [LOCALIZATION_NAMESPACE];\n"],"mappings":";;AA6KA,MAAaiC,yBAAyB;;;;;AAMtC,MAAaC,0BAA0B,CAACD,uBAAuB"}
1
+ {"version":3,"file":"LocalizedStrings.js","names":["LOCALIZED_STRINGS","loading","filterHierarchyLevel","filterHierarchyLevelActiveDescription","clearHierarchyLevelFilter","noFilteredChildren","noFilteredChildrenChangeFilter","failedToCreateHierarchy","failedToCreateRootHierarchy","resultLimitExceeded","rootResultLimitExceeded","issuesForTree","issuesFound","noIssuesFound","increaseHierarchyLimit","increaseHierarchyLimitToUnlimited","increaseHierarchyLimitWithFiltering","retry","rename","more","confirm","cancel","newLabel","other","unspecified","AddPrefix","TPrefix","TPath","ObjectKeys","Acc","TObject","K","LocalizationKey","LOCALIZATION_NAMESPACE","LOCALIZATION_NAMESPACES"],"sources":["../../../src/presentation-hierarchies-react/internal/LocalizedStrings.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Localized strings used in the components.\n *\n * The version suffix in `LOCALIZATION_NAMESPACE` should be bumped when making changes to this object:\n * - minor bump when new strings are added or exists string values are changed,\n * - major bump when a string is removed.\n *\n * @internal\n */\nexport const LOCALIZED_STRINGS = {\n /**\n * Message displayed when nodes are loading.\n * Default value: `Loading...`.\n */\n loading: \"Loading...\",\n /**\n * Title for apply hierarchy filter button.\n * Default value: `Apply filter`.\n */\n filterHierarchyLevel: \"Apply filter\",\n /**\n * Accessible description for applied hierarchy filter button.\n * Default value: `Filter is applied`.\n */\n filterHierarchyLevelActiveDescription: \"Filter is applied\",\n /**\n * Title for clear hierarchy filter button.\n * Default value: `Clear active filter`.\n */\n clearHierarchyLevelFilter: \"Clear active filter\",\n /**\n * Message displayed when no nodes matching filter are found.\n * Default value: `No matches for current filter for {{node}}.`.\n */\n noFilteredChildren: \"No matches for current filter for {{node}}.\",\n /**\n * Label for change filter action.\n * Default value: `Change filter`.\n */\n noFilteredChildrenChangeFilter: \"Change filter\",\n /**\n * Message displayed when hierarchy creation for a node failed.\n * Default value: `Failed to create hierarchy for {{node}}.`.\n */\n failedToCreateHierarchy: \"Failed to create hierarchy for {{node}}.\",\n /**\n * Message displayed when hierarchy creation for a node failed.\n * Default value: `Failed to load tree.`.\n */\n failedToCreateRootHierarchy: \"Failed to load tree.\",\n /**\n * Message displayed when result limit exceeds hierarchy size limit.\n * Default value: `The hierarchy for {{node}} contains {{limit}}+ items. Try using filters or increase the limit.`.\n */\n resultLimitExceeded: \"The hierarchy for {{node}} contains {{limit}}+ items. Try using filters or increase the limit.\",\n /**\n * Message displayed when result limit exceeds hierarchy size limit.\n * Default value: `The root item hierarchy contains {{limit}}+ items. Try increasing the limit.`.\n */\n rootResultLimitExceeded: \"The root item hierarchy contains {{limit}}+ items. Try increasing the limit.\",\n /**\n * Name for the error region landmark.\n * Default value: `Issues for {{tree_label}}.`.\n */\n issuesForTree: \"Issues for {{tree_label}}.\",\n /**\n * Label displayed on the error region, when errors are detected.\n * Default value: `{{number_of_issues}} issue(s) found.`.\n */\n issuesFound: \"{{number_of_issues}} issue(s) found.\",\n /**\n * Label displayed on the error region, when no issues are found.\n * Default value: `No issues found.`.\n */\n noIssuesFound: \"No issues found.\",\n /**\n * Message displayed when hierarchy size limit can be overridden.\n * Default value: `Increase limit to {{limit}}`.\n */\n increaseHierarchyLimit: \"Increase limit to {{limit}}\",\n /**\n * Message displayed when hierarchy size limit can be overridden.\n * Default value: `Remove limit`.\n */\n increaseHierarchyLimitToUnlimited: \"Remove limit\",\n /**\n * Message displayed when hierarchy size limit can be overridden and hierarchy filtering is enabled.\n * Default value: `Add Filter`.\n */\n increaseHierarchyLimitWithFiltering: \"Add Filter\",\n /**\n * Label for retry action.\n * Default value: `Retry`.\n */\n retry: \"Retry\",\n /**\n * Label for rename action.\n * Default value: `Rename`.\n */\n rename: \"Rename\",\n /**\n * Label for more actions button.\n * Default value: `More`.\n */\n more: \"More\",\n /**\n * Label for confirm button.\n * Default value: `Confirm`.\n */\n confirm: \"Confirm\",\n /**\n * Label for cancel button.\n * Default value: `Cancel`.\n */\n cancel: \"Cancel\",\n /**\n * Label for tree node rename input.\n * Default value: `New label`.\n */\n newLabel: \"New label\",\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: \"Other\",\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: \"Unspecified\",\n};\n\ntype AddPrefix<TPrefix extends string, TPath extends string> = [TPrefix] extends [never]\n ? `${TPath}`\n : `${TPrefix}.${TPath}`;\n\n/**\n * Utility type that extracts all possible keys from a nested object as dot-separated strings\n *\n * Example:\n *\n * ```ts\n * type Example = {\n * a: {\n * b: string;\n * c: number;\n * };\n * d: boolean;\n * }\n * // ExampleKeys will be \"a.b\" | \"a.c\" | \"d\"\n * type ExampleKeys = ObjectKeys<Example>\n * ```\n */\ntype ObjectKeys<TObject extends object, Acc extends string = never> =\n | Acc\n | {\n [K in keyof TObject & string]: TObject[K] extends object\n ? ObjectKeys<TObject[K], AddPrefix<Acc, K>>\n : AddPrefix<Acc, K>;\n }[keyof TObject & string];\n\n/**\n * Type representing all possible localization keys\n * @internal\n */\nexport type LocalizationKey = ObjectKeys<typeof LOCALIZED_STRINGS>;\n\n/** @internal */\nexport const LOCALIZATION_NAMESPACE = \"PresentationHierarchies_1.0\";\n\n/**\n * Namespaces used for localization of presentation hierarchies components.\n * @alpha\n */\nexport const LOCALIZATION_NAMESPACES = [LOCALIZATION_NAMESPACE];\n"],"mappings":";;AA6KA,MAAaiC,yBAAyB;;;;;AAMtC,MAAaC,0BAA0B,CAACD,sBAAsB"}
@@ -9,6 +9,10 @@ import { EMPTY, Subject, buffer, debounceTime, groupBy, map, mergeMap, reduce, s
9
9
  enableMapSet();
10
10
  /** @internal */
11
11
  var TreeActions = class {
12
+ _onModelChanged;
13
+ _onLoad;
14
+ _onHierarchyLimitExceeded;
15
+ _onHierarchyLoadError;
12
16
  _loader;
13
17
  _nodeIdFactory;
14
18
  _currentModel;
@@ -267,6 +271,7 @@ var NoopTreeLoader = class {
267
271
  }
268
272
  };
269
273
  var TimeTracker = class {
274
+ _onFinish;
270
275
  _start;
271
276
  _stopped = false;
272
277
  constructor(_onFinish) {
@@ -1 +1 @@
1
- {"version":3,"file":"TreeActions.js","names":["enableMapSet","produce","buffer","debounceTime","EMPTY","groupBy","map","mergeMap","reduce","Subject","switchMap","takeUntil","tap","HierarchyNode","TreeLoader","TreeModel","createNodeId","sameNodes","Draft","Observable","GenericInstanceFilter","HierarchyProvider","ErrorInfo","SelectionChangeType","HierarchyLevelOptions","ITreeLoader","LoadedTreePart","LoadNodesOptions","TreeModelHierarchyNode","TreeModelRootNode","LoadDebouncedNodesOptions","loadOptions","onComplete","timeTracker","TimeTracker","initialRootNode","parentId","discardState","TreeActions","_loader","_nodeIdFactory","node","Pick","_currentModel","_reset","_nodeLoader","constructor","_onModelChanged","model","_onLoad","actionType","duration","_onHierarchyLimitExceeded","props","filter","limit","_onHierarchyLoadError","type","error","nodeIdFactory","seed","NoopTreeLoader","idToNode","Map","parentChildMap","rootNode","id","undefined","nodeData","createNodeLoader","subject","pipe","item","group","groupArr","returnIndex","length","forEach","member","index","Symbol","dispose","loadNodes","collectTreePartsUntil","next","newModel","parentNode","get","handleLoadedHierarchy","finish","complete","onLoadingComplete","subscribe","updateTreeModel","updater","loadedHierarchy","addHierarchyPart","setIsLoading","getLoadAction","size","loadSubTree","options","loadAction","parent","time","Promise","resolve","ignoreCache","getHierarchyLevelOptions","createHierarchyLevelOptions","getNonGroupedParentId","shouldLoadChildren","autoExpand","reloadSubTree","oldModel","currModel","expandedNodes","collectNodes","isExpanded","collapsedNodes","instanceFilter","hierarchyLevelSizeLimit","filteredNodeId","findIndex","expandedNode","collapsedNode","buildNode","addAttributes","getNode","reset","setHierarchyProvider","provider","Number","MAX_SAFE_INTEGER","nodeId","selectNodes","nodeIds","Array","changeType","expandNode","childrenAction","ReturnType","setHierarchyLimit","loadChildren","setInstanceFilter","reloadTree","parentNodeId","state","removeSubTree","untilNotifier","source","treeModel","loadedPart","addTreePartToModel","addNodesToModel","addErrorToModel","set","loadedNodes","oldNode","hierarchyLimit","isSelected","pred","currentChildren","flatMap","child","currNode","isGroupingNode","nonGroupingAncestor","modelNode","_start","_stopped","_onFinish","Date","now","elapsedTime"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeActions.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"./DisposePolyfill.js\";\n\nimport { enableMapSet, produce } from \"immer\";\nimport { buffer, debounceTime, EMPTY, groupBy, map, mergeMap, reduce, Subject, switchMap, takeUntil, tap } from \"rxjs\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { TreeLoader } from \"./TreeLoader.js\";\nimport { TreeModel } from \"./TreeModel.js\";\nimport { createNodeId, sameNodes } from \"./Utils.js\";\n\nimport type { Draft } from \"immer\";\nimport type { Observable } from \"rxjs\";\nimport type { GenericInstanceFilter, HierarchyProvider } from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { SelectionChangeType } from \"../UseSelectionHandler.js\";\nimport type { HierarchyLevelOptions, ITreeLoader, LoadedTreePart, LoadNodesOptions } from \"./TreeLoader.js\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./TreeModel.js\";\n\nenableMapSet();\n\ninterface LoadDebouncedNodesOptions {\n loadOptions: LoadNodesOptions;\n onComplete: () => void;\n timeTracker?: TimeTracker;\n initialRootNode?: TreeModelRootNode;\n parentId?: string;\n discardState?: boolean;\n}\n\n/** @internal */\nexport class TreeActions {\n private _loader: ITreeLoader;\n private _nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n private _currentModel: TreeModel;\n private _reset = new Subject<void>();\n private _nodeLoader: Subject<LoadDebouncedNodesOptions>;\n\n constructor(\n private _onModelChanged: (model: TreeModel) => void,\n private _onLoad: (actionType: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void,\n private _onHierarchyLimitExceeded: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void,\n nodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n seed?: TreeModel,\n ) {\n this._loader = new NoopTreeLoader();\n this._nodeIdFactory = nodeIdFactory ?? createNodeId;\n this._currentModel = seed ?? {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: { id: undefined, nodeData: undefined },\n };\n\n this._nodeLoader = this.createNodeLoader();\n }\n\n private createNodeLoader() {\n const subject = new Subject<LoadDebouncedNodesOptions>();\n subject\n .pipe(\n groupBy((item) => item.parentId),\n mergeMap((group) =>\n group.pipe(\n buffer(group.pipe(debounceTime(0))),\n map((groupArr) => {\n let returnIndex = groupArr.length - 1;\n\n groupArr.forEach((member, index) => {\n if (member.discardState) {\n returnIndex = index;\n }\n });\n\n groupArr.forEach((member, index) => {\n if (index === returnIndex) {\n return;\n }\n member.timeTracker?.[Symbol.dispose];\n member.onComplete();\n });\n return groupArr[returnIndex];\n }),\n switchMap((props) =>\n this._loader.loadNodes(props.loadOptions).pipe(\n collectTreePartsUntil(this._reset, props.initialRootNode),\n tap({\n next: (newModel: TreeModel) => {\n const parentNode = props.parentId ? newModel.idToNode.get(props.parentId) : newModel.rootNode;\n this.handleLoadedHierarchy(props.parentId, newModel);\n // only report load duration if children were loaded\n if (!(parentNode && parentNode.error)) {\n props.timeTracker?.finish();\n }\n },\n complete: () => {\n this.onLoadingComplete(props.parentId);\n props.timeTracker?.[Symbol.dispose]();\n props.onComplete();\n },\n }),\n ),\n ),\n ),\n ),\n )\n .subscribe();\n\n return subject;\n }\n\n private updateTreeModel(updater: (model: Draft<TreeModel>) => void) {\n const newModel = produce(this._currentModel, updater);\n if (this._currentModel === newModel) {\n return;\n }\n\n this._currentModel = newModel;\n this._onModelChanged(this._currentModel);\n }\n\n private handleLoadedHierarchy(parentId: string | undefined, loadedHierarchy: TreeModel) {\n this.updateTreeModel((model) => {\n TreeModel.addHierarchyPart(model, parentId, loadedHierarchy);\n });\n }\n\n private onLoadingComplete(parentId: string | undefined) {\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, parentId, false);\n });\n }\n\n private getLoadAction(parentId: string | undefined) {\n return this._currentModel.idToNode.size === 0\n ? \"initial-load\"\n : parentId === undefined\n ? \"reload\"\n : \"hierarchy-level-load\";\n }\n\n private loadSubTree(options: LoadNodesOptions, initialRootNode?: TreeModelRootNode, discardState?: boolean) {\n const loadAction = this.getLoadAction(options.parent.id);\n const timeTracker = new TimeTracker((time) => this._onLoad(loadAction, time));\n\n return {\n complete: new Promise<void>((resolve) => {\n this._nodeLoader.next({\n loadOptions: options,\n onComplete: resolve,\n timeTracker,\n parentId: options.parent.id,\n initialRootNode,\n discardState,\n });\n }),\n };\n }\n\n private loadNodes(parentId: string, ignoreCache?: boolean) {\n const parentNode = this._currentModel.idToNode.get(parentId);\n if (!parentNode) {\n return { complete: Promise.resolve() };\n }\n return this.loadSubTree({\n parent: parentNode,\n getHierarchyLevelOptions: (node) =>\n createHierarchyLevelOptions(this._currentModel, getNonGroupedParentId(node, this._nodeIdFactory)),\n shouldLoadChildren: (node) => !!node.nodeData.autoExpand,\n ignoreCache,\n });\n }\n\n private reloadSubTree(\n parentId: string | undefined,\n oldModel: TreeModel,\n options?: { discardState?: boolean; ignoreCache?: boolean },\n ) {\n const currModel = this._currentModel;\n const expandedNodes = !!options?.discardState\n ? []\n : collectNodes(parentId, oldModel, (node) => node.isExpanded === true);\n const collapsedNodes = !!options?.discardState\n ? []\n : collectNodes(parentId, oldModel, (node) => node.isExpanded === false);\n const getHierarchyLevelOptions = (node: TreeModelRootNode | TreeModelHierarchyNode) => {\n if (!!options?.discardState) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n const filteredNodeId = getNonGroupedParentId(node, this._nodeIdFactory);\n return createHierarchyLevelOptions(filteredNodeId === parentId ? currModel : oldModel, filteredNodeId);\n };\n const shouldLoadChildren = (node: TreeModelHierarchyNode) => {\n if (expandedNodes.findIndex((expandedNode) => sameNodes(expandedNode.nodeData, node.nodeData)) !== -1) {\n return true;\n }\n if (collapsedNodes.findIndex((collapsedNode) => sameNodes(collapsedNode.nodeData, node.nodeData)) !== -1) {\n return false;\n }\n return !!node.nodeData.autoExpand;\n };\n const buildNode = (node: TreeModelHierarchyNode) =>\n !!options?.discardState || node.id === parentId ? node : addAttributes(node, oldModel);\n\n const rootNode = parentId !== undefined ? this.getNode(parentId) : currModel.rootNode;\n if (!rootNode) {\n return { complete: Promise.resolve() };\n }\n\n if (parentId === undefined) {\n // cancel all ongoing requests\n this._reset.next();\n }\n\n return this.loadSubTree(\n { parent: rootNode, getHierarchyLevelOptions, shouldLoadChildren, buildNode, ignoreCache: options?.ignoreCache },\n !!options?.discardState ? undefined : { ...currModel.rootNode },\n options?.discardState,\n );\n }\n\n public reset() {\n this._reset.next();\n }\n\n public setHierarchyProvider(provider?: HierarchyProvider) {\n this._loader = provider\n ? new TreeLoader(\n provider,\n this._onHierarchyLimitExceeded,\n ({ parentId, type, error }) => {\n if (type === \"timeout\") {\n const loadAction = this.getLoadAction(parentId);\n this._onLoad(loadAction, Number.MAX_SAFE_INTEGER);\n }\n this._onHierarchyLoadError({ parentId, type, error });\n },\n this._nodeIdFactory,\n )\n : new NoopTreeLoader();\n }\n\n public getNode(nodeId: string | undefined): TreeModelHierarchyNode | TreeModelRootNode | undefined {\n return TreeModel.getNode(this._currentModel, nodeId);\n }\n\n public selectNodes(nodeIds: Array<string>, changeType: SelectionChangeType) {\n this.updateTreeModel((model) => {\n TreeModel.selectNodes(model, nodeIds, changeType);\n });\n }\n\n public expandNode(nodeId: string, isExpanded: boolean) {\n let childrenAction = \"none\" as ReturnType<typeof TreeModel.expandNode>;\n this.updateTreeModel((model) => {\n childrenAction = TreeModel.expandNode(model, nodeId, isExpanded);\n });\n\n if (childrenAction === \"none\") {\n return { complete: Promise.resolve() };\n }\n\n return this.loadNodes(nodeId, childrenAction === \"reloadChildren\");\n }\n\n public setHierarchyLimit(nodeId: string | undefined, limit?: number | \"unbounded\") {\n const oldModel = this._currentModel;\n let loadChildren = false as boolean;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setHierarchyLimit(model, nodeId, limit);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public setInstanceFilter(nodeId: string | undefined, filter?: GenericInstanceFilter) {\n const oldModel = this._currentModel;\n let loadChildren = false as boolean;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setInstanceFilter(model, nodeId, filter);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public reloadTree(options?: { parentNodeId?: string; state?: \"keep\" | \"discard\" | \"reset\" }) {\n const oldModel = this._currentModel;\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, options?.parentNodeId, true);\n if (options?.state === \"reset\") {\n TreeModel.removeSubTree(model, options.parentNodeId);\n }\n });\n\n const discardState = options?.state === \"discard\" || options?.state === \"reset\";\n const ignoreCache = options?.state === \"reset\";\n return this.reloadSubTree(options?.parentNodeId, oldModel, { discardState, ignoreCache });\n }\n}\n\nfunction collectTreePartsUntil(untilNotifier: Observable<void>, rootNode?: TreeModelRootNode) {\n return (source: Observable<LoadedTreePart>) =>\n source.pipe(\n reduce<LoadedTreePart, TreeModel>(\n (treeModel, loadedPart) => {\n addTreePartToModel(treeModel, loadedPart);\n return treeModel;\n },\n {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: rootNode ?? { id: undefined, nodeData: undefined },\n },\n ),\n takeUntil(untilNotifier),\n );\n}\n\nfunction addTreePartToModel(treeModel: TreeModel, loadedPart: LoadedTreePart) {\n if (\"loadedNodes\" in loadedPart) {\n addNodesToModel(treeModel, loadedPart);\n } else {\n addErrorToModel(treeModel, loadedPart);\n }\n}\n\nfunction addErrorToModel(\n model: TreeModel,\n loadedPart: { parent: TreeModelHierarchyNode | TreeModelRootNode; error: ErrorInfo },\n) {\n if (loadedPart.parent.id === undefined) {\n model.rootNode.error = loadedPart.error;\n } else {\n model.idToNode.set(loadedPart.parent.id, { ...loadedPart.parent, error: loadedPart.error });\n }\n}\n\nfunction addNodesToModel(\n model: TreeModel,\n loadedPart: { parent: TreeModelHierarchyNode | TreeModelRootNode; loadedNodes: TreeModelHierarchyNode[] },\n) {\n model.parentChildMap.set(\n loadedPart.parent.id,\n loadedPart.loadedNodes.map((node) => node.id),\n );\n for (const node of loadedPart.loadedNodes) {\n model.idToNode.set(node.id, node);\n }\n const parentNode = loadedPart.parent.id ? model.idToNode.get(loadedPart.parent.id) : undefined;\n if (parentNode && loadedPart.loadedNodes.length !== 0) {\n parentNode.isExpanded = true;\n }\n}\n\nfunction addAttributes(node: TreeModelHierarchyNode, oldModel: TreeModel) {\n const oldNode = oldModel.idToNode.get(node.id);\n if (oldNode) {\n node.hierarchyLimit = oldNode.hierarchyLimit;\n node.instanceFilter = oldNode.instanceFilter;\n node.isSelected = oldNode.isSelected;\n }\n return node;\n}\n\nfunction collectNodes(\n parentId: string | undefined,\n model: TreeModel,\n pred: (node: TreeModelHierarchyNode) => boolean,\n): TreeModelHierarchyNode[] {\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return [];\n }\n\n if (parentId === undefined) {\n return currentChildren.flatMap((child) => collectNodes(child, model, pred));\n }\n\n const currNode = model.idToNode.get(parentId);\n if (!currNode || !pred(currNode)) {\n return [];\n }\n\n return [currNode, ...currentChildren.flatMap((child) => collectNodes(child, model, pred))];\n}\n\nfunction getNonGroupedParentId(\n node: TreeModelHierarchyNode | TreeModelRootNode,\n nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n) {\n if (!node.nodeData || !HierarchyNode.isGroupingNode(node.nodeData)) {\n return node.id;\n }\n\n if (!node.nodeData.nonGroupingAncestor) {\n return undefined;\n }\n\n return nodeIdFactory(node.nodeData.nonGroupingAncestor);\n}\n\nfunction createHierarchyLevelOptions(model: TreeModel, nodeId: string | undefined): HierarchyLevelOptions {\n if (nodeId === undefined) {\n return { instanceFilter: model.rootNode.instanceFilter, hierarchyLevelSizeLimit: model.rootNode.hierarchyLimit };\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n return { instanceFilter: modelNode.instanceFilter, hierarchyLevelSizeLimit: modelNode.hierarchyLimit };\n}\n\nclass NoopTreeLoader implements ITreeLoader {\n public loadNodes(): Observable<LoadedTreePart> {\n return EMPTY;\n }\n}\n\nclass TimeTracker {\n private _start: number;\n private _stopped: boolean = false;\n\n constructor(private _onFinish: (time: number) => void) {\n this._start = Date.now();\n }\n\n public [Symbol.dispose]() {\n this._stopped = true;\n }\n\n public finish() {\n if (this._stopped) {\n return;\n }\n\n this._stopped = true;\n const elapsedTime = Date.now() - this._start;\n this._onFinish(elapsedTime);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TreeActions.js","names":["enableMapSet","produce","buffer","debounceTime","EMPTY","groupBy","map","mergeMap","reduce","Subject","switchMap","takeUntil","tap","HierarchyNode","TreeLoader","TreeModel","createNodeId","sameNodes","Draft","Observable","GenericInstanceFilter","HierarchyProvider","ErrorInfo","SelectionChangeType","HierarchyLevelOptions","ITreeLoader","LoadedTreePart","LoadNodesOptions","TreeModelHierarchyNode","TreeModelRootNode","LoadDebouncedNodesOptions","loadOptions","onComplete","timeTracker","TimeTracker","initialRootNode","parentId","discardState","TreeActions","_loader","_nodeIdFactory","node","Pick","_currentModel","_reset","_nodeLoader","constructor","_onModelChanged","model","_onLoad","actionType","duration","_onHierarchyLimitExceeded","props","filter","limit","_onHierarchyLoadError","type","error","nodeIdFactory","seed","NoopTreeLoader","idToNode","Map","parentChildMap","rootNode","id","undefined","nodeData","createNodeLoader","subject","pipe","item","group","groupArr","returnIndex","length","forEach","member","index","Symbol","dispose","loadNodes","collectTreePartsUntil","next","newModel","parentNode","get","handleLoadedHierarchy","finish","complete","onLoadingComplete","subscribe","updateTreeModel","updater","loadedHierarchy","addHierarchyPart","setIsLoading","getLoadAction","size","loadSubTree","options","loadAction","parent","time","Promise","resolve","ignoreCache","getHierarchyLevelOptions","createHierarchyLevelOptions","getNonGroupedParentId","shouldLoadChildren","autoExpand","reloadSubTree","oldModel","currModel","expandedNodes","collectNodes","isExpanded","collapsedNodes","instanceFilter","hierarchyLevelSizeLimit","filteredNodeId","findIndex","expandedNode","collapsedNode","buildNode","addAttributes","getNode","reset","setHierarchyProvider","provider","Number","MAX_SAFE_INTEGER","nodeId","selectNodes","nodeIds","Array","changeType","expandNode","childrenAction","ReturnType","setHierarchyLimit","loadChildren","setInstanceFilter","reloadTree","parentNodeId","state","removeSubTree","untilNotifier","source","treeModel","loadedPart","addTreePartToModel","addNodesToModel","addErrorToModel","set","loadedNodes","oldNode","hierarchyLimit","isSelected","pred","currentChildren","flatMap","child","currNode","isGroupingNode","nonGroupingAncestor","modelNode","_start","_stopped","_onFinish","Date","now","elapsedTime"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeActions.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"./DisposePolyfill.js\";\n\nimport { enableMapSet, produce } from \"immer\";\nimport { buffer, debounceTime, EMPTY, groupBy, map, mergeMap, reduce, Subject, switchMap, takeUntil, tap } from \"rxjs\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { TreeLoader } from \"./TreeLoader.js\";\nimport { TreeModel } from \"./TreeModel.js\";\nimport { createNodeId, sameNodes } from \"./Utils.js\";\n\nimport type { Draft } from \"immer\";\nimport type { Observable } from \"rxjs\";\nimport type { GenericInstanceFilter, HierarchyProvider } from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { SelectionChangeType } from \"../UseSelectionHandler.js\";\nimport type { HierarchyLevelOptions, ITreeLoader, LoadedTreePart, LoadNodesOptions } from \"./TreeLoader.js\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./TreeModel.js\";\n\nenableMapSet();\n\ninterface LoadDebouncedNodesOptions {\n loadOptions: LoadNodesOptions;\n onComplete: () => void;\n timeTracker?: TimeTracker;\n initialRootNode?: TreeModelRootNode;\n parentId?: string;\n discardState?: boolean;\n}\n\n/** @internal */\nexport class TreeActions {\n private _loader: ITreeLoader;\n private _nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n private _currentModel: TreeModel;\n private _reset = new Subject<void>();\n private _nodeLoader: Subject<LoadDebouncedNodesOptions>;\n\n constructor(\n private _onModelChanged: (model: TreeModel) => void,\n private _onLoad: (actionType: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void,\n private _onHierarchyLimitExceeded: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void,\n nodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n seed?: TreeModel,\n ) {\n this._loader = new NoopTreeLoader();\n this._nodeIdFactory = nodeIdFactory ?? createNodeId;\n this._currentModel = seed ?? {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: { id: undefined, nodeData: undefined },\n };\n\n this._nodeLoader = this.createNodeLoader();\n }\n\n private createNodeLoader() {\n const subject = new Subject<LoadDebouncedNodesOptions>();\n subject\n .pipe(\n groupBy((item) => item.parentId),\n mergeMap((group) =>\n group.pipe(\n buffer(group.pipe(debounceTime(0))),\n map((groupArr) => {\n let returnIndex = groupArr.length - 1;\n\n groupArr.forEach((member, index) => {\n if (member.discardState) {\n returnIndex = index;\n }\n });\n\n groupArr.forEach((member, index) => {\n if (index === returnIndex) {\n return;\n }\n member.timeTracker?.[Symbol.dispose];\n member.onComplete();\n });\n return groupArr[returnIndex];\n }),\n switchMap((props) =>\n this._loader.loadNodes(props.loadOptions).pipe(\n collectTreePartsUntil(this._reset, props.initialRootNode),\n tap({\n next: (newModel: TreeModel) => {\n const parentNode = props.parentId ? newModel.idToNode.get(props.parentId) : newModel.rootNode;\n this.handleLoadedHierarchy(props.parentId, newModel);\n // only report load duration if children were loaded\n if (!(parentNode && parentNode.error)) {\n props.timeTracker?.finish();\n }\n },\n complete: () => {\n this.onLoadingComplete(props.parentId);\n props.timeTracker?.[Symbol.dispose]();\n props.onComplete();\n },\n }),\n ),\n ),\n ),\n ),\n )\n .subscribe();\n\n return subject;\n }\n\n private updateTreeModel(updater: (model: Draft<TreeModel>) => void) {\n const newModel = produce(this._currentModel, updater);\n if (this._currentModel === newModel) {\n return;\n }\n\n this._currentModel = newModel;\n this._onModelChanged(this._currentModel);\n }\n\n private handleLoadedHierarchy(parentId: string | undefined, loadedHierarchy: TreeModel) {\n this.updateTreeModel((model) => {\n TreeModel.addHierarchyPart(model, parentId, loadedHierarchy);\n });\n }\n\n private onLoadingComplete(parentId: string | undefined) {\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, parentId, false);\n });\n }\n\n private getLoadAction(parentId: string | undefined) {\n return this._currentModel.idToNode.size === 0\n ? \"initial-load\"\n : parentId === undefined\n ? \"reload\"\n : \"hierarchy-level-load\";\n }\n\n private loadSubTree(options: LoadNodesOptions, initialRootNode?: TreeModelRootNode, discardState?: boolean) {\n const loadAction = this.getLoadAction(options.parent.id);\n const timeTracker = new TimeTracker((time) => this._onLoad(loadAction, time));\n\n return {\n complete: new Promise<void>((resolve) => {\n this._nodeLoader.next({\n loadOptions: options,\n onComplete: resolve,\n timeTracker,\n parentId: options.parent.id,\n initialRootNode,\n discardState,\n });\n }),\n };\n }\n\n private loadNodes(parentId: string, ignoreCache?: boolean) {\n const parentNode = this._currentModel.idToNode.get(parentId);\n if (!parentNode) {\n return { complete: Promise.resolve() };\n }\n return this.loadSubTree({\n parent: parentNode,\n getHierarchyLevelOptions: (node) =>\n createHierarchyLevelOptions(this._currentModel, getNonGroupedParentId(node, this._nodeIdFactory)),\n shouldLoadChildren: (node) => !!node.nodeData.autoExpand,\n ignoreCache,\n });\n }\n\n private reloadSubTree(\n parentId: string | undefined,\n oldModel: TreeModel,\n options?: { discardState?: boolean; ignoreCache?: boolean },\n ) {\n const currModel = this._currentModel;\n const expandedNodes = !!options?.discardState\n ? []\n : collectNodes(parentId, oldModel, (node) => node.isExpanded === true);\n const collapsedNodes = !!options?.discardState\n ? []\n : collectNodes(parentId, oldModel, (node) => node.isExpanded === false);\n const getHierarchyLevelOptions = (node: TreeModelRootNode | TreeModelHierarchyNode) => {\n if (!!options?.discardState) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n const filteredNodeId = getNonGroupedParentId(node, this._nodeIdFactory);\n return createHierarchyLevelOptions(filteredNodeId === parentId ? currModel : oldModel, filteredNodeId);\n };\n const shouldLoadChildren = (node: TreeModelHierarchyNode) => {\n if (expandedNodes.findIndex((expandedNode) => sameNodes(expandedNode.nodeData, node.nodeData)) !== -1) {\n return true;\n }\n if (collapsedNodes.findIndex((collapsedNode) => sameNodes(collapsedNode.nodeData, node.nodeData)) !== -1) {\n return false;\n }\n return !!node.nodeData.autoExpand;\n };\n const buildNode = (node: TreeModelHierarchyNode) =>\n !!options?.discardState || node.id === parentId ? node : addAttributes(node, oldModel);\n\n const rootNode = parentId !== undefined ? this.getNode(parentId) : currModel.rootNode;\n if (!rootNode) {\n return { complete: Promise.resolve() };\n }\n\n if (parentId === undefined) {\n // cancel all ongoing requests\n this._reset.next();\n }\n\n return this.loadSubTree(\n { parent: rootNode, getHierarchyLevelOptions, shouldLoadChildren, buildNode, ignoreCache: options?.ignoreCache },\n !!options?.discardState ? undefined : { ...currModel.rootNode },\n options?.discardState,\n );\n }\n\n public reset() {\n this._reset.next();\n }\n\n public setHierarchyProvider(provider?: HierarchyProvider) {\n this._loader = provider\n ? new TreeLoader(\n provider,\n this._onHierarchyLimitExceeded,\n ({ parentId, type, error }) => {\n if (type === \"timeout\") {\n const loadAction = this.getLoadAction(parentId);\n this._onLoad(loadAction, Number.MAX_SAFE_INTEGER);\n }\n this._onHierarchyLoadError({ parentId, type, error });\n },\n this._nodeIdFactory,\n )\n : new NoopTreeLoader();\n }\n\n public getNode(nodeId: string | undefined): TreeModelHierarchyNode | TreeModelRootNode | undefined {\n return TreeModel.getNode(this._currentModel, nodeId);\n }\n\n public selectNodes(nodeIds: Array<string>, changeType: SelectionChangeType) {\n this.updateTreeModel((model) => {\n TreeModel.selectNodes(model, nodeIds, changeType);\n });\n }\n\n public expandNode(nodeId: string, isExpanded: boolean) {\n let childrenAction = \"none\" as ReturnType<typeof TreeModel.expandNode>;\n this.updateTreeModel((model) => {\n childrenAction = TreeModel.expandNode(model, nodeId, isExpanded);\n });\n\n if (childrenAction === \"none\") {\n return { complete: Promise.resolve() };\n }\n\n return this.loadNodes(nodeId, childrenAction === \"reloadChildren\");\n }\n\n public setHierarchyLimit(nodeId: string | undefined, limit?: number | \"unbounded\") {\n const oldModel = this._currentModel;\n let loadChildren = false as boolean;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setHierarchyLimit(model, nodeId, limit);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public setInstanceFilter(nodeId: string | undefined, filter?: GenericInstanceFilter) {\n const oldModel = this._currentModel;\n let loadChildren = false as boolean;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setInstanceFilter(model, nodeId, filter);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public reloadTree(options?: { parentNodeId?: string; state?: \"keep\" | \"discard\" | \"reset\" }) {\n const oldModel = this._currentModel;\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, options?.parentNodeId, true);\n if (options?.state === \"reset\") {\n TreeModel.removeSubTree(model, options.parentNodeId);\n }\n });\n\n const discardState = options?.state === \"discard\" || options?.state === \"reset\";\n const ignoreCache = options?.state === \"reset\";\n return this.reloadSubTree(options?.parentNodeId, oldModel, { discardState, ignoreCache });\n }\n}\n\nfunction collectTreePartsUntil(untilNotifier: Observable<void>, rootNode?: TreeModelRootNode) {\n return (source: Observable<LoadedTreePart>) =>\n source.pipe(\n reduce<LoadedTreePart, TreeModel>(\n (treeModel, loadedPart) => {\n addTreePartToModel(treeModel, loadedPart);\n return treeModel;\n },\n {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: rootNode ?? { id: undefined, nodeData: undefined },\n },\n ),\n takeUntil(untilNotifier),\n );\n}\n\nfunction addTreePartToModel(treeModel: TreeModel, loadedPart: LoadedTreePart) {\n if (\"loadedNodes\" in loadedPart) {\n addNodesToModel(treeModel, loadedPart);\n } else {\n addErrorToModel(treeModel, loadedPart);\n }\n}\n\nfunction addErrorToModel(\n model: TreeModel,\n loadedPart: { parent: TreeModelHierarchyNode | TreeModelRootNode; error: ErrorInfo },\n) {\n if (loadedPart.parent.id === undefined) {\n model.rootNode.error = loadedPart.error;\n } else {\n model.idToNode.set(loadedPart.parent.id, { ...loadedPart.parent, error: loadedPart.error });\n }\n}\n\nfunction addNodesToModel(\n model: TreeModel,\n loadedPart: { parent: TreeModelHierarchyNode | TreeModelRootNode; loadedNodes: TreeModelHierarchyNode[] },\n) {\n model.parentChildMap.set(\n loadedPart.parent.id,\n loadedPart.loadedNodes.map((node) => node.id),\n );\n for (const node of loadedPart.loadedNodes) {\n model.idToNode.set(node.id, node);\n }\n const parentNode = loadedPart.parent.id ? model.idToNode.get(loadedPart.parent.id) : undefined;\n if (parentNode && loadedPart.loadedNodes.length !== 0) {\n parentNode.isExpanded = true;\n }\n}\n\nfunction addAttributes(node: TreeModelHierarchyNode, oldModel: TreeModel) {\n const oldNode = oldModel.idToNode.get(node.id);\n if (oldNode) {\n node.hierarchyLimit = oldNode.hierarchyLimit;\n node.instanceFilter = oldNode.instanceFilter;\n node.isSelected = oldNode.isSelected;\n }\n return node;\n}\n\nfunction collectNodes(\n parentId: string | undefined,\n model: TreeModel,\n pred: (node: TreeModelHierarchyNode) => boolean,\n): TreeModelHierarchyNode[] {\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return [];\n }\n\n if (parentId === undefined) {\n return currentChildren.flatMap((child) => collectNodes(child, model, pred));\n }\n\n const currNode = model.idToNode.get(parentId);\n if (!currNode || !pred(currNode)) {\n return [];\n }\n\n return [currNode, ...currentChildren.flatMap((child) => collectNodes(child, model, pred))];\n}\n\nfunction getNonGroupedParentId(\n node: TreeModelHierarchyNode | TreeModelRootNode,\n nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n) {\n if (!node.nodeData || !HierarchyNode.isGroupingNode(node.nodeData)) {\n return node.id;\n }\n\n if (!node.nodeData.nonGroupingAncestor) {\n return undefined;\n }\n\n return nodeIdFactory(node.nodeData.nonGroupingAncestor);\n}\n\nfunction createHierarchyLevelOptions(model: TreeModel, nodeId: string | undefined): HierarchyLevelOptions {\n if (nodeId === undefined) {\n return { instanceFilter: model.rootNode.instanceFilter, hierarchyLevelSizeLimit: model.rootNode.hierarchyLimit };\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n return { instanceFilter: modelNode.instanceFilter, hierarchyLevelSizeLimit: modelNode.hierarchyLimit };\n}\n\nclass NoopTreeLoader implements ITreeLoader {\n public loadNodes(): Observable<LoadedTreePart> {\n return EMPTY;\n }\n}\n\nclass TimeTracker {\n private _start: number;\n private _stopped: boolean = false;\n\n constructor(private _onFinish: (time: number) => void) {\n this._start = Date.now();\n }\n\n public [Symbol.dispose]() {\n this._stopped = true;\n }\n\n public finish() {\n if (this._stopped) {\n return;\n }\n\n this._stopped = true;\n const elapsedTime = Date.now() - this._start;\n this._onFinish(elapsedTime);\n }\n}\n"],"mappings":"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"}
@@ -3,6 +3,9 @@ import { EMPTY, catchError, expand, filter, from, map, mergeMap, of, toArray } f
3
3
  //#region src/presentation-hierarchies-react/internal/TreeLoader.ts
4
4
  /** @internal */
5
5
  var TreeLoader = class {
6
+ _hierarchyProvider;
7
+ _onHierarchyLimitExceeded;
8
+ _onHierarchyLoadError;
6
9
  _treeNodeIdFactory;
7
10
  constructor(_hierarchyProvider, _onHierarchyLimitExceeded, _onHierarchyLoadError, treeNodeIdFactory) {
8
11
  this._hierarchyProvider = _hierarchyProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"TreeLoader.js","names":["catchError","EMPTY","expand","filter","from","map","mergeMap","of","toArray","createNodeId","Observable","GenericInstanceFilter","HierarchyNode","HierarchyProvider","RowsLimitExceededError","ErrorInfo","TreeModelHierarchyNode","TreeModelRootNode","LoadedTreePart","parent","loadedNodes","error","HierarchyLevelOptions","instanceFilter","hierarchyLevelSizeLimit","LoadNodesOptions","getHierarchyLevelOptions","node","shouldLoadChildren","buildNode","ignoreCache","ITreeLoader","loadNodes","options","TreeLoader","_treeNodeIdFactory","Pick","constructor","_hierarchyProvider","_onHierarchyLimitExceeded","props","parentId","limit","_onHierarchyLoadError","type","treeNodeIdFactory","loadChildren","Omit","infoNodeIdBase","id","treeModelNodesFactory","createTreeModelNodesFactory","getNodes","parentNode","nodeData","pipe","childNodes","length","const","err","hierarchyLoadErrorType","Error","isRowsLimitError","message","resultSetSizeLimit","isTimeoutError","loadedPart","modelNode","children","label","includes"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { catchError, EMPTY, expand, filter, from, map, mergeMap, of, toArray } from \"rxjs\";\nimport { createNodeId } from \"./Utils.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type {\n GenericInstanceFilter,\n HierarchyNode,\n HierarchyProvider,\n RowsLimitExceededError,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./TreeModel.js\";\n\n/** @internal */\nexport type LoadedTreePart = { parent: TreeModelHierarchyNode | TreeModelRootNode } & (\n | { loadedNodes: TreeModelHierarchyNode[] }\n | { error: ErrorInfo }\n);\n\n/** @internal */\nexport interface HierarchyLevelOptions {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n}\n\n/** @internal */\nexport interface LoadNodesOptions {\n parent: TreeModelHierarchyNode | TreeModelRootNode;\n getHierarchyLevelOptions: (node: TreeModelRootNode | TreeModelHierarchyNode) => HierarchyLevelOptions;\n shouldLoadChildren: (node: TreeModelHierarchyNode) => boolean;\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n ignoreCache?: boolean;\n}\n\n/** @internal */\nexport interface ITreeLoader {\n loadNodes(options: LoadNodesOptions): Observable<LoadedTreePart>;\n}\n\n/** @internal */\nexport class TreeLoader implements ITreeLoader {\n private _treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n\n constructor(\n private _hierarchyProvider: HierarchyProvider,\n private _onHierarchyLimitExceeded: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void,\n treeNodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n ) {\n this._treeNodeIdFactory = treeNodeIdFactory ?? createNodeId;\n }\n\n private loadChildren({\n parent,\n getHierarchyLevelOptions,\n buildNode,\n ignoreCache,\n }: Omit<LoadNodesOptions, \"shouldLoadChildren\">) {\n const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent);\n const infoNodeIdBase = `${parent.id ?? \"<root>\"}`;\n const treeModelNodesFactory = createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory: this._treeNodeIdFactory,\n });\n return from(\n this._hierarchyProvider.getNodes({\n parentNode: parent.nodeData,\n hierarchyLevelSizeLimit,\n instanceFilter,\n ignoreCache,\n }),\n ).pipe(\n toArray(),\n map((childNodes): LoadedTreePart => {\n return instanceFilter && childNodes.length === 0\n ? { parent, error: { id: `${infoNodeIdBase}-no-filter-matches`, type: \"NoFilterMatches\" as const } }\n : { parent, loadedNodes: childNodes.map(treeModelNodesFactory) };\n }),\n catchError((err) => {\n let hierarchyLoadErrorType: \"unknown\" | \"timeout\" = \"unknown\";\n if (err instanceof Error) {\n if (isRowsLimitError(err)) {\n this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });\n return of({\n parent,\n error: {\n id: `${infoNodeIdBase}-${err.message}`,\n type: \"ResultSetTooLarge\" as const,\n resultSetSizeLimit: err.limit,\n },\n });\n }\n if (isTimeoutError(err)) {\n hierarchyLoadErrorType = \"timeout\";\n }\n }\n\n this._onHierarchyLoadError({ parentId: parent.id, type: hierarchyLoadErrorType, error: err });\n return of({\n parent,\n error: {\n id: `${infoNodeIdBase}-ChildrenLoad`,\n type: \"ChildrenLoad\" as const,\n message: \"Failed to create hierarchy level\",\n },\n });\n }),\n );\n }\n\n public loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions) {\n return this.loadChildren(options).pipe(\n expand((loadedPart) =>\n \"loadedNodes\" in loadedPart\n ? from(loadedPart.loadedNodes).pipe(\n filter((node) => shouldLoadChildren(node)),\n mergeMap((node) => this.loadChildren({ ...options, parent: node })),\n )\n : EMPTY,\n ),\n );\n }\n}\n\nfunction createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory,\n}: {\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n}): (node: HierarchyNode) => TreeModelHierarchyNode {\n return (node: HierarchyNode) => {\n const modelNode: TreeModelHierarchyNode = {\n id: treeNodeIdFactory(node),\n children: node.children,\n label: node.label,\n nodeData: node,\n };\n return buildNode ? buildNode(modelNode) : modelNode;\n };\n}\n\nfunction isRowsLimitError(error: Error): error is RowsLimitExceededError {\n return \"limit\" in error && error.message.includes(\"Query rows limit of\");\n}\n\nfunction isTimeoutError(error: Error) {\n return error.message.includes(\"query too long to execute or server is too busy\");\n}\n"],"mappings":";;;;AA6CA,IAAakC,aAAb,MAA+C;CAC7C;CAEAG,YACE,oBACA,2BAKA,uBACAQ,mBACA;AARQP,OAAAA,qBAAAA;AACAC,OAAAA,4BAAAA;AAKAI,OAAAA,wBAAAA;AAGR,OAAKR,qBAAqBU,qBAAqBpC;;CAGjD,aAAqB,EACnBU,QACAO,0BACAG,WACAC,eAC+C;EAC/C,MAAM,EAAEP,gBAAgBC,4BAA4BE,yBAAyBP,OAAO;EACpF,MAAM6B,iBAAiB,GAAG7B,OAAO8B,MAAM;EACvC,MAAMC,wBAAwBC,4BAA4B;GACxDtB;GACAgB,mBAAmB,KAAKV;GACzB,CAAC;AACF,SAAO/B,KACL,KAAKkC,mBAAmBc,SAAS;GAC/BC,YAAYlC,OAAOmC;GACnB9B;GACAD;GACAO;GACD,CACH,CAAC,CAACyB,KACA/C,SAAS,EACTH,KAAKmD,eAA+B;AAClC,UAAOjC,kBAAkBiC,WAAWC,WAAW,IAC3C;IAAEtC;IAAQE,OAAO;KAAE4B,IAAI,GAAGD,eAAc;KAAsBJ,MAAM;KAA2B;IAAG,GAClG;IAAEzB;IAAQC,aAAaoC,WAAWnD,IAAI6C,sBAAqB;IAAG;IAClE,EACFlD,YAAY2D,QAAQ;GAClB,IAAIC,yBAAgD;AACpD,OAAID,eAAeE,OAAO;AACxB,QAAIC,iBAAiBH,IAAI,EAAE;AACzB,UAAKpB,0BAA0B;MAAEE,UAAUtB,OAAO8B;MAAI9C,QAAQoB;MAAgBmB,OAAOiB,IAAIjB;MAAO,CAAC;AACjG,YAAOnC,GAAG;MACRY;MACAE,OAAO;OACL4B,IAAI,GAAGD,eAAc,GAAIW,IAAII;OAC7BnB,MAAM;OACNoB,oBAAoBL,IAAIjB;OAC1B;MACD,CAAC;;AAEJ,QAAIuB,eAAeN,IAAI,CACrBC,0BAAyB;;AAI7B,QAAKjB,sBAAsB;IAAEF,UAAUtB,OAAO8B;IAAIL,MAAMgB;IAAwBvC,OAAOsC;IAAK,CAAC;AAC7F,UAAOpD,GAAG;IACRY;IACAE,OAAO;KACL4B,IAAI,GAAGD,eAAc;KACrBJ,MAAM;KACNmB,SAAS;KACX;IACD,CAAC;IAEN,CAAC;;CAGH,UAAiB,EAAEnC,oBAAoB,GAAGK,WAA6B;AACrE,SAAO,KAAKa,aAAab,QAAQ,CAACsB,KAChCrD,QAAQgE,eACN,iBAAiBA,aACb9D,KAAK8D,WAAW9C,YAAY,CAACmC,KAC3BpD,QAAQwB,SAASC,mBAAmBD,KAAK,CAAC,EAC1CrB,UAAUqB,SAAS,KAAKmB,aAAa;GAAE,GAAGb;GAASd,QAAQQ;GAAM,CAAC,CACpE,CAAC,GACD1B,MAER,CAAC;;;AAIL,SAASkD,4BAA4B,EACnCtB,WACAgB,qBAIkD;AAClD,SAAQlB,SAAwB;EAC9B,MAAMwC,YAAoC;GACxClB,IAAIJ,kBAAkBlB,KAAK;GAC3ByC,UAAUzC,KAAKyC;GACfC,OAAO1C,KAAK0C;GACZf,UAAU3B;GACX;AACD,SAAOE,YAAYA,UAAUsC,UAAU,GAAGA;;;AAI9C,SAASL,iBAAiBzC,OAA+C;AACvE,QAAO,WAAWA,SAASA,MAAM0C,QAAQO,SAAS,sBAAsB;;AAG1E,SAASL,eAAe5C,OAAc;AACpC,QAAOA,MAAM0C,QAAQO,SAAS,kDAAkD"}
1
+ {"version":3,"file":"TreeLoader.js","names":["catchError","EMPTY","expand","filter","from","map","mergeMap","of","toArray","createNodeId","Observable","GenericInstanceFilter","HierarchyNode","HierarchyProvider","RowsLimitExceededError","ErrorInfo","TreeModelHierarchyNode","TreeModelRootNode","LoadedTreePart","parent","loadedNodes","error","HierarchyLevelOptions","instanceFilter","hierarchyLevelSizeLimit","LoadNodesOptions","getHierarchyLevelOptions","node","shouldLoadChildren","buildNode","ignoreCache","ITreeLoader","loadNodes","options","TreeLoader","_treeNodeIdFactory","Pick","constructor","_hierarchyProvider","_onHierarchyLimitExceeded","props","parentId","limit","_onHierarchyLoadError","type","treeNodeIdFactory","loadChildren","Omit","infoNodeIdBase","id","treeModelNodesFactory","createTreeModelNodesFactory","getNodes","parentNode","nodeData","pipe","childNodes","length","const","err","hierarchyLoadErrorType","Error","isRowsLimitError","message","resultSetSizeLimit","isTimeoutError","loadedPart","modelNode","children","label","includes"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { catchError, EMPTY, expand, filter, from, map, mergeMap, of, toArray } from \"rxjs\";\nimport { createNodeId } from \"./Utils.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type {\n GenericInstanceFilter,\n HierarchyNode,\n HierarchyProvider,\n RowsLimitExceededError,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./TreeModel.js\";\n\n/** @internal */\nexport type LoadedTreePart = { parent: TreeModelHierarchyNode | TreeModelRootNode } & (\n | { loadedNodes: TreeModelHierarchyNode[] }\n | { error: ErrorInfo }\n);\n\n/** @internal */\nexport interface HierarchyLevelOptions {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n}\n\n/** @internal */\nexport interface LoadNodesOptions {\n parent: TreeModelHierarchyNode | TreeModelRootNode;\n getHierarchyLevelOptions: (node: TreeModelRootNode | TreeModelHierarchyNode) => HierarchyLevelOptions;\n shouldLoadChildren: (node: TreeModelHierarchyNode) => boolean;\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n ignoreCache?: boolean;\n}\n\n/** @internal */\nexport interface ITreeLoader {\n loadNodes(options: LoadNodesOptions): Observable<LoadedTreePart>;\n}\n\n/** @internal */\nexport class TreeLoader implements ITreeLoader {\n private _treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n\n constructor(\n private _hierarchyProvider: HierarchyProvider,\n private _onHierarchyLimitExceeded: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void,\n treeNodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n ) {\n this._treeNodeIdFactory = treeNodeIdFactory ?? createNodeId;\n }\n\n private loadChildren({\n parent,\n getHierarchyLevelOptions,\n buildNode,\n ignoreCache,\n }: Omit<LoadNodesOptions, \"shouldLoadChildren\">) {\n const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent);\n const infoNodeIdBase = `${parent.id ?? \"<root>\"}`;\n const treeModelNodesFactory = createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory: this._treeNodeIdFactory,\n });\n return from(\n this._hierarchyProvider.getNodes({\n parentNode: parent.nodeData,\n hierarchyLevelSizeLimit,\n instanceFilter,\n ignoreCache,\n }),\n ).pipe(\n toArray(),\n map((childNodes): LoadedTreePart => {\n return instanceFilter && childNodes.length === 0\n ? { parent, error: { id: `${infoNodeIdBase}-no-filter-matches`, type: \"NoFilterMatches\" as const } }\n : { parent, loadedNodes: childNodes.map(treeModelNodesFactory) };\n }),\n catchError((err) => {\n let hierarchyLoadErrorType: \"unknown\" | \"timeout\" = \"unknown\";\n if (err instanceof Error) {\n if (isRowsLimitError(err)) {\n this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });\n return of({\n parent,\n error: {\n id: `${infoNodeIdBase}-${err.message}`,\n type: \"ResultSetTooLarge\" as const,\n resultSetSizeLimit: err.limit,\n },\n });\n }\n if (isTimeoutError(err)) {\n hierarchyLoadErrorType = \"timeout\";\n }\n }\n\n this._onHierarchyLoadError({ parentId: parent.id, type: hierarchyLoadErrorType, error: err });\n return of({\n parent,\n error: {\n id: `${infoNodeIdBase}-ChildrenLoad`,\n type: \"ChildrenLoad\" as const,\n message: \"Failed to create hierarchy level\",\n },\n });\n }),\n );\n }\n\n public loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions) {\n return this.loadChildren(options).pipe(\n expand((loadedPart) =>\n \"loadedNodes\" in loadedPart\n ? from(loadedPart.loadedNodes).pipe(\n filter((node) => shouldLoadChildren(node)),\n mergeMap((node) => this.loadChildren({ ...options, parent: node })),\n )\n : EMPTY,\n ),\n );\n }\n}\n\nfunction createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory,\n}: {\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n}): (node: HierarchyNode) => TreeModelHierarchyNode {\n return (node: HierarchyNode) => {\n const modelNode: TreeModelHierarchyNode = {\n id: treeNodeIdFactory(node),\n children: node.children,\n label: node.label,\n nodeData: node,\n };\n return buildNode ? buildNode(modelNode) : modelNode;\n };\n}\n\nfunction isRowsLimitError(error: Error): error is RowsLimitExceededError {\n return \"limit\" in error && error.message.includes(\"Query rows limit of\");\n}\n\nfunction isTimeoutError(error: Error) {\n return error.message.includes(\"query too long to execute or server is too busy\");\n}\n"],"mappings":";;;;AA6CA,IAAakC,aAAb,MAA+C;CAInCI;CACAC;CAKAI;CATV;CAEAN,YACE,oBACA,2BAKA,uBACAQ,mBACA;EARQP,KAAAA,qBAAAA;EACAC,KAAAA,4BAAAA;EAKAI,KAAAA,wBAAAA;EAGR,KAAKR,qBAAqBU,qBAAqBpC;CACjD;CAEA,aAAqB,EACnBU,QACAO,0BACAG,WACAC,eAC+C;EAC/C,MAAM,EAAEP,gBAAgBC,4BAA4BE,yBAAyBP,MAAM;EACnF,MAAM6B,iBAAiB,GAAG7B,OAAO8B,MAAM;EACvC,MAAMC,wBAAwBC,4BAA4B;GACxDtB;GACAgB,mBAAmB,KAAKV;EAC1B,CAAC;EACD,OAAO/B,KACL,KAAKkC,mBAAmBc,SAAS;GAC/BC,YAAYlC,OAAOmC;GACnB9B;GACAD;GACAO;EACF,CAAC,CACH,CAAC,CAACyB,KACA/C,QAAQ,GACRH,KAAKmD,eAA+B;GAClC,OAAOjC,kBAAkBiC,WAAWC,WAAW,IAC3C;IAAEtC;IAAQE,OAAO;KAAE4B,IAAI,GAAGD,eAAc;KAAsBJ,MAAM;IAA2B;GAAE,IACjG;IAAEzB;IAAQC,aAAaoC,WAAWnD,IAAI6C,qBAAqB;GAAE;EACnE,CAAC,GACDlD,YAAY2D,QAAQ;GAClB,IAAIC,yBAAgD;GACpD,IAAID,eAAeE,OAAO;IACxB,IAAIC,iBAAiBH,GAAG,GAAG;KACzB,KAAKpB,0BAA0B;MAAEE,UAAUtB,OAAO8B;MAAI9C,QAAQoB;MAAgBmB,OAAOiB,IAAIjB;KAAM,CAAC;KAChG,OAAOnC,GAAG;MACRY;MACAE,OAAO;OACL4B,IAAI,GAAGD,eAAc,GAAIW,IAAII;OAC7BnB,MAAM;OACNoB,oBAAoBL,IAAIjB;MAC1B;KACF,CAAC;IACH;IACA,IAAIuB,eAAeN,GAAG,GACpBC,yBAAyB;GAE7B;GAEA,KAAKjB,sBAAsB;IAAEF,UAAUtB,OAAO8B;IAAIL,MAAMgB;IAAwBvC,OAAOsC;GAAI,CAAC;GAC5F,OAAOpD,GAAG;IACRY;IACAE,OAAO;KACL4B,IAAI,GAAGD,eAAc;KACrBJ,MAAM;KACNmB,SAAS;IACX;GACF,CAAC;EACH,CAAC,CACH;CACF;CAEA,UAAiB,EAAEnC,oBAAoB,GAAGK,WAA6B;EACrE,OAAO,KAAKa,aAAab,OAAO,CAAC,CAACsB,KAChCrD,QAAQgE,eACN,iBAAiBA,aACb9D,KAAK8D,WAAW9C,WAAW,CAAC,CAACmC,KAC3BpD,QAAQwB,SAASC,mBAAmBD,IAAI,CAAC,GACzCrB,UAAUqB,SAAS,KAAKmB,aAAa;GAAE,GAAGb;GAASd,QAAQQ;EAAK,CAAC,CAAC,CACpE,IACA1B,KACN,CACF;CACF;AACF;AAEA,SAASkD,4BAA4B,EACnCtB,WACAgB,qBAIkD;CAClD,QAAQlB,SAAwB;EAC9B,MAAMwC,YAAoC;GACxClB,IAAIJ,kBAAkBlB,IAAI;GAC1ByC,UAAUzC,KAAKyC;GACfC,OAAO1C,KAAK0C;GACZf,UAAU3B;EACZ;EACA,OAAOE,YAAYA,UAAUsC,SAAS,IAAIA;CAC5C;AACF;AAEA,SAASL,iBAAiBzC,OAA+C;CACvE,OAAO,WAAWA,SAASA,MAAM0C,QAAQO,SAAS,qBAAqB;AACzE;AAEA,SAASL,eAAe5C,OAAc;CACpC,OAAOA,MAAM0C,QAAQO,SAAS,iDAAiD;AACjF"}
@@ -1 +1,3 @@
1
+ import "../TreeNode.js";
2
+ import "../UseSelectionHandler.js";
1
3
  import { GenericInstanceFilter, HierarchyNode } from "@itwin/presentation-hierarchies";
@@ -1 +1 @@
1
- {"version":3,"file":"TreeModel.js","names":["GenericInstanceFilter","HierarchyNode","ErrorInfo","SelectionChangeType","TreeModelRootNode","id","nodeData","hierarchyLimit","instanceFilter","isLoading","error","TreeModelHierarchyNode","label","children","isExpanded","isSelected","TreeModel","parentChildMap","Map","idToNode","rootNode","expandNode","model","nodeId","node","get","type","removeSubTree","addHierarchyPart","rootId","hierarchyPart","parentId","set","parentNode","undefined","clearNodeError","currentChildren","delete","childId","childNode","setHierarchyLimit","limit","updateForReload","setInstanceFilter","filter","selectNodes","nodeIds","Array","changeType","find","modelNode","isNodeSelected","currentNode","getNode","setIsLoading","update"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeModel.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport type { GenericInstanceFilter, HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { SelectionChangeType } from \"../UseSelectionHandler.js\";\n\n/** @internal */\nexport interface TreeModelRootNode {\n id: undefined;\n nodeData: undefined;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n isLoading?: boolean;\n error?: ErrorInfo;\n}\n\n/** @internal */\nexport interface TreeModelHierarchyNode {\n id: string;\n nodeData: HierarchyNode;\n label: string;\n children: boolean;\n isLoading?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n error?: ErrorInfo;\n}\n\n/** @internal */\nexport interface TreeModel {\n parentChildMap: Map<string | undefined, string[]>;\n idToNode: Map<string, TreeModelHierarchyNode>;\n rootNode: TreeModelRootNode;\n}\n\n/** @internal */\nexport namespace TreeModel {\n export function expandNode(\n model: TreeModel,\n nodeId: string,\n isExpanded: boolean,\n ): \"none\" | \"loadChildren\" | \"reloadChildren\" {\n const node = model.idToNode.get(nodeId);\n if (!node) {\n return \"none\";\n }\n\n node.isExpanded = isExpanded;\n if (!isExpanded) {\n return \"none\";\n }\n\n if (node.error?.type === \"ChildrenLoad\") {\n node.isLoading = true;\n // remove subtree if there `ChildrenLoad` error info in order to attempt reloading children\n TreeModel.removeSubTree(model, nodeId);\n return \"reloadChildren\";\n }\n\n if (!node.children) {\n return \"none\";\n }\n\n const children = model.parentChildMap.get(node.id);\n if (!children) {\n node.isLoading = true;\n return \"loadChildren\";\n }\n\n return \"none\";\n }\n\n /** @internal */\n export function addHierarchyPart(model: TreeModel, rootId: string | undefined, hierarchyPart: TreeModel): void {\n removeSubTree(model, rootId);\n model.rootNode.error = hierarchyPart.rootNode.error;\n\n for (const [parentId, children] of hierarchyPart.parentChildMap) {\n model.parentChildMap.set(parentId, children);\n }\n\n for (const [nodeId, node] of hierarchyPart.idToNode) {\n model.idToNode.set(nodeId, node);\n }\n\n const parentNode = rootId !== undefined ? model.idToNode.get(rootId) : model.rootNode;\n if (!parentNode) {\n return;\n }\n parentNode.isLoading = false;\n }\n\n export function removeSubTree(model: TreeModel, parentId: string | undefined): void {\n clearNodeError(model, parentId);\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return;\n }\n model.parentChildMap.delete(parentId);\n\n for (const childId of currentChildren) {\n const childNode = model.idToNode.get(childId);\n if (childNode) {\n removeSubTree(model, childNode.id);\n }\n model.idToNode.delete(childId);\n }\n }\n\n export function setHierarchyLimit(\n model: TreeModel,\n nodeId: string | undefined,\n limit?: number | \"unbounded\",\n ): boolean {\n return updateForReload(model, nodeId, (node) => {\n node.hierarchyLimit = limit;\n });\n }\n\n export function setInstanceFilter(\n model: TreeModel,\n nodeId: string | undefined,\n filter?: GenericInstanceFilter,\n ): boolean {\n return updateForReload(model, nodeId, (node) => {\n if (filter && node.id !== undefined) {\n node.isExpanded = true;\n }\n node.instanceFilter = filter;\n });\n }\n\n export function selectNodes(model: TreeModel, nodeIds: Array<string>, changeType: SelectionChangeType) {\n if (changeType === \"replace\") {\n for (const [nodeId, node] of model.idToNode) {\n node.isSelected = !!nodeIds.find((id) => id === nodeId);\n }\n return;\n }\n for (const nodeId of nodeIds) {\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return;\n }\n modelNode.isSelected = changeType === \"add\";\n }\n }\n\n export function isNodeSelected(model: TreeModel, nodeId: string): boolean {\n const currentNode = model.idToNode.get(nodeId);\n return !!currentNode && !!currentNode.isSelected;\n }\n\n export function getNode(\n model: TreeModel,\n nodeId: string | undefined,\n ): TreeModelHierarchyNode | TreeModelRootNode | undefined {\n if (!nodeId) {\n return model.rootNode;\n }\n return model.idToNode.get(nodeId);\n }\n\n export function setIsLoading(model: TreeModel, nodeId: string | undefined, isLoading: boolean) {\n if (nodeId === undefined) {\n model.rootNode.isLoading = isLoading;\n return;\n }\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return;\n }\n modelNode.isLoading = isLoading;\n }\n}\n\nfunction updateForReload(\n model: TreeModel,\n nodeId: string | undefined,\n update: (node: TreeModelHierarchyNode | TreeModelRootNode) => void,\n) {\n TreeModel.removeSubTree(model, nodeId);\n if (nodeId === undefined) {\n update(model.rootNode);\n model.rootNode.isLoading = true;\n return true;\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return false;\n }\n\n update(modelNode);\n if (modelNode.isExpanded) {\n modelNode.isLoading = true;\n return true;\n }\n return false;\n}\n\nfunction clearNodeError(model: TreeModel, parentId: string | undefined) {\n const node = !parentId ? model.rootNode : model.idToNode.get(parentId);\n if (node) {\n node.error = undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TreeModel.js","names":["GenericInstanceFilter","HierarchyNode","ErrorInfo","SelectionChangeType","TreeModelRootNode","id","nodeData","hierarchyLimit","instanceFilter","isLoading","error","TreeModelHierarchyNode","label","children","isExpanded","isSelected","TreeModel","parentChildMap","Map","idToNode","rootNode","expandNode","model","nodeId","node","get","type","removeSubTree","addHierarchyPart","rootId","hierarchyPart","parentId","set","parentNode","undefined","clearNodeError","currentChildren","delete","childId","childNode","setHierarchyLimit","limit","updateForReload","setInstanceFilter","filter","selectNodes","nodeIds","Array","changeType","find","modelNode","isNodeSelected","currentNode","getNode","setIsLoading","update"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeModel.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport type { GenericInstanceFilter, HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { SelectionChangeType } from \"../UseSelectionHandler.js\";\n\n/** @internal */\nexport interface TreeModelRootNode {\n id: undefined;\n nodeData: undefined;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n isLoading?: boolean;\n error?: ErrorInfo;\n}\n\n/** @internal */\nexport interface TreeModelHierarchyNode {\n id: string;\n nodeData: HierarchyNode;\n label: string;\n children: boolean;\n isLoading?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n error?: ErrorInfo;\n}\n\n/** @internal */\nexport interface TreeModel {\n parentChildMap: Map<string | undefined, string[]>;\n idToNode: Map<string, TreeModelHierarchyNode>;\n rootNode: TreeModelRootNode;\n}\n\n/** @internal */\nexport namespace TreeModel {\n export function expandNode(\n model: TreeModel,\n nodeId: string,\n isExpanded: boolean,\n ): \"none\" | \"loadChildren\" | \"reloadChildren\" {\n const node = model.idToNode.get(nodeId);\n if (!node) {\n return \"none\";\n }\n\n node.isExpanded = isExpanded;\n if (!isExpanded) {\n return \"none\";\n }\n\n if (node.error?.type === \"ChildrenLoad\") {\n node.isLoading = true;\n // remove subtree if there `ChildrenLoad` error info in order to attempt reloading children\n TreeModel.removeSubTree(model, nodeId);\n return \"reloadChildren\";\n }\n\n if (!node.children) {\n return \"none\";\n }\n\n const children = model.parentChildMap.get(node.id);\n if (!children) {\n node.isLoading = true;\n return \"loadChildren\";\n }\n\n return \"none\";\n }\n\n /** @internal */\n export function addHierarchyPart(model: TreeModel, rootId: string | undefined, hierarchyPart: TreeModel): void {\n removeSubTree(model, rootId);\n model.rootNode.error = hierarchyPart.rootNode.error;\n\n for (const [parentId, children] of hierarchyPart.parentChildMap) {\n model.parentChildMap.set(parentId, children);\n }\n\n for (const [nodeId, node] of hierarchyPart.idToNode) {\n model.idToNode.set(nodeId, node);\n }\n\n const parentNode = rootId !== undefined ? model.idToNode.get(rootId) : model.rootNode;\n if (!parentNode) {\n return;\n }\n parentNode.isLoading = false;\n }\n\n export function removeSubTree(model: TreeModel, parentId: string | undefined): void {\n clearNodeError(model, parentId);\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return;\n }\n model.parentChildMap.delete(parentId);\n\n for (const childId of currentChildren) {\n const childNode = model.idToNode.get(childId);\n if (childNode) {\n removeSubTree(model, childNode.id);\n }\n model.idToNode.delete(childId);\n }\n }\n\n export function setHierarchyLimit(\n model: TreeModel,\n nodeId: string | undefined,\n limit?: number | \"unbounded\",\n ): boolean {\n return updateForReload(model, nodeId, (node) => {\n node.hierarchyLimit = limit;\n });\n }\n\n export function setInstanceFilter(\n model: TreeModel,\n nodeId: string | undefined,\n filter?: GenericInstanceFilter,\n ): boolean {\n return updateForReload(model, nodeId, (node) => {\n if (filter && node.id !== undefined) {\n node.isExpanded = true;\n }\n node.instanceFilter = filter;\n });\n }\n\n export function selectNodes(model: TreeModel, nodeIds: Array<string>, changeType: SelectionChangeType) {\n if (changeType === \"replace\") {\n for (const [nodeId, node] of model.idToNode) {\n node.isSelected = !!nodeIds.find((id) => id === nodeId);\n }\n return;\n }\n for (const nodeId of nodeIds) {\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return;\n }\n modelNode.isSelected = changeType === \"add\";\n }\n }\n\n export function isNodeSelected(model: TreeModel, nodeId: string): boolean {\n const currentNode = model.idToNode.get(nodeId);\n return !!currentNode && !!currentNode.isSelected;\n }\n\n export function getNode(\n model: TreeModel,\n nodeId: string | undefined,\n ): TreeModelHierarchyNode | TreeModelRootNode | undefined {\n if (!nodeId) {\n return model.rootNode;\n }\n return model.idToNode.get(nodeId);\n }\n\n export function setIsLoading(model: TreeModel, nodeId: string | undefined, isLoading: boolean) {\n if (nodeId === undefined) {\n model.rootNode.isLoading = isLoading;\n return;\n }\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return;\n }\n modelNode.isLoading = isLoading;\n }\n}\n\nfunction updateForReload(\n model: TreeModel,\n nodeId: string | undefined,\n update: (node: TreeModelHierarchyNode | TreeModelRootNode) => void,\n) {\n TreeModel.removeSubTree(model, nodeId);\n if (nodeId === undefined) {\n update(model.rootNode);\n model.rootNode.isLoading = true;\n return true;\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return false;\n }\n\n update(modelNode);\n if (modelNode.isExpanded) {\n modelNode.isLoading = true;\n return true;\n }\n return false;\n}\n\nfunction clearNodeError(model: TreeModel, parentId: string | undefined) {\n const node = !parentId ? model.rootNode : model.idToNode.get(parentId);\n if (node) {\n node.error = undefined;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
+ import "../UseSelectionHandler.js";
2
+ import "./TreeModel.js";
1
3
  import { GenericNodeKey, NonGroupingHierarchyNode } from "@itwin/presentation-hierarchies";
2
4
  import { Selectable, SelectionStorage } from "@itwin/unified-selection";
3
-
4
5
  //#region src/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts
5
6
  /** @public */
6
7
  interface UseUnifiedTreeSelectionProps {
@@ -1 +1 @@
1
- {"version":3,"file":"UseUnifiedSelection.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/internal/UseUnifiedSelection.ts"],"mappings":";;;;;UAuBiB,4BAAA;EAuBV;;;EAnBL,UAAA;EAAA;;;;;;;;;;;;;;EAgBA,8BAAA,IACE,IAAA,EAAM,wBAAA;IAA6B,GAAA,EAAK,cAAA;EAAA,GACxC,eAAA,aACG,UAAA;;;;EAKL,gBAAA,EAAkB,gBAAA;AAAA"}
1
+ {"version":3,"file":"UseUnifiedSelection.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/internal/UseUnifiedSelection.ts"],"mappings":";;;;;;UAuBiB;;;;EAIf;;;;;;;;;;;;;;;EAgBA,kCACE,MAAM;IAA6B,KAAK;KACxC,4BACG;;;;EAKL,kBAAkB"}
@@ -121,7 +121,7 @@ function groupNodeSelectablesByIModelKey(modelNode, createSelectableForGenericNo
121
121
  return groupingNodeSelectables;
122
122
  }
123
123
  assert(HierarchyNode.isGeneric(hierarchyNode));
124
- return new Map([["", [createSelectableForGenericNode(hierarchyNode, modelNode.id)]]]);
124
+ return /* @__PURE__ */ new Map([["", [createSelectableForGenericNode(hierarchyNode, modelNode.id)]]]);
125
125
  }
126
126
  function groupIModelInstanceKeys(instanceKeys) {
127
127
  return instanceKeys.reduce((imodelSelectables, key) => {
@@ -1 +1 @@
1
- {"version":3,"file":"UseUnifiedSelection.js","names":["useEffect","useState","assert","HierarchyNode","Selectables","GenericNodeKey","InstancesNodeKey","NonGroupingHierarchyNode","InstanceKey","Selectable","SelectionStorage","SelectionChangeType","TreeModelHierarchyNode","TreeModelRootNode","TreeSelectionOptions","isNodeSelected","nodeId","selectNodes","nodeIds","Array","changeType","UseUnifiedTreeSelectionProps","sourceName","createSelectableForGenericNode","node","key","treeModelNodeId","selectionStorage","useUnifiedTreeSelection","t0","$","_c","getTreeModelNode","t1","undefined","defaultCreateSelectableForGenericNode","options","setOptions","_temp3","t2","t3","createOptions","selectionChangeEvent","addListener","args","level","_temp","_temp2","NonNullable","identifier","data","loadInstanceKeys","source","storage","getNode","id","imodelKey","nodeSelectables","groupNodeSelectablesByIModelKey","storageSelectables","getSelection","hasAny","imodelSelectables","Map","selectablesList","get","set","forEach","selectable","push","selectables","actionProps","addToSelection","removeFromSelection","replaceSelection","modelNode","hierarchyNode","nodeData","isInstancesNode","groupIModelInstanceKeys","instanceKeys","isGroupingNode","groupingNodeSelectables","groupedInstanceKeys","isGeneric","reduce"],"sources":["../../../src/presentation-hierarchies-react/internal/UseUnifiedSelection.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useEffect, useState } from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { Selectables } from \"@itwin/unified-selection\";\n\nimport type { GenericNodeKey, InstancesNodeKey, NonGroupingHierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { Selectable, SelectionStorage } from \"@itwin/unified-selection\";\nimport type { SelectionChangeType } from \"../UseSelectionHandler.js\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./TreeModel.js\";\n\n/** @internal */\nexport interface TreeSelectionOptions {\n isNodeSelected: (nodeId: string) => boolean;\n selectNodes: (nodeIds: Array<string>, changeType: SelectionChangeType) => void;\n}\n\n/** @public */\nexport interface UseUnifiedTreeSelectionProps {\n /**\n * Identifier to distinguish this source of changes to the unified selection from another ones in the application.\n */\n sourceName: string;\n\n /**\n * An optional function that allows customizing the `Selectable` object that gets created for generic hierarchy nodes. When\n * not supplied, the `Selectable` is created using the following signature:\n * ```ts\n * {\n * identifier: treeModelNodeId,\n * data: node,\n * async *loadInstanceKeys() {},\n * }\n * ```\n *\n * @param node Hierarchy node to create a selectable for.\n * @param treeModelNodeId ID of the hierarchy node in the internal tree model. This ID uniquely identifies the node in the whole hierarchy, as opposed to `GenericNodeKey.id` contained within the `node`, which may not be unique.\n */\n createSelectableForGenericNode?: (\n node: NonGroupingHierarchyNode & { key: GenericNodeKey },\n treeModelNodeId: string,\n ) => Selectable;\n\n /**\n * Unified selection storage to use for listening, getting and changing active selection.\n */\n selectionStorage: SelectionStorage;\n}\n\n/** @internal */\nexport function useUnifiedTreeSelection({\n sourceName,\n selectionStorage,\n getTreeModelNode,\n createSelectableForGenericNode = defaultCreateSelectableForGenericNode,\n}: UseUnifiedTreeSelectionProps & {\n getTreeModelNode: (nodeId: string) => TreeModelHierarchyNode | TreeModelRootNode | undefined;\n}): TreeSelectionOptions {\n const [options, setOptions] = useState<TreeSelectionOptions>(() => ({\n isNodeSelected: () => false,\n selectNodes: () => {},\n }));\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setOptions(createOptions(sourceName, selectionStorage, createSelectableForGenericNode, getTreeModelNode));\n return selectionStorage.selectionChangeEvent.addListener((args) => {\n if (args.level > 0) {\n return;\n }\n setOptions(createOptions(sourceName, selectionStorage, createSelectableForGenericNode, getTreeModelNode));\n });\n }, [selectionStorage, createSelectableForGenericNode, getTreeModelNode, sourceName]);\n\n return options;\n}\n\nconst defaultCreateSelectableForGenericNode: NonNullable<\n UseUnifiedTreeSelectionProps[\"createSelectableForGenericNode\"]\n> = (node, treeModelNodeId): Selectable => ({ identifier: treeModelNodeId, data: node, async *loadInstanceKeys() {} });\n\nfunction createOptions(\n source: string,\n storage: SelectionStorage,\n createSelectableForGenericNode: NonNullable<UseUnifiedTreeSelectionProps[\"createSelectableForGenericNode\"]>,\n getNode: (nodeId: string) => TreeModelHierarchyNode | TreeModelRootNode | undefined,\n): TreeSelectionOptions {\n return {\n isNodeSelected: (nodeId: string) => {\n const node = getNode(nodeId);\n if (!node || node.id === undefined) {\n return false;\n }\n for (const [imodelKey, nodeSelectables] of groupNodeSelectablesByIModelKey(\n node,\n createSelectableForGenericNode,\n )) {\n const storageSelectables = storage.getSelection({ imodelKey, level: 0 });\n if (Selectables.hasAny(storageSelectables, nodeSelectables)) {\n return true;\n }\n }\n return false;\n },\n\n selectNodes: (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n const imodelSelectables = new Map<string, Selectable[]>();\n for (const nodeId of nodeIds) {\n const node = getNode(nodeId);\n if (!node || node.id === undefined) {\n return;\n }\n for (const [imodelKey, nodeSelectables] of groupNodeSelectablesByIModelKey(\n node,\n createSelectableForGenericNode,\n )) {\n let selectablesList = imodelSelectables.get(imodelKey);\n if (!selectablesList) {\n selectablesList = [];\n imodelSelectables.set(imodelKey, selectablesList);\n }\n nodeSelectables.forEach((selectable) => selectablesList.push(selectable));\n }\n }\n imodelSelectables.forEach((selectables, imodelKey) => {\n const actionProps = { imodelKey, source, selectables, level: 0 };\n switch (changeType) {\n case \"add\":\n storage.addToSelection(actionProps);\n return;\n case \"remove\":\n storage.removeFromSelection(actionProps);\n return;\n case \"replace\":\n storage.replaceSelection(actionProps);\n return;\n }\n });\n },\n };\n}\n\nfunction groupNodeSelectablesByIModelKey(\n modelNode: TreeModelHierarchyNode,\n createSelectableForGenericNode: NonNullable<UseUnifiedTreeSelectionProps[\"createSelectableForGenericNode\"]>,\n): Map<string, Selectable[]> {\n const hierarchyNode = modelNode.nodeData;\n if (HierarchyNode.isInstancesNode(hierarchyNode)) {\n return groupIModelInstanceKeys(hierarchyNode.key.instanceKeys);\n }\n if (HierarchyNode.isGroupingNode(hierarchyNode)) {\n const groupingNodeSelectables = new Map<string, Selectable[]>();\n groupIModelInstanceKeys(hierarchyNode.groupedInstanceKeys).forEach((instanceKeys, imodelKey) => {\n groupingNodeSelectables.set(imodelKey, [\n {\n identifier: modelNode.id,\n data: hierarchyNode,\n async *loadInstanceKeys() {\n for (const key of instanceKeys) {\n yield key;\n }\n },\n },\n ]);\n });\n return groupingNodeSelectables;\n }\n assert(HierarchyNode.isGeneric(hierarchyNode));\n // note: generic nodes aren't associated with an imodel\n return new Map([[\"\", [createSelectableForGenericNode(hierarchyNode, modelNode.id)]]]);\n}\n\nfunction groupIModelInstanceKeys(instanceKeys: InstancesNodeKey[\"instanceKeys\"]) {\n return instanceKeys.reduce((imodelSelectables, key) => {\n const imodelKey = key.imodelKey ?? \"\";\n let selectablesList = imodelSelectables.get(imodelKey);\n if (!selectablesList) {\n selectablesList = [];\n imodelSelectables.set(imodelKey, selectablesList);\n }\n selectablesList.push(key);\n return imodelSelectables;\n }, new Map<string, InstanceKey[]>());\n}\n"],"mappings":";;;;;;;AAuDA,SAAO4B,wBAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAiC,MAAA,EAAAT,YAAAK,kBAAAK,kBAAAT,gCAAAU,OAAAJ;CAItC,MAAAN,iCAAAU,OAAAC,KAAAA,IAAAC,wCAAAF;CAIA,MAAA,CAAAG,SAAAC,cAA8BpC,SAA+BqC,OAG1D;CAAC,IAAAC;CAAA,IAAAC;AAAA,KAAAV,EAAA,OAAAP,kCAAAO,EAAA,OAAAE,oBAAAF,EAAA,OAAAH,oBAAAG,EAAA,OAAAR,YAAA;AAEMiB,aAAA;AAERF,cAAWI,cAAcnB,YAAYK,kBAAkBJ,gCAAgCS,iBAAiB,CAAC;AAAA,UAClGL,iBAAgBe,qBAAqBC,aAAaC,SAAA;AACvD,QAAIA,KAAIC,QAAS,EAAC;AAGlBR,eAAWI,cAAcnB,YAAYK,kBAAkBJ,gCAAgCS,iBAAiB,CAAC;KACzG;;AACDQ,OAAA;GAACb;GAAkBJ;GAAgCS;GAAkBV;GAAW;AAAAQ,IAAA,KAAAP;AAAAO,IAAA,KAAAE;AAAAF,IAAA,KAAAH;AAAAG,IAAA,KAAAR;AAAAQ,IAAA,KAAAS;AAAAT,IAAA,KAAAU;QAAA;AAAAD,OAAAT,EAAA;AAAAU,OAAAV,EAAA;;AATnF9B,WAAUuC,IASPC,GAAiF;AAAA,QAE7EJ;;AAxBF,SAAAE,SAAA;AAAA,QAQ+D;EAAAvB,gBAClD+B;EAAW7B,aACd8B;EACd;;AAXI,SAAAA,SAAA;AAAA,SAAAD,QAAA;AAAA,QASmB;;AAkB1B,MAAMX,yCAEDX,MAAME,qBAAiC;CAAEuB,YAAYvB;CAAiBwB,MAAM1B;CAAM,OAAO2B,mBAAmB;CAAI;AAErH,SAASV,cACPW,QACAC,SACA9B,gCACA+B,SACsB;AACtB,QAAO;EACLvC,iBAAiBC,WAAmB;GAClC,MAAMQ,OAAO8B,QAAQtC,OAAO;AAC5B,OAAI,CAACQ,QAAQA,KAAK+B,OAAOrB,KAAAA,EACvB,QAAO;AAET,QAAK,MAAM,CAACsB,WAAWC,oBAAoBC,gCACzClC,MACAD,+BACD,EAAE;IACD,MAAMoC,qBAAqBN,QAAQO,aAAa;KAAEJ;KAAWX,OAAO;KAAG,CAAC;AACxE,QAAIzC,YAAYyD,OAAOF,oBAAoBF,gBAAgB,CACzD,QAAO;;AAGX,UAAO;;EAGTxC,cAAcC,SAAwBE,eAAoC;GACxE,MAAM0C,oCAAoB,IAAIC,KAA2B;AACzD,QAAK,MAAM/C,UAAUE,SAAS;IAC5B,MAAMM,OAAO8B,QAAQtC,OAAO;AAC5B,QAAI,CAACQ,QAAQA,KAAK+B,OAAOrB,KAAAA,EACvB;AAEF,SAAK,MAAM,CAACsB,WAAWC,oBAAoBC,gCACzClC,MACAD,+BACD,EAAE;KACD,IAAIyC,kBAAkBF,kBAAkBG,IAAIT,UAAU;AACtD,SAAI,CAACQ,iBAAiB;AACpBA,wBAAkB,EAAE;AACpBF,wBAAkBI,IAAIV,WAAWQ,gBAAgB;;AAEnDP,qBAAgBU,SAASC,eAAeJ,gBAAgBK,KAAKD,WAAW,CAAC;;;AAG7EN,qBAAkBK,SAASG,aAAad,cAAc;IACpD,MAAMe,cAAc;KAAEf;KAAWJ;KAAQkB;KAAazB,OAAO;KAAG;AAChE,YAAQzB,YAAR;KACE,KAAK;AACHiC,cAAQmB,eAAeD,YAAY;AACnC;KACF,KAAK;AACHlB,cAAQoB,oBAAoBF,YAAY;AACxC;KACF,KAAK;AACHlB,cAAQqB,iBAAiBH,YAAY;AACrC;;KAEJ;;EAEL;;AAGH,SAASb,gCACPiB,WACApD,gCAC2B;CAC3B,MAAMqD,gBAAgBD,UAAUE;AAChC,KAAI1E,cAAc2E,gBAAgBF,cAAc,CAC9C,QAAOG,wBAAwBH,cAAcnD,IAAIuD,aAAa;AAEhE,KAAI7E,cAAc8E,eAAeL,cAAc,EAAE;EAC/C,MAAMM,0CAA0B,IAAInB,KAA2B;AAC/DgB,0BAAwBH,cAAcO,oBAAoB,CAAChB,SAASa,cAAcxB,cAAc;AAC9F0B,2BAAwBhB,IAAIV,WAAW,CACrC;IACEP,YAAY0B,UAAUpB;IACtBL,MAAM0B;IACN,OAAOzB,mBAAmB;AACxB,UAAK,MAAM1B,OAAOuD,aAChB,OAAMvD;;IAGX,CACF,CAAC;IACF;AACF,SAAOyD;;AAEThF,QAAOC,cAAciF,UAAUR,cAAc,CAAC;AAE9C,QAAO,IAAIb,IAAI,CAAC,CAAC,IAAI,CAACxC,+BAA+BqD,eAAeD,UAAUpB,GAAG,CAAC,CAAC,CAAC,CAAC;;AAGvF,SAASwB,wBAAwBC,cAAgD;AAC/E,QAAOA,aAAaK,QAAQvB,mBAAmBrC,QAAQ;EACrD,MAAM+B,YAAY/B,IAAI+B,aAAa;EACnC,IAAIQ,kBAAkBF,kBAAkBG,IAAIT,UAAU;AACtD,MAAI,CAACQ,iBAAiB;AACpBA,qBAAkB,EAAE;AACpBF,qBAAkBI,IAAIV,WAAWQ,gBAAgB;;AAEnDA,kBAAgBK,KAAK5C,IAAI;AACzB,SAAOqC;oBACN,IAAIC,KAA4B,CAAC"}
1
+ {"version":3,"file":"UseUnifiedSelection.js","names":["useEffect","useState","assert","HierarchyNode","Selectables","GenericNodeKey","InstancesNodeKey","NonGroupingHierarchyNode","InstanceKey","Selectable","SelectionStorage","SelectionChangeType","TreeModelHierarchyNode","TreeModelRootNode","TreeSelectionOptions","isNodeSelected","nodeId","selectNodes","nodeIds","Array","changeType","UseUnifiedTreeSelectionProps","sourceName","createSelectableForGenericNode","node","key","treeModelNodeId","selectionStorage","useUnifiedTreeSelection","t0","$","_c","getTreeModelNode","t1","undefined","defaultCreateSelectableForGenericNode","options","setOptions","_temp3","t2","t3","createOptions","selectionChangeEvent","addListener","args","level","_temp","_temp2","NonNullable","identifier","data","loadInstanceKeys","source","storage","getNode","id","imodelKey","nodeSelectables","groupNodeSelectablesByIModelKey","storageSelectables","getSelection","hasAny","imodelSelectables","Map","selectablesList","get","set","forEach","selectable","push","selectables","actionProps","addToSelection","removeFromSelection","replaceSelection","modelNode","hierarchyNode","nodeData","isInstancesNode","groupIModelInstanceKeys","instanceKeys","isGroupingNode","groupingNodeSelectables","groupedInstanceKeys","isGeneric","reduce"],"sources":["../../../src/presentation-hierarchies-react/internal/UseUnifiedSelection.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useEffect, useState } from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { Selectables } from \"@itwin/unified-selection\";\n\nimport type { GenericNodeKey, InstancesNodeKey, NonGroupingHierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { Selectable, SelectionStorage } from \"@itwin/unified-selection\";\nimport type { SelectionChangeType } from \"../UseSelectionHandler.js\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./TreeModel.js\";\n\n/** @internal */\nexport interface TreeSelectionOptions {\n isNodeSelected: (nodeId: string) => boolean;\n selectNodes: (nodeIds: Array<string>, changeType: SelectionChangeType) => void;\n}\n\n/** @public */\nexport interface UseUnifiedTreeSelectionProps {\n /**\n * Identifier to distinguish this source of changes to the unified selection from another ones in the application.\n */\n sourceName: string;\n\n /**\n * An optional function that allows customizing the `Selectable` object that gets created for generic hierarchy nodes. When\n * not supplied, the `Selectable` is created using the following signature:\n * ```ts\n * {\n * identifier: treeModelNodeId,\n * data: node,\n * async *loadInstanceKeys() {},\n * }\n * ```\n *\n * @param node Hierarchy node to create a selectable for.\n * @param treeModelNodeId ID of the hierarchy node in the internal tree model. This ID uniquely identifies the node in the whole hierarchy, as opposed to `GenericNodeKey.id` contained within the `node`, which may not be unique.\n */\n createSelectableForGenericNode?: (\n node: NonGroupingHierarchyNode & { key: GenericNodeKey },\n treeModelNodeId: string,\n ) => Selectable;\n\n /**\n * Unified selection storage to use for listening, getting and changing active selection.\n */\n selectionStorage: SelectionStorage;\n}\n\n/** @internal */\nexport function useUnifiedTreeSelection({\n sourceName,\n selectionStorage,\n getTreeModelNode,\n createSelectableForGenericNode = defaultCreateSelectableForGenericNode,\n}: UseUnifiedTreeSelectionProps & {\n getTreeModelNode: (nodeId: string) => TreeModelHierarchyNode | TreeModelRootNode | undefined;\n}): TreeSelectionOptions {\n const [options, setOptions] = useState<TreeSelectionOptions>(() => ({\n isNodeSelected: () => false,\n selectNodes: () => {},\n }));\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setOptions(createOptions(sourceName, selectionStorage, createSelectableForGenericNode, getTreeModelNode));\n return selectionStorage.selectionChangeEvent.addListener((args) => {\n if (args.level > 0) {\n return;\n }\n setOptions(createOptions(sourceName, selectionStorage, createSelectableForGenericNode, getTreeModelNode));\n });\n }, [selectionStorage, createSelectableForGenericNode, getTreeModelNode, sourceName]);\n\n return options;\n}\n\nconst defaultCreateSelectableForGenericNode: NonNullable<\n UseUnifiedTreeSelectionProps[\"createSelectableForGenericNode\"]\n> = (node, treeModelNodeId): Selectable => ({ identifier: treeModelNodeId, data: node, async *loadInstanceKeys() {} });\n\nfunction createOptions(\n source: string,\n storage: SelectionStorage,\n createSelectableForGenericNode: NonNullable<UseUnifiedTreeSelectionProps[\"createSelectableForGenericNode\"]>,\n getNode: (nodeId: string) => TreeModelHierarchyNode | TreeModelRootNode | undefined,\n): TreeSelectionOptions {\n return {\n isNodeSelected: (nodeId: string) => {\n const node = getNode(nodeId);\n if (!node || node.id === undefined) {\n return false;\n }\n for (const [imodelKey, nodeSelectables] of groupNodeSelectablesByIModelKey(\n node,\n createSelectableForGenericNode,\n )) {\n const storageSelectables = storage.getSelection({ imodelKey, level: 0 });\n if (Selectables.hasAny(storageSelectables, nodeSelectables)) {\n return true;\n }\n }\n return false;\n },\n\n selectNodes: (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n const imodelSelectables = new Map<string, Selectable[]>();\n for (const nodeId of nodeIds) {\n const node = getNode(nodeId);\n if (!node || node.id === undefined) {\n return;\n }\n for (const [imodelKey, nodeSelectables] of groupNodeSelectablesByIModelKey(\n node,\n createSelectableForGenericNode,\n )) {\n let selectablesList = imodelSelectables.get(imodelKey);\n if (!selectablesList) {\n selectablesList = [];\n imodelSelectables.set(imodelKey, selectablesList);\n }\n nodeSelectables.forEach((selectable) => selectablesList.push(selectable));\n }\n }\n imodelSelectables.forEach((selectables, imodelKey) => {\n const actionProps = { imodelKey, source, selectables, level: 0 };\n switch (changeType) {\n case \"add\":\n storage.addToSelection(actionProps);\n return;\n case \"remove\":\n storage.removeFromSelection(actionProps);\n return;\n case \"replace\":\n storage.replaceSelection(actionProps);\n return;\n }\n });\n },\n };\n}\n\nfunction groupNodeSelectablesByIModelKey(\n modelNode: TreeModelHierarchyNode,\n createSelectableForGenericNode: NonNullable<UseUnifiedTreeSelectionProps[\"createSelectableForGenericNode\"]>,\n): Map<string, Selectable[]> {\n const hierarchyNode = modelNode.nodeData;\n if (HierarchyNode.isInstancesNode(hierarchyNode)) {\n return groupIModelInstanceKeys(hierarchyNode.key.instanceKeys);\n }\n if (HierarchyNode.isGroupingNode(hierarchyNode)) {\n const groupingNodeSelectables = new Map<string, Selectable[]>();\n groupIModelInstanceKeys(hierarchyNode.groupedInstanceKeys).forEach((instanceKeys, imodelKey) => {\n groupingNodeSelectables.set(imodelKey, [\n {\n identifier: modelNode.id,\n data: hierarchyNode,\n async *loadInstanceKeys() {\n for (const key of instanceKeys) {\n yield key;\n }\n },\n },\n ]);\n });\n return groupingNodeSelectables;\n }\n assert(HierarchyNode.isGeneric(hierarchyNode));\n // note: generic nodes aren't associated with an imodel\n return new Map([[\"\", [createSelectableForGenericNode(hierarchyNode, modelNode.id)]]]);\n}\n\nfunction groupIModelInstanceKeys(instanceKeys: InstancesNodeKey[\"instanceKeys\"]) {\n return instanceKeys.reduce((imodelSelectables, key) => {\n const imodelKey = key.imodelKey ?? \"\";\n let selectablesList = imodelSelectables.get(imodelKey);\n if (!selectablesList) {\n selectablesList = [];\n imodelSelectables.set(imodelKey, selectablesList);\n }\n selectablesList.push(key);\n return imodelSelectables;\n }, new Map<string, InstanceKey[]>());\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Utils.js","names":["HierarchyNodeKey","HierarchyNode","createNodeId","node","Pick","parentKeys","map","serializeNodeKey","key","join","convertObjectValuesToString","obj","Object","entries","value","String","sameNodes","lhs","rhs","compare","length","i","MAX_LIMIT_OVERRIDE","safeDispose","disposable","Symbol","dispose"],"sources":["../../../src/presentation-hierarchies-react/internal/Utils.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"./DisposePolyfill.js\";\n\nimport { HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\n\nimport type { HierarchyNode } from \"@itwin/presentation-hierarchies\";\n\n/** @internal */\nexport function createNodeId(node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) {\n return [...node.parentKeys.map(serializeNodeKey), serializeNodeKey(node.key)].join(\";\");\n}\n\nfunction serializeNodeKey(key: HierarchyNodeKey): string {\n return convertObjectValuesToString(key);\n}\n\nfunction convertObjectValuesToString(obj: object): string {\n return Object.entries(obj)\n .map(([, value]) => {\n if (typeof value === \"object\") {\n return convertObjectValuesToString(value);\n }\n return String(value);\n })\n .join(\",\");\n}\n\n/** @internal */\nexport function sameNodes(lhs: HierarchyNode, rhs: HierarchyNode): boolean {\n if (HierarchyNodeKey.compare(lhs.key, rhs.key) !== 0) {\n return false;\n }\n\n if (lhs.parentKeys.length !== rhs.parentKeys.length) {\n return false;\n }\n\n for (let i = lhs.parentKeys.length - 1; i >= 0; --i) {\n if (HierarchyNodeKey.compare(lhs.parentKeys[i], rhs.parentKeys[i]) !== 0) {\n return false;\n }\n }\n return true;\n}\n\n/** @internal */\nexport const MAX_LIMIT_OVERRIDE = 10000;\n\n/**\n * A helper that disposes the given object, if it's disposable.\n *\n * The first option is to dispose using the deprecated `dispose` method if it exists on the object.\n * If not, we use the new `Symbol.dispose` method. If that doesn't exist either, the object is\n * considered as non-disposable and nothing is done with it.\n *\n * @internal\n */\nexport function safeDispose(disposable: {} | { [Symbol.dispose]: () => void } | { dispose: () => void }) {\n if (\"dispose\" in disposable) {\n disposable.dispose();\n } else if (Symbol.dispose in disposable) {\n disposable[Symbol.dispose]();\n }\n}\n"],"mappings":";;;;AAYA,SAAgBE,aAAaC,MAAiD;AAC5E,QAAO,CAAC,GAAGA,KAAKE,WAAWC,IAAIC,iBAAiB,EAAEA,iBAAiBJ,KAAKK,IAAI,CAAC,CAACC,KAAK,IAAI;;AAGzF,SAASF,iBAAiBC,KAA+B;AACvD,QAAOE,4BAA4BF,IAAI;;AAGzC,SAASE,4BAA4BC,KAAqB;AACxD,QAAOC,OAAOC,QAAQF,IAAI,CACvBL,KAAK,GAAGQ,WAAW;AAClB,MAAI,OAAOA,UAAU,SACnB,QAAOJ,4BAA4BI,MAAM;AAE3C,SAAOC,OAAOD,MAAM;GACpB,CACDL,KAAK,IAAI;;;AAId,SAAgBO,UAAUC,KAAoBC,KAA6B;AACzE,KAAIlB,iBAAiBmB,QAAQF,IAAIT,KAAKU,IAAIV,IAAI,KAAK,EACjD,QAAO;AAGT,KAAIS,IAAIZ,WAAWe,WAAWF,IAAIb,WAAWe,OAC3C,QAAO;AAGT,MAAK,IAAIC,IAAIJ,IAAIZ,WAAWe,SAAS,GAAGC,KAAK,GAAG,EAAEA,EAChD,KAAIrB,iBAAiBmB,QAAQF,IAAIZ,WAAWgB,IAAIH,IAAIb,WAAWgB,GAAG,KAAK,EACrE,QAAO;AAGX,QAAO;;;AAIT,MAAaC,qBAAqB;;;;;;;;;;AAWlC,SAAgBC,YAAYC,YAA6E;AACvG,KAAI,aAAaA,WACfA,YAAWE,SAAS;UACXD,OAAOC,WAAWF,WAC3BA,YAAWC,OAAOC,UAAU"}
1
+ {"version":3,"file":"Utils.js","names":["HierarchyNodeKey","HierarchyNode","createNodeId","node","Pick","parentKeys","map","serializeNodeKey","key","join","convertObjectValuesToString","obj","Object","entries","value","String","sameNodes","lhs","rhs","compare","length","i","MAX_LIMIT_OVERRIDE","safeDispose","disposable","Symbol","dispose"],"sources":["../../../src/presentation-hierarchies-react/internal/Utils.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"./DisposePolyfill.js\";\n\nimport { HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\n\nimport type { HierarchyNode } from \"@itwin/presentation-hierarchies\";\n\n/** @internal */\nexport function createNodeId(node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) {\n return [...node.parentKeys.map(serializeNodeKey), serializeNodeKey(node.key)].join(\";\");\n}\n\nfunction serializeNodeKey(key: HierarchyNodeKey): string {\n return convertObjectValuesToString(key);\n}\n\nfunction convertObjectValuesToString(obj: object): string {\n return Object.entries(obj)\n .map(([, value]) => {\n if (typeof value === \"object\") {\n return convertObjectValuesToString(value);\n }\n return String(value);\n })\n .join(\",\");\n}\n\n/** @internal */\nexport function sameNodes(lhs: HierarchyNode, rhs: HierarchyNode): boolean {\n if (HierarchyNodeKey.compare(lhs.key, rhs.key) !== 0) {\n return false;\n }\n\n if (lhs.parentKeys.length !== rhs.parentKeys.length) {\n return false;\n }\n\n for (let i = lhs.parentKeys.length - 1; i >= 0; --i) {\n if (HierarchyNodeKey.compare(lhs.parentKeys[i], rhs.parentKeys[i]) !== 0) {\n return false;\n }\n }\n return true;\n}\n\n/** @internal */\nexport const MAX_LIMIT_OVERRIDE = 10000;\n\n/**\n * A helper that disposes the given object, if it's disposable.\n *\n * The first option is to dispose using the deprecated `dispose` method if it exists on the object.\n * If not, we use the new `Symbol.dispose` method. If that doesn't exist either, the object is\n * considered as non-disposable and nothing is done with it.\n *\n * @internal\n */\nexport function safeDispose(disposable: {} | { [Symbol.dispose]: () => void } | { dispose: () => void }) {\n if (\"dispose\" in disposable) {\n disposable.dispose();\n } else if (Symbol.dispose in disposable) {\n disposable[Symbol.dispose]();\n }\n}\n"],"mappings":";;;;AAYA,SAAgBE,aAAaC,MAAiD;CAC5E,OAAO,CAAC,GAAGA,KAAKE,WAAWC,IAAIC,gBAAgB,GAAGA,iBAAiBJ,KAAKK,GAAG,CAAC,CAAC,CAACC,KAAK,GAAG;AACxF;AAEA,SAASF,iBAAiBC,KAA+B;CACvD,OAAOE,4BAA4BF,GAAG;AACxC;AAEA,SAASE,4BAA4BC,KAAqB;CACxD,OAAOC,OAAOC,QAAQF,GAAG,CAAC,CACvBL,KAAK,GAAGQ,WAAW;EAClB,IAAI,OAAOA,UAAU,UACnB,OAAOJ,4BAA4BI,KAAK;EAE1C,OAAOC,OAAOD,KAAK;CACrB,CAAC,CAAC,CACDL,KAAK,GAAG;AACb;;AAGA,SAAgBO,UAAUC,KAAoBC,KAA6B;CACzE,IAAIlB,iBAAiBmB,QAAQF,IAAIT,KAAKU,IAAIV,GAAG,MAAM,GACjD,OAAO;CAGT,IAAIS,IAAIZ,WAAWe,WAAWF,IAAIb,WAAWe,QAC3C,OAAO;CAGT,KAAK,IAAIC,IAAIJ,IAAIZ,WAAWe,SAAS,GAAGC,KAAK,GAAG,EAAEA,GAChD,IAAIrB,iBAAiBmB,QAAQF,IAAIZ,WAAWgB,IAAIH,IAAIb,WAAWgB,EAAE,MAAM,GACrE,OAAO;CAGX,OAAO;AACT;;AAGA,MAAaC,qBAAqB;;;;;;;;;;AAWlC,SAAgBC,YAAYC,YAA6E;CACvG,IAAI,aAAaA,YACfA,WAAWE,QAAQ;MACd,IAAID,OAAOC,WAAWF,YAC3BA,WAAWC,OAAOC,QAAQ,CAAC;AAE/B"}
@@ -1,7 +1,6 @@
1
1
  import { ErrorInfo, TreeNode } from "../TreeNode.js";
2
2
  import { HierarchyLevelDetails, TreeRendererProps } from "../Renderers.js";
3
3
  import { JSX } from "react";
4
-
5
4
  //#region src/presentation-hierarchies-react/stratakit/ErrorItemRenderer.d.ts
6
5
  /** @alpha */
7
6
  interface ErrorItemRendererProps extends Pick<TreeRendererProps, "getHierarchyLevelDetails"> {
@@ -27,14 +26,7 @@ interface ErrorItemRendererProps extends Pick<TreeRendererProps, "getHierarchyLe
27
26
  *
28
27
  * @alpha
29
28
  */
30
- declare function ErrorItemRenderer({
31
- treeNode,
32
- error,
33
- getHierarchyLevelDetails,
34
- filterHierarchyLevel,
35
- reloadTree,
36
- scrollToNode
37
- }: ErrorItemRendererProps): JSX.Element;
29
+ declare function ErrorItemRenderer({ treeNode, error, getHierarchyLevelDetails, filterHierarchyLevel, reloadTree, scrollToNode }: ErrorItemRendererProps): JSX.Element;
38
30
  //#endregion
39
31
  export { ErrorItemRenderer, ErrorItemRendererProps };
40
32
  //# sourceMappingURL=ErrorItemRenderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorItemRenderer.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/stratakit/ErrorItemRenderer.tsx"],"mappings":";;;;;;UAeiB,sBAAA,SAA+B,IAAA,CAAK,iBAAA;EAApC;EAEf,QAAA,EAAU,IAAA,CAAK,QAAA;;EAEf,KAAA,EAAO,SAAA;EAFQ;EAIf,UAAA,GAAa,OAAA;IAAW,YAAA;EAAA;EAEC;EAAzB,YAAA,GAAe,QAAA,EAAU,IAAA,CAAK,QAAA;EARgB;EAU9C,oBAAA,IAAwB,qBAAA,EAAuB,qBAAA;AAAA;;;;;;;;;;iBAYjC,iBAAA,CAAA;EACd,QAAA;EACA,KAAA;EACA,wBAAA;EACA,oBAAA;EACA,UAAA;EACA;AAAA,GACC,sBAAA,GAAyB,GAAA,CAAI,OAAA"}
1
+ {"version":3,"file":"ErrorItemRenderer.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/stratakit/ErrorItemRenderer.tsx"],"mappings":";;;;;UAeiB,+BAA+B,KAAK;;EAEnD,UAAU,KAAK;;EAEf,OAAO;;EAEP,aAAa;IAAW;;;EAExB,eAAe,UAAU,KAAK;;EAE9B,wBAAwB,uBAAuB;;;;;;;;;;;iBAYjC,oBACd,UACA,OACA,0BACA,sBACA,YACA,gBACC,yBAAyB,IAAI"}
@@ -324,34 +324,29 @@ function _temp3(t0) {
324
324
  return condition();
325
325
  }
326
326
  function MessageWithLink(t0) {
327
- const $ = c(13);
327
+ const $ = c(14);
328
328
  const { linkLabel, scrollToElement, message } = t0;
329
- let firstPart;
330
329
  let t1;
331
330
  if ($[0] !== message) {
332
- const splitMessage = message.split("{{node}}", 2);
333
- firstPart = splitMessage[0].trimEnd();
334
- t1 = splitMessage[1]?.trimStart();
331
+ t1 = message.split("{{node}}", 2);
335
332
  $[0] = message;
336
- $[1] = firstPart;
337
- $[2] = t1;
338
- } else {
339
- firstPart = $[1];
340
- t1 = $[2];
341
- }
342
- const secondPart = t1;
333
+ $[1] = t1;
334
+ } else t1 = $[1];
335
+ const splitMessage = t1;
336
+ const firstPart = splitMessage[0];
337
+ const secondPart = splitMessage.length > 1 ? splitMessage[1] : void 0;
343
338
  let t2;
344
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
339
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
345
340
  t2 = /* @__PURE__ */ jsx("button", { type: "button" });
346
- $[3] = t2;
347
- } else t2 = $[3];
341
+ $[2] = t2;
342
+ } else t2 = $[2];
348
343
  let t3;
349
- if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
344
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
350
345
  t3 = { verticalAlign: "baseline" };
351
- $[4] = t3;
352
- } else t3 = $[4];
346
+ $[3] = t3;
347
+ } else t3 = $[3];
353
348
  let t4;
354
- if ($[5] !== linkLabel || $[6] !== scrollToElement) {
349
+ if ($[4] !== linkLabel || $[5] !== scrollToElement) {
355
350
  t4 = /* @__PURE__ */ jsx(Link, {
356
351
  render: t2,
357
352
  onClick: scrollToElement,
@@ -359,28 +354,39 @@ function MessageWithLink(t0) {
359
354
  style: t3,
360
355
  children: linkLabel
361
356
  });
362
- $[5] = linkLabel;
363
- $[6] = scrollToElement;
364
- $[7] = t4;
365
- } else t4 = $[7];
366
- const t5 = secondPart ? " " : "";
367
- const t6 = secondPart ? secondPart : null;
368
- let t7;
369
- if ($[8] !== firstPart || $[9] !== t4 || $[10] !== t5 || $[11] !== t6) {
370
- t7 = /* @__PURE__ */ jsxs("div", { children: [
357
+ $[4] = linkLabel;
358
+ $[5] = scrollToElement;
359
+ $[6] = t4;
360
+ } else t4 = $[6];
361
+ const linkToNode = t4;
362
+ if (message.length === firstPart.length) {
363
+ let t5;
364
+ if ($[7] !== firstPart || $[8] !== linkToNode) {
365
+ t5 = /* @__PURE__ */ jsxs("div", { children: [
366
+ linkToNode,
367
+ ": ",
368
+ firstPart
369
+ ] });
370
+ $[7] = firstPart;
371
+ $[8] = linkToNode;
372
+ $[9] = t5;
373
+ } else t5 = $[9];
374
+ return t5;
375
+ }
376
+ const t5 = secondPart ? secondPart : null;
377
+ let t6;
378
+ if ($[10] !== firstPart || $[11] !== linkToNode || $[12] !== t5) {
379
+ t6 = /* @__PURE__ */ jsxs("div", { children: [
371
380
  firstPart,
372
- " ",
373
- t4,
374
- t5,
375
- t6
381
+ linkToNode,
382
+ t5
376
383
  ] });
377
- $[8] = firstPart;
378
- $[9] = t4;
379
- $[10] = t5;
380
- $[11] = t6;
381
- $[12] = t7;
382
- } else t7 = $[12];
383
- return t7;
384
+ $[10] = firstPart;
385
+ $[11] = linkToNode;
386
+ $[12] = t5;
387
+ $[13] = t6;
388
+ } else t6 = $[13];
389
+ return t6;
384
390
  }
385
391
  //#endregion
386
392
  export { ErrorItemRenderer };