@itwin/tree-widget-react 4.0.0-alpha.2 → 4.0.0-alpha.20
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.
- package/CHANGELOG.md +281 -1
- package/README.md +190 -63
- package/lib/esm/tree-widget-react/TreeWidget.d.ts +7 -4
- package/lib/esm/tree-widget-react/TreeWidget.js +32 -12
- package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
- package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.d.ts +7 -1
- package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js +22 -23
- package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js.map +1 -1
- package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js +4 -3
- package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js +4 -3
- package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +6 -6
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +3 -2
- package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.d.ts +4 -4
- package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.js +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.css +1 -0
- package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.d.ts +12 -5
- package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js +13 -9
- package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +3 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +11 -7
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +64 -14
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +8 -6
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +4 -4
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +41 -8
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +700 -125
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +18 -7
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +124 -83
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +70 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +504 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +41 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +50 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.d.ts +27 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js +136 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.d.ts +54 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js +291 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.d.ts +64 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js +94 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.d.ts +36 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.js +219 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.d.ts +12 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js +19 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +30 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js +47 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.d.ts +45 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +569 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.d.ts +6 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.js +33 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +24 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +115 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.d.ts +44 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js +61 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +50 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +364 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.d.ts +19 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js +32 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.d.ts +20 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js +53 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.d.ts +37 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js +177 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.d.ts +55 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.js +53 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.d.ts +32 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js +168 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +11 -23
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +22 -76
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.d.ts +28 -4
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js +73 -2
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.d.ts +186 -0
- package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js +79 -0
- package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.d.ts +15 -7
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +33 -22
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +45 -23
- package/lib/esm/tree-widget-react/components/trees/common/Utils.js +110 -44
- package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.d.ts +2 -3
- package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js +4 -5
- package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.css +25 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.d.ts +27 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js +47 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +4 -3
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.css +16 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.d.ts +7 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js +19 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.css +11 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +9 -12
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +55 -38
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.css +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.d.ts +24 -8
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js +41 -25
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.d.ts +6 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js +13 -4
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +6 -5
- package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js +7 -7
- package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.d.ts +5 -5
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js +10 -6
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.d.ts +5 -3
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js +17 -15
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.d.ts +74 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js +207 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.d.ts +43 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js +47 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.d.ts +12 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +112 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.d.ts → internal/Rxjs.d.ts} +9 -2
- package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.js → internal/Rxjs.js} +10 -2
- package/lib/esm/tree-widget-react/components/trees/common/internal/Rxjs.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.d.ts → internal/Tooltip.d.ts} +4 -8
- package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js +18 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +14 -0
- package/lib/esm/tree-widget-react/components/{tree-header/SearchBox.css → trees/common/internal/Types.js} +2 -4
- package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveTreeWidgetViewport.d.ts +6 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveTreeWidgetViewport.js +24 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveTreeWidgetViewport.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.d.ts → internal/UseHierarchiesLocalization.d.ts} +3 -2
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.js → internal/UseHierarchiesLocalization.js} +6 -2
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchiesLocalization.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.d.ts → internal/UseHierarchyFiltering.d.ts} +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.js → internal/UseHierarchyFiltering.js} +5 -4
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchyFiltering.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.d.ts +17 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js +32 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.d.ts → internal/UseIModelChangeListener.d.ts} +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.js → internal/UseIModelChangeListener.js} +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelChangeListener.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +70 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +172 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.d.ts +20 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js +60 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +39 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +160 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useGuid.d.ts +3 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useGuid.js +12 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useGuid.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.d.ts +68 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js +170 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +20 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +46 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.d.ts +91 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js +112 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.d.ts +236 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js +600 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/useGuid.d.ts +2 -0
- package/lib/esm/tree-widget-react/components/trees/common/useGuid.js +11 -0
- package/lib/esm/tree-widget-react/components/trees/common/useGuid.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +7 -2
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +29 -20
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +2 -6
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +2 -2
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +5 -6
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +36 -21
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +9 -2
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +48 -36
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +2 -6
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js +2 -2
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +13 -4
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +80 -74
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +7 -10
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +45 -36
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/index.d.ts +16 -5
- package/lib/esm/tree-widget-react/components/trees/index.js +16 -4
- package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +3 -2
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +34 -24
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +14 -7
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +11 -7
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +24 -20
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +193 -154
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +60 -10
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +97 -238
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +22 -25
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +280 -298
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNode.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNode.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.d.ts +41 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js +253 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.d.ts +27 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.js +148 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.d.ts +76 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js +269 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.d.ts +53 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.js +71 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.js.map +1 -0
- package/lib/esm/tree-widget-react-internal.d.ts +12 -0
- package/lib/esm/tree-widget-react-internal.js +18 -0
- package/lib/esm/tree-widget-react-internal.js.map +1 -0
- package/lib/public/locales/en/TreeWidget.json +41 -54
- package/package.json +76 -79
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.d.ts +0 -28
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js +0 -87
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.d.ts +0 -7
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.js +0 -66
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js +0 -24
- package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.d.ts +0 -7
- package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js +0 -21
- package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.d.ts +0 -11
- package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js +0 -24
- package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchiesLocalization.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseIModelChangeListener.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.d.ts +0 -20
- package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js +0 -127
- package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTreeContent.d.ts +0 -7
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTreeContent.js +0 -12
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTreeContent.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +0 -7
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +0 -21
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +0 -29
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +0 -138
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +0 -25
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +0 -173
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +0 -106
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +0 -663
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +0 -12
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js +0 -48
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +0 -1
package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { BeEvent } from "@itwin/core-bentley";
|
|
6
|
+
/** @internal */
|
|
7
|
+
export function createVisibilityChangeEventListener(props) {
|
|
8
|
+
const onVisibilityChange = new BeEvent();
|
|
9
|
+
let pendingVisibilityChange;
|
|
10
|
+
let suppressChangeEvents = 0;
|
|
11
|
+
let hasFiredDuringSuppress = true;
|
|
12
|
+
const handleVisibilityChange = () => {
|
|
13
|
+
hasFiredDuringSuppress = true;
|
|
14
|
+
if (pendingVisibilityChange || suppressChangeEvents > 0) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
pendingVisibilityChange = setTimeout(() => {
|
|
18
|
+
onVisibilityChange.raiseEvent();
|
|
19
|
+
pendingVisibilityChange = undefined;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
const listeners = new Array();
|
|
23
|
+
if (props.listeners.elements) {
|
|
24
|
+
listeners.push(props.viewport.onAlwaysDrawnChanged.addListener(handleVisibilityChange));
|
|
25
|
+
listeners.push(props.viewport.onNeverDrawnChanged.addListener(handleVisibilityChange));
|
|
26
|
+
}
|
|
27
|
+
if (props.listeners.categories) {
|
|
28
|
+
listeners.push(props.viewport.onPerModelCategoriesOverridesChanged.addListener(handleVisibilityChange));
|
|
29
|
+
listeners.push(props.viewport.onDisplayedCategoriesChanged.addListener(handleVisibilityChange));
|
|
30
|
+
}
|
|
31
|
+
if (props.listeners.displayStyle) {
|
|
32
|
+
listeners.push(props.viewport.onDisplayStyleChanged.addListener(handleVisibilityChange));
|
|
33
|
+
}
|
|
34
|
+
if (props.listeners.models) {
|
|
35
|
+
listeners.push(props.viewport.onDisplayedModelsChanged.addListener(handleVisibilityChange));
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
onVisibilityChange,
|
|
39
|
+
[Symbol.dispose]() {
|
|
40
|
+
if (pendingVisibilityChange) {
|
|
41
|
+
clearTimeout(pendingVisibilityChange);
|
|
42
|
+
pendingVisibilityChange = undefined;
|
|
43
|
+
}
|
|
44
|
+
listeners.forEach((x) => x());
|
|
45
|
+
listeners.length = 0;
|
|
46
|
+
},
|
|
47
|
+
suppressChangeEvents: () => {
|
|
48
|
+
hasFiredDuringSuppress = false;
|
|
49
|
+
++suppressChangeEvents;
|
|
50
|
+
},
|
|
51
|
+
isVisibilityChangePending: () => pendingVisibilityChange !== undefined,
|
|
52
|
+
resumeChangeEvents: () => {
|
|
53
|
+
--suppressChangeEvents;
|
|
54
|
+
if (suppressChangeEvents === 0 && hasFiredDuringSuppress) {
|
|
55
|
+
handleVisibilityChange();
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=VisibilityChangeEventListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisibilityChangeEventListener.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAY9C,gBAAgB;AAChB,MAAM,UAAU,mCAAmC,CAAC,KAQnD;IACC,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAc,CAAC;IACrD,IAAI,uBAAkE,CAAC;IACvE,IAAI,oBAAoB,GAAW,CAAC,CAAC;IACrC,IAAI,sBAAsB,GAAG,IAAI,CAAC;IAClC,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,sBAAsB,GAAG,IAAI,CAAC;QAC9B,IAAI,uBAAuB,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QACD,uBAAuB,GAAG,UAAU,CAAC,GAAG,EAAE;YACxC,kBAAkB,CAAC,UAAU,EAAE,CAAC;YAChC,uBAAuB,GAAG,SAAS,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,KAAK,EAAc,CAAC;IAE1C,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACxF,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,oCAAoC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACxG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,4BAA4B,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO;QACL,kBAAkB;QAClB,CAAC,MAAM,CAAC,OAAO,CAAC;YACd,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,YAAY,CAAC,uBAAuB,CAAC,CAAC;gBACtC,uBAAuB,GAAG,SAAS,CAAC;YACtC,CAAC;YACD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,oBAAoB,EAAE,GAAG,EAAE;YACzB,sBAAsB,GAAG,KAAK,CAAC;YAC/B,EAAE,oBAAoB,CAAC;QACzB,CAAC;QACD,yBAAyB,EAAE,GAAG,EAAE,CAAC,uBAAuB,KAAK,SAAS;QACtE,kBAAkB,EAAE,GAAG,EAAE;YACvB,EAAE,oBAAoB,CAAC;YACvB,IAAI,oBAAoB,KAAK,CAAC,IAAI,sBAAsB,EAAE,CAAC;gBACzD,sBAAsB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;KACF,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 { BeEvent } from \"@itwin/core-bentley\";\n\nimport type { TreeWidgetViewport } from \"../TreeWidgetViewport.js\";\n\n/** @internal */\nexport interface IVisibilityChangeEventListener extends Disposable {\n onVisibilityChange: BeEvent<() => void>;\n suppressChangeEvents(): void;\n resumeChangeEvents(): void;\n isVisibilityChangePending: () => boolean;\n}\n\n/** @internal */\nexport function createVisibilityChangeEventListener(props: {\n viewport: TreeWidgetViewport;\n listeners: {\n elements?: boolean;\n categories?: boolean;\n displayStyle?: boolean;\n models?: boolean;\n };\n}): IVisibilityChangeEventListener {\n const onVisibilityChange = new BeEvent<() => void>();\n let pendingVisibilityChange: undefined | ReturnType<typeof setTimeout>;\n let suppressChangeEvents: number = 0;\n let hasFiredDuringSuppress = true;\n const handleVisibilityChange = () => {\n hasFiredDuringSuppress = true;\n if (pendingVisibilityChange || suppressChangeEvents > 0) {\n return;\n }\n pendingVisibilityChange = setTimeout(() => {\n onVisibilityChange.raiseEvent();\n pendingVisibilityChange = undefined;\n });\n };\n\n const listeners = new Array<() => void>();\n\n if (props.listeners.elements) {\n listeners.push(props.viewport.onAlwaysDrawnChanged.addListener(handleVisibilityChange));\n listeners.push(props.viewport.onNeverDrawnChanged.addListener(handleVisibilityChange));\n }\n if (props.listeners.categories) {\n listeners.push(props.viewport.onPerModelCategoriesOverridesChanged.addListener(handleVisibilityChange));\n listeners.push(props.viewport.onDisplayedCategoriesChanged.addListener(handleVisibilityChange));\n }\n if (props.listeners.displayStyle) {\n listeners.push(props.viewport.onDisplayStyleChanged.addListener(handleVisibilityChange));\n }\n if (props.listeners.models) {\n listeners.push(props.viewport.onDisplayedModelsChanged.addListener(handleVisibilityChange));\n }\n\n return {\n onVisibilityChange,\n [Symbol.dispose]() {\n if (pendingVisibilityChange) {\n clearTimeout(pendingVisibilityChange);\n pendingVisibilityChange = undefined;\n }\n listeners.forEach((x) => x());\n listeners.length = 0;\n },\n suppressChangeEvents: () => {\n hasFiredDuringSuppress = false;\n ++suppressChangeEvents;\n },\n isVisibilityChangePending: () => pendingVisibilityChange !== undefined,\n resumeChangeEvents: () => {\n --suppressChangeEvents;\n if (suppressChangeEvents === 0 && hasFiredDuringSuppress) {\n handleVisibilityChange();\n }\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Observable, OperatorFunction } from "rxjs";
|
|
2
|
+
import type { GuidString, Id64Arg, Id64String } from "@itwin/core-bentley";
|
|
3
|
+
import type { CategoryInfo } from "../CategoriesVisibilityUtils.js";
|
|
4
|
+
import type { TreeWidgetViewport } from "../TreeWidgetViewport.js";
|
|
5
|
+
import type { VisibilityStatus } from "../UseHierarchyVisibility.js";
|
|
6
|
+
import type { ElementId } from "./Types.js";
|
|
7
|
+
/** @internal */
|
|
8
|
+
export declare function mergeVisibilityStatuses(obs: Observable<VisibilityStatus>): Observable<VisibilityStatus>;
|
|
9
|
+
/** @internal */
|
|
10
|
+
export declare function changeElementStateNoChildrenOperator(props: {
|
|
11
|
+
on: boolean;
|
|
12
|
+
isDisplayedByDefault: boolean;
|
|
13
|
+
viewport: TreeWidgetViewport;
|
|
14
|
+
}): OperatorFunction<string, void>;
|
|
15
|
+
/** @internal */
|
|
16
|
+
export declare function getVisibilityFromAlwaysAndNeverDrawnElementsImpl(props: {
|
|
17
|
+
alwaysDrawn: Set<ElementId> | undefined;
|
|
18
|
+
neverDrawn: Set<ElementId> | undefined;
|
|
19
|
+
totalCount: number;
|
|
20
|
+
viewport: TreeWidgetViewport;
|
|
21
|
+
} & GetVisibilityFromAlwaysAndNeverDrawnElementsProps): VisibilityStatus;
|
|
22
|
+
/** @internal */
|
|
23
|
+
export interface GetVisibilityFromAlwaysAndNeverDrawnElementsProps {
|
|
24
|
+
/** Status when always/never lists are empty and exclusive mode is off */
|
|
25
|
+
defaultStatus: (categoryId?: string) => VisibilityStatus;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Changes category display in the viewport.
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export declare function enableCategoryDisplay(viewport: TreeWidgetViewport, categoryIds: Id64Arg, enabled: boolean, enableAllSubCategories?: boolean): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Changes subcategory display in the viewport
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export declare function enableSubCategoryDisplay(viewport: TreeWidgetViewport, subCategoryId: Id64String, enabled: boolean): void;
|
|
37
|
+
/** @internal */
|
|
38
|
+
export declare function loadCategoriesFromViewport(vp: TreeWidgetViewport, componentId?: GuidString): Promise<CategoryInfo[]>;
|
|
39
|
+
//# sourceMappingURL=VisibilityUtils.d.ts.map
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { bufferCount, from, map, mergeMap, reduce } from "rxjs";
|
|
6
|
+
import { Guid, Id64 } from "@itwin/core-bentley";
|
|
7
|
+
import { QueryRowFormat } from "@itwin/core-common";
|
|
8
|
+
import { reduceWhile, toVoidPromise } from "./Rxjs.js";
|
|
9
|
+
import { createVisibilityStatus } from "./Tooltip.js";
|
|
10
|
+
import { getClassesByView, getOptimalBatchSize, releaseMainThreadOnItemsCount } from "./Utils.js";
|
|
11
|
+
function mergeVisibilities(obs) {
|
|
12
|
+
return obs.pipe(reduceWhile((x) => x.allVisible || x.allHidden, (acc, val) => {
|
|
13
|
+
acc.allVisible &&= val === "visible";
|
|
14
|
+
acc.allHidden &&= val === "hidden";
|
|
15
|
+
return acc;
|
|
16
|
+
}, { allVisible: true, allHidden: true }), map((x) => {
|
|
17
|
+
if (!x) {
|
|
18
|
+
return "empty";
|
|
19
|
+
}
|
|
20
|
+
return x.allVisible ? "visible" : x.allHidden ? "hidden" : "partial";
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
/** @internal */
|
|
24
|
+
export function mergeVisibilityStatuses(obs) {
|
|
25
|
+
return obs.pipe(map((visibilityStatus) => visibilityStatus.state), mergeVisibilities, map((visibility) => createVisibilityStatus(visibility === "empty" ? "disabled" : visibility)));
|
|
26
|
+
}
|
|
27
|
+
/** @internal */
|
|
28
|
+
export function changeElementStateNoChildrenOperator(props) {
|
|
29
|
+
return (elementIds) => {
|
|
30
|
+
const { on, isDisplayedByDefault } = props;
|
|
31
|
+
const isAlwaysDrawnExclusive = props.viewport.isAlwaysDrawnExclusive;
|
|
32
|
+
return elementIds.pipe(releaseMainThreadOnItemsCount(500), reduce((acc, elementId) => {
|
|
33
|
+
if (acc.alwaysDrawn === undefined || acc.neverDrawn === undefined) {
|
|
34
|
+
acc.alwaysDrawn = new Set(props.viewport.alwaysDrawn || []);
|
|
35
|
+
acc.neverDrawn = new Set(props.viewport.neverDrawn || []);
|
|
36
|
+
}
|
|
37
|
+
if (on) {
|
|
38
|
+
const wasRemoved = acc.neverDrawn.delete(elementId);
|
|
39
|
+
acc.changedNeverDrawn ||= wasRemoved;
|
|
40
|
+
// If exclusive mode is enabled, we must add the element to the always drawn list.
|
|
41
|
+
if ((!isDisplayedByDefault || isAlwaysDrawnExclusive) && !acc.alwaysDrawn.has(elementId)) {
|
|
42
|
+
acc.alwaysDrawn.add(elementId);
|
|
43
|
+
acc.changedAlwaysDrawn = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const wasRemoved = acc.alwaysDrawn.delete(elementId);
|
|
48
|
+
acc.changedAlwaysDrawn ||= wasRemoved;
|
|
49
|
+
// If exclusive mode is not enabled, we have to add the element to the never drawn list.
|
|
50
|
+
if (isDisplayedByDefault && !isAlwaysDrawnExclusive && !acc.neverDrawn.has(elementId)) {
|
|
51
|
+
acc.neverDrawn.add(elementId);
|
|
52
|
+
acc.changedNeverDrawn = true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return acc;
|
|
56
|
+
}, {
|
|
57
|
+
changedNeverDrawn: false,
|
|
58
|
+
changedAlwaysDrawn: false,
|
|
59
|
+
neverDrawn: undefined,
|
|
60
|
+
alwaysDrawn: undefined,
|
|
61
|
+
}), map((state) => {
|
|
62
|
+
state.changedNeverDrawn && state.neverDrawn && props.viewport.setNeverDrawn({ elementIds: state.neverDrawn });
|
|
63
|
+
state.changedAlwaysDrawn &&
|
|
64
|
+
state.alwaysDrawn &&
|
|
65
|
+
props.viewport.setAlwaysDrawn({ elementIds: state.alwaysDrawn, exclusive: props.viewport.isAlwaysDrawnExclusive });
|
|
66
|
+
}));
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** @internal */
|
|
70
|
+
export function getVisibilityFromAlwaysAndNeverDrawnElementsImpl(props) {
|
|
71
|
+
const { alwaysDrawn, neverDrawn, totalCount, viewport } = props;
|
|
72
|
+
if (totalCount === 0) {
|
|
73
|
+
return props.defaultStatus();
|
|
74
|
+
}
|
|
75
|
+
if (neverDrawn?.size === totalCount) {
|
|
76
|
+
return createVisibilityStatus("hidden");
|
|
77
|
+
}
|
|
78
|
+
if (alwaysDrawn?.size === totalCount) {
|
|
79
|
+
return createVisibilityStatus("visible");
|
|
80
|
+
}
|
|
81
|
+
if (viewport.isAlwaysDrawnExclusive) {
|
|
82
|
+
return createVisibilityStatus(alwaysDrawn?.size ? "partial" : "hidden");
|
|
83
|
+
}
|
|
84
|
+
const status = props.defaultStatus();
|
|
85
|
+
if ((status.state === "visible" && neverDrawn?.size) || (status.state === "hidden" && alwaysDrawn?.size)) {
|
|
86
|
+
return createVisibilityStatus("partial");
|
|
87
|
+
}
|
|
88
|
+
return status;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Changes category display in the viewport.
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
94
|
+
export async function enableCategoryDisplay(viewport, categoryIds, enabled, enableAllSubCategories = true) {
|
|
95
|
+
const removeOverrides = (bufferedCategories) => {
|
|
96
|
+
const modelsContainingOverrides = [];
|
|
97
|
+
for (const ovr of viewport.perModelCategoryOverrides) {
|
|
98
|
+
if (Id64.has(bufferedCategories, ovr.categoryId)) {
|
|
99
|
+
modelsContainingOverrides.push(ovr.modelId);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
viewport.setPerModelCategoryOverride({ modelIds: modelsContainingOverrides, categoryIds: bufferedCategories, override: "none" });
|
|
103
|
+
};
|
|
104
|
+
const disableSubCategories = async (bufferedCategories) => {
|
|
105
|
+
// changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.
|
|
106
|
+
(await viewport.iModel.categories.getCategoryInfo(bufferedCategories)).forEach((categoryInfo) => {
|
|
107
|
+
categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
return toVoidPromise(from(Id64.iterable(categoryIds)).pipe(releaseMainThreadOnItemsCount(500), bufferCount(getOptimalBatchSize({ totalSize: Id64.sizeOf(categoryIds), maximumBatchSize: 500 })), mergeMap(async (bufferedCategories) => {
|
|
111
|
+
viewport.changeCategoryDisplay({ categoryIds: bufferedCategories, display: enabled, enableAllSubCategories });
|
|
112
|
+
removeOverrides(bufferedCategories);
|
|
113
|
+
if (!enabled) {
|
|
114
|
+
await disableSubCategories(bufferedCategories);
|
|
115
|
+
}
|
|
116
|
+
})));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Changes subcategory display in the viewport
|
|
120
|
+
* @internal
|
|
121
|
+
*/
|
|
122
|
+
export function enableSubCategoryDisplay(viewport, subCategoryId, enabled) {
|
|
123
|
+
viewport.changeSubCategoryDisplay({ subCategoryId, display: enabled });
|
|
124
|
+
}
|
|
125
|
+
/** @internal */
|
|
126
|
+
export async function loadCategoriesFromViewport(vp, componentId) {
|
|
127
|
+
// Query categories and add them to state
|
|
128
|
+
if (vp.viewType === "other") {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const { categoryClass, elementClass } = getClassesByView(vp.viewType);
|
|
132
|
+
const ecsql = `
|
|
133
|
+
SELECT ECInstanceId as id
|
|
134
|
+
FROM ${categoryClass}
|
|
135
|
+
WHERE
|
|
136
|
+
ECInstanceId IN (
|
|
137
|
+
SELECT DISTINCT Category.Id
|
|
138
|
+
FROM ${elementClass}
|
|
139
|
+
WHERE
|
|
140
|
+
Category.Id IN (SELECT ECInstanceId FROM ${categoryClass})
|
|
141
|
+
${vp.viewType !== "2d" ? "" : "AND Model.Id=?"}
|
|
142
|
+
)
|
|
143
|
+
`;
|
|
144
|
+
const categories = [];
|
|
145
|
+
const rows = await (async () => {
|
|
146
|
+
const result = new Array();
|
|
147
|
+
for await (const row of vp.iModel.createQueryReader(ecsql, undefined, {
|
|
148
|
+
rowFormat: QueryRowFormat.UseJsPropertyNames,
|
|
149
|
+
restartToken: `CategoriesVisibilityUtils/${componentId ?? Guid.createValue()}/categories`,
|
|
150
|
+
})) {
|
|
151
|
+
result.push(row.id);
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
})();
|
|
155
|
+
(await vp.iModel.categories.getCategoryInfo(rows)).forEach((val) => {
|
|
156
|
+
categories.push({ categoryId: val.id, subCategoryIds: val.subCategories.size ? [...val.subCategories.keys()] : undefined });
|
|
157
|
+
});
|
|
158
|
+
return categories;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=VisibilityUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VisibilityUtils.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/common/internal/VisibilityUtils.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 { bufferCount, from, map, mergeMap, reduce } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { QueryRowFormat } from \"@itwin/core-common\";\nimport { reduceWhile, toVoidPromise } from \"./Rxjs.js\";\nimport { createVisibilityStatus } from \"./Tooltip.js\";\nimport { getClassesByView, getOptimalBatchSize, releaseMainThreadOnItemsCount } from \"./Utils.js\";\n\nimport type { Observable, OperatorFunction } from \"rxjs\";\nimport type { GuidString, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { CategoryInfo } from \"../CategoriesVisibilityUtils.js\";\nimport type { TreeWidgetViewport } from \"../TreeWidgetViewport.js\";\nimport type { VisibilityStatus } from \"../UseHierarchyVisibility.js\";\nimport type { Visibility } from \"./Tooltip.js\";\nimport type { ElementId } from \"./Types.js\";\n\nfunction mergeVisibilities(obs: Observable<Visibility>): Observable<Visibility | \"empty\"> {\n return obs.pipe(\n reduceWhile(\n (x) => x.allVisible || x.allHidden,\n (acc, val) => {\n acc.allVisible &&= val === \"visible\";\n acc.allHidden &&= val === \"hidden\";\n return acc;\n },\n { allVisible: true, allHidden: true },\n ),\n map((x) => {\n if (!x) {\n return \"empty\";\n }\n return x.allVisible ? \"visible\" : x.allHidden ? \"hidden\" : \"partial\";\n }),\n );\n}\n\n/** @internal */\nexport function mergeVisibilityStatuses(obs: Observable<VisibilityStatus>): Observable<VisibilityStatus> {\n return obs.pipe(\n map((visibilityStatus) => visibilityStatus.state),\n mergeVisibilities,\n map((visibility) => createVisibilityStatus(visibility === \"empty\" ? \"disabled\" : visibility)),\n );\n}\n\n/** @internal */\nexport function changeElementStateNoChildrenOperator(props: {\n on: boolean;\n isDisplayedByDefault: boolean;\n viewport: TreeWidgetViewport;\n}): OperatorFunction<string, void> {\n return (elementIds: Observable<Id64String>) => {\n const { on, isDisplayedByDefault } = props;\n const isAlwaysDrawnExclusive = props.viewport.isAlwaysDrawnExclusive;\n return elementIds.pipe(\n releaseMainThreadOnItemsCount(500),\n reduce<\n string,\n { changedNeverDrawn: boolean; changedAlwaysDrawn: boolean; neverDrawn: Set<ElementId> | undefined; alwaysDrawn: Set<ElementId> | undefined }\n >(\n (acc, elementId) => {\n if (acc.alwaysDrawn === undefined || acc.neverDrawn === undefined) {\n acc.alwaysDrawn = new Set(props.viewport.alwaysDrawn || []);\n acc.neverDrawn = new Set(props.viewport.neverDrawn || []);\n }\n if (on) {\n const wasRemoved = acc.neverDrawn.delete(elementId);\n acc.changedNeverDrawn ||= wasRemoved;\n // If exclusive mode is enabled, we must add the element to the always drawn list.\n if ((!isDisplayedByDefault || isAlwaysDrawnExclusive) && !acc.alwaysDrawn.has(elementId)) {\n acc.alwaysDrawn.add(elementId);\n acc.changedAlwaysDrawn = true;\n }\n } else {\n const wasRemoved = acc.alwaysDrawn.delete(elementId);\n acc.changedAlwaysDrawn ||= wasRemoved;\n // If exclusive mode is not enabled, we have to add the element to the never drawn list.\n if (isDisplayedByDefault && !isAlwaysDrawnExclusive && !acc.neverDrawn.has(elementId)) {\n acc.neverDrawn.add(elementId);\n acc.changedNeverDrawn = true;\n }\n }\n return acc;\n },\n {\n changedNeverDrawn: false,\n changedAlwaysDrawn: false,\n neverDrawn: undefined,\n alwaysDrawn: undefined,\n },\n ),\n map((state) => {\n state.changedNeverDrawn && state.neverDrawn && props.viewport.setNeverDrawn({ elementIds: state.neverDrawn });\n state.changedAlwaysDrawn &&\n state.alwaysDrawn &&\n props.viewport.setAlwaysDrawn({ elementIds: state.alwaysDrawn, exclusive: props.viewport.isAlwaysDrawnExclusive });\n }),\n );\n };\n}\n\n/** @internal */\nexport function getVisibilityFromAlwaysAndNeverDrawnElementsImpl(\n props: {\n alwaysDrawn: Set<ElementId> | undefined;\n neverDrawn: Set<ElementId> | undefined;\n totalCount: number;\n viewport: TreeWidgetViewport;\n } & GetVisibilityFromAlwaysAndNeverDrawnElementsProps,\n): VisibilityStatus {\n const { alwaysDrawn, neverDrawn, totalCount, viewport } = props;\n if (totalCount === 0) {\n return props.defaultStatus();\n }\n if (neverDrawn?.size === totalCount) {\n return createVisibilityStatus(\"hidden\");\n }\n\n if (alwaysDrawn?.size === totalCount) {\n return createVisibilityStatus(\"visible\");\n }\n\n if (viewport.isAlwaysDrawnExclusive) {\n return createVisibilityStatus(alwaysDrawn?.size ? \"partial\" : \"hidden\");\n }\n\n const status = props.defaultStatus();\n if ((status.state === \"visible\" && neverDrawn?.size) || (status.state === \"hidden\" && alwaysDrawn?.size)) {\n return createVisibilityStatus(\"partial\");\n }\n return status;\n}\n\n/** @internal */\nexport interface GetVisibilityFromAlwaysAndNeverDrawnElementsProps {\n /** Status when always/never lists are empty and exclusive mode is off */\n defaultStatus: (categoryId?: string) => VisibilityStatus;\n}\n\n/**\n * Changes category display in the viewport.\n * @internal\n */\nexport async function enableCategoryDisplay(viewport: TreeWidgetViewport, categoryIds: Id64Arg, enabled: boolean, enableAllSubCategories = true) {\n const removeOverrides = (bufferedCategories: Id64Array) => {\n const modelsContainingOverrides: string[] = [];\n for (const ovr of viewport.perModelCategoryOverrides) {\n if (Id64.has(bufferedCategories, ovr.categoryId)) {\n modelsContainingOverrides.push(ovr.modelId);\n }\n }\n viewport.setPerModelCategoryOverride({ modelIds: modelsContainingOverrides, categoryIds: bufferedCategories, override: \"none\" });\n };\n const disableSubCategories = async (bufferedCategories: Id64Array) => {\n // changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.\n (await viewport.iModel.categories.getCategoryInfo(bufferedCategories)).forEach((categoryInfo) => {\n categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));\n });\n };\n return toVoidPromise(\n from(Id64.iterable(categoryIds)).pipe(\n releaseMainThreadOnItemsCount(500),\n bufferCount(getOptimalBatchSize({ totalSize: Id64.sizeOf(categoryIds), maximumBatchSize: 500 })),\n mergeMap(async (bufferedCategories) => {\n viewport.changeCategoryDisplay({ categoryIds: bufferedCategories, display: enabled, enableAllSubCategories });\n removeOverrides(bufferedCategories);\n if (!enabled) {\n await disableSubCategories(bufferedCategories);\n }\n }),\n ),\n );\n}\n\n/**\n * Changes subcategory display in the viewport\n * @internal\n */\nexport function enableSubCategoryDisplay(viewport: TreeWidgetViewport, subCategoryId: Id64String, enabled: boolean) {\n viewport.changeSubCategoryDisplay({ subCategoryId, display: enabled });\n}\n\n/** @internal */\nexport async function loadCategoriesFromViewport(vp: TreeWidgetViewport, componentId?: GuidString) {\n // Query categories and add them to state\n if (vp.viewType === \"other\") {\n return [];\n }\n const { categoryClass, elementClass } = getClassesByView(vp.viewType);\n const ecsql = `\n SELECT ECInstanceId as id\n FROM ${categoryClass}\n WHERE\n ECInstanceId IN (\n SELECT DISTINCT Category.Id\n FROM ${elementClass}\n WHERE\n Category.Id IN (SELECT ECInstanceId FROM ${categoryClass})\n ${vp.viewType !== \"2d\" ? \"\" : \"AND Model.Id=?\"}\n )\n `;\n\n const categories: CategoryInfo[] = [];\n const rows = await (async () => {\n const result = new Array<Id64String>();\n for await (const row of vp.iModel.createQueryReader(ecsql, undefined, {\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n restartToken: `CategoriesVisibilityUtils/${componentId ?? Guid.createValue()}/categories`,\n })) {\n result.push(row.id);\n }\n return result;\n })();\n (await vp.iModel.categories.getCategoryInfo(rows)).forEach((val) => {\n categories.push({ categoryId: val.id, subCategoryIds: val.subCategories.size ? [...val.subCategories.keys()] : undefined });\n });\n return categories;\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
import { Guid } from "@itwin/core-bentley";
|
|
7
|
+
/** @internal */
|
|
8
|
+
export function useGuid() {
|
|
9
|
+
const [componentId] = useState(() => Guid.createValue());
|
|
10
|
+
return componentId;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=useGuid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGuid.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/common/internal/useGuid.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C,gBAAgB;AAChB,MAAM,UAAU,OAAO;IACrB,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,OAAO,WAAW,CAAC;AACrB,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 { useState } from \"react\";\nimport { Guid } from \"@itwin/core-bentley\";\n\n/** @internal */\nexport function useGuid() {\n const [componentId] = useState(() => Guid.createValue());\n return componentId;\n}\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { HierarchyNode } from "@itwin/presentation-hierarchies";
|
|
2
|
+
import { HierarchyVisibilityOverrideHandler } from "../../UseHierarchyVisibility.js";
|
|
3
|
+
import { AlwaysAndNeverDrawnElementInfo } from "../AlwaysAndNeverDrawnElementInfo.js";
|
|
4
|
+
import type { GuidString } from "@itwin/core-bentley";
|
|
5
|
+
import type { HierarchyFilteringPath } from "@itwin/presentation-hierarchies";
|
|
6
|
+
import type { ECClassHierarchyInspector } from "@itwin/presentation-shared";
|
|
7
|
+
import type { TreeWidgetViewport } from "../../TreeWidgetViewport.js";
|
|
8
|
+
import type { HierarchyVisibilityHandler, VisibilityStatus } from "../../UseHierarchyVisibility.js";
|
|
9
|
+
import type { FilteredTree } from "../visibility/BaseFilteredTree.js";
|
|
10
|
+
import type { TreeSpecificVisibilityHandler } from "../visibility/BaseVisibilityHelper.js";
|
|
11
|
+
/** @internal */
|
|
12
|
+
export interface CreateFilteredTreeProps<TCache> {
|
|
13
|
+
getCache: () => TCache;
|
|
14
|
+
imodelAccess: ECClassHierarchyInspector;
|
|
15
|
+
filteringPaths: HierarchyFilteringPath[];
|
|
16
|
+
}
|
|
17
|
+
/** @internal */
|
|
18
|
+
export interface CreateTreeSpecificVisibilityHandlerProps<TCache> {
|
|
19
|
+
info: AlwaysAndNeverDrawnElementInfo;
|
|
20
|
+
getCache: () => TCache;
|
|
21
|
+
viewport: TreeWidgetViewport;
|
|
22
|
+
overrideHandler: HierarchyVisibilityOverrideHandler;
|
|
23
|
+
}
|
|
24
|
+
/** @internal */
|
|
25
|
+
export interface UseCachedVisibilityProps<TCache, TFilterTargets> {
|
|
26
|
+
componentId: GuidString;
|
|
27
|
+
activeView: TreeWidgetViewport;
|
|
28
|
+
getCache: () => TCache;
|
|
29
|
+
createFilteredTree: (props: CreateFilteredTreeProps<TCache>) => Promise<FilteredTree<TFilterTargets>>;
|
|
30
|
+
createTreeSpecificVisibilityHandler: (props: CreateTreeSpecificVisibilityHandlerProps<TCache>) => TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;
|
|
31
|
+
}
|
|
32
|
+
/** @internal */
|
|
33
|
+
export declare function useCachedVisibility<TCache, TFilterTargets>(props: UseCachedVisibilityProps<TCache, TFilterTargets>): {
|
|
34
|
+
visibilityHandlerFactory: (props: {
|
|
35
|
+
imodelAccess: ECClassHierarchyInspector;
|
|
36
|
+
}) => HierarchyVisibilityHandler;
|
|
37
|
+
onFilteredPathsChanged: (paths: HierarchyFilteringPath[] | undefined) => void;
|
|
38
|
+
filteredPaths: HierarchyFilteringPath[] | undefined;
|
|
39
|
+
};
|
|
40
|
+
/** @internal */
|
|
41
|
+
export interface HierarchyVisibilityHandlerImplProps<TFilterTargets> {
|
|
42
|
+
viewport: TreeWidgetViewport;
|
|
43
|
+
getTreeSpecificVisibilityHandler: (info: AlwaysAndNeverDrawnElementInfo, overrideHandler: HierarchyVisibilityOverrideHandler) => TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;
|
|
44
|
+
getFilteredTree: () => Promise<FilteredTree<TFilterTargets>> | undefined;
|
|
45
|
+
componentId?: GuidString;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Class that handles visibility of hierarchy nodes in a tree.
|
|
49
|
+
*
|
|
50
|
+
* - It provides methods to get and change visibility status of nodes.
|
|
51
|
+
* - Also handles filtered tree nodes visibility.
|
|
52
|
+
* - Listens to visibility change events and updates visibility status accordingly.
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
export declare class HierarchyVisibilityHandlerImpl<TFilterTargets> implements HierarchyVisibilityHandler, Disposable {
|
|
56
|
+
#private;
|
|
57
|
+
constructor(props: HierarchyVisibilityHandlerImplProps<TFilterTargets>);
|
|
58
|
+
get onVisibilityChange(): import("@itwin/core-bentley").BeEvent<() => void>;
|
|
59
|
+
getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus>;
|
|
60
|
+
changeVisibility(node: HierarchyNode, shouldDisplay: boolean): Promise<void>;
|
|
61
|
+
[Symbol.dispose](): void;
|
|
62
|
+
private getVisibilityStatusInternal;
|
|
63
|
+
private changeVisibilityStatusInternal;
|
|
64
|
+
private getFilteredNodeVisibility;
|
|
65
|
+
private getFilteredTreeTargets;
|
|
66
|
+
private changeFilteredNodeVisibility;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=UseCachedVisibility.d.ts.map
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { useCallback, useEffect, useState } from "react";
|
|
6
|
+
import { defaultIfEmpty, EMPTY, filter, firstValueFrom, from, fromEventPattern, map, mergeMap, Subject, takeUntil, tap } from "rxjs";
|
|
7
|
+
import { assert } from "@itwin/core-bentley";
|
|
8
|
+
import { HierarchyNode, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
|
|
9
|
+
import { HierarchyVisibilityOverrideHandler } from "../../UseHierarchyVisibility.js";
|
|
10
|
+
import { AlwaysAndNeverDrawnElementInfo } from "../AlwaysAndNeverDrawnElementInfo.js";
|
|
11
|
+
import { toVoidPromise } from "../Rxjs.js";
|
|
12
|
+
import { createVisibilityStatus } from "../Tooltip.js";
|
|
13
|
+
import { createVisibilityChangeEventListener } from "../VisibilityChangeEventListener.js";
|
|
14
|
+
/** @internal */
|
|
15
|
+
export function useCachedVisibility(props) {
|
|
16
|
+
const [filteredPaths, setFilteredPaths] = useState(undefined);
|
|
17
|
+
const { activeView, getCache, createFilteredTree, createTreeSpecificVisibilityHandler, componentId } = props;
|
|
18
|
+
const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState(() => createVisibilityHandlerFactory({
|
|
19
|
+
activeView,
|
|
20
|
+
getCache,
|
|
21
|
+
createFilteredTree,
|
|
22
|
+
createTreeSpecificVisibilityHandler,
|
|
23
|
+
filteringPaths: filteredPaths,
|
|
24
|
+
componentId,
|
|
25
|
+
}));
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
setVisibilityHandlerFactory(() => createVisibilityHandlerFactory({
|
|
28
|
+
activeView,
|
|
29
|
+
getCache,
|
|
30
|
+
createFilteredTree,
|
|
31
|
+
createTreeSpecificVisibilityHandler,
|
|
32
|
+
filteringPaths: filteredPaths,
|
|
33
|
+
componentId,
|
|
34
|
+
}));
|
|
35
|
+
}, [activeView, getCache, filteredPaths, createFilteredTree, createTreeSpecificVisibilityHandler, componentId]);
|
|
36
|
+
return {
|
|
37
|
+
visibilityHandlerFactory,
|
|
38
|
+
onFilteredPathsChanged: useCallback((paths) => setFilteredPaths(paths), []),
|
|
39
|
+
filteredPaths,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function createVisibilityHandlerFactory(props) {
|
|
43
|
+
const { activeView, createFilteredTree, createTreeSpecificVisibilityHandler, getCache, filteringPaths, componentId } = props;
|
|
44
|
+
return ({ imodelAccess }) => new HierarchyVisibilityHandlerImpl({
|
|
45
|
+
componentId,
|
|
46
|
+
viewport: activeView,
|
|
47
|
+
getFilteredTree: () => {
|
|
48
|
+
if (filteringPaths) {
|
|
49
|
+
return createFilteredTree({ imodelAccess, filteringPaths, getCache });
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
},
|
|
53
|
+
getTreeSpecificVisibilityHandler: (info, overrideHandler) => createTreeSpecificVisibilityHandler({
|
|
54
|
+
info,
|
|
55
|
+
getCache,
|
|
56
|
+
viewport: activeView,
|
|
57
|
+
overrideHandler,
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Class that handles visibility of hierarchy nodes in a tree.
|
|
63
|
+
*
|
|
64
|
+
* - It provides methods to get and change visibility status of nodes.
|
|
65
|
+
* - Also handles filtered tree nodes visibility.
|
|
66
|
+
* - Listens to visibility change events and updates visibility status accordingly.
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
export class HierarchyVisibilityHandlerImpl {
|
|
70
|
+
#props;
|
|
71
|
+
#eventListener;
|
|
72
|
+
#alwaysAndNeverDrawnElements;
|
|
73
|
+
#treeSpecificVisibilityHandler;
|
|
74
|
+
#changeRequest = new Subject();
|
|
75
|
+
#filteredTree;
|
|
76
|
+
constructor(props) {
|
|
77
|
+
this.#props = props;
|
|
78
|
+
this.#eventListener = createVisibilityChangeEventListener({
|
|
79
|
+
viewport: this.#props.viewport,
|
|
80
|
+
listeners: {
|
|
81
|
+
models: true,
|
|
82
|
+
categories: true,
|
|
83
|
+
elements: true,
|
|
84
|
+
displayStyle: true,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
this.#alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo({ viewport: this.#props.viewport, componentId: props.componentId });
|
|
88
|
+
this.#treeSpecificVisibilityHandler = this.#props.getTreeSpecificVisibilityHandler(this.#alwaysAndNeverDrawnElements, new HierarchyVisibilityOverrideHandler(this));
|
|
89
|
+
this.#filteredTree = this.#props.getFilteredTree();
|
|
90
|
+
}
|
|
91
|
+
get onVisibilityChange() {
|
|
92
|
+
return this.#eventListener.onVisibilityChange;
|
|
93
|
+
}
|
|
94
|
+
async getVisibilityStatus(node) {
|
|
95
|
+
return firstValueFrom(this.getVisibilityStatusInternal(node).pipe(
|
|
96
|
+
// unsubscribe from the observable if the change request for this node is received
|
|
97
|
+
takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),
|
|
98
|
+
// unsubscribe if visibility changes
|
|
99
|
+
takeUntil(fromEventPattern((handler) => {
|
|
100
|
+
this.#eventListener.onVisibilityChange.addListener(handler);
|
|
101
|
+
}, (handler) => {
|
|
102
|
+
this.#eventListener.onVisibilityChange.removeListener(handler);
|
|
103
|
+
})), defaultIfEmpty(createVisibilityStatus("hidden"))));
|
|
104
|
+
}
|
|
105
|
+
async changeVisibility(node, shouldDisplay) {
|
|
106
|
+
// notify about new change request
|
|
107
|
+
this.#changeRequest.next({ key: node.key, depth: node.parentKeys.length });
|
|
108
|
+
const changeObservable = this.changeVisibilityStatusInternal(node, shouldDisplay).pipe(
|
|
109
|
+
// unsubscribe from the observable if the change request for this node is received
|
|
110
|
+
takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))), tap({
|
|
111
|
+
subscribe: () => {
|
|
112
|
+
this.#eventListener.suppressChangeEvents();
|
|
113
|
+
this.#alwaysAndNeverDrawnElements.suppressChangeEvents();
|
|
114
|
+
},
|
|
115
|
+
finalize: () => {
|
|
116
|
+
this.#eventListener.resumeChangeEvents();
|
|
117
|
+
this.#alwaysAndNeverDrawnElements.resumeChangeEvents();
|
|
118
|
+
},
|
|
119
|
+
}));
|
|
120
|
+
return toVoidPromise(changeObservable);
|
|
121
|
+
}
|
|
122
|
+
[Symbol.dispose]() {
|
|
123
|
+
this.#eventListener[Symbol.dispose]();
|
|
124
|
+
this.#alwaysAndNeverDrawnElements[Symbol.dispose]();
|
|
125
|
+
this.#treeSpecificVisibilityHandler[Symbol.dispose]();
|
|
126
|
+
}
|
|
127
|
+
getVisibilityStatusInternal(node) {
|
|
128
|
+
if (HierarchyNode.isClassGroupingNode(node)) {
|
|
129
|
+
if (node.extendedData?.hasDirectNonFilteredTargets && !node.extendedData?.hasFilterTargetAncestor) {
|
|
130
|
+
return this.getFilteredNodeVisibility({ node });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (HierarchyNode.isInstancesNode(node) && node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {
|
|
134
|
+
return this.getFilteredNodeVisibility({ node });
|
|
135
|
+
}
|
|
136
|
+
return this.#treeSpecificVisibilityHandler.getVisibilityStatus(node);
|
|
137
|
+
}
|
|
138
|
+
changeVisibilityStatusInternal(node, on) {
|
|
139
|
+
if (HierarchyNode.isClassGroupingNode(node)) {
|
|
140
|
+
if (node.extendedData?.hasDirectNonFilteredTargets && !node.extendedData?.hasFilterTargetAncestor) {
|
|
141
|
+
return this.changeFilteredNodeVisibility({ node, on });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (HierarchyNode.isInstancesNode(node) && node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {
|
|
145
|
+
return this.changeFilteredNodeVisibility({ node, on });
|
|
146
|
+
}
|
|
147
|
+
return this.#treeSpecificVisibilityHandler.changeVisibilityStatus(node, on);
|
|
148
|
+
}
|
|
149
|
+
getFilteredNodeVisibility(props) {
|
|
150
|
+
return this.getFilteredTreeTargets(props).pipe(mergeMap((targets) => {
|
|
151
|
+
if (!targets) {
|
|
152
|
+
return EMPTY;
|
|
153
|
+
}
|
|
154
|
+
return this.#treeSpecificVisibilityHandler.getFilterTargetsVisibilityStatus(targets);
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
getFilteredTreeTargets({ node, }) {
|
|
158
|
+
assert(this.#filteredTree !== undefined);
|
|
159
|
+
return from(this.#filteredTree).pipe(map((filteredTree) => filteredTree.getFilterTargets(node)));
|
|
160
|
+
}
|
|
161
|
+
changeFilteredNodeVisibility({ on, node, }) {
|
|
162
|
+
return this.getFilteredTreeTargets({ node }).pipe(mergeMap((targets) => {
|
|
163
|
+
if (!targets) {
|
|
164
|
+
return EMPTY;
|
|
165
|
+
}
|
|
166
|
+
return this.#treeSpecificVisibilityHandler.changeFilterTargetsVisibilityStatus(targets, on);
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=UseCachedVisibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UseCachedVisibility.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.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 { useCallback, useEffect, useState } from \"react\";\nimport { defaultIfEmpty, EMPTY, filter, firstValueFrom, from, fromEventPattern, map, mergeMap, Subject, takeUntil, tap } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { HierarchyNode, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { HierarchyVisibilityOverrideHandler } from \"../../UseHierarchyVisibility.js\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"../AlwaysAndNeverDrawnElementInfo.js\";\nimport { toVoidPromise } from \"../Rxjs.js\";\nimport { createVisibilityStatus } from \"../Tooltip.js\";\nimport { createVisibilityChangeEventListener } from \"../VisibilityChangeEventListener.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString } from \"@itwin/core-bentley\";\nimport type { ClassGroupingNodeKey, HierarchyFilteringPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { VisibilityTreeProps } from \"../../components/VisibilityTree.js\";\nimport type { TreeWidgetViewport } from \"../../TreeWidgetViewport.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../UseHierarchyVisibility.js\";\nimport type { FilteredTree } from \"../visibility/BaseFilteredTree.js\";\nimport type { TreeSpecificVisibilityHandler } from \"../visibility/BaseVisibilityHelper.js\";\nimport type { IVisibilityChangeEventListener } from \"../VisibilityChangeEventListener.js\";\n\n/** @internal */\nexport interface CreateFilteredTreeProps<TCache> {\n getCache: () => TCache;\n imodelAccess: ECClassHierarchyInspector;\n filteringPaths: HierarchyFilteringPath[];\n}\n\n/** @internal */\nexport interface CreateTreeSpecificVisibilityHandlerProps<TCache> {\n info: AlwaysAndNeverDrawnElementInfo;\n getCache: () => TCache;\n viewport: TreeWidgetViewport;\n overrideHandler: HierarchyVisibilityOverrideHandler;\n}\n\n/** @internal */\nexport interface UseCachedVisibilityProps<TCache, TFilterTargets> {\n componentId: GuidString;\n activeView: TreeWidgetViewport;\n getCache: () => TCache;\n createFilteredTree: (props: CreateFilteredTreeProps<TCache>) => Promise<FilteredTree<TFilterTargets>>;\n createTreeSpecificVisibilityHandler: (props: CreateTreeSpecificVisibilityHandlerProps<TCache>) => TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;\n}\n\n/** @internal */\nexport function useCachedVisibility<TCache, TFilterTargets>(props: UseCachedVisibilityProps<TCache, TFilterTargets>) {\n const [filteredPaths, setFilteredPaths] = useState<HierarchyFilteringPath[] | undefined>(undefined);\n const { activeView, getCache, createFilteredTree, createTreeSpecificVisibilityHandler, componentId } = props;\n\n const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState<VisibilityTreeProps[\"visibilityHandlerFactory\"]>(() =>\n createVisibilityHandlerFactory({\n activeView,\n getCache,\n createFilteredTree,\n createTreeSpecificVisibilityHandler,\n filteringPaths: filteredPaths,\n componentId,\n }),\n );\n\n useEffect(() => {\n setVisibilityHandlerFactory(() =>\n createVisibilityHandlerFactory({\n activeView,\n getCache,\n createFilteredTree,\n createTreeSpecificVisibilityHandler,\n filteringPaths: filteredPaths,\n componentId,\n }),\n );\n }, [activeView, getCache, filteredPaths, createFilteredTree, createTreeSpecificVisibilityHandler, componentId]);\n\n return {\n visibilityHandlerFactory,\n onFilteredPathsChanged: useCallback((paths: HierarchyFilteringPath[] | undefined) => setFilteredPaths(paths), []),\n filteredPaths,\n };\n}\n\nfunction createVisibilityHandlerFactory<TCache, TFilterTargets>(\n props: UseCachedVisibilityProps<TCache, TFilterTargets> & {\n filteringPaths: HierarchyFilteringPath[] | undefined;\n },\n): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n const { activeView, createFilteredTree, createTreeSpecificVisibilityHandler, getCache, filteringPaths, componentId } = props;\n return ({ imodelAccess }) =>\n new HierarchyVisibilityHandlerImpl<TFilterTargets>({\n componentId,\n viewport: activeView,\n getFilteredTree: (): Promise<FilteredTree<TFilterTargets>> | undefined => {\n if (filteringPaths) {\n return createFilteredTree({ imodelAccess, filteringPaths, getCache });\n }\n return undefined;\n },\n getTreeSpecificVisibilityHandler: (info, overrideHandler) =>\n createTreeSpecificVisibilityHandler({\n info,\n getCache,\n viewport: activeView,\n overrideHandler,\n }),\n });\n}\n\n/** @internal */\nexport interface HierarchyVisibilityHandlerImplProps<TFilterTargets> {\n viewport: TreeWidgetViewport;\n getTreeSpecificVisibilityHandler: (\n info: AlwaysAndNeverDrawnElementInfo,\n overrideHandler: HierarchyVisibilityOverrideHandler,\n ) => TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;\n getFilteredTree: () => Promise<FilteredTree<TFilterTargets>> | undefined;\n componentId?: GuidString;\n}\n\n/**\n * Class that handles visibility of hierarchy nodes in a tree.\n *\n * - It provides methods to get and change visibility status of nodes.\n * - Also handles filtered tree nodes visibility.\n * - Listens to visibility change events and updates visibility status accordingly.\n * @internal\n */\nexport class HierarchyVisibilityHandlerImpl<TFilterTargets> implements HierarchyVisibilityHandler, Disposable {\n readonly #props: HierarchyVisibilityHandlerImplProps<TFilterTargets>;\n readonly #eventListener: IVisibilityChangeEventListener;\n readonly #alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n #treeSpecificVisibilityHandler: TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;\n #changeRequest = new Subject<{ key: HierarchyNodeKey; depth: number }>();\n #filteredTree: Promise<FilteredTree<TFilterTargets>> | undefined;\n\n constructor(props: HierarchyVisibilityHandlerImplProps<TFilterTargets>) {\n this.#props = props;\n this.#eventListener = createVisibilityChangeEventListener({\n viewport: this.#props.viewport,\n listeners: {\n models: true,\n categories: true,\n elements: true,\n displayStyle: true,\n },\n });\n this.#alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo({ viewport: this.#props.viewport, componentId: props.componentId });\n this.#treeSpecificVisibilityHandler = this.#props.getTreeSpecificVisibilityHandler(\n this.#alwaysAndNeverDrawnElements,\n new HierarchyVisibilityOverrideHandler(this),\n );\n this.#filteredTree = this.#props.getFilteredTree();\n }\n\n public get onVisibilityChange() {\n return this.#eventListener.onVisibilityChange;\n }\n\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n return firstValueFrom(\n this.getVisibilityStatusInternal(node).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n // unsubscribe if visibility changes\n takeUntil(\n fromEventPattern(\n (handler) => {\n this.#eventListener.onVisibilityChange.addListener(handler);\n },\n (handler) => {\n this.#eventListener.onVisibilityChange.removeListener(handler);\n },\n ),\n ),\n defaultIfEmpty(createVisibilityStatus(\"hidden\")),\n ),\n );\n }\n\n public async changeVisibility(node: HierarchyNode, shouldDisplay: boolean): Promise<void> {\n // notify about new change request\n this.#changeRequest.next({ key: node.key, depth: node.parentKeys.length });\n\n const changeObservable = this.changeVisibilityStatusInternal(node, shouldDisplay).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n tap({\n subscribe: () => {\n this.#eventListener.suppressChangeEvents();\n this.#alwaysAndNeverDrawnElements.suppressChangeEvents();\n },\n finalize: () => {\n this.#eventListener.resumeChangeEvents();\n this.#alwaysAndNeverDrawnElements.resumeChangeEvents();\n },\n }),\n );\n\n return toVoidPromise(changeObservable);\n }\n\n public [Symbol.dispose]() {\n this.#eventListener[Symbol.dispose]();\n this.#alwaysAndNeverDrawnElements[Symbol.dispose]();\n this.#treeSpecificVisibilityHandler[Symbol.dispose]();\n }\n\n private getVisibilityStatusInternal(node: HierarchyNode) {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.extendedData?.hasFilterTargetAncestor) {\n return this.getFilteredNodeVisibility({ node });\n }\n }\n\n if (HierarchyNode.isInstancesNode(node) && node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.getFilteredNodeVisibility({ node });\n }\n return this.#treeSpecificVisibilityHandler.getVisibilityStatus(node);\n }\n\n private changeVisibilityStatusInternal(node: HierarchyNode, on: boolean): Observable<void> {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.extendedData?.hasFilterTargetAncestor) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n }\n if (HierarchyNode.isInstancesNode(node) && node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n return this.#treeSpecificVisibilityHandler.changeVisibilityStatus(node, on);\n }\n\n private getFilteredNodeVisibility(props: {\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }) {\n return this.getFilteredTreeTargets(props).pipe(\n mergeMap((targets) => {\n if (!targets) {\n return EMPTY;\n }\n return this.#treeSpecificVisibilityHandler.getFilterTargetsVisibilityStatus(targets);\n }),\n );\n }\n\n private getFilteredTreeTargets({\n node,\n }: {\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }): Observable<TFilterTargets | undefined> {\n assert(this.#filteredTree !== undefined);\n return from(this.#filteredTree).pipe(map((filteredTree) => filteredTree.getFilterTargets(node)));\n }\n\n private changeFilteredNodeVisibility({\n on,\n node,\n }: {\n on: boolean;\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }) {\n return this.getFilteredTreeTargets({ node }).pipe(\n mergeMap((targets) => {\n if (!targets) {\n return EMPTY;\n }\n return this.#treeSpecificVisibilityHandler.changeFilterTargetsVisibilityStatus(targets, on);\n }),\n );\n }\n}\n"]}
|
package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { GuidString } from "@itwin/core-bentley";
|
|
2
|
+
import type { IModelConnection } from "@itwin/core-frontend";
|
|
3
|
+
/** @internal */
|
|
4
|
+
export interface CreateCacheProps<TCacheSpecificProps> {
|
|
5
|
+
imodel: IModelConnection;
|
|
6
|
+
specificProps: TCacheSpecificProps;
|
|
7
|
+
componentId: GuidString;
|
|
8
|
+
}
|
|
9
|
+
/** @internal */
|
|
10
|
+
export interface UseIdsCacheProps<TCache, TCacheSpecificProps> {
|
|
11
|
+
imodel: IModelConnection;
|
|
12
|
+
createCache: (props: CreateCacheProps<TCacheSpecificProps>) => TCache;
|
|
13
|
+
cacheSpecificProps: TCacheSpecificProps;
|
|
14
|
+
componentId: GuidString;
|
|
15
|
+
}
|
|
16
|
+
/** @internal */
|
|
17
|
+
export declare function useIdsCache<TCache extends Disposable, TCacheSpecificProps extends object>(props: UseIdsCacheProps<TCache, TCacheSpecificProps>): {
|
|
18
|
+
getCache: () => TCache;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=UseIdsCache.d.ts.map
|