@itwin/tree-widget-react 4.0.0-alpha.22 → 4.0.0-alpha.23

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 (129) hide show
  1. package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.d.ts +1 -1
  2. package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js +1 -1
  3. package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js.map +1 -1
  4. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +1 -1
  5. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +2 -2
  6. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  7. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +2 -2
  8. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +3 -3
  9. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  10. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +2 -2
  11. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +11 -11
  12. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  13. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +3 -3
  14. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +25 -25
  15. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +2 -2
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +23 -39
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/{UseFilteredPaths.d.ts → UseSearchPaths.d.ts} +8 -8
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/{UseFilteredPaths.js → UseSearchPaths.js} +21 -21
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseSearchPaths.js.map +1 -0
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.d.ts +7 -7
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js +11 -11
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js.map +1 -1
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js +2 -2
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js.map +1 -1
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/{FilteredTree.d.ts → SearchResultsTree.d.ts} +8 -8
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/{FilteredTree.js → SearchResultsTree.js} +62 -62
  29. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/SearchResultsTree.js.map +1 -0
  30. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.d.ts +1 -1
  31. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js +2 -2
  32. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js.map +1 -1
  33. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +1 -1
  34. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js +2 -2
  35. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -1
  36. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.d.ts +2 -2
  37. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +7 -7
  38. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -1
  39. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +3 -3
  40. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +25 -25
  41. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -1
  42. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.d.ts +4 -4
  43. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js +2 -2
  44. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js.map +1 -1
  45. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +4 -1
  46. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +36 -1
  47. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -1
  48. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.d.ts +20 -0
  49. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/{UseFilteredPaths.js → UseSearchPaths.js} +19 -19
  50. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.js.map +1 -0
  51. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.d.ts +4 -4
  52. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js +8 -8
  53. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js.map +1 -1
  54. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/{FilteredTree.d.ts → SearchResultsTree.d.ts} +9 -9
  55. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.js +168 -0
  56. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.js.map +1 -0
  57. package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.d.ts +2 -2
  58. package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js +3 -3
  59. package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js.map +1 -1
  60. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -1
  61. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
  62. package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +3 -3
  63. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +17 -17
  64. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  65. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.css +1 -1
  66. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.d.ts +6 -6
  67. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js +11 -11
  68. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js.map +1 -1
  69. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +1 -1
  70. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
  71. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +2 -2
  72. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +2 -2
  73. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  74. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +21 -5
  75. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +24 -8
  76. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -1
  77. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +1 -6
  78. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +4 -11
  79. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -1
  80. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.d.ts +18 -18
  81. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js +32 -32
  82. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js.map +1 -1
  83. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.d.ts +91 -0
  84. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.js +112 -0
  85. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.js.map +1 -0
  86. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.d.ts +6 -10
  87. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js +27 -15
  88. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js.map +1 -1
  89. package/lib/esm/tree-widget-react/components/trees/index.d.ts +1 -1
  90. package/lib/esm/tree-widget-react/components/trees/index.js +1 -1
  91. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  92. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +1 -1
  93. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +3 -3
  94. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
  95. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
  96. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +5 -5
  97. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  98. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +2 -2
  99. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +12 -12
  100. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  101. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +29 -29
  102. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +26 -26
  103. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  104. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -1
  105. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +36 -1
  106. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  107. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseSearchPaths.d.ts +41 -0
  108. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/{UseFilteredPaths.js → UseSearchPaths.js} +47 -47
  109. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseSearchPaths.js.map +1 -0
  110. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.d.ts +7 -7
  111. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js +11 -11
  112. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js.map +1 -1
  113. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/{FilteredTree.d.ts → SearchResultsTree.d.ts} +8 -8
  114. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/{FilteredTree.js → SearchResultsTree.js} +43 -43
  115. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/SearchResultsTree.js.map +1 -0
  116. package/lib/public/locales/en/TreeWidget.json +13 -13
  117. package/package.json +7 -7
  118. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js.map +0 -1
  119. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.js.map +0 -1
  120. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.d.ts +0 -20
  121. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js.map +0 -1
  122. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js +0 -168
  123. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js.map +0 -1
  124. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.d.ts +0 -91
  125. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js +0 -112
  126. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js.map +0 -1
  127. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.d.ts +0 -41
  128. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js.map +0 -1
  129. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"UseClassificationsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.tsx"],"names":[],"mappings":"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","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 { useCallback, useEffect, useMemo } from \"react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport iconBisCategory3d from \"@stratakit/icons/bis-category-3d.svg\";\nimport { EmptyTreeContent, FilterUnknownError, NoFilterMatches, TooManyFilterMatches } from \"../common/components/EmptyTree.js\";\nimport { useGuid } from \"../common/internal/useGuid.js\";\nimport { useCachedVisibility } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport { useIdsCache } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport { ClassificationsTreeComponent } from \"./ClassificationsTreeComponent.js\";\nimport { ClassificationsTreeDefinition } from \"./ClassificationsTreeDefinition.js\";\nimport { ClassificationsTreeIcon } from \"./ClassificationsTreeIcon.js\";\nimport { ClassificationsTreeIdsCache } from \"./internal/ClassificationsTreeIdsCache.js\";\nimport { useFilteredPaths } from \"./internal/UseFilteredPaths.js\";\nimport { ClassificationsTreeVisibilityHandler } from \"./internal/visibility/ClassificationsTreeVisibilityHandler.js\";\nimport { createFilteredClassificationsTree } from \"./internal/visibility/FilteredTree.js\";\n\nimport type { ReactNode } from \"react\";\nimport type { GuidString } from \"@itwin/core-bentley\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\nimport type { CreateFilteredTreeProps, CreateTreeSpecificVisibilityHandlerProps } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport type { CreateCacheProps } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport type { FilteredTree } from \"../common/internal/visibility/BaseFilteredTree.js\";\nimport type { TreeWidgetViewport } from \"../common/TreeWidgetViewport.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"./ClassificationsTreeDefinition.js\";\nimport type { ClassificationsTreeFilteringError } from \"./internal/UseFilteredPaths.js\";\nimport type { ClassificationsTreeFilterTargets } from \"./internal/visibility/FilteredTree.js\";\n\n/** @alpha */\nexport interface UseClassificationsTreeProps {\n activeView: TreeWidgetViewport;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n emptyTreeContent?: ReactNode;\n filter?: string;\n}\n\n/** @alpha */\ninterface UseClassificationsTreeResult {\n classificationsTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"visibilityHandlerFactory\" | \"getFilteredPaths\" | \"emptyTreeContent\" | \"highlightText\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getDecorations\">>;\n}\n\n/**\n * Custom hook to create and manage state for the categories tree.\n * @alpha\n */\nexport function useClassificationsTree({ activeView, emptyTreeContent, filter, ...rest }: UseClassificationsTreeProps): UseClassificationsTreeResult {\n const hierarchyConfig = useMemo(\n () => ({ ...rest.hierarchyConfig }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [...Object.values(rest.hierarchyConfig)],\n );\n const componentId = useGuid();\n\n const { getCache: getClassificationsTreeIdsCache } = useIdsCache<ClassificationsTreeIdsCache, { hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>(\n {\n imodel: activeView.iModel,\n createCache,\n cacheSpecificProps: useMemo(() => ({ hierarchyConfig }), [hierarchyConfig]),\n componentId,\n },\n );\n\n const { visibilityHandlerFactory, onFilteredPathsChanged } = useClassificationsCachedVisibility({\n activeView,\n getCache: getClassificationsTreeIdsCache,\n componentId,\n });\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n (props) => {\n return new ClassificationsTreeDefinition({ ...props, getIdsCache: getClassificationsTreeIdsCache, hierarchyConfig });\n },\n [getClassificationsTreeIdsCache, hierarchyConfig],\n );\n\n const { getPaths, filteringError } = useFilteredPaths({\n hierarchyConfiguration: hierarchyConfig,\n filter,\n getClassificationsTreeIdsCache,\n onFilteredPathsChanged,\n componentId,\n });\n\n return {\n classificationsTreeProps: {\n treeName: ClassificationsTreeComponent.id,\n getHierarchyDefinition,\n visibilityHandlerFactory,\n getFilteredPaths: getPaths,\n emptyTreeContent: useMemo(() => getEmptyTreeContentComponent(filter, filteringError, emptyTreeContent), [filter, filteringError, emptyTreeContent]),\n highlightText: filter,\n },\n rendererProps: {\n getDecorations: useCallback((node) => <ClassificationsTreeIcon node={node} />, []),\n },\n };\n}\n\nfunction createCache(props: CreateCacheProps<{ hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>) {\n return new ClassificationsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig, props.componentId);\n}\n\nfunction getEmptyTreeContentComponent(filter?: string, error?: ClassificationsTreeFilteringError, emptyTreeContent?: React.ReactNode) {\n if (error) {\n if (error === \"tooManyFilterMatches\") {\n return <TooManyFilterMatches base={\"classificationsTree\"} />;\n }\n return <FilterUnknownError base={\"classificationsTree\"} />;\n }\n if (filter) {\n return <NoFilterMatches base={\"classificationsTree\"} />;\n }\n if (emptyTreeContent) {\n return emptyTreeContent;\n }\n return <EmptyTreeContent icon={iconBisCategory3d} />;\n}\n\nfunction useClassificationsCachedVisibility(props: { activeView: TreeWidgetViewport; getCache: () => ClassificationsTreeIdsCache; componentId: GuidString }) {\n const { activeView, getCache, componentId } = props;\n const { visibilityHandlerFactory, filteredPaths, onFilteredPathsChanged } = useCachedVisibility<\n ClassificationsTreeIdsCache,\n ClassificationsTreeFilterTargets\n >({\n activeView,\n getCache,\n createFilteredTree,\n createTreeSpecificVisibilityHandler,\n componentId,\n });\n\n useEffect(() => {\n getCache().clearFilteredElementsData();\n }, [filteredPaths, getCache]);\n\n return {\n visibilityHandlerFactory,\n onFilteredPathsChanged,\n };\n}\n\nasync function createFilteredTree(props: CreateFilteredTreeProps<ClassificationsTreeIdsCache>): Promise<FilteredTree<ClassificationsTreeFilterTargets>> {\n const { filteringPaths, getCache, imodelAccess } = props;\n return createFilteredClassificationsTree({\n idsCache: getCache(),\n filteringPaths,\n imodelAccess,\n });\n}\n\nfunction createTreeSpecificVisibilityHandler(props: CreateTreeSpecificVisibilityHandlerProps<ClassificationsTreeIdsCache>) {\n const { info, getCache, viewport } = props;\n return new ClassificationsTreeVisibilityHandler({\n alwaysAndNeverDrawnElementInfo: info,\n idsCache: getCache(),\n viewport,\n });\n}\n"]}
1
+ {"version":3,"file":"UseClassificationsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAChI,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,oCAAoC,EAAE,MAAM,+DAA+D,CAAC;AACrH,OAAO,EAAE,sCAAsC,EAAE,MAAM,4CAA4C,CAAC;AA+BpG;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,IAAI,EAA+B;IACvH,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACnC,uDAAuD;IACvD,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CACzC,CAAC;IACF,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC;IAE9B,MAAM,EAAE,QAAQ,EAAE,8BAA8B,EAAE,GAAG,WAAW,CAC9D;QACE,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,WAAW;QACX,kBAAkB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;QAC3E,WAAW;KACZ,CACF,CAAC;IAEF,MAAM,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,GAAG,kCAAkC,CAAC;QAC5F,UAAU;QACV,QAAQ,EAAE,8BAA8B;QACxC,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAG,WAAW,CACxC,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,IAAI,6BAA6B,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,8BAA8B,EAAE,eAAe,EAAE,CAAC,CAAC;IACvH,CAAC,EACD,CAAC,8BAA8B,EAAE,eAAe,CAAC,CAClD,CAAC;IAEF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QAC/C,sBAAsB,EAAE,eAAe;QACvC,UAAU;QACV,8BAA8B;QAC9B,oBAAoB;QACpB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,wBAAwB,EAAE;YACxB,QAAQ,EAAE,4BAA4B,CAAC,EAAE;YACzC,sBAAsB;YACtB,wBAAwB;YACxB,cAAc,EAAE,QAAQ;YACxB,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;YACrJ,aAAa,EAAE,UAAU;SAC1B;QACD,aAAa,EAAE;YACb,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAC,uBAAuB,IAAC,IAAI,EAAE,IAAI,GAAI,EAAE,EAAE,CAAC;SACnF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAuF;IAC1G,OAAO,IAAI,2BAA2B,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AACzI,CAAC;AAED,SAAS,4BAA4B,CAAC,UAAmB,EAAE,KAAsC,EAAE,gBAAkC;IACnI,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,KAAK,KAAK,sBAAsB,EAAE,CAAC;YACrC,OAAO,KAAC,oBAAoB,IAAC,IAAI,EAAE,qBAAqB,GAAI,CAAC;QAC/D,CAAC;QACD,OAAO,KAAC,kBAAkB,IAAC,IAAI,EAAE,qBAAqB,GAAI,CAAC;IAC7D,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,KAAC,eAAe,IAAC,IAAI,EAAE,qBAAqB,GAAI,CAAC;IAC1D,CAAC;IACD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,KAAC,gBAAgB,IAAC,IAAI,EAAE,iBAAiB,GAAI,CAAC;AACvD,CAAC;AAED,SAAS,kCAAkC,CAAC,KAA+G;IACzJ,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IACpD,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,oBAAoB,EAAE,GAAG,mBAAmB,CAAgE;QACzJ,UAAU;QACV,QAAQ;QACR,uBAAuB;QACvB,mCAAmC;QACnC,WAAW;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,EAAE,CAAC,yBAAyB,EAAE,CAAC;IACzC,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE5B,OAAO;QACL,wBAAwB;QACxB,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,KAAgE;IAEhE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IACtD,OAAO,sCAAsC,CAAC;QAC5C,QAAQ,EAAE,QAAQ,EAAE;QACpB,WAAW;QACX,YAAY;KACb,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mCAAmC,CAAC,KAA4E;IACvH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3C,OAAO,IAAI,oCAAoC,CAAC;QAC9C,8BAA8B,EAAE,IAAI;QACpC,QAAQ,EAAE,QAAQ,EAAE;QACpB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC","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 { useCallback, useEffect, useMemo } from \"react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport iconBisCategory3d from \"@stratakit/icons/bis-category-3d.svg\";\nimport { EmptyTreeContent, NoSearchMatches, SearchUnknownError, TooManySearchMatches } from \"../common/components/EmptyTree.js\";\nimport { useGuid } from \"../common/internal/useGuid.js\";\nimport { useCachedVisibility } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport { useIdsCache } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport { ClassificationsTreeComponent } from \"./ClassificationsTreeComponent.js\";\nimport { ClassificationsTreeDefinition } from \"./ClassificationsTreeDefinition.js\";\nimport { ClassificationsTreeIcon } from \"./ClassificationsTreeIcon.js\";\nimport { ClassificationsTreeIdsCache } from \"./internal/ClassificationsTreeIdsCache.js\";\nimport { useSearchPaths } from \"./internal/UseSearchPaths.js\";\nimport { ClassificationsTreeVisibilityHandler } from \"./internal/visibility/ClassificationsTreeVisibilityHandler.js\";\nimport { createClassificationsSearchResultsTree } from \"./internal/visibility/SearchResultsTree.js\";\n\nimport type { ReactNode } from \"react\";\nimport type { GuidString } from \"@itwin/core-bentley\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\nimport type { CreateSearchResultsTreeProps, CreateTreeSpecificVisibilityHandlerProps } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport type { CreateCacheProps } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport type { SearchResultsTree } from \"../common/internal/visibility/BaseSearchResultsTree.js\";\nimport type { TreeWidgetViewport } from \"../common/TreeWidgetViewport.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"./ClassificationsTreeDefinition.js\";\nimport type { ClassificationsTreeSearchError } from \"./internal/UseSearchPaths.js\";\nimport type { ClassificationsTreeSearchTargets } from \"./internal/visibility/SearchResultsTree.js\";\n\n/** @alpha */\nexport interface UseClassificationsTreeProps {\n activeView: TreeWidgetViewport;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n emptyTreeContent?: ReactNode;\n searchText?: string;\n}\n\n/** @alpha */\ninterface UseClassificationsTreeResult {\n classificationsTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"visibilityHandlerFactory\" | \"getSearchPaths\" | \"emptyTreeContent\" | \"highlightText\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getDecorations\">>;\n}\n\n/**\n * Custom hook to create and manage state for the categories tree.\n * @alpha\n */\nexport function useClassificationsTree({ activeView, emptyTreeContent, searchText, ...rest }: UseClassificationsTreeProps): UseClassificationsTreeResult {\n const hierarchyConfig = useMemo(\n () => ({ ...rest.hierarchyConfig }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [...Object.values(rest.hierarchyConfig)],\n );\n const componentId = useGuid();\n\n const { getCache: getClassificationsTreeIdsCache } = useIdsCache<ClassificationsTreeIdsCache, { hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>(\n {\n imodel: activeView.iModel,\n createCache,\n cacheSpecificProps: useMemo(() => ({ hierarchyConfig }), [hierarchyConfig]),\n componentId,\n },\n );\n\n const { visibilityHandlerFactory, onSearchPathsChanged } = useClassificationsCachedVisibility({\n activeView,\n getCache: getClassificationsTreeIdsCache,\n componentId,\n });\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n (props) => {\n return new ClassificationsTreeDefinition({ ...props, getIdsCache: getClassificationsTreeIdsCache, hierarchyConfig });\n },\n [getClassificationsTreeIdsCache, hierarchyConfig],\n );\n\n const { getPaths, searchError } = useSearchPaths({\n hierarchyConfiguration: hierarchyConfig,\n searchText,\n getClassificationsTreeIdsCache,\n onSearchPathsChanged,\n componentId,\n });\n\n return {\n classificationsTreeProps: {\n treeName: ClassificationsTreeComponent.id,\n getHierarchyDefinition,\n visibilityHandlerFactory,\n getSearchPaths: getPaths,\n emptyTreeContent: useMemo(() => getEmptyTreeContentComponent(searchText, searchError, emptyTreeContent), [searchText, searchError, emptyTreeContent]),\n highlightText: searchText,\n },\n rendererProps: {\n getDecorations: useCallback((node) => <ClassificationsTreeIcon node={node} />, []),\n },\n };\n}\n\nfunction createCache(props: CreateCacheProps<{ hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>) {\n return new ClassificationsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig, props.componentId);\n}\n\nfunction getEmptyTreeContentComponent(searchText?: string, error?: ClassificationsTreeSearchError, emptyTreeContent?: React.ReactNode) {\n if (error) {\n if (error === \"tooManySearchMatches\") {\n return <TooManySearchMatches base={\"classificationsTree\"} />;\n }\n return <SearchUnknownError base={\"classificationsTree\"} />;\n }\n if (searchText) {\n return <NoSearchMatches base={\"classificationsTree\"} />;\n }\n if (emptyTreeContent) {\n return emptyTreeContent;\n }\n return <EmptyTreeContent icon={iconBisCategory3d} />;\n}\n\nfunction useClassificationsCachedVisibility(props: { activeView: TreeWidgetViewport; getCache: () => ClassificationsTreeIdsCache; componentId: GuidString }) {\n const { activeView, getCache, componentId } = props;\n const { visibilityHandlerFactory, searchPaths, onSearchPathsChanged } = useCachedVisibility<ClassificationsTreeIdsCache, ClassificationsTreeSearchTargets>({\n activeView,\n getCache,\n createSearchResultsTree,\n createTreeSpecificVisibilityHandler,\n componentId,\n });\n\n useEffect(() => {\n getCache().clearFilteredElementsData();\n }, [searchPaths, getCache]);\n\n return {\n visibilityHandlerFactory,\n onSearchPathsChanged,\n };\n}\n\nasync function createSearchResultsTree(\n props: CreateSearchResultsTreeProps<ClassificationsTreeIdsCache>,\n): Promise<SearchResultsTree<ClassificationsTreeSearchTargets>> {\n const { searchPaths, getCache, imodelAccess } = props;\n return createClassificationsSearchResultsTree({\n idsCache: getCache(),\n searchPaths,\n imodelAccess,\n });\n}\n\nfunction createTreeSpecificVisibilityHandler(props: CreateTreeSpecificVisibilityHandlerProps<ClassificationsTreeIdsCache>) {\n const { info, getCache, viewport } = props;\n return new ClassificationsTreeVisibilityHandler({\n alwaysAndNeverDrawnElementInfo: info,\n idsCache: getCache(),\n viewport,\n });\n}\n"]}
@@ -19,16 +19,16 @@ interface UseClassificationsTreeDefinitionProps {
19
19
  }>;
20
20
  hierarchyConfig: ClassificationsTreeHierarchyConfiguration;
21
21
  /**
22
- * Optional search parameters to filter tree nodes.
22
+ * Optional parameters to search for tree nodes.
23
23
  */
24
24
  search?: {
25
25
  /**
26
- * Text used to filter tree nodes by label.
26
+ * Text used to search tree nodes by label.
27
27
  */
28
28
  searchText: string;
29
29
  } | {
30
30
  /**
31
- * List of instance keys to filter tree nodes by.
31
+ * List of instance keys to search tree nodes by.
32
32
  */
33
33
  targetItems: Array<InstanceKey>;
34
34
  };
@@ -36,7 +36,7 @@ interface UseClassificationsTreeDefinitionProps {
36
36
  /** @alpha */
37
37
  interface UseClassificationsTreeDefinitionResult {
38
38
  definition: HierarchyDefinition;
39
- getFilteredPaths?: FunctionProps<typeof useTree>["getFilteredPaths"];
39
+ getSearchPaths?: FunctionProps<typeof useTree>["getSearchPaths"];
40
40
  }
41
41
  /** @alpha */
42
42
  export declare function useClassificationsTreeDefinition(props: UseClassificationsTreeDefinitionProps): UseClassificationsTreeDefinitionResult;
@@ -23,7 +23,7 @@ export function useClassificationsTreeDefinition(props) {
23
23
  });
24
24
  }, [imodels, hierarchyConfig]);
25
25
  const searchTerm = search ? ("searchText" in search ? search.searchText : search.targetItems) : undefined;
26
- const getFilteredPaths = useMemo(() => {
26
+ const getSearchPaths = useMemo(() => {
27
27
  if (!searchTerm) {
28
28
  return undefined;
29
29
  }
@@ -46,7 +46,7 @@ export function useClassificationsTreeDefinition(props) {
46
46
  }, [imodels, hierarchyConfig, searchTerm]);
47
47
  return {
48
48
  definition,
49
- getFilteredPaths,
49
+ getSearchPaths,
50
50
  };
51
51
  }
52
52
  function getOrCreateIdsCache({ imodelKey, imodels, hierarchyConfig, idsCaches, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"UseClassificationsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.ts"],"names":[],"mappings":"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","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 { useMemo, useRef } from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { ClassificationsTreeDefinition } from \"./ClassificationsTreeDefinition.js\";\nimport { ClassificationsTreeIdsCache } from \"./internal/ClassificationsTreeIdsCache.js\";\n\nimport type { MutableRefObject } from \"react\";\nimport type { HierarchyDefinition } from \"@itwin/presentation-hierarchies\";\nimport type { useIModelTree, useTree } from \"@itwin/presentation-hierarchies-react\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { FunctionProps } from \"../common/Utils.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"./ClassificationsTreeDefinition.js\";\n\n/** @alpha */\ninterface UseClassificationsTreeDefinitionProps {\n /**\n * A list of iModels to create merged hierarchy for.\n *\n * **Warning:** These **must** all be different versions of the same iModel, ordered from the earliest to the\n * latest version. Not obeying this rule may result in undefined behavior.\n */\n imodels: Array<{\n /**\n * An object that provides access to iModel's data and metadata.\n */\n imodelAccess: FunctionProps<typeof useIModelTree>[\"imodelAccess\"];\n }>;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n /**\n * Optional search parameters to filter tree nodes.\n */\n search?:\n | {\n /**\n * Text used to filter tree nodes by label.\n */\n searchText: string;\n }\n | {\n /**\n * List of instance keys to filter tree nodes by.\n */\n targetItems: Array<InstanceKey>;\n };\n}\n\n/** @alpha */\ninterface UseClassificationsTreeDefinitionResult {\n definition: HierarchyDefinition;\n getFilteredPaths?: FunctionProps<typeof useTree>[\"getFilteredPaths\"];\n}\n\n/** @alpha */\nexport function useClassificationsTreeDefinition(props: UseClassificationsTreeDefinitionProps): UseClassificationsTreeDefinitionResult {\n const { imodels, hierarchyConfig, search } = props;\n\n const idsCaches = useRef<Map<string, ClassificationsTreeIdsCache>>(new Map());\n\n const definition = useMemo(() => {\n return new ClassificationsTreeDefinition({\n imodelAccess: imodels[imodels.length - 1].imodelAccess,\n getIdsCache: (imodelKey: string) =>\n getOrCreateIdsCache({\n imodelKey,\n imodels,\n idsCaches,\n hierarchyConfig,\n }),\n hierarchyConfig,\n });\n }, [imodels, hierarchyConfig]);\n\n const searchTerm = search ? (\"searchText\" in search ? search.searchText : search.targetItems) : undefined;\n const getFilteredPaths = useMemo<FunctionProps<typeof useTree>[\"getFilteredPaths\"]>(() => {\n if (!searchTerm) {\n return undefined;\n }\n\n return async ({ abortSignal }) => {\n const [first, ...rest] = await Promise.all(\n imodels.map(async ({ imodelAccess }) =>\n ClassificationsTreeDefinition.createInstanceKeyPaths({\n hierarchyConfig,\n idsCache: getOrCreateIdsCache({\n imodelKey: imodelAccess.imodelKey,\n imodels,\n idsCaches,\n hierarchyConfig,\n }),\n imodelAccess,\n abortSignal,\n limit: typeof searchTerm !== \"string\" ? \"unbounded\" : undefined,\n ...(typeof searchTerm === \"string\" ? { label: searchTerm } : { targetItems: searchTerm }),\n }),\n ),\n );\n\n return first.concat(...rest);\n };\n }, [imodels, hierarchyConfig, searchTerm]);\n\n return {\n definition,\n getFilteredPaths,\n };\n}\n\nfunction getOrCreateIdsCache({\n imodelKey,\n imodels,\n hierarchyConfig,\n idsCaches,\n}: {\n imodelKey: string;\n imodels: Array<{\n imodelAccess: FunctionProps<typeof useIModelTree>[\"imodelAccess\"];\n }>;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n idsCaches: MutableRefObject<Map<string, ClassificationsTreeIdsCache>>;\n}) {\n let idsCache = idsCaches.current.get(imodelKey);\n if (!idsCache) {\n const imodel = imodels.find((currImodel) => currImodel.imodelAccess.imodelKey === imodelKey);\n assert(!!imodel);\n idsCache = new ClassificationsTreeIdsCache(imodel.imodelAccess, hierarchyConfig);\n idsCaches.current.set(imodelKey, idsCache);\n }\n return idsCache;\n}\n"]}
1
+ {"version":3,"file":"UseClassificationsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.ts"],"names":[],"mappings":"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","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 { useMemo, useRef } from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { ClassificationsTreeDefinition } from \"./ClassificationsTreeDefinition.js\";\nimport { ClassificationsTreeIdsCache } from \"./internal/ClassificationsTreeIdsCache.js\";\n\nimport type { MutableRefObject } from \"react\";\nimport type { HierarchyDefinition } from \"@itwin/presentation-hierarchies\";\nimport type { useIModelTree, useTree } from \"@itwin/presentation-hierarchies-react\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { FunctionProps } from \"../common/Utils.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"./ClassificationsTreeDefinition.js\";\n\n/** @alpha */\ninterface UseClassificationsTreeDefinitionProps {\n /**\n * A list of iModels to create merged hierarchy for.\n *\n * **Warning:** These **must** all be different versions of the same iModel, ordered from the earliest to the\n * latest version. Not obeying this rule may result in undefined behavior.\n */\n imodels: Array<{\n /**\n * An object that provides access to iModel's data and metadata.\n */\n imodelAccess: FunctionProps<typeof useIModelTree>[\"imodelAccess\"];\n }>;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n /**\n * Optional parameters to search for tree nodes.\n */\n search?:\n | {\n /**\n * Text used to search tree nodes by label.\n */\n searchText: string;\n }\n | {\n /**\n * List of instance keys to search tree nodes by.\n */\n targetItems: Array<InstanceKey>;\n };\n}\n\n/** @alpha */\ninterface UseClassificationsTreeDefinitionResult {\n definition: HierarchyDefinition;\n getSearchPaths?: FunctionProps<typeof useTree>[\"getSearchPaths\"];\n}\n\n/** @alpha */\nexport function useClassificationsTreeDefinition(props: UseClassificationsTreeDefinitionProps): UseClassificationsTreeDefinitionResult {\n const { imodels, hierarchyConfig, search } = props;\n\n const idsCaches = useRef<Map<string, ClassificationsTreeIdsCache>>(new Map());\n\n const definition = useMemo(() => {\n return new ClassificationsTreeDefinition({\n imodelAccess: imodels[imodels.length - 1].imodelAccess,\n getIdsCache: (imodelKey: string) =>\n getOrCreateIdsCache({\n imodelKey,\n imodels,\n idsCaches,\n hierarchyConfig,\n }),\n hierarchyConfig,\n });\n }, [imodels, hierarchyConfig]);\n\n const searchTerm = search ? (\"searchText\" in search ? search.searchText : search.targetItems) : undefined;\n const getSearchPaths = useMemo<FunctionProps<typeof useTree>[\"getSearchPaths\"]>(() => {\n if (!searchTerm) {\n return undefined;\n }\n\n return async ({ abortSignal }) => {\n const [first, ...rest] = await Promise.all(\n imodels.map(async ({ imodelAccess }) =>\n ClassificationsTreeDefinition.createInstanceKeyPaths({\n hierarchyConfig,\n idsCache: getOrCreateIdsCache({\n imodelKey: imodelAccess.imodelKey,\n imodels,\n idsCaches,\n hierarchyConfig,\n }),\n imodelAccess,\n abortSignal,\n limit: typeof searchTerm !== \"string\" ? \"unbounded\" : undefined,\n ...(typeof searchTerm === \"string\" ? { label: searchTerm } : { targetItems: searchTerm }),\n }),\n ),\n );\n\n return first.concat(...rest);\n };\n }, [imodels, hierarchyConfig, searchTerm]);\n\n return {\n definition,\n getSearchPaths,\n };\n}\n\nfunction getOrCreateIdsCache({\n imodelKey,\n imodels,\n hierarchyConfig,\n idsCaches,\n}: {\n imodelKey: string;\n imodels: Array<{\n imodelAccess: FunctionProps<typeof useIModelTree>[\"imodelAccess\"];\n }>;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n idsCaches: MutableRefObject<Map<string, ClassificationsTreeIdsCache>>;\n}) {\n let idsCache = idsCaches.current.get(imodelKey);\n if (!idsCache) {\n const imodel = imodels.find((currImodel) => currImodel.imodelAccess.imodelKey === imodelKey);\n assert(!!imodel);\n idsCache = new ClassificationsTreeIdsCache(imodel.imodelAccess, hierarchyConfig);\n idsCaches.current.set(imodelKey, idsCache);\n }\n return idsCache;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { Observable } from "rxjs";
2
2
  import type { GuidString, Id64Arg, Id64Array, Id64Set, Id64String } from "@itwin/core-bentley";
3
3
  import type { HierarchyNodeIdentifiersPath, LimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
4
- import type { CategoryId, ElementId, ModelId } from "../../common/internal/Types.js";
4
+ import type { CategoryId, ElementId, ModelId, SubCategoryId } from "../../common/internal/Types.js";
5
5
  import type { ClassificationsTreeHierarchyConfiguration } from "../ClassificationsTreeDefinition.js";
6
6
  /** @internal */
7
7
  export type ClassificationId = Id64String;
@@ -12,6 +12,9 @@ export declare class ClassificationsTreeIdsCache implements Disposable {
12
12
  #private;
13
13
  constructor(queryExecutor: LimitingECSqlQueryExecutor, hierarchyConfig: ClassificationsTreeHierarchyConfiguration, componentId?: GuidString);
14
14
  [Symbol.dispose](): void;
15
+ private querySubCategories;
16
+ private getSubCategoriesInfo;
17
+ getSubCategories(categoryId: Id64String): Observable<Array<SubCategoryId>>;
15
18
  private queryElementModelCategories;
16
19
  private getElementModelsCategories;
17
20
  private queryModeledElements;
@@ -4,12 +4,13 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { defer, EMPTY, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from "rxjs";
6
6
  import { Guid, Id64 } from "@itwin/core-bentley";
7
- import { CLASS_NAME_Classification, CLASS_NAME_ClassificationSystem, CLASS_NAME_ClassificationTable, CLASS_NAME_DrawingCategory, CLASS_NAME_ElementHasClassifications, CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d, CLASS_NAME_SpatialCategory, } from "../../common/internal/ClassNameDefinitions.js";
7
+ import { CLASS_NAME_Classification, CLASS_NAME_ClassificationSystem, CLASS_NAME_ClassificationTable, CLASS_NAME_DrawingCategory, CLASS_NAME_ElementHasClassifications, CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d, CLASS_NAME_SpatialCategory, CLASS_NAME_SubCategory, } from "../../common/internal/ClassNameDefinitions.js";
8
8
  import { ModelCategoryElementsCountCache } from "../../common/internal/ModelCategoryElementsCountCache.js";
9
9
  import { joinId64Arg } from "../../common/internal/Utils.js";
10
10
  /** @internal */
11
11
  export class ClassificationsTreeIdsCache {
12
12
  #categoryElementCounts;
13
+ #categorySubCategories;
13
14
  #elementModelsCategories;
14
15
  #modelWithCategoryModeledElements;
15
16
  #classificationInfos;
@@ -28,6 +29,40 @@ export class ClassificationsTreeIdsCache {
28
29
  [Symbol.dispose]() {
29
30
  this.#categoryElementCounts[Symbol.dispose]();
30
31
  }
32
+ querySubCategories() {
33
+ return defer(() => {
34
+ const definitionsQuery = `
35
+ SELECT
36
+ sc.ECInstanceId id,
37
+ sc.Parent.Id categoryId
38
+ FROM
39
+ ${CLASS_NAME_SubCategory} sc
40
+ WHERE
41
+ NOT sc.IsPrivate
42
+ `;
43
+ return this.#queryExecutor.createQueryReader({ ecsql: definitionsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: `${this.#componentName}/${this.#componentId}/visible-sub-categories` });
44
+ }).pipe(map((row) => {
45
+ return { id: row.id, parentId: row.categoryId };
46
+ }));
47
+ }
48
+ getSubCategoriesInfo() {
49
+ this.#categorySubCategories ??= this.querySubCategories()
50
+ .pipe(reduce((acc, queriedSubCategory) => {
51
+ const entry = acc.get(queriedSubCategory.parentId);
52
+ if (entry) {
53
+ entry.push(queriedSubCategory.id);
54
+ }
55
+ else {
56
+ acc.set(queriedSubCategory.parentId, [queriedSubCategory.id]);
57
+ }
58
+ return acc;
59
+ }, new Map()))
60
+ .pipe(shareReplay());
61
+ return this.#categorySubCategories;
62
+ }
63
+ getSubCategories(categoryId) {
64
+ return this.getSubCategoriesInfo().pipe(map((categorySubCategories) => categorySubCategories.get(categoryId) ?? []));
65
+ }
31
66
  queryElementModelCategories() {
32
67
  return defer(() => {
33
68
  const query = `
@@ -1 +1 @@
1
- {"version":3,"file":"ClassificationsTreeIdsCache.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.ts"],"names":[],"mappings":"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","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 { defer, EMPTY, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport {\n CLASS_NAME_Classification,\n CLASS_NAME_ClassificationSystem,\n CLASS_NAME_ClassificationTable,\n CLASS_NAME_DrawingCategory,\n CLASS_NAME_ElementHasClassifications,\n CLASS_NAME_GeometricElement2d,\n CLASS_NAME_GeometricElement3d,\n CLASS_NAME_SpatialCategory,\n} from \"../../common/internal/ClassNameDefinitions.js\";\nimport { ModelCategoryElementsCountCache } from \"../../common/internal/ModelCategoryElementsCountCache.js\";\nimport { joinId64Arg } from \"../../common/internal/Utils.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNodeIdentifiersPath, LimitingECSqlQueryExecutor } from \"@itwin/presentation-hierarchies\";\nimport type { CategoryId, ElementId, ModelId } from \"../../common/internal/Types.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"../ClassificationsTreeDefinition.js\";\n\n/** @internal */\nexport type ClassificationId = Id64String;\n/** @internal */\nexport type ClassificationTableId = Id64String;\n\ninterface ClassificationInfo {\n parentClassificationOrTableId: ClassificationId | ClassificationTableId | undefined;\n childClassificationIds: ClassificationId[];\n relatedCategories2d: CategoryId[];\n relatedCategories3d: CategoryId[];\n}\n\n/** @internal */\nexport class ClassificationsTreeIdsCache implements Disposable {\n readonly #categoryElementCounts: ModelCategoryElementsCountCache;\n #elementModelsCategories: Observable<Map<ModelId, { category2dIds: Id64Set; category3dIds: Id64Set; isSubModel: boolean }>> | undefined;\n #modelWithCategoryModeledElements: Observable<Map<ModelId, Map<CategoryId, Set<ElementId>>>> | undefined;\n #classificationInfos: Observable<Map<ClassificationId | ClassificationTableId, ClassificationInfo>> | undefined;\n #filteredElementsData: Observable<Map<ElementId, { modelId: Id64String; categoryId: Id64String }>> | undefined;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, hierarchyConfig: ClassificationsTreeHierarchyConfiguration, componentId?: GuidString) {\n this.#queryExecutor = queryExecutor;\n this.#hierarchyConfig = hierarchyConfig;\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"ClassificationsTreeIdsCache\";\n this.#categoryElementCounts = new ModelCategoryElementsCountCache(\n this.#queryExecutor,\n [\"BisCore.GeometricElement2d\", \"BisCore.GeometricElement3d\"],\n this.#componentId,\n );\n }\n\n public [Symbol.dispose]() {\n this.#categoryElementCounts[Symbol.dispose]();\n }\n\n private queryElementModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n type: \"2d\" | \"3d\";\n }> {\n return defer(() => {\n const query = `\n SELECT * FROM (\n SELECT '3d' type, this.Model.Id modelId, this.Category.Id categoryId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement3d this ON m.ECInstanceId = this.Model.Id\n WHERE this.Parent.Id IS NULL AND m.IsPrivate = false\n GROUP BY modelId, categoryId\n )\n UNION ALL\n SELECT * FROM (\n SELECT '2d' type, this.Model.Id modelId, this.Category.Id categoryId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement2d this ON m.ECInstanceId = this.Model.Id\n WHERE this.Parent.Id IS NULL AND m.IsPrivate = false\n GROUP BY modelId, categoryId\n )\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/element-models-and-categories` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, type: row.type };\n }),\n );\n }\n\n private getElementModelsCategories() {\n this.#elementModelsCategories ??= forkJoin({\n modelCategories: this.queryElementModelCategories().pipe(\n reduce((acc, queriedCategory) => {\n let modelEntry = acc.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = { category2dIds: new Set(), category3dIds: new Set() };\n acc.set(queriedCategory.modelId, modelEntry);\n }\n switch (queriedCategory.type) {\n case \"2d\":\n modelEntry.category2dIds.add(queriedCategory.categoryId);\n break;\n case \"3d\":\n modelEntry.category3dIds.add(queriedCategory.categoryId);\n break;\n }\n return acc;\n }, new Map<ModelId, { category2dIds: Id64Set; category3dIds: Id64Set }>()),\n ),\n modelWithCategoryModeledElements: this.getModelWithCategoryModeledElements(),\n }).pipe(\n map(({ modelCategories, modelWithCategoryModeledElements }) => {\n const result = new Map<ModelId, { category2dIds: Id64Set; category3dIds: Id64Set; isSubModel: boolean }>();\n const subModels = new Set<Id64String>();\n modelWithCategoryModeledElements.forEach((categoryMap) =>\n categoryMap.forEach((categorySubModels) => categorySubModels.forEach((subModelId) => subModels.add(subModelId))),\n );\n for (const [modelId, modelEntry] of modelCategories) {\n const isSubModel = subModels.has(modelId);\n result.set(modelId, { category2dIds: modelEntry.category2dIds, category3dIds: modelEntry.category3dIds, isSubModel });\n }\n return result;\n }),\n shareReplay(),\n );\n return this.#elementModelsCategories;\n }\n\n private queryModeledElements(): Observable<{\n modelId: Id64String;\n modeledElementId: Id64String;\n categoryId: Id64String;\n rootCategoryId: Id64String;\n }> {\n return defer(() => {\n const query = `\n SELECT\n pe.ECInstanceId modeledElementId,\n pe.Category.Id categoryId,\n pe.Model.Id modelId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement3d pe ON pe.ECInstanceId = m.ModeledElement.Id\n WHERE\n m.IsPrivate = false\n AND m.ECInstanceId IN (SELECT Model.Id FROM BisCore.Element)\n UNION ALL\n SELECT\n pe.ECInstanceId modeledElementId,\n pe.Category.Id categoryId,\n pe.Model.Id modelId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement2d pe ON pe.ECInstanceId = m.ModeledElement.Id\n WHERE\n m.IsPrivate = false\n AND m.ECInstanceId IN (SELECT Model.Id FROM BisCore.Element)\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/modeled-elements` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, modeledElementId: row.modeledElementId, rootCategoryId: row.rootCategoryId };\n }),\n );\n }\n\n private getModelWithCategoryModeledElements() {\n this.#modelWithCategoryModeledElements ??= this.queryModeledElements().pipe(\n reduce((acc, { modelId, categoryId, modeledElementId }) => {\n let modelEntry = acc.get(modelId);\n if (!modelEntry) {\n modelEntry = new Map();\n acc.set(modelId, modelEntry);\n }\n const categoryEntry = modelEntry.get(categoryId);\n if (!categoryEntry) {\n modelEntry.set(categoryId, new Set([modeledElementId]));\n } else {\n categoryEntry.add(modeledElementId);\n }\n return acc;\n }, new Map<ModelId, Map<CategoryId, Set<ElementId>>>()),\n shareReplay(),\n );\n return this.#modelWithCategoryModeledElements;\n }\n\n public getCategoriesModeledElements(modelId: Id64String, categoryIds: Id64Arg): Observable<Id64Array> {\n return this.getModelWithCategoryModeledElements().pipe(\n mergeMap((modelWithCategoryModeledElements) => {\n const result = new Array<ElementId>();\n const categoryMap = modelWithCategoryModeledElements.get(modelId);\n if (!categoryMap) {\n return of(result);\n }\n return from(Id64.iterable(categoryIds)).pipe(\n map((categoryId) => categoryMap.get(categoryId)),\n mergeMap((elementsSet) => (elementsSet ? from(elementsSet) : EMPTY)),\n toArray(),\n );\n }),\n );\n }\n\n public getCategoriesElementModels(categoryIds: Id64Arg, includeSubModels?: boolean): Observable<{ id: CategoryId; models: Array<ModelId> | undefined }> {\n return this.getElementModelsCategories().pipe(\n mergeMap((elementModelsCategories) =>\n from(Id64.iterable(categoryIds)).pipe(\n map((categoryId) => {\n const categoryModels = new Array<ModelId>();\n elementModelsCategories.forEach(({ category2dIds, category3dIds, isSubModel }, modelId) => {\n if ((includeSubModels || !isSubModel) && (category2dIds.has(categoryId) || category3dIds.has(categoryId))) {\n categoryModels.push(modelId);\n }\n });\n return { id: categoryId, models: categoryModels.length > 0 ? categoryModels : undefined };\n }),\n ),\n ),\n );\n }\n\n public getModelCategoryIds(modelId: Id64String): Observable<{ drawing: Id64Array; spatial: Id64Array }> {\n return this.getElementModelsCategories().pipe(\n map((elementModelsCategories) => {\n return {\n drawing: Array.from(elementModelsCategories.get(modelId)?.category2dIds ?? []),\n spatial: Array.from(elementModelsCategories.get(modelId)?.category3dIds ?? []),\n };\n }),\n );\n }\n\n public getAllCategories(): Observable<{ drawing: Id64Set; spatial: Id64Set }> {\n return this.getElementModelsCategories().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce(\n (acc, { category2dIds, category3dIds }) => {\n category2dIds.forEach((id) => acc.drawing.add(id));\n category3dIds.forEach((id) => acc.spatial.add(id));\n return acc;\n },\n { drawing: new Set<Id64String>(), spatial: new Set<Id64String>() },\n ),\n );\n }\n\n public hasSubModel(elementId: Id64String): Observable<boolean> {\n return this.getElementModelsCategories().pipe(map((elementModelsCategories) => elementModelsCategories.has(elementId)));\n }\n\n public getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Observable<number> {\n return this.#categoryElementCounts.getCategoryElementsCount(modelId, categoryId);\n }\n\n private queryClassifications(): Observable<\n {\n id: Id64String;\n relatedCategories2d: CategoryId[];\n relatedCategories3d: CategoryId[];\n } & ({ tableId: ClassificationTableId; parentId: undefined } | { tableId: undefined; parentId: ClassificationId })\n > {\n return defer(() => {\n const CLASSIFICATIONS_CTE = \"Classifications\";\n const ctes = [\n `\n ${CLASSIFICATIONS_CTE}(ClassificationId, ClassificationTableId, ParentClassificationId) AS (\n SELECT\n cl.ECInstanceId,\n ct.ECInstanceId,\n NULL\n FROM ${CLASS_NAME_Classification} cl\n JOIN ${CLASS_NAME_ClassificationTable} ct ON ct.ECInstanceId = cl.Model.Id\n JOIN ${CLASS_NAME_ClassificationSystem} cs ON cs.ECInstanceId = ct.Parent.Id\n WHERE\n cs.CodeValue = '${this.#hierarchyConfig.rootClassificationSystemCode}'\n AND NOT ct.IsPrivate\n AND NOT cl.IsPrivate\n AND cl.Parent.Id IS NULL\n\n UNION ALL\n\n SELECT\n cl.ECInstanceId,\n NULL,\n cl.Parent.Id\n FROM\n ${CLASSIFICATIONS_CTE} cte\n JOIN ${CLASS_NAME_Classification} cl ON cl.Parent.Id = cte.ClassificationId\n WHERE\n NOT cl.IsPrivate\n )\n `,\n ];\n const ecsql = `\n SELECT\n cl.ClassificationId id,\n cl.ClassificationTableId tableId,\n cl.ParentClassificationId parentId,\n (\n SELECT group_concat(IdToHex(cat.ECInstanceId))\n FROM ${CLASS_NAME_GeometricElement2d} e\n JOIN ${CLASS_NAME_DrawingCategory} cat ON cat.ECInstanceId = e.Category.Id\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = e.ECInstanceId\n WHERE e.Parent.Id IS NULL AND NOT cat.IsPrivate AND ehc.TargetECInstanceId = cl.ClassificationId\n GROUP BY ehc.TargetECInstanceId\n ) relatedCategories2d,\n (\n SELECT group_concat(IdToHex(cat.ECInstanceId))\n FROM ${CLASS_NAME_GeometricElement3d} e\n JOIN ${CLASS_NAME_SpatialCategory} cat ON cat.ECInstanceId = e.Category.Id\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = e.ECInstanceId\n WHERE e.Parent.Id IS NULL AND NOT cat.IsPrivate AND ehc.TargetECInstanceId = cl.ClassificationId\n GROUP BY ehc.TargetECInstanceId\n ) relatedCategories3d\n FROM ${CLASSIFICATIONS_CTE} cl\n `;\n return this.#queryExecutor.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/classifications` },\n );\n }).pipe(\n map((row) => {\n return {\n id: row.id,\n tableId: row.tableId,\n parentId: row.parentId,\n relatedCategories2d: row.relatedCategories2d ? (row.relatedCategories2d as string).split(\",\") : [],\n relatedCategories3d: row.relatedCategories3d ? (row.relatedCategories3d as string).split(\",\") : [],\n };\n }),\n );\n }\n\n private getClassificationsInfo() {\n this.#classificationInfos ??= this.queryClassifications().pipe(\n reduce((acc, { id, tableId, parentId, relatedCategories2d, relatedCategories3d }) => {\n const tableOrParentId = tableId ?? parentId;\n let parentInfo = acc.get(tableOrParentId);\n if (!parentInfo) {\n parentInfo = { childClassificationIds: [], relatedCategories2d: [], relatedCategories3d: [], parentClassificationOrTableId: undefined };\n acc.set(tableOrParentId, parentInfo);\n }\n parentInfo.childClassificationIds.push(id);\n let classificationEntry = acc.get(id);\n if (!classificationEntry) {\n classificationEntry = { childClassificationIds: [], relatedCategories2d, relatedCategories3d, parentClassificationOrTableId: tableOrParentId };\n acc.set(id, classificationEntry);\n } else {\n classificationEntry.parentClassificationOrTableId = tableOrParentId;\n }\n return acc;\n }, new Map<ClassificationId | ClassificationTableId, ClassificationInfo>()),\n shareReplay(),\n );\n return this.#classificationInfos;\n }\n\n public getAllContainedCategories(classificationOrTableIds: Id64Arg): Observable<{ drawing: Id64Array; spatial: Id64Array }> {\n const result = { drawing: new Array<CategoryId>(), spatial: new Array<CategoryId>() };\n if (Id64.sizeOf(classificationOrTableIds) === 0) {\n return of(result);\n }\n return this.getClassificationsInfo().pipe(\n mergeMap((classificationsInfo) =>\n from(Id64.iterable(classificationOrTableIds)).pipe(\n reduce(\n (acc, classificationOrTableId) => {\n const classificationInfo = classificationsInfo.get(classificationOrTableId);\n if (classificationInfo === undefined) {\n return acc;\n }\n acc.drawing.push(...classificationInfo.relatedCategories2d);\n acc.spatial.push(...classificationInfo.relatedCategories3d);\n acc.childClassifications.push(...classificationInfo.childClassificationIds);\n return acc;\n },\n { drawing: new Array<Id64String>(), spatial: new Array<Id64String>(), childClassifications: new Array<Id64String>() },\n ),\n mergeMap(({ drawing, spatial, childClassifications }) => {\n if (childClassifications.length === 0) {\n return of({ drawing, spatial });\n }\n return this.getAllContainedCategories(childClassifications).pipe(\n map((childResult) => {\n drawing.push(...childResult.drawing);\n spatial.push(...childResult.spatial);\n return { drawing, spatial };\n }),\n );\n }),\n ),\n ),\n );\n }\n\n public getDirectChildClassifications(classificationOrTableIds: Id64Arg): Observable<ClassificationId[]> {\n const result = new Array<ClassificationId>();\n if (Id64.sizeOf(classificationOrTableIds) === 0) {\n return of(result);\n }\n return this.getClassificationsInfo().pipe(\n mergeMap((classificationsInfo) =>\n from(Id64.iterable(classificationOrTableIds)).pipe(\n reduce((acc, classificationOrTableId) => {\n const classificationInfo = classificationsInfo.get(classificationOrTableId);\n if (classificationInfo !== undefined) {\n acc.push(...classificationInfo.childClassificationIds);\n }\n return acc;\n }, result),\n ),\n ),\n );\n }\n\n public getClassificationsPathObs(classificationIds: Id64Arg): Observable<HierarchyNodeIdentifiersPath> {\n return from(this.getClassificationsInfo()).pipe(\n mergeMap((classificationsInfo) => {\n return from(Id64.iterable(classificationIds)).pipe(\n map((classificationId) => {\n const path: HierarchyNodeIdentifiersPath = [{ id: classificationId, className: CLASS_NAME_Classification }];\n let parentId = classificationsInfo.get(classificationId)?.parentClassificationOrTableId;\n while (parentId !== undefined) {\n const parentIdOfParent = classificationsInfo.get(parentId)?.parentClassificationOrTableId;\n if (parentIdOfParent) {\n path.push({ className: CLASS_NAME_Classification, id: parentId });\n } else {\n path.push({ className: CLASS_NAME_ClassificationTable, id: parentId });\n }\n parentId = parentIdOfParent;\n }\n return path.reverse();\n }),\n );\n }),\n );\n }\n\n public getAllClassifications(): Observable<ClassificationId[]> {\n return this.getClassificationsInfo().pipe(map((classificationsInfo) => [...classificationsInfo.keys()]));\n }\n\n private queryFilteredElementsData({ element2dIds, element3dIds }: { element2dIds: Id64Arg; element3dIds: Id64Arg }): Observable<{\n modelId: Id64String;\n id: ElementId;\n categoryId: Id64String;\n }> {\n return defer(() => {\n const queries = new Array<string>();\n if (Id64.sizeOf(element2dIds) > 0) {\n queries.push(`\n SELECT Model.Id modelId, Category.Id categoryId, ECInstanceId id\n FROM ${CLASS_NAME_GeometricElement2d}\n WHERE ECInstanceId IN (${joinId64Arg(element2dIds, \",\")})\n `);\n }\n if (Id64.sizeOf(element3dIds) > 0) {\n queries.push(`\n SELECT Model.Id modelId, Category.Id categoryId, ECInstanceId id\n FROM ${CLASS_NAME_GeometricElement3d}\n WHERE ECInstanceId IN (${joinId64Arg(element3dIds, \",\")})\n `);\n }\n return this.#queryExecutor.createQueryReader(\n { ecsql: queries.join(\" UNION ALL \") },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/filtered-elements/${Guid.createValue()}`,\n },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, id: row.id, categoryId: row.categoryId };\n }),\n );\n }\n\n public getFilteredElementsData({\n element2dIds,\n element3dIds,\n }: {\n element2dIds: Id64Arg;\n element3dIds: Id64Arg;\n }): Observable<Map<ElementId, { categoryId: Id64String; modelId: Id64String }>> {\n const result = new Map<ElementId, { categoryId: Id64String; modelId: Id64String }>();\n if (Id64.sizeOf(element2dIds) === 0 && Id64.sizeOf(element3dIds) === 0) {\n return of(result);\n }\n this.#filteredElementsData ??= this.queryFilteredElementsData({\n element2dIds,\n element3dIds,\n }).pipe(\n reduce((acc, { modelId, id, categoryId }) => {\n acc.set(id, { modelId, categoryId });\n return acc;\n }, result),\n shareReplay(),\n );\n return this.#filteredElementsData;\n }\n\n public clearFilteredElementsData() {\n this.#filteredElementsData = undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"ClassificationsTreeIdsCache.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.ts"],"names":[],"mappings":"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","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 { defer, EMPTY, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport {\n CLASS_NAME_Classification,\n CLASS_NAME_ClassificationSystem,\n CLASS_NAME_ClassificationTable,\n CLASS_NAME_DrawingCategory,\n CLASS_NAME_ElementHasClassifications,\n CLASS_NAME_GeometricElement2d,\n CLASS_NAME_GeometricElement3d,\n CLASS_NAME_SpatialCategory,\n CLASS_NAME_SubCategory,\n} from \"../../common/internal/ClassNameDefinitions.js\";\nimport { ModelCategoryElementsCountCache } from \"../../common/internal/ModelCategoryElementsCountCache.js\";\nimport { joinId64Arg } from \"../../common/internal/Utils.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNodeIdentifiersPath, LimitingECSqlQueryExecutor } from \"@itwin/presentation-hierarchies\";\nimport type { CategoryId, ElementId, ModelId, SubCategoryId } from \"../../common/internal/Types.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"../ClassificationsTreeDefinition.js\";\n\n/** @internal */\nexport type ClassificationId = Id64String;\n/** @internal */\nexport type ClassificationTableId = Id64String;\n\ninterface ClassificationInfo {\n parentClassificationOrTableId: ClassificationId | ClassificationTableId | undefined;\n childClassificationIds: ClassificationId[];\n relatedCategories2d: CategoryId[];\n relatedCategories3d: CategoryId[];\n}\n\n/** @internal */\nexport class ClassificationsTreeIdsCache implements Disposable {\n readonly #categoryElementCounts: ModelCategoryElementsCountCache;\n #categorySubCategories: Observable<Map<CategoryId, Array<SubCategoryId>>> | undefined;\n #elementModelsCategories: Observable<Map<ModelId, { category2dIds: Id64Set; category3dIds: Id64Set; isSubModel: boolean }>> | undefined;\n #modelWithCategoryModeledElements: Observable<Map<ModelId, Map<CategoryId, Set<ElementId>>>> | undefined;\n #classificationInfos: Observable<Map<ClassificationId | ClassificationTableId, ClassificationInfo>> | undefined;\n #filteredElementsData: Observable<Map<ElementId, { modelId: Id64String; categoryId: Id64String }>> | undefined;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, hierarchyConfig: ClassificationsTreeHierarchyConfiguration, componentId?: GuidString) {\n this.#queryExecutor = queryExecutor;\n this.#hierarchyConfig = hierarchyConfig;\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"ClassificationsTreeIdsCache\";\n this.#categoryElementCounts = new ModelCategoryElementsCountCache(\n this.#queryExecutor,\n [\"BisCore.GeometricElement2d\", \"BisCore.GeometricElement3d\"],\n this.#componentId,\n );\n }\n\n public [Symbol.dispose]() {\n this.#categoryElementCounts[Symbol.dispose]();\n }\n\n private querySubCategories(): Observable<{ id: SubCategoryId; parentId: CategoryId }> {\n return defer(() => {\n const definitionsQuery = `\n SELECT\n sc.ECInstanceId id,\n sc.Parent.Id categoryId\n FROM\n ${CLASS_NAME_SubCategory} sc\n WHERE\n NOT sc.IsPrivate\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/visible-sub-categories` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.categoryId };\n }),\n );\n }\n private getSubCategoriesInfo() {\n this.#categorySubCategories ??= this.querySubCategories()\n .pipe(\n reduce((acc, queriedSubCategory) => {\n const entry = acc.get(queriedSubCategory.parentId);\n if (entry) {\n entry.push(queriedSubCategory.id);\n } else {\n acc.set(queriedSubCategory.parentId, [queriedSubCategory.id]);\n }\n return acc;\n }, new Map<CategoryId, Array<SubCategoryId>>()),\n )\n .pipe(shareReplay());\n return this.#categorySubCategories;\n }\n\n public getSubCategories(categoryId: Id64String): Observable<Array<SubCategoryId>> {\n return this.getSubCategoriesInfo().pipe(map((categorySubCategories) => categorySubCategories.get(categoryId) ?? []));\n }\n\n private queryElementModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n type: \"2d\" | \"3d\";\n }> {\n return defer(() => {\n const query = `\n SELECT * FROM (\n SELECT '3d' type, this.Model.Id modelId, this.Category.Id categoryId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement3d this ON m.ECInstanceId = this.Model.Id\n WHERE this.Parent.Id IS NULL AND m.IsPrivate = false\n GROUP BY modelId, categoryId\n )\n UNION ALL\n SELECT * FROM (\n SELECT '2d' type, this.Model.Id modelId, this.Category.Id categoryId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement2d this ON m.ECInstanceId = this.Model.Id\n WHERE this.Parent.Id IS NULL AND m.IsPrivate = false\n GROUP BY modelId, categoryId\n )\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/element-models-and-categories` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, type: row.type };\n }),\n );\n }\n\n private getElementModelsCategories() {\n this.#elementModelsCategories ??= forkJoin({\n modelCategories: this.queryElementModelCategories().pipe(\n reduce((acc, queriedCategory) => {\n let modelEntry = acc.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = { category2dIds: new Set(), category3dIds: new Set() };\n acc.set(queriedCategory.modelId, modelEntry);\n }\n switch (queriedCategory.type) {\n case \"2d\":\n modelEntry.category2dIds.add(queriedCategory.categoryId);\n break;\n case \"3d\":\n modelEntry.category3dIds.add(queriedCategory.categoryId);\n break;\n }\n return acc;\n }, new Map<ModelId, { category2dIds: Id64Set; category3dIds: Id64Set }>()),\n ),\n modelWithCategoryModeledElements: this.getModelWithCategoryModeledElements(),\n }).pipe(\n map(({ modelCategories, modelWithCategoryModeledElements }) => {\n const result = new Map<ModelId, { category2dIds: Id64Set; category3dIds: Id64Set; isSubModel: boolean }>();\n const subModels = new Set<Id64String>();\n modelWithCategoryModeledElements.forEach((categoryMap) =>\n categoryMap.forEach((categorySubModels) => categorySubModels.forEach((subModelId) => subModels.add(subModelId))),\n );\n for (const [modelId, modelEntry] of modelCategories) {\n const isSubModel = subModels.has(modelId);\n result.set(modelId, { category2dIds: modelEntry.category2dIds, category3dIds: modelEntry.category3dIds, isSubModel });\n }\n return result;\n }),\n shareReplay(),\n );\n return this.#elementModelsCategories;\n }\n\n private queryModeledElements(): Observable<{\n modelId: Id64String;\n modeledElementId: Id64String;\n categoryId: Id64String;\n rootCategoryId: Id64String;\n }> {\n return defer(() => {\n const query = `\n SELECT\n pe.ECInstanceId modeledElementId,\n pe.Category.Id categoryId,\n pe.Model.Id modelId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement3d pe ON pe.ECInstanceId = m.ModeledElement.Id\n WHERE\n m.IsPrivate = false\n AND m.ECInstanceId IN (SELECT Model.Id FROM BisCore.Element)\n UNION ALL\n SELECT\n pe.ECInstanceId modeledElementId,\n pe.Category.Id categoryId,\n pe.Model.Id modelId\n FROM BisCore.GeometricModel m\n JOIN BisCore.GeometricElement2d pe ON pe.ECInstanceId = m.ModeledElement.Id\n WHERE\n m.IsPrivate = false\n AND m.ECInstanceId IN (SELECT Model.Id FROM BisCore.Element)\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/modeled-elements` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, modeledElementId: row.modeledElementId, rootCategoryId: row.rootCategoryId };\n }),\n );\n }\n\n private getModelWithCategoryModeledElements() {\n this.#modelWithCategoryModeledElements ??= this.queryModeledElements().pipe(\n reduce((acc, { modelId, categoryId, modeledElementId }) => {\n let modelEntry = acc.get(modelId);\n if (!modelEntry) {\n modelEntry = new Map();\n acc.set(modelId, modelEntry);\n }\n const categoryEntry = modelEntry.get(categoryId);\n if (!categoryEntry) {\n modelEntry.set(categoryId, new Set([modeledElementId]));\n } else {\n categoryEntry.add(modeledElementId);\n }\n return acc;\n }, new Map<ModelId, Map<CategoryId, Set<ElementId>>>()),\n shareReplay(),\n );\n return this.#modelWithCategoryModeledElements;\n }\n\n public getCategoriesModeledElements(modelId: Id64String, categoryIds: Id64Arg): Observable<Id64Array> {\n return this.getModelWithCategoryModeledElements().pipe(\n mergeMap((modelWithCategoryModeledElements) => {\n const result = new Array<ElementId>();\n const categoryMap = modelWithCategoryModeledElements.get(modelId);\n if (!categoryMap) {\n return of(result);\n }\n return from(Id64.iterable(categoryIds)).pipe(\n map((categoryId) => categoryMap.get(categoryId)),\n mergeMap((elementsSet) => (elementsSet ? from(elementsSet) : EMPTY)),\n toArray(),\n );\n }),\n );\n }\n\n public getCategoriesElementModels(categoryIds: Id64Arg, includeSubModels?: boolean): Observable<{ id: CategoryId; models: Array<ModelId> | undefined }> {\n return this.getElementModelsCategories().pipe(\n mergeMap((elementModelsCategories) =>\n from(Id64.iterable(categoryIds)).pipe(\n map((categoryId) => {\n const categoryModels = new Array<ModelId>();\n elementModelsCategories.forEach(({ category2dIds, category3dIds, isSubModel }, modelId) => {\n if ((includeSubModels || !isSubModel) && (category2dIds.has(categoryId) || category3dIds.has(categoryId))) {\n categoryModels.push(modelId);\n }\n });\n return { id: categoryId, models: categoryModels.length > 0 ? categoryModels : undefined };\n }),\n ),\n ),\n );\n }\n\n public getModelCategoryIds(modelId: Id64String): Observable<{ drawing: Id64Array; spatial: Id64Array }> {\n return this.getElementModelsCategories().pipe(\n map((elementModelsCategories) => {\n return {\n drawing: Array.from(elementModelsCategories.get(modelId)?.category2dIds ?? []),\n spatial: Array.from(elementModelsCategories.get(modelId)?.category3dIds ?? []),\n };\n }),\n );\n }\n\n public getAllCategories(): Observable<{ drawing: Id64Set; spatial: Id64Set }> {\n return this.getElementModelsCategories().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce(\n (acc, { category2dIds, category3dIds }) => {\n category2dIds.forEach((id) => acc.drawing.add(id));\n category3dIds.forEach((id) => acc.spatial.add(id));\n return acc;\n },\n { drawing: new Set<Id64String>(), spatial: new Set<Id64String>() },\n ),\n );\n }\n\n public hasSubModel(elementId: Id64String): Observable<boolean> {\n return this.getElementModelsCategories().pipe(map((elementModelsCategories) => elementModelsCategories.has(elementId)));\n }\n\n public getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Observable<number> {\n return this.#categoryElementCounts.getCategoryElementsCount(modelId, categoryId);\n }\n\n private queryClassifications(): Observable<\n {\n id: Id64String;\n relatedCategories2d: CategoryId[];\n relatedCategories3d: CategoryId[];\n } & ({ tableId: ClassificationTableId; parentId: undefined } | { tableId: undefined; parentId: ClassificationId })\n > {\n return defer(() => {\n const CLASSIFICATIONS_CTE = \"Classifications\";\n const ctes = [\n `\n ${CLASSIFICATIONS_CTE}(ClassificationId, ClassificationTableId, ParentClassificationId) AS (\n SELECT\n cl.ECInstanceId,\n ct.ECInstanceId,\n NULL\n FROM ${CLASS_NAME_Classification} cl\n JOIN ${CLASS_NAME_ClassificationTable} ct ON ct.ECInstanceId = cl.Model.Id\n JOIN ${CLASS_NAME_ClassificationSystem} cs ON cs.ECInstanceId = ct.Parent.Id\n WHERE\n cs.CodeValue = '${this.#hierarchyConfig.rootClassificationSystemCode}'\n AND NOT ct.IsPrivate\n AND NOT cl.IsPrivate\n AND cl.Parent.Id IS NULL\n\n UNION ALL\n\n SELECT\n cl.ECInstanceId,\n NULL,\n cl.Parent.Id\n FROM\n ${CLASSIFICATIONS_CTE} cte\n JOIN ${CLASS_NAME_Classification} cl ON cl.Parent.Id = cte.ClassificationId\n WHERE\n NOT cl.IsPrivate\n )\n `,\n ];\n const ecsql = `\n SELECT\n cl.ClassificationId id,\n cl.ClassificationTableId tableId,\n cl.ParentClassificationId parentId,\n (\n SELECT group_concat(IdToHex(cat.ECInstanceId))\n FROM ${CLASS_NAME_GeometricElement2d} e\n JOIN ${CLASS_NAME_DrawingCategory} cat ON cat.ECInstanceId = e.Category.Id\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = e.ECInstanceId\n WHERE e.Parent.Id IS NULL AND NOT cat.IsPrivate AND ehc.TargetECInstanceId = cl.ClassificationId\n GROUP BY ehc.TargetECInstanceId\n ) relatedCategories2d,\n (\n SELECT group_concat(IdToHex(cat.ECInstanceId))\n FROM ${CLASS_NAME_GeometricElement3d} e\n JOIN ${CLASS_NAME_SpatialCategory} cat ON cat.ECInstanceId = e.Category.Id\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = e.ECInstanceId\n WHERE e.Parent.Id IS NULL AND NOT cat.IsPrivate AND ehc.TargetECInstanceId = cl.ClassificationId\n GROUP BY ehc.TargetECInstanceId\n ) relatedCategories3d\n FROM ${CLASSIFICATIONS_CTE} cl\n `;\n return this.#queryExecutor.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/classifications` },\n );\n }).pipe(\n map((row) => {\n return {\n id: row.id,\n tableId: row.tableId,\n parentId: row.parentId,\n relatedCategories2d: row.relatedCategories2d ? (row.relatedCategories2d as string).split(\",\") : [],\n relatedCategories3d: row.relatedCategories3d ? (row.relatedCategories3d as string).split(\",\") : [],\n };\n }),\n );\n }\n\n private getClassificationsInfo() {\n this.#classificationInfos ??= this.queryClassifications().pipe(\n reduce((acc, { id, tableId, parentId, relatedCategories2d, relatedCategories3d }) => {\n const tableOrParentId = tableId ?? parentId;\n let parentInfo = acc.get(tableOrParentId);\n if (!parentInfo) {\n parentInfo = { childClassificationIds: [], relatedCategories2d: [], relatedCategories3d: [], parentClassificationOrTableId: undefined };\n acc.set(tableOrParentId, parentInfo);\n }\n parentInfo.childClassificationIds.push(id);\n let classificationEntry = acc.get(id);\n if (!classificationEntry) {\n classificationEntry = { childClassificationIds: [], relatedCategories2d, relatedCategories3d, parentClassificationOrTableId: tableOrParentId };\n acc.set(id, classificationEntry);\n } else {\n classificationEntry.parentClassificationOrTableId = tableOrParentId;\n }\n return acc;\n }, new Map<ClassificationId | ClassificationTableId, ClassificationInfo>()),\n shareReplay(),\n );\n return this.#classificationInfos;\n }\n\n public getAllContainedCategories(classificationOrTableIds: Id64Arg): Observable<{ drawing: Id64Array; spatial: Id64Array }> {\n const result = { drawing: new Array<CategoryId>(), spatial: new Array<CategoryId>() };\n if (Id64.sizeOf(classificationOrTableIds) === 0) {\n return of(result);\n }\n return this.getClassificationsInfo().pipe(\n mergeMap((classificationsInfo) =>\n from(Id64.iterable(classificationOrTableIds)).pipe(\n reduce(\n (acc, classificationOrTableId) => {\n const classificationInfo = classificationsInfo.get(classificationOrTableId);\n if (classificationInfo === undefined) {\n return acc;\n }\n acc.drawing.push(...classificationInfo.relatedCategories2d);\n acc.spatial.push(...classificationInfo.relatedCategories3d);\n acc.childClassifications.push(...classificationInfo.childClassificationIds);\n return acc;\n },\n { drawing: new Array<Id64String>(), spatial: new Array<Id64String>(), childClassifications: new Array<Id64String>() },\n ),\n mergeMap(({ drawing, spatial, childClassifications }) => {\n if (childClassifications.length === 0) {\n return of({ drawing, spatial });\n }\n return this.getAllContainedCategories(childClassifications).pipe(\n map((childResult) => {\n drawing.push(...childResult.drawing);\n spatial.push(...childResult.spatial);\n return { drawing, spatial };\n }),\n );\n }),\n ),\n ),\n );\n }\n\n public getDirectChildClassifications(classificationOrTableIds: Id64Arg): Observable<ClassificationId[]> {\n const result = new Array<ClassificationId>();\n if (Id64.sizeOf(classificationOrTableIds) === 0) {\n return of(result);\n }\n return this.getClassificationsInfo().pipe(\n mergeMap((classificationsInfo) =>\n from(Id64.iterable(classificationOrTableIds)).pipe(\n reduce((acc, classificationOrTableId) => {\n const classificationInfo = classificationsInfo.get(classificationOrTableId);\n if (classificationInfo !== undefined) {\n acc.push(...classificationInfo.childClassificationIds);\n }\n return acc;\n }, result),\n ),\n ),\n );\n }\n\n public getClassificationsPathObs(classificationIds: Id64Arg): Observable<HierarchyNodeIdentifiersPath> {\n return from(this.getClassificationsInfo()).pipe(\n mergeMap((classificationsInfo) => {\n return from(Id64.iterable(classificationIds)).pipe(\n map((classificationId) => {\n const path: HierarchyNodeIdentifiersPath = [{ id: classificationId, className: CLASS_NAME_Classification }];\n let parentId = classificationsInfo.get(classificationId)?.parentClassificationOrTableId;\n while (parentId !== undefined) {\n const parentIdOfParent = classificationsInfo.get(parentId)?.parentClassificationOrTableId;\n if (parentIdOfParent) {\n path.push({ className: CLASS_NAME_Classification, id: parentId });\n } else {\n path.push({ className: CLASS_NAME_ClassificationTable, id: parentId });\n }\n parentId = parentIdOfParent;\n }\n return path.reverse();\n }),\n );\n }),\n );\n }\n\n public getAllClassifications(): Observable<ClassificationId[]> {\n return this.getClassificationsInfo().pipe(map((classificationsInfo) => [...classificationsInfo.keys()]));\n }\n\n private queryFilteredElementsData({ element2dIds, element3dIds }: { element2dIds: Id64Arg; element3dIds: Id64Arg }): Observable<{\n modelId: Id64String;\n id: ElementId;\n categoryId: Id64String;\n }> {\n return defer(() => {\n const queries = new Array<string>();\n if (Id64.sizeOf(element2dIds) > 0) {\n queries.push(`\n SELECT Model.Id modelId, Category.Id categoryId, ECInstanceId id\n FROM ${CLASS_NAME_GeometricElement2d}\n WHERE ECInstanceId IN (${joinId64Arg(element2dIds, \",\")})\n `);\n }\n if (Id64.sizeOf(element3dIds) > 0) {\n queries.push(`\n SELECT Model.Id modelId, Category.Id categoryId, ECInstanceId id\n FROM ${CLASS_NAME_GeometricElement3d}\n WHERE ECInstanceId IN (${joinId64Arg(element3dIds, \",\")})\n `);\n }\n return this.#queryExecutor.createQueryReader(\n { ecsql: queries.join(\" UNION ALL \") },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/filtered-elements/${Guid.createValue()}`,\n },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, id: row.id, categoryId: row.categoryId };\n }),\n );\n }\n\n public getFilteredElementsData({\n element2dIds,\n element3dIds,\n }: {\n element2dIds: Id64Arg;\n element3dIds: Id64Arg;\n }): Observable<Map<ElementId, { categoryId: Id64String; modelId: Id64String }>> {\n const result = new Map<ElementId, { categoryId: Id64String; modelId: Id64String }>();\n if (Id64.sizeOf(element2dIds) === 0 && Id64.sizeOf(element3dIds) === 0) {\n return of(result);\n }\n this.#filteredElementsData ??= this.queryFilteredElementsData({\n element2dIds,\n element3dIds,\n }).pipe(\n reduce((acc, { modelId, id, categoryId }) => {\n acc.set(id, { modelId, categoryId });\n return acc;\n }, result),\n shareReplay(),\n );\n return this.#filteredElementsData;\n }\n\n public clearFilteredElementsData() {\n this.#filteredElementsData = undefined;\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { GuidString } from "@itwin/core-bentley";
2
+ import type { VisibilityTreeProps } from "../../common/components/VisibilityTree.js";
3
+ import type { ClassificationsTreeHierarchyConfiguration } from "../ClassificationsTreeDefinition.js";
4
+ import type { ClassificationsTreeIdsCache } from "./ClassificationsTreeIdsCache.js";
5
+ /** @internal */
6
+ export type ClassificationsTreeSearchError = "tooManySearchMatches" | "unknownSearchError";
7
+ type HierarchySearchPaths = Awaited<ReturnType<Required<VisibilityTreeProps>["getSearchPaths"]>>;
8
+ /** @internal */
9
+ export declare function useSearchPaths({ searchText, hierarchyConfiguration, getClassificationsTreeIdsCache, onSearchPathsChanged, componentId, }: {
10
+ searchText?: string;
11
+ hierarchyConfiguration: ClassificationsTreeHierarchyConfiguration;
12
+ getClassificationsTreeIdsCache: () => ClassificationsTreeIdsCache;
13
+ onSearchPathsChanged: (paths: HierarchySearchPaths | undefined) => void;
14
+ componentId: GuidString;
15
+ }): {
16
+ getPaths: VisibilityTreeProps["getSearchPaths"] | undefined;
17
+ searchError: ClassificationsTreeSearchError | undefined;
18
+ };
19
+ export {};
20
+ //# sourceMappingURL=UseSearchPaths.d.ts.map
@@ -3,51 +3,51 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { useEffect, useMemo, useState } from "react";
6
- import { FilterLimitExceededError } from "../../common/TreeErrors.js";
6
+ import { SearchLimitExceededError } from "../../common/TreeErrors.js";
7
7
  import { useTelemetryContext } from "../../common/UseTelemetryContext.js";
8
8
  import { ClassificationsTreeDefinition } from "../ClassificationsTreeDefinition.js";
9
9
  /** @internal */
10
- export function useFilteredPaths({ filter, hierarchyConfiguration, getClassificationsTreeIdsCache, onFilteredPathsChanged, componentId, }) {
11
- const [filteringError, setFilteringError] = useState();
10
+ export function useSearchPaths({ searchText, hierarchyConfiguration, getClassificationsTreeIdsCache, onSearchPathsChanged, componentId, }) {
11
+ const [searchError, setSearchError] = useState();
12
12
  const { onFeatureUsed } = useTelemetryContext();
13
13
  useEffect(() => {
14
- setFilteringError(undefined);
15
- if (!filter) {
16
- onFilteredPathsChanged(undefined);
14
+ setSearchError(undefined);
15
+ if (!searchText) {
16
+ onSearchPathsChanged(undefined);
17
17
  }
18
- }, [filter, onFilteredPathsChanged]);
19
- const getFilteredPaths = useMemo(() => {
20
- if (!filter) {
18
+ }, [searchText, onSearchPathsChanged]);
19
+ const getSearchPaths = useMemo(() => {
20
+ if (!searchText) {
21
21
  return undefined;
22
22
  }
23
23
  return async ({ imodelAccess, abortSignal }) => {
24
- onFeatureUsed({ featureId: "filtering", reportInteraction: true });
24
+ onFeatureUsed({ featureId: "search", reportInteraction: true });
25
25
  try {
26
26
  const paths = await ClassificationsTreeDefinition.createInstanceKeyPaths({
27
27
  imodelAccess,
28
- label: filter,
28
+ label: searchText,
29
29
  idsCache: getClassificationsTreeIdsCache(),
30
30
  hierarchyConfig: hierarchyConfiguration,
31
31
  componentId,
32
32
  abortSignal,
33
33
  });
34
- onFilteredPathsChanged(paths);
34
+ onSearchPathsChanged(paths);
35
35
  return paths;
36
36
  }
37
37
  catch (e) {
38
- const newError = e instanceof FilterLimitExceededError ? "tooManyFilterMatches" : "unknownFilterError";
39
- if (newError !== "tooManyFilterMatches") {
38
+ const newError = e instanceof SearchLimitExceededError ? "tooManySearchMatches" : "unknownSearchError";
39
+ if (newError !== "tooManySearchMatches") {
40
40
  const feature = e instanceof Error && e.message.includes("query too long to execute or server is too busy") ? "error-timeout" : "error-unknown";
41
41
  onFeatureUsed({ featureId: feature, reportInteraction: false });
42
42
  }
43
- setFilteringError(newError);
43
+ setSearchError(newError);
44
44
  return [];
45
45
  }
46
46
  };
47
- }, [filter, onFilteredPathsChanged, onFeatureUsed, getClassificationsTreeIdsCache, hierarchyConfiguration, componentId]);
47
+ }, [searchText, onSearchPathsChanged, onFeatureUsed, getClassificationsTreeIdsCache, hierarchyConfiguration, componentId]);
48
48
  return {
49
- getPaths: getFilteredPaths,
50
- filteringError,
49
+ getPaths: getSearchPaths,
50
+ searchError,
51
51
  };
52
52
  }
53
- //# sourceMappingURL=UseFilteredPaths.js.map
53
+ //# sourceMappingURL=UseSearchPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseSearchPaths.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AAYpF,gBAAgB;AAChB,MAAM,UAAU,cAAc,CAAC,EAC7B,UAAU,EACV,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,WAAW,GAOZ;IAIC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,EAA8C,CAAC;IAC7F,MAAM,EAAE,aAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,CAAC,SAAS,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEvC,MAAM,cAAc,GAAG,OAAO,CAAoD,GAAG,EAAE;QACrF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;YAC7C,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,6BAA6B,CAAC,sBAAsB,CAAC;oBACvE,YAAY;oBACZ,KAAK,EAAE,UAAU;oBACjB,QAAQ,EAAE,8BAA8B,EAAE;oBAC1C,eAAe,EAAE,sBAAsB;oBACvC,WAAW;oBACX,WAAW;iBACZ,CAAC,CAAC;gBACH,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC5B,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,CAAC,YAAY,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACvG,IAAI,QAAQ,KAAK,sBAAsB,EAAE,CAAC;oBACxC,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,iDAAiD,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;oBAChJ,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClE,CAAC;gBACD,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,oBAAoB,EAAE,aAAa,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3H,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,WAAW;KACZ,CAAC;AACJ,CAAC","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, useMemo, useState } from \"react\";\nimport { SearchLimitExceededError } from \"../../common/TreeErrors.js\";\nimport { useTelemetryContext } from \"../../common/UseTelemetryContext.js\";\nimport { ClassificationsTreeDefinition } from \"../ClassificationsTreeDefinition.js\";\n\nimport type { GuidString } from \"@itwin/core-bentley\";\nimport type { VisibilityTreeProps } from \"../../common/components/VisibilityTree.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"../ClassificationsTreeDefinition.js\";\nimport type { ClassificationsTreeIdsCache } from \"./ClassificationsTreeIdsCache.js\";\n\n/** @internal */\nexport type ClassificationsTreeSearchError = \"tooManySearchMatches\" | \"unknownSearchError\";\n\ntype HierarchySearchPaths = Awaited<ReturnType<Required<VisibilityTreeProps>[\"getSearchPaths\"]>>;\n\n/** @internal */\nexport function useSearchPaths({\n searchText,\n hierarchyConfiguration,\n getClassificationsTreeIdsCache,\n onSearchPathsChanged,\n componentId,\n}: {\n searchText?: string;\n hierarchyConfiguration: ClassificationsTreeHierarchyConfiguration;\n getClassificationsTreeIdsCache: () => ClassificationsTreeIdsCache;\n onSearchPathsChanged: (paths: HierarchySearchPaths | undefined) => void;\n componentId: GuidString;\n}): {\n getPaths: VisibilityTreeProps[\"getSearchPaths\"] | undefined;\n searchError: ClassificationsTreeSearchError | undefined;\n} {\n const [searchError, setSearchError] = useState<ClassificationsTreeSearchError | undefined>();\n const { onFeatureUsed } = useTelemetryContext();\n useEffect(() => {\n setSearchError(undefined);\n if (!searchText) {\n onSearchPathsChanged(undefined);\n }\n }, [searchText, onSearchPathsChanged]);\n\n const getSearchPaths = useMemo<VisibilityTreeProps[\"getSearchPaths\"] | undefined>(() => {\n if (!searchText) {\n return undefined;\n }\n\n return async ({ imodelAccess, abortSignal }) => {\n onFeatureUsed({ featureId: \"search\", reportInteraction: true });\n try {\n const paths = await ClassificationsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n label: searchText,\n idsCache: getClassificationsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n componentId,\n abortSignal,\n });\n onSearchPathsChanged(paths);\n return paths;\n } catch (e) {\n const newError = e instanceof SearchLimitExceededError ? \"tooManySearchMatches\" : \"unknownSearchError\";\n if (newError !== \"tooManySearchMatches\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setSearchError(newError);\n return [];\n }\n };\n }, [searchText, onSearchPathsChanged, onFeatureUsed, getClassificationsTreeIdsCache, hierarchyConfiguration, componentId]);\n\n return {\n getPaths: getSearchPaths,\n searchError,\n };\n}\n"]}
@@ -5,7 +5,7 @@ import type { TreeSpecificVisibilityHandler } from "../../../common/internal/vis
5
5
  import type { TreeWidgetViewport } from "../../../common/TreeWidgetViewport.js";
6
6
  import type { VisibilityStatus } from "../../../common/UseHierarchyVisibility.js";
7
7
  import type { ClassificationsTreeIdsCache } from "../ClassificationsTreeIdsCache.js";
8
- import type { ClassificationsTreeFilterTargets } from "./FilteredTree.js";
8
+ import type { ClassificationsTreeSearchTargets } from "./SearchResultsTree.js";
9
9
  /** @internal */
10
10
  export interface ClassificationsTreeVisibilityHandlerProps {
11
11
  idsCache: ClassificationsTreeIdsCache;
@@ -18,15 +18,15 @@ export interface ClassificationsTreeVisibilityHandlerProps {
18
18
  * This handler knows how to get and change visibility status of nodes created by hierarchy definition.
19
19
  * @internal
20
20
  */
21
- export declare class ClassificationsTreeVisibilityHandler implements Disposable, TreeSpecificVisibilityHandler<ClassificationsTreeFilterTargets> {
21
+ export declare class ClassificationsTreeVisibilityHandler implements Disposable, TreeSpecificVisibilityHandler<ClassificationsTreeSearchTargets> {
22
22
  #private;
23
23
  constructor(constructorProps: ClassificationsTreeVisibilityHandlerProps);
24
24
  [Symbol.dispose](): void;
25
- changeFilterTargetsVisibilityStatus(targets: ClassificationsTreeFilterTargets, on: boolean): Observable<void>;
25
+ changeSearchTargetsVisibilityStatus(targets: ClassificationsTreeSearchTargets, on: boolean): Observable<void>;
26
26
  getVisibilityStatus(node: HierarchyNode): Observable<VisibilityStatus>;
27
27
  /** Changes visibility of the items represented by the tree node. */
28
28
  changeVisibilityStatus(node: HierarchyNode, on: boolean): Observable<void>;
29
- getFilterTargetsVisibilityStatus(targets: ClassificationsTreeFilterTargets): Observable<VisibilityStatus>;
29
+ getSearchTargetsVisibilityStatus(targets: ClassificationsTreeSearchTargets): Observable<VisibilityStatus>;
30
30
  private getCategories;
31
31
  private getAllCategories;
32
32
  private getElementsCount;
@@ -5,7 +5,7 @@
5
5
  import { concat, defer, EMPTY, from, map, merge, mergeMap, of, toArray } from "rxjs";
6
6
  import { Id64 } from "@itwin/core-bentley";
7
7
  import { HierarchyNode } from "@itwin/presentation-hierarchies";
8
- import { releaseMainThreadOnItemsCount } from "../../../common/internal/Utils.js";
8
+ import { fromWithRelease } from "../../../common/internal/Utils.js";
9
9
  import { mergeVisibilityStatuses } from "../../../common/internal/VisibilityUtils.js";
10
10
  import { ClassificationsTreeNode } from "../ClassificationsTreeNode.js";
11
11
  import { ClassificationsTreeVisibilityHelper } from "./ClassificationsTreeVisibilityHelper.js";
@@ -41,7 +41,7 @@ export class ClassificationsTreeVisibilityHandler {
41
41
  [Symbol.dispose]() {
42
42
  this.#visibilityHelper[Symbol.dispose]();
43
43
  }
44
- changeFilterTargetsVisibilityStatus(targets, on) {
44
+ changeSearchTargetsVisibilityStatus(targets, on) {
45
45
  return defer(() => {
46
46
  const { classificationIds, classificationTableIds, elements2d, elements3d } = targets;
47
47
  const observables = new Array();
@@ -111,7 +111,7 @@ export class ClassificationsTreeVisibilityHandler {
111
111
  }
112
112
  return changeObs;
113
113
  }
114
- getFilterTargetsVisibilityStatus(targets) {
114
+ getSearchTargetsVisibilityStatus(targets) {
115
115
  return defer(() => {
116
116
  const { classificationIds, classificationTableIds, elements2d, elements3d } = targets;
117
117
  const observables = new Array();
@@ -122,13 +122,13 @@ export class ClassificationsTreeVisibilityHandler {
122
122
  observables.push(this.#visibilityHelper.getClassificationsVisibilityStatus({ classificationIds }));
123
123
  }
124
124
  if (elements2d?.length) {
125
- observables.push(from(elements2d).pipe(releaseMainThreadOnItemsCount(50), mergeMap(({ modelId, categoryId, elements }) => {
126
- return from(elements.keys()).pipe(releaseMainThreadOnItemsCount(1000), mergeMap((elementId) => this.#visibilityHelper.getElementsVisibilityStatus({ modelId, categoryId, elementIds: elementId, type: "GeometricElement2d" })));
125
+ observables.push(fromWithRelease({ source: elements2d, releaseOnCount: 50 }).pipe(mergeMap(({ modelId, categoryId, elements }) => {
126
+ return fromWithRelease({ source: elements.keys(), size: elements.size, releaseOnCount: 1000 }).pipe(mergeMap((elementId) => this.#visibilityHelper.getElementsVisibilityStatus({ modelId, categoryId, elementIds: elementId, type: "GeometricElement2d" })));
127
127
  })));
128
128
  }
129
129
  if (elements3d?.length) {
130
- observables.push(from(elements3d).pipe(releaseMainThreadOnItemsCount(50), mergeMap(({ modelId, categoryId, elements }) => {
131
- return from(elements.keys()).pipe(releaseMainThreadOnItemsCount(1000), mergeMap((elementId) => this.#visibilityHelper.getElementsVisibilityStatus({ modelId, categoryId, elementIds: elementId, type: "GeometricElement3d" })));
130
+ observables.push(fromWithRelease({ source: elements3d, releaseOnCount: 50 }).pipe(mergeMap(({ modelId, categoryId, elements }) => {
131
+ return fromWithRelease({ source: elements.keys(), size: elements.size, releaseOnCount: 1000 }).pipe(mergeMap((elementId) => this.#visibilityHelper.getElementsVisibilityStatus({ modelId, categoryId, elementIds: elementId, type: "GeometricElement3d" })));
132
132
  })));
133
133
  }
134
134
  return merge(...observables);
@@ -151,7 +151,7 @@ export class ClassificationsTreeVisibilityHandler {
151
151
  return this.#props.idsCache.getCategoriesElementModels(props.categoryIds, true);
152
152
  }
153
153
  getSubCategories(props) {
154
- return from(Id64.iterable(props.categoryIds)).pipe(map((categoryId) => ({ id: categoryId, subCategories: undefined })));
154
+ return this.#props.idsCache.getSubCategories(props.categoryId);
155
155
  }
156
156
  getSubModels(props) {
157
157
  if ("modelIds" in props) {