@itwin/components-react 4.7.2 → 4.8.1
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 +11 -3
- package/lib/cjs/components-react/common/DelayedSpinner.js +3 -2
- package/lib/cjs/components-react/common/DelayedSpinner.js.map +1 -1
- package/lib/cjs/components-react/common/UseDebouncedAsyncValue.js +2 -1
- package/lib/cjs/components-react/common/UseDebouncedAsyncValue.js.map +1 -1
- package/lib/cjs/components-react/converters/NumericTypeConverter.js +4 -2
- package/lib/cjs/components-react/converters/NumericTypeConverter.js.map +1 -1
- package/lib/cjs/components-react/converters/TypeConverter.js +2 -1
- package/lib/cjs/components-react/converters/TypeConverter.js.map +1 -1
- package/lib/cjs/components-react/editors/CustomNumberEditor.js +8 -6
- package/lib/cjs/components-react/editors/CustomNumberEditor.js.map +1 -1
- package/lib/cjs/components-react/editors/DateTimeEditor.js +3 -2
- package/lib/cjs/components-react/editors/DateTimeEditor.js.map +1 -1
- package/lib/cjs/components-react/editors/PopupButton.js +4 -3
- package/lib/cjs/components-react/editors/PopupButton.js.map +1 -1
- package/lib/cjs/components-react/editors/TextEditor.js +4 -2
- package/lib/cjs/components-react/editors/TextEditor.js.map +1 -1
- package/lib/cjs/components-react/favorite/FavoritePropertyList.js +3 -3
- package/lib/cjs/components-react/favorite/FavoritePropertyList.js.map +1 -1
- package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js +2 -1
- package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -1
- package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.js +3 -3
- package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.js.map +1 -1
- package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.js +1 -1
- package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.js.map +1 -1
- package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts +2 -0
- package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -1
- package/lib/cjs/components-react/filter-builder/FilterBuilderState.js +8 -2
- package/lib/cjs/components-react/filter-builder/FilterBuilderState.js.map +1 -1
- package/lib/cjs/components-react/properties/renderers/CommonPropertyRenderer.js +4 -3
- package/lib/cjs/components-react/properties/renderers/CommonPropertyRenderer.js.map +1 -1
- package/lib/cjs/components-react/properties/renderers/NonPrimitivePropertyRenderer.js +1 -1
- package/lib/cjs/components-react/properties/renderers/NonPrimitivePropertyRenderer.js.map +1 -1
- package/lib/cjs/components-react/properties/renderers/PrimitivePropertyRenderer.js +3 -2
- package/lib/cjs/components-react/properties/renderers/PrimitivePropertyRenderer.js.map +1 -1
- package/lib/cjs/components-react/properties/renderers/label/PropertyLabelRenderer.js +4 -4
- package/lib/cjs/components-react/properties/renderers/label/PropertyLabelRenderer.js.map +1 -1
- package/lib/cjs/components-react/properties/renderers/value/Common.js +2 -1
- package/lib/cjs/components-react/properties/renderers/value/Common.js.map +1 -1
- package/lib/cjs/components-react/properties/renderers/value/MultilineTextPropertyValueRenderer.js +6 -3
- package/lib/cjs/components-react/properties/renderers/value/MultilineTextPropertyValueRenderer.js.map +1 -1
- package/lib/cjs/components-react/properties/renderers/value/PrimitivePropertyValueRenderer.js +6 -3
- package/lib/cjs/components-react/properties/renderers/value/PrimitivePropertyValueRenderer.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/PropertyCategoryRendererManager.js +2 -1
- package/lib/cjs/components-react/propertygrid/PropertyCategoryRendererManager.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/component/ColumnResizingPropertyListPropsSupplier.js +2 -1
- package/lib/cjs/components-react/propertygrid/component/ColumnResizingPropertyListPropsSupplier.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/component/PropertyCategoryBlock.js +2 -1
- package/lib/cjs/components-react/propertygrid/component/PropertyCategoryBlock.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/component/PropertyGridCommons.js +2 -2
- package/lib/cjs/components-react/propertygrid/component/PropertyGridCommons.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/component/VirtualizedPropertyGrid.d.ts.map +1 -1
- package/lib/cjs/components-react/propertygrid/component/VirtualizedPropertyGrid.js +54 -48
- package/lib/cjs/components-react/propertygrid/component/VirtualizedPropertyGrid.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/dataproviders/FilteringDataProvider.js +13 -11
- package/lib/cjs/components-react/propertygrid/dataproviders/FilteringDataProvider.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/dataproviders/filterers/CompositePropertyDataFilterer.js +2 -2
- package/lib/cjs/components-react/propertygrid/dataproviders/filterers/CompositePropertyDataFilterer.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/dataproviders/filterers/DisplayValuePropertyDataFilterer.js +2 -1
- package/lib/cjs/components-react/propertygrid/dataproviders/filterers/DisplayValuePropertyDataFilterer.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableCustomGridCategory.js +2 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableCustomGridCategory.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableFlatGridItem.js +2 -2
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableFlatGridItem.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableGridCategory.js +3 -2
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableGridCategory.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableGridItemFactory.js +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-items/MutableGridItemFactory.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-properties/FlatNonPrimitivePropertyRenderer.js +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-properties/FlatNonPrimitivePropertyRenderer.js.map +1 -1
- package/lib/cjs/components-react/propertygrid/internal/flat-properties/FlatPropertyRenderer.js +7 -5
- package/lib/cjs/components-react/propertygrid/internal/flat-properties/FlatPropertyRenderer.js.map +1 -1
- package/lib/cjs/components-react/selectable-content/SelectableContent.js +3 -2
- package/lib/cjs/components-react/selectable-content/SelectableContent.js.map +1 -1
- package/lib/cjs/components-react/toolbar/InternalToolbarComponent.js +6 -4
- package/lib/cjs/components-react/toolbar/InternalToolbarComponent.js.map +1 -1
- package/lib/cjs/components-react/toolbar/useConditionalSynchedItems.js +6 -5
- package/lib/cjs/components-react/toolbar/useConditionalSynchedItems.js.map +1 -1
- package/lib/cjs/components-react/tree/controlled/TreeModel.js +8 -7
- package/lib/cjs/components-react/tree/controlled/TreeModel.js.map +1 -1
- package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.js +8 -6
- package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.js.map +1 -1
- package/lib/cjs/components-react/tree/controlled/internal/SparseTree.js +2 -1
- package/lib/cjs/components-react/tree/controlled/internal/SparseTree.js.map +1 -1
- package/lib/cjs/components-react/tree/controlled/internal/TreeSelectionManager.js +4 -2
- package/lib/cjs/components-react/tree/controlled/internal/TreeSelectionManager.js.map +1 -1
- package/lib/esm/components-react/common/DelayedSpinner.js +3 -2
- package/lib/esm/components-react/common/DelayedSpinner.js.map +1 -1
- package/lib/esm/components-react/common/UseDebouncedAsyncValue.js +2 -1
- package/lib/esm/components-react/common/UseDebouncedAsyncValue.js.map +1 -1
- package/lib/esm/components-react/converters/NumericTypeConverter.js +4 -2
- package/lib/esm/components-react/converters/NumericTypeConverter.js.map +1 -1
- package/lib/esm/components-react/converters/TypeConverter.js +2 -1
- package/lib/esm/components-react/converters/TypeConverter.js.map +1 -1
- package/lib/esm/components-react/editors/CustomNumberEditor.js +8 -6
- package/lib/esm/components-react/editors/CustomNumberEditor.js.map +1 -1
- package/lib/esm/components-react/editors/DateTimeEditor.js +3 -2
- package/lib/esm/components-react/editors/DateTimeEditor.js.map +1 -1
- package/lib/esm/components-react/editors/PopupButton.js +4 -3
- package/lib/esm/components-react/editors/PopupButton.js.map +1 -1
- package/lib/esm/components-react/editors/TextEditor.js +4 -2
- package/lib/esm/components-react/editors/TextEditor.js.map +1 -1
- package/lib/esm/components-react/favorite/FavoritePropertyList.js +3 -3
- package/lib/esm/components-react/favorite/FavoritePropertyList.js.map +1 -1
- package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js +2 -1
- package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -1
- package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.js +3 -3
- package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.js.map +1 -1
- package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.js +1 -1
- package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.js.map +1 -1
- package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts +2 -0
- package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -1
- package/lib/esm/components-react/filter-builder/FilterBuilderState.js +8 -2
- package/lib/esm/components-react/filter-builder/FilterBuilderState.js.map +1 -1
- package/lib/esm/components-react/properties/renderers/CommonPropertyRenderer.js +4 -3
- package/lib/esm/components-react/properties/renderers/CommonPropertyRenderer.js.map +1 -1
- package/lib/esm/components-react/properties/renderers/NonPrimitivePropertyRenderer.js +1 -1
- package/lib/esm/components-react/properties/renderers/NonPrimitivePropertyRenderer.js.map +1 -1
- package/lib/esm/components-react/properties/renderers/PrimitivePropertyRenderer.js +3 -2
- package/lib/esm/components-react/properties/renderers/PrimitivePropertyRenderer.js.map +1 -1
- package/lib/esm/components-react/properties/renderers/label/PropertyLabelRenderer.js +4 -4
- package/lib/esm/components-react/properties/renderers/label/PropertyLabelRenderer.js.map +1 -1
- package/lib/esm/components-react/properties/renderers/value/Common.js +2 -1
- package/lib/esm/components-react/properties/renderers/value/Common.js.map +1 -1
- package/lib/esm/components-react/properties/renderers/value/MultilineTextPropertyValueRenderer.js +6 -3
- package/lib/esm/components-react/properties/renderers/value/MultilineTextPropertyValueRenderer.js.map +1 -1
- package/lib/esm/components-react/properties/renderers/value/PrimitivePropertyValueRenderer.js +6 -3
- package/lib/esm/components-react/properties/renderers/value/PrimitivePropertyValueRenderer.js.map +1 -1
- package/lib/esm/components-react/propertygrid/PropertyCategoryRendererManager.js +2 -1
- package/lib/esm/components-react/propertygrid/PropertyCategoryRendererManager.js.map +1 -1
- package/lib/esm/components-react/propertygrid/component/ColumnResizingPropertyListPropsSupplier.js +2 -1
- package/lib/esm/components-react/propertygrid/component/ColumnResizingPropertyListPropsSupplier.js.map +1 -1
- package/lib/esm/components-react/propertygrid/component/PropertyCategoryBlock.js +2 -1
- package/lib/esm/components-react/propertygrid/component/PropertyCategoryBlock.js.map +1 -1
- package/lib/esm/components-react/propertygrid/component/PropertyGridCommons.js +2 -2
- package/lib/esm/components-react/propertygrid/component/PropertyGridCommons.js.map +1 -1
- package/lib/esm/components-react/propertygrid/component/VirtualizedPropertyGrid.d.ts.map +1 -1
- package/lib/esm/components-react/propertygrid/component/VirtualizedPropertyGrid.js +54 -48
- package/lib/esm/components-react/propertygrid/component/VirtualizedPropertyGrid.js.map +1 -1
- package/lib/esm/components-react/propertygrid/dataproviders/FilteringDataProvider.js +13 -11
- package/lib/esm/components-react/propertygrid/dataproviders/FilteringDataProvider.js.map +1 -1
- package/lib/esm/components-react/propertygrid/dataproviders/filterers/CompositePropertyDataFilterer.js +2 -2
- package/lib/esm/components-react/propertygrid/dataproviders/filterers/CompositePropertyDataFilterer.js.map +1 -1
- package/lib/esm/components-react/propertygrid/dataproviders/filterers/DisplayValuePropertyDataFilterer.js +2 -1
- package/lib/esm/components-react/propertygrid/dataproviders/filterers/DisplayValuePropertyDataFilterer.js.map +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableCustomGridCategory.js +2 -1
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableCustomGridCategory.js.map +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableFlatGridItem.js +2 -2
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableFlatGridItem.js.map +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableGridCategory.js +3 -2
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableGridCategory.js.map +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableGridItemFactory.js +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-items/MutableGridItemFactory.js.map +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-properties/FlatNonPrimitivePropertyRenderer.js +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-properties/FlatNonPrimitivePropertyRenderer.js.map +1 -1
- package/lib/esm/components-react/propertygrid/internal/flat-properties/FlatPropertyRenderer.js +7 -5
- package/lib/esm/components-react/propertygrid/internal/flat-properties/FlatPropertyRenderer.js.map +1 -1
- package/lib/esm/components-react/selectable-content/SelectableContent.js +3 -2
- package/lib/esm/components-react/selectable-content/SelectableContent.js.map +1 -1
- package/lib/esm/components-react/toolbar/InternalToolbarComponent.js +6 -4
- package/lib/esm/components-react/toolbar/InternalToolbarComponent.js.map +1 -1
- package/lib/esm/components-react/toolbar/useConditionalSynchedItems.js +6 -5
- package/lib/esm/components-react/toolbar/useConditionalSynchedItems.js.map +1 -1
- package/lib/esm/components-react/tree/controlled/TreeModel.js +8 -7
- package/lib/esm/components-react/tree/controlled/TreeModel.js.map +1 -1
- package/lib/esm/components-react/tree/controlled/TreeNodeLoader.js +8 -6
- package/lib/esm/components-react/tree/controlled/TreeNodeLoader.js.map +1 -1
- package/lib/esm/components-react/tree/controlled/internal/SparseTree.js +2 -1
- package/lib/esm/components-react/tree/controlled/internal/SparseTree.js.map +1 -1
- package/lib/esm/components-react/tree/controlled/internal/TreeSelectionManager.js +4 -2
- package/lib/esm/components-react/tree/controlled/internal/TreeSelectionManager.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeNodeLoader.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.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/** @packageDocumentation\n * @module Tree\n */\n\nimport type { Observable as RxjsObservable } from \"rxjs\";\nimport {\n concatAll,\n concatMap,\n defer,\n finalize,\n from,\n map,\n of,\n share,\n toArray,\n} from \"rxjs\";\nimport { UiError } from \"@itwin/appui-abstract\";\nimport {\n scheduleSubscription,\n SubscriptionScheduler,\n} from \"../../common/SubscriptionScheduler\";\nimport { UiComponents } from \"../../UiComponents\";\nimport type {\n ImmediatelyLoadedTreeNodeItem,\n TreeDataProvider,\n TreeDataProviderRaw,\n TreeNodeItem,\n} from \"../TreeDataProvider\";\nimport {\n isTreeDataProviderInterface,\n isTreeDataProviderMethod,\n isTreeDataProviderPromise,\n isTreeDataProviderRaw,\n} from \"../TreeDataProvider\";\nimport type { Observable } from \"./Observable\";\nimport { toRxjsObservable } from \"./Observable\";\nimport type {\n MutableTreeModel,\n TreeModelNode,\n TreeModelNodeInput,\n TreeModelRootNode,\n TreeNodeItemData,\n} from \"./TreeModel\";\nimport { isTreeModelNode } from \"./TreeModel\";\nimport type { TreeModelSource } from \"./TreeModelSource\";\n\n/**\n * Data structure that describes node load result\n * @public\n */\nexport interface TreeNodeLoadResult {\n loadedNodes: TreeNodeItem[];\n}\n\n/**\n * Tree node loader which is used to load tree nodes.\n * @public\n */\nexport interface ITreeNodeLoader {\n /**\n * Loads node at specified place in tree.\n * @param parentId specifies tree branch\n * @param childIndex specifies offset in the branch.\n */\n loadNode(\n parentId: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<TreeNodeLoadResult>;\n}\n\n/**\n * Tree node loader which uses `TreeDataProvider` to load nodes.\n * @public\n */\nexport interface ITreeNodeLoaderWithProvider<\n TDataProvider extends TreeDataProvider\n> extends ITreeNodeLoader {\n /** Returns `TreeDataProvider` used to load nodes. */\n readonly dataProvider: TDataProvider;\n}\n\n/**\n * Abstract node loader implementation which loads nodes into provided model source.\n * @public\n */\nexport abstract class AbstractTreeNodeLoader implements ITreeNodeLoader {\n private _treeModelSource: TreeModelSource;\n private _loadScheduler = new SubscriptionScheduler<LoadedNodeHierarchy>();\n\n protected constructor(modelSource: TreeModelSource) {\n this._treeModelSource = modelSource;\n }\n\n public get modelSource() {\n return this._treeModelSource;\n }\n\n /** Do not override this method. @see `load` */\n public loadNode(\n parent: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<TreeNodeLoadResult> {\n return toRxjsObservable(this.load(parent, childIndex)).pipe(\n scheduleSubscription(this._loadScheduler),\n map((loadedHierarchy) => {\n this.updateModel(loadedHierarchy);\n return {\n loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems),\n };\n })\n );\n }\n\n /**\n * A method that's called when `load` loads some nodes and we need to put them into model source. The\n * default implementation simply puts loaded child nodes under their parent at correct positions. Concrete\n * implementation may override this method to handle loaded nodes in a a custom way (put them at custom locations\n * in the hierarchy, etc.)\n */\n protected updateModel(loadedHierarchy: LoadedNodeHierarchy): void {\n handleLoadedNodeHierarchy(this._treeModelSource, loadedHierarchy);\n }\n\n /** An abstract method to load a node at the specific index for the specified parent. */\n protected abstract load(\n parent: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<LoadedNodeHierarchy>;\n}\n\n/**\n * Abstract node loader with tree data provider which loads nodes into provided model source.\n * @public\n */\nexport abstract class AbstractTreeNodeLoaderWithProvider<\n TDataProvider extends TreeDataProvider\n >\n extends AbstractTreeNodeLoader\n implements ITreeNodeLoaderWithProvider<TDataProvider>\n{\n private _dataProvider: TDataProvider;\n\n protected constructor(\n modelSource: TreeModelSource,\n dataProvider: TDataProvider\n ) {\n super(modelSource);\n this._dataProvider = dataProvider;\n }\n\n public get dataProvider() {\n return this._dataProvider;\n }\n}\n\n/**\n * Default tree node loader with `TreeDataProvider` implementation.\n * @public\n */\nexport class TreeNodeLoader<\n TDataProvider extends TreeDataProvider\n> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> {\n private _treeDataSource: TreeDataSource;\n private _activeRequests = new Map<\n string | undefined,\n RxjsObservable<TreeNodeLoadResult>\n >();\n private _scheduler = new SubscriptionScheduler<LoadedNodeHierarchy>();\n\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource) {\n super(modelSource, dataProvider);\n this._treeDataSource = new TreeDataSource(dataProvider);\n }\n\n /**\n * Schedules to load children of node and returns an Observable.\n * @note It does not start loading node until '.subscribe()' is called on returned Observable.\n */\n public override loadNode(\n parent: TreeModelNode | TreeModelRootNode,\n _childIndex?: number\n ): Observable<TreeNodeLoadResult> {\n return defer(() => {\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\n const parentId = parentItem?.id;\n const activeRequest = this._activeRequests.get(parentId);\n if (activeRequest) {\n return activeRequest;\n }\n\n const newRequest = requestLoadedHierarchy(\n parentItem,\n this._treeDataSource,\n 0,\n 0,\n parent.numChildren === undefined\n ).pipe(\n scheduleSubscription(this._scheduler),\n map((loadedHierarchy) => {\n this.updateModel(loadedHierarchy);\n return {\n loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems),\n };\n }),\n finalize(() => this._activeRequests.delete(parentId))\n );\n this._activeRequests.set(parentId, newRequest);\n return newRequest;\n });\n }\n\n // istanbul ignore next\n protected load(): Observable<LoadedNodeHierarchy> {\n throw new Error(\"Method not implemented.\");\n }\n}\n\n/**\n * Default paged tree node loader with `TreeDataProvider` implementation.\n * @public\n */\nexport class PagedTreeNodeLoader<\n TDataProvider extends TreeDataProvider\n> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> {\n private _treeDataSource: TreeDataSource;\n private _pageSize: number;\n private _activePageRequests: Map<\n string | undefined,\n Map<number, RxjsObservable<TreeNodeLoadResult>>\n >;\n private _scheduler: SubscriptionScheduler<LoadedNodeHierarchy>;\n\n constructor(\n dataProvider: TDataProvider,\n modelSource: TreeModelSource,\n pageSize: number\n ) {\n super(modelSource, dataProvider);\n this._treeDataSource = new TreeDataSource(dataProvider);\n this._pageSize = pageSize;\n this._activePageRequests = new Map();\n this._scheduler = new SubscriptionScheduler();\n }\n\n /** Returns page size used by tree node loader. */\n public get pageSize(): number {\n return this._pageSize;\n }\n\n /**\n * Schedules to load one page of node children and returns an Observable.\n * @note It does not start loading node page until '.subscribe()' is called on returned Observable.\n */\n public override loadNode(\n parent: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<TreeNodeLoadResult> {\n return defer(() => {\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\n const parentId = parentItem?.id;\n const parentPageRequests =\n this._activePageRequests.get(parentId) ??\n new Map<number, RxjsObservable<TreeNodeLoadResult>>();\n const page = Math.trunc(childIndex / this._pageSize);\n const activeRequest = parentPageRequests.get(page);\n if (activeRequest) {\n return activeRequest;\n }\n\n const startIndex = page * this._pageSize;\n const newRequest = requestLoadedHierarchy(\n parentItem,\n this._treeDataSource,\n startIndex,\n this._pageSize,\n parent.numChildren === undefined\n ).pipe(\n scheduleSubscription(this._scheduler),\n map((loadedHierarchy) => {\n this.updateModel(loadedHierarchy);\n return {\n loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems),\n };\n }),\n finalize(() => {\n parentPageRequests.delete(page);\n if (parentPageRequests.size === 0) {\n this._activePageRequests.delete(parentId);\n }\n })\n );\n\n parentPageRequests.set(page, newRequest);\n this._activePageRequests.set(parentId, parentPageRequests);\n return newRequest;\n });\n }\n\n // istanbul ignore next\n protected load(): Observable<LoadedNodeHierarchy> {\n throw new Error(\"Method not implemented.\");\n }\n}\n\n/**\n * Data structure that describes hierarchy loaded for parent node.\n * @public\n */\nexport interface LoadedNodeHierarchy {\n /** Node id of the parent node for loaded hierarchy. */\n parentId: string | undefined;\n /** Hierarchy items offset in parent node children array. */\n offset: number;\n /** Loaded hierarchy items. */\n hierarchyItems: LoadedNodeHierarchyItem[];\n /** Number of children parent node has. */\n numChildren?: number;\n}\n\n/**\n * Data structure that describes one loaded hierarchy item.\n * @public\n */\nexport interface LoadedNodeHierarchyItem {\n /** Loaded tree node item. */\n item: TreeNodeItemData;\n /** Children of loaded tree node item. */\n children?: LoadedNodeHierarchyItem[];\n /** Number of children tree node item has. */\n numChildren?: number;\n}\n\nfunction requestLoadedHierarchy(\n parentItem: TreeNodeItem | undefined,\n dataSource: TreeDataSource,\n start: number,\n take: number,\n requestNumChildren: boolean\n) {\n const parentId = parentItem && parentItem.id;\n return dataSource\n .requestItems(parentItem, start, take, requestNumChildren)\n .pipe(\n concatMap(({ numChildren, loadedItems }) =>\n loadHierarchy(loadedItems, dataSource, take).pipe(\n map((hierarchyItems) => ({\n parentId,\n offset: start,\n hierarchyItems,\n numChildren,\n }))\n )\n )\n );\n}\n\nfunction loadHierarchy(\n rootItems: TreeNodeItemData[],\n dataSource: TreeDataSource,\n take: number\n): RxjsObservable<LoadedNodeHierarchyItem[]> {\n return from(rootItems).pipe(\n concatMap((item) => {\n if (!item.autoExpand || item.children) {\n return of(convertToLoadedNodeHierarchyItem(item));\n }\n\n return dataSource\n .requestItems(item, 0, take, true)\n .pipe(\n concatMap(({ numChildren, loadedItems }) =>\n loadHierarchy(loadedItems, dataSource, take).pipe(\n map((children) => ({ item, children, numChildren }))\n )\n )\n );\n }),\n toArray()\n );\n}\n\nfunction convertToLoadedNodeHierarchyItem(\n item: TreeNodeItemData\n): LoadedNodeHierarchyItem {\n return {\n item,\n children: item.children\n ? item.children.map((child) => convertToLoadedNodeHierarchyItem(child))\n : undefined,\n numChildren: item.children ? item.children.length : undefined,\n };\n}\n\nfunction collectTreeNodeItems(\n hierarchyItems: LoadedNodeHierarchyItem[],\n result: TreeNodeItem[] = []\n) {\n for (const hierarchyItem of hierarchyItems) {\n result.push(hierarchyItem.item);\n if (hierarchyItem.children)\n collectTreeNodeItems(hierarchyItem.children, result);\n }\n\n return result;\n}\n\n/** @internal */\nexport function handleLoadedNodeHierarchy(\n modelSource: TreeModelSource,\n loadedHierarchy: LoadedNodeHierarchy\n) {\n modelSource.modifyModel((model) => {\n if (loadedHierarchy.parentId !== undefined) {\n // Make sure the model sill contains the parent node\n /* istanbul ignore if */\n if (model.getNode(loadedHierarchy.parentId) === undefined) return;\n }\n\n updateChildren(\n model,\n loadedHierarchy.parentId,\n loadedHierarchy.hierarchyItems,\n loadedHierarchy.offset,\n loadedHierarchy.numChildren\n );\n if (loadedHierarchy.parentId !== undefined) {\n const parentNode = model.getNode(loadedHierarchy.parentId);\n /* istanbul ignore else */\n if (\n parentNode &&\n parentNode.isLoading &&\n parentNode.numChildren !== undefined\n ) {\n parentNode.isLoading = false;\n }\n }\n });\n}\n\nfunction updateChildren(\n model: MutableTreeModel,\n parentId: string | undefined,\n hierarchyItems: LoadedNodeHierarchyItem[],\n startIndex: number,\n numChildren?: number\n) {\n // numChildren set to undefined indicates that this is not the first request for children\n if (numChildren !== undefined) {\n model.setNumChildren(parentId, numChildren);\n }\n\n // if children array is undefined do not add children as they should be disposed\n if (model.getChildren(parentId) === undefined) {\n return;\n }\n\n let offset = startIndex;\n for (const hierarchyItem of hierarchyItems) {\n const nodeInput = convertToTreeModelNodeInput(hierarchyItem.item);\n const existingNode = model.getNode(hierarchyItem.item.id);\n\n // if same item exists in the same position and is expanded update it without removing it's subtree\n if (\n !existingNode ||\n !existingNode.isExpanded ||\n model.getChildOffset(parentId, existingNode.id) !== offset ||\n nodeInput.numChildren === 0\n ) {\n model.setChildren(parentId, [nodeInput], offset);\n } else {\n existingNode.label = nodeInput.label;\n existingNode.description = nodeInput.description ?? \"\";\n existingNode.item = nodeInput.item;\n }\n\n if (hierarchyItem.children) {\n updateChildren(\n model,\n hierarchyItem.item.id,\n hierarchyItem.children,\n 0,\n hierarchyItem.numChildren\n );\n }\n offset++;\n }\n}\n\nfunction convertToTreeModelNodeInput(\n item: TreeNodeItemData\n): TreeModelNodeInput {\n let numChildren: number | undefined;\n if (item.children) {\n numChildren = item.children.length;\n } else if (!item.hasChildren) {\n numChildren = 0;\n }\n\n return {\n description: item.description,\n isExpanded: !!item.autoExpand,\n id: item.id,\n item,\n label: item.label,\n isLoading: false,\n numChildren,\n isSelected: false,\n };\n}\n\ninterface TreeDataSourceResult {\n loadedItems: TreeNodeItemData[];\n numChildren?: number;\n}\n\n/**\n * Wrapper to handle different types of `TreeDataProvider`. Provides one method\n * to request items from `TreeDataProviderRaw`, `TreeDataProviderMethod`,\n * `TreeDataProviderPromise` or `TreeDataProviderInterface`.\n *\n * @internal\n */\nexport class TreeDataSource {\n private _dataProvider: TreeDataProvider;\n\n constructor(dataProvider: TreeDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n public requestItems(\n parent: TreeNodeItem | undefined,\n firstItemIndex: number,\n numItems: number,\n requestNumChildren: boolean\n ): RxjsObservable<TreeDataSourceResult> {\n // During each async operation there is a chance that data provider will become stale. Create an opportunity to\n // unsubscribe after each async operation so that we stop interacting with the stale data provider immediately.\n return defer(async () => {\n if (isTreeDataProviderInterface(this._dataProvider)) {\n const dataProvider = this._dataProvider;\n return from(\n requestNumChildren ? dataProvider.getNodesCount(parent) : [undefined]\n ).pipe(\n concatMap(async (numChildren) => {\n const pageOptions =\n numItems !== 0\n ? { size: numItems, start: firstItemIndex }\n : undefined;\n return {\n loadedItems: await dataProvider.getNodes(parent, pageOptions),\n numChildren,\n };\n })\n );\n }\n\n return from(this.getItems(parent)).pipe(\n map((loadedItems) => ({\n loadedItems:\n numItems !== 0\n ? loadedItems.slice(firstItemIndex, firstItemIndex + numItems)\n : loadedItems,\n numChildren: loadedItems.length,\n }))\n );\n }).pipe(\n concatAll(),\n share({\n resetOnError: false,\n resetOnComplete: false,\n resetOnRefCountZero: true,\n })\n );\n }\n\n private async getItems(\n parent: TreeNodeItem | undefined\n ): Promise<TreeNodeItemData[]> {\n if (isTreeDataProviderRaw(this._dataProvider)) {\n return this.getChildren(this._dataProvider, parent);\n }\n\n if (isTreeDataProviderMethod(this._dataProvider)) {\n return this._dataProvider(parent);\n }\n\n if (isTreeDataProviderPromise(this._dataProvider)) {\n this._dataProvider = await this._dataProvider;\n return this.getChildren(this._dataProvider, parent);\n }\n\n throw new UiError(\n UiComponents.loggerCategory(this),\n \"Unsupported TreeDataProvider.\"\n );\n }\n\n private getChildren(\n rawProvider: TreeDataProviderRaw,\n parent: TreeNodeItem | undefined\n ): TreeNodeItemData[] {\n if (parent === undefined) return rawProvider;\n\n return (parent as ImmediatelyLoadedTreeNodeItem).children ?? [];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TreeNodeLoader.js","sourceRoot":"","sources":["../../../../../src/components-react/tree/controlled/TreeNodeLoader.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/** @packageDocumentation\n * @module Tree\n */\n\nimport type { Observable as RxjsObservable } from \"rxjs\";\nimport {\n concatAll,\n concatMap,\n defer,\n finalize,\n from,\n map,\n of,\n share,\n toArray,\n} from \"rxjs\";\nimport { UiError } from \"@itwin/appui-abstract\";\nimport {\n scheduleSubscription,\n SubscriptionScheduler,\n} from \"../../common/SubscriptionScheduler\";\nimport { UiComponents } from \"../../UiComponents\";\nimport type {\n ImmediatelyLoadedTreeNodeItem,\n TreeDataProvider,\n TreeDataProviderRaw,\n TreeNodeItem,\n} from \"../TreeDataProvider\";\nimport {\n isTreeDataProviderInterface,\n isTreeDataProviderMethod,\n isTreeDataProviderPromise,\n isTreeDataProviderRaw,\n} from \"../TreeDataProvider\";\nimport type { Observable } from \"./Observable\";\nimport { toRxjsObservable } from \"./Observable\";\nimport type {\n MutableTreeModel,\n TreeModelNode,\n TreeModelNodeInput,\n TreeModelRootNode,\n TreeNodeItemData,\n} from \"./TreeModel\";\nimport { isTreeModelNode } from \"./TreeModel\";\nimport type { TreeModelSource } from \"./TreeModelSource\";\n\n/**\n * Data structure that describes node load result\n * @public\n */\nexport interface TreeNodeLoadResult {\n loadedNodes: TreeNodeItem[];\n}\n\n/**\n * Tree node loader which is used to load tree nodes.\n * @public\n */\nexport interface ITreeNodeLoader {\n /**\n * Loads node at specified place in tree.\n * @param parentId specifies tree branch\n * @param childIndex specifies offset in the branch.\n */\n loadNode(\n parentId: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<TreeNodeLoadResult>;\n}\n\n/**\n * Tree node loader which uses `TreeDataProvider` to load nodes.\n * @public\n */\nexport interface ITreeNodeLoaderWithProvider<\n TDataProvider extends TreeDataProvider\n> extends ITreeNodeLoader {\n /** Returns `TreeDataProvider` used to load nodes. */\n readonly dataProvider: TDataProvider;\n}\n\n/**\n * Abstract node loader implementation which loads nodes into provided model source.\n * @public\n */\nexport abstract class AbstractTreeNodeLoader implements ITreeNodeLoader {\n private _treeModelSource: TreeModelSource;\n private _loadScheduler = new SubscriptionScheduler<LoadedNodeHierarchy>();\n\n protected constructor(modelSource: TreeModelSource) {\n this._treeModelSource = modelSource;\n }\n\n public get modelSource() {\n return this._treeModelSource;\n }\n\n /** Do not override this method. @see `load` */\n public loadNode(\n parent: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<TreeNodeLoadResult> {\n return toRxjsObservable(this.load(parent, childIndex)).pipe(\n scheduleSubscription(this._loadScheduler),\n map((loadedHierarchy) => {\n this.updateModel(loadedHierarchy);\n return {\n loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems),\n };\n })\n );\n }\n\n /**\n * A method that's called when `load` loads some nodes and we need to put them into model source. The\n * default implementation simply puts loaded child nodes under their parent at correct positions. Concrete\n * implementation may override this method to handle loaded nodes in a a custom way (put them at custom locations\n * in the hierarchy, etc.)\n */\n protected updateModel(loadedHierarchy: LoadedNodeHierarchy): void {\n handleLoadedNodeHierarchy(this._treeModelSource, loadedHierarchy);\n }\n\n /** An abstract method to load a node at the specific index for the specified parent. */\n protected abstract load(\n parent: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<LoadedNodeHierarchy>;\n}\n\n/**\n * Abstract node loader with tree data provider which loads nodes into provided model source.\n * @public\n */\nexport abstract class AbstractTreeNodeLoaderWithProvider<\n TDataProvider extends TreeDataProvider\n >\n extends AbstractTreeNodeLoader\n implements ITreeNodeLoaderWithProvider<TDataProvider>\n{\n private _dataProvider: TDataProvider;\n\n protected constructor(\n modelSource: TreeModelSource,\n dataProvider: TDataProvider\n ) {\n super(modelSource);\n this._dataProvider = dataProvider;\n }\n\n public get dataProvider() {\n return this._dataProvider;\n }\n}\n\n/**\n * Default tree node loader with `TreeDataProvider` implementation.\n * @public\n */\nexport class TreeNodeLoader<\n TDataProvider extends TreeDataProvider\n> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> {\n private _treeDataSource: TreeDataSource;\n private _activeRequests = new Map<\n string | undefined,\n RxjsObservable<TreeNodeLoadResult>\n >();\n private _scheduler = new SubscriptionScheduler<LoadedNodeHierarchy>();\n\n constructor(dataProvider: TDataProvider, modelSource: TreeModelSource) {\n super(modelSource, dataProvider);\n this._treeDataSource = new TreeDataSource(dataProvider);\n }\n\n /**\n * Schedules to load children of node and returns an Observable.\n * @note It does not start loading node until '.subscribe()' is called on returned Observable.\n */\n public override loadNode(\n parent: TreeModelNode | TreeModelRootNode,\n _childIndex?: number\n ): Observable<TreeNodeLoadResult> {\n return defer(() => {\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\n const parentId = parentItem?.id;\n const activeRequest = this._activeRequests.get(parentId);\n if (activeRequest) {\n return activeRequest;\n }\n\n const newRequest = requestLoadedHierarchy(\n parentItem,\n this._treeDataSource,\n 0,\n 0,\n parent.numChildren === undefined\n ).pipe(\n scheduleSubscription(this._scheduler),\n map((loadedHierarchy) => {\n this.updateModel(loadedHierarchy);\n return {\n loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems),\n };\n }),\n finalize(() => this._activeRequests.delete(parentId))\n );\n this._activeRequests.set(parentId, newRequest);\n return newRequest;\n });\n }\n\n // istanbul ignore next\n protected load(): Observable<LoadedNodeHierarchy> {\n throw new Error(\"Method not implemented.\");\n }\n}\n\n/**\n * Default paged tree node loader with `TreeDataProvider` implementation.\n * @public\n */\nexport class PagedTreeNodeLoader<\n TDataProvider extends TreeDataProvider\n> extends AbstractTreeNodeLoaderWithProvider<TDataProvider> {\n private _treeDataSource: TreeDataSource;\n private _pageSize: number;\n private _activePageRequests: Map<\n string | undefined,\n Map<number, RxjsObservable<TreeNodeLoadResult>>\n >;\n private _scheduler: SubscriptionScheduler<LoadedNodeHierarchy>;\n\n constructor(\n dataProvider: TDataProvider,\n modelSource: TreeModelSource,\n pageSize: number\n ) {\n super(modelSource, dataProvider);\n this._treeDataSource = new TreeDataSource(dataProvider);\n this._pageSize = pageSize;\n this._activePageRequests = new Map();\n this._scheduler = new SubscriptionScheduler();\n }\n\n /** Returns page size used by tree node loader. */\n public get pageSize(): number {\n return this._pageSize;\n }\n\n /**\n * Schedules to load one page of node children and returns an Observable.\n * @note It does not start loading node page until '.subscribe()' is called on returned Observable.\n */\n public override loadNode(\n parent: TreeModelNode | TreeModelRootNode,\n childIndex: number\n ): Observable<TreeNodeLoadResult> {\n return defer(() => {\n const parentItem = isTreeModelNode(parent) ? parent.item : undefined;\n const parentId = parentItem?.id;\n const parentPageRequests =\n this._activePageRequests.get(parentId) ??\n new Map<number, RxjsObservable<TreeNodeLoadResult>>();\n const page = Math.trunc(childIndex / this._pageSize);\n const activeRequest = parentPageRequests.get(page);\n if (activeRequest) {\n return activeRequest;\n }\n\n const startIndex = page * this._pageSize;\n const newRequest = requestLoadedHierarchy(\n parentItem,\n this._treeDataSource,\n startIndex,\n this._pageSize,\n parent.numChildren === undefined\n ).pipe(\n scheduleSubscription(this._scheduler),\n map((loadedHierarchy) => {\n this.updateModel(loadedHierarchy);\n return {\n loadedNodes: collectTreeNodeItems(loadedHierarchy.hierarchyItems),\n };\n }),\n finalize(() => {\n parentPageRequests.delete(page);\n if (parentPageRequests.size === 0) {\n this._activePageRequests.delete(parentId);\n }\n })\n );\n\n parentPageRequests.set(page, newRequest);\n this._activePageRequests.set(parentId, parentPageRequests);\n return newRequest;\n });\n }\n\n // istanbul ignore next\n protected load(): Observable<LoadedNodeHierarchy> {\n throw new Error(\"Method not implemented.\");\n }\n}\n\n/**\n * Data structure that describes hierarchy loaded for parent node.\n * @public\n */\nexport interface LoadedNodeHierarchy {\n /** Node id of the parent node for loaded hierarchy. */\n parentId: string | undefined;\n /** Hierarchy items offset in parent node children array. */\n offset: number;\n /** Loaded hierarchy items. */\n hierarchyItems: LoadedNodeHierarchyItem[];\n /** Number of children parent node has. */\n numChildren?: number;\n}\n\n/**\n * Data structure that describes one loaded hierarchy item.\n * @public\n */\nexport interface LoadedNodeHierarchyItem {\n /** Loaded tree node item. */\n item: TreeNodeItemData;\n /** Children of loaded tree node item. */\n children?: LoadedNodeHierarchyItem[];\n /** Number of children tree node item has. */\n numChildren?: number;\n}\n\nfunction requestLoadedHierarchy(\n parentItem: TreeNodeItem | undefined,\n dataSource: TreeDataSource,\n start: number,\n take: number,\n requestNumChildren: boolean\n) {\n const parentId = parentItem && parentItem.id;\n return dataSource\n .requestItems(parentItem, start, take, requestNumChildren)\n .pipe(\n concatMap(({ numChildren, loadedItems }) =>\n loadHierarchy(loadedItems, dataSource, take).pipe(\n map((hierarchyItems) => ({\n parentId,\n offset: start,\n hierarchyItems,\n numChildren,\n }))\n )\n )\n );\n}\n\nfunction loadHierarchy(\n rootItems: TreeNodeItemData[],\n dataSource: TreeDataSource,\n take: number\n): RxjsObservable<LoadedNodeHierarchyItem[]> {\n return from(rootItems).pipe(\n concatMap((item) => {\n if (!item.autoExpand || item.children) {\n return of(convertToLoadedNodeHierarchyItem(item));\n }\n\n return dataSource\n .requestItems(item, 0, take, true)\n .pipe(\n concatMap(({ numChildren, loadedItems }) =>\n loadHierarchy(loadedItems, dataSource, take).pipe(\n map((children) => ({ item, children, numChildren }))\n )\n )\n );\n }),\n toArray()\n );\n}\n\nfunction convertToLoadedNodeHierarchyItem(\n item: TreeNodeItemData\n): LoadedNodeHierarchyItem {\n return {\n item,\n children: item.children\n ? item.children.map((child) => convertToLoadedNodeHierarchyItem(child))\n : undefined,\n numChildren: item.children ? item.children.length : undefined,\n };\n}\n\nfunction collectTreeNodeItems(\n hierarchyItems: LoadedNodeHierarchyItem[],\n result: TreeNodeItem[] = []\n) {\n for (const hierarchyItem of hierarchyItems) {\n result.push(hierarchyItem.item);\n if (hierarchyItem.children)\n collectTreeNodeItems(hierarchyItem.children, result);\n }\n\n return result;\n}\n\n/** @internal */\nexport function handleLoadedNodeHierarchy(\n modelSource: TreeModelSource,\n loadedHierarchy: LoadedNodeHierarchy\n) {\n modelSource.modifyModel((model) => {\n if (loadedHierarchy.parentId !== undefined) {\n // Make sure the model sill contains the parent node\n /* istanbul ignore if */\n if (model.getNode(loadedHierarchy.parentId) === undefined) return;\n }\n\n updateChildren(\n model,\n loadedHierarchy.parentId,\n loadedHierarchy.hierarchyItems,\n loadedHierarchy.offset,\n loadedHierarchy.numChildren\n );\n if (loadedHierarchy.parentId !== undefined) {\n const parentNode = model.getNode(loadedHierarchy.parentId);\n /* istanbul ignore else */\n if (\n parentNode &&\n parentNode.isLoading &&\n parentNode.numChildren !== undefined\n ) {\n parentNode.isLoading = false;\n }\n }\n });\n}\n\nfunction updateChildren(\n model: MutableTreeModel,\n parentId: string | undefined,\n hierarchyItems: LoadedNodeHierarchyItem[],\n startIndex: number,\n numChildren?: number\n) {\n // numChildren set to undefined indicates that this is not the first request for children\n if (numChildren !== undefined) {\n model.setNumChildren(parentId, numChildren);\n }\n\n // if children array is undefined do not add children as they should be disposed\n if (model.getChildren(parentId) === undefined) {\n return;\n }\n\n let offset = startIndex;\n for (const hierarchyItem of hierarchyItems) {\n const nodeInput = convertToTreeModelNodeInput(hierarchyItem.item);\n const existingNode = model.getNode(hierarchyItem.item.id);\n\n // if same item exists in the same position and is expanded update it without removing it's subtree\n if (\n !existingNode ||\n !existingNode.isExpanded ||\n model.getChildOffset(parentId, existingNode.id) !== offset ||\n nodeInput.numChildren === 0\n ) {\n model.setChildren(parentId, [nodeInput], offset);\n } else {\n existingNode.label = nodeInput.label;\n existingNode.description = nodeInput.description ?? \"\";\n existingNode.item = nodeInput.item;\n }\n\n if (hierarchyItem.children) {\n updateChildren(\n model,\n hierarchyItem.item.id,\n hierarchyItem.children,\n 0,\n hierarchyItem.numChildren\n );\n }\n offset++;\n }\n}\n\nfunction convertToTreeModelNodeInput(\n item: TreeNodeItemData\n): TreeModelNodeInput {\n let numChildren: number | undefined;\n if (item.children) {\n numChildren = item.children.length;\n } else if (!item.hasChildren) {\n numChildren = 0;\n }\n\n return {\n description: item.description,\n isExpanded: !!item.autoExpand,\n id: item.id,\n item,\n label: item.label,\n isLoading: false,\n numChildren,\n isSelected: false,\n };\n}\n\ninterface TreeDataSourceResult {\n loadedItems: TreeNodeItemData[];\n numChildren?: number;\n}\n\n/**\n * Wrapper to handle different types of `TreeDataProvider`. Provides one method\n * to request items from `TreeDataProviderRaw`, `TreeDataProviderMethod`,\n * `TreeDataProviderPromise` or `TreeDataProviderInterface`.\n *\n * @internal\n */\nexport class TreeDataSource {\n private _dataProvider: TreeDataProvider;\n\n constructor(dataProvider: TreeDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n public requestItems(\n parent: TreeNodeItem | undefined,\n firstItemIndex: number,\n numItems: number,\n requestNumChildren: boolean\n ): RxjsObservable<TreeDataSourceResult> {\n // During each async operation there is a chance that data provider will become stale. Create an opportunity to\n // unsubscribe after each async operation so that we stop interacting with the stale data provider immediately.\n return defer(async () => {\n if (isTreeDataProviderInterface(this._dataProvider)) {\n const dataProvider = this._dataProvider;\n return from(\n requestNumChildren ? dataProvider.getNodesCount(parent) : [undefined]\n ).pipe(\n concatMap(async (numChildren) => {\n const pageOptions =\n numItems !== 0\n ? { size: numItems, start: firstItemIndex }\n : undefined;\n return {\n loadedItems: await dataProvider.getNodes(parent, pageOptions),\n numChildren,\n };\n })\n );\n }\n\n return from(this.getItems(parent)).pipe(\n map((loadedItems) => ({\n loadedItems:\n numItems !== 0\n ? loadedItems.slice(firstItemIndex, firstItemIndex + numItems)\n : loadedItems,\n numChildren: loadedItems.length,\n }))\n );\n }).pipe(\n concatAll(),\n share({\n resetOnError: false,\n resetOnComplete: false,\n resetOnRefCountZero: true,\n })\n );\n }\n\n private async getItems(\n parent: TreeNodeItem | undefined\n ): Promise<TreeNodeItemData[]> {\n if (isTreeDataProviderRaw(this._dataProvider)) {\n return this.getChildren(this._dataProvider, parent);\n }\n\n if (isTreeDataProviderMethod(this._dataProvider)) {\n return this._dataProvider(parent);\n }\n\n if (isTreeDataProviderPromise(this._dataProvider)) {\n this._dataProvider = await this._dataProvider;\n return this.getChildren(this._dataProvider, parent);\n }\n\n throw new UiError(\n UiComponents.loggerCategory(this),\n \"Unsupported TreeDataProvider.\"\n );\n }\n\n private getChildren(\n rawProvider: TreeDataProviderRaw,\n parent: TreeNodeItem | undefined\n ): TreeNodeItemData[] {\n if (parent === undefined) return rawProvider;\n\n return (parent as ImmediatelyLoadedTreeNodeItem).children ?? [];\n }\n}\n"]}
|
|
@@ -55,7 +55,8 @@ export class SparseTree {
|
|
|
55
55
|
this._idToNode[child.id] = child;
|
|
56
56
|
}
|
|
57
57
|
setNodeId(parentId, index, newId) {
|
|
58
|
-
|
|
58
|
+
var _a;
|
|
59
|
+
const previousNodeId = (_a = this.getChildren(parentId)) === null || _a === void 0 ? void 0 : _a.get(index);
|
|
59
60
|
if (previousNodeId === undefined) {
|
|
60
61
|
return false;
|
|
61
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SparseTree.js","sourceRoot":"","sources":["../../../../../../src/components-react/tree/controlled/internal/SparseTree.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAOzE;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IAOrB;QAJQ,eAAU,GAAG,IAAI,WAAW,EAAU,CAAC;QACvC,sBAAiB,GAAwC,EAAE,CAAC;QAC5D,cAAS,GAAsB,EAAE,CAAC;QAGxC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzB,CAAC;IAEM,OAAO,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAEM,cAAc,CACnB,QAA4B,EAC5B,OAAe;QAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEhC,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAEM,WAAW,CAChB,QAA4B,EAC5B,mBAA4B,KAAK;QAEjC,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,gBAAgB,EAAE;YACtE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,IAAI,WAAW,EAAU,CAAC;SAC9D;QAED,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAEM,WAAW,CAChB,QAA4B,EAC5B,QAAa,EACb,MAAc;QAEd,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAE,CAAC;QAC3D,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YAC7D,IAAI,eAAe,KAAK,SAAS,EAAE;gBACjC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;aACrC;YAED,gBAAgB,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,WAAW,CAAC,QAA4B,EAAE,KAAQ,EAAE,MAAc;QACvE,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAE,CAAC;QAC3D,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IAEM,SAAS,CACd,QAA4B,EAC5B,KAAa,EACb,KAAa;QAEb,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,cAAc,KAAK,SAAS,EAAE;YAChC,OAAO,KAAK,CAAC;SACd;QAED,IAAI,cAAc,KAAK,KAAK,EAAE;YAC5B,OAAO,IAAI,CAAC;SACb;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;YACrC,OAAO,KAAK,CAAC;SACd;QAED,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAEtC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAE9C,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACnC;aAAM;YACL,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACpD;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,QAAQ,CACb,cAAkC,EAClC,YAAoB,EACpB,cAAkC,EAClC,WAAmB;QAEnB,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;QAElC,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,cAAc,KAAK,cAAc,IAAI,WAAW,GAAG,WAAW,EAAE;YAClE,WAAW,IAAI,CAAC,CAAC;SAClB;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC;QACzC,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvD,CAAC;IAEM,cAAc,CAAC,QAA4B,EAAE,WAAmB;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAE,CAAC;QACnD,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE;YAChD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;SAC7B;QAED,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAEM,WAAW,CAChB,QAA4B,EAC5B,KAAsB;QAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QAEnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,UAAU,KAAK,SAAS,EAAE;gBAC5B,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;aAC7B;YAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC3B;aAAM;YACL,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,OAAO,KAAK,SAAS,EAAE;gBACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;aAC7B;SACF;IACH,CAAC;IAEM,aAAa,CAClB,QAA4B,EAC5B,eAAwB,IAAI;QAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE;gBAChD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;aAC7B;SACF;QAED,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO;SACR;QACD,IAAI,YAAY,EAAE;YAChB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;SACjC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IAMtB;QAHQ,YAAO,GAAG,CAAC,CAAC;QACZ,WAAM,GAAuB,EAAE,CAAC;QAGtC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,wEAAwE;IACjE,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,4BAA4B;IACrB,SAAS,CAAC,MAAc;QAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,WAAc;QAC5B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YACxC,IAAI,KAAK,KAAK,WAAW;gBAAE,OAAO,KAAK,CAAC;SACzC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,GAAG,CAAC,KAAa;QACtB,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IAED,qEAAqE;IAC9D,GAAG,CAAC,KAAa,EAAE,KAAQ;QAChC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,yEAAyE;IAClE,MAAM,CAAC,KAAa,EAAE,KAAQ;QACnC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrB;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,wEAAwE;IACjE,MAAM,CAAC,KAAa;QACzB,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;YACzB,OAAO;SACR;QAED,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrB;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACI,aAAa;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,kEAAkE;IAC3D,CAAC,MAAM,CAAC,QAAQ,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC;YACf,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE;gBAClC,OAAO,YAAY,GAAG,KAAK,EAAE,EAAE,YAAY,EAAE;oBAC3C,MAAM,SAAS,CAAC;iBACjB;gBAED,MAAM,KAAK,CAAC;gBACZ,EAAE,YAAY,CAAC;aAChB;YAED,OAAO,YAAY,GAAG,MAAM,EAAE,EAAE,YAAY,EAAE;gBAC5C,MAAM,SAAS,CAAC;aACjB;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAEO,UAAU,CAAC,KAAa;QAI9B,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAEO,MAAM,CAAC,OAAO,CAAI,KAAa,EAAE,KAAkB;QACzD,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;CACF","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/** @packageDocumentation\n * @module Tree\n */\n\nimport { immerable } from \"immer\";\nimport { assert, compareNumbers, lowerBound } from \"@itwin/core-bentley\";\n\n/** @internal */\nexport interface Node {\n readonly id: string;\n}\n\n/**\n * Structure for sparse tree storage.\n * It uses SparseArray to store children ids for parent. This allows\n * having tree structure with some nodes missing in the tree branch.\n * @internal\n */\nexport class SparseTree<T extends Node> {\n public [immerable]: boolean;\n\n private _rootNodes = new SparseArray<string>();\n private _parentToChildren: Record<string, SparseArray<string>> = {};\n private _idToNode: Record<string, T> = {};\n\n constructor() {\n this[immerable] = true;\n }\n\n public getNode(nodeId: string): T | undefined {\n return this._idToNode[nodeId];\n }\n\n public getChildOffset(\n parentId: string | undefined,\n childId: string\n ): number | undefined {\n const children = this.getChildren(parentId);\n if (!children) return undefined;\n\n return children.getIndex(childId);\n }\n\n public getChildren(\n parentId: string | undefined,\n createIfNotExist: boolean = false\n ): SparseArray<string> | undefined {\n if (parentId === undefined) {\n return this._rootNodes;\n }\n\n if (this._parentToChildren[parentId] === undefined && createIfNotExist) {\n this._parentToChildren[parentId] = new SparseArray<string>();\n }\n\n return this._parentToChildren[parentId];\n }\n\n public setChildren(\n parentId: string | undefined,\n children: T[],\n offset: number\n ) {\n const existingChildren = this.getChildren(parentId, true)!;\n children.forEach((child, index) => {\n const existingChildId = existingChildren.get(offset + index);\n if (existingChildId !== undefined) {\n this.deleteSubtree(existingChildId);\n }\n\n existingChildren.set(offset + index, child.id);\n this._idToNode[child.id] = child;\n });\n }\n\n public insertChild(parentId: string | undefined, child: T, offset: number) {\n const existingChildren = this.getChildren(parentId, true)!;\n existingChildren.insert(offset, child.id);\n this._idToNode[child.id] = child;\n }\n\n public setNodeId(\n parentId: string | undefined,\n index: number,\n newId: string\n ): boolean {\n const previousNodeId = this.getChildren(parentId)?.get(index);\n if (previousNodeId === undefined) {\n return false;\n }\n\n if (previousNodeId === newId) {\n return true;\n }\n\n if (this.getNode(newId) !== undefined) {\n return false;\n }\n\n this._idToNode[newId] = this._idToNode[previousNodeId];\n delete this._idToNode[previousNodeId];\n\n this._parentToChildren[newId] = this._parentToChildren[previousNodeId];\n delete this._parentToChildren[previousNodeId];\n\n if (parentId === undefined) {\n this._rootNodes.set(index, newId);\n } else {\n this._parentToChildren[parentId].set(index, newId);\n }\n\n return true;\n }\n\n public moveNode(\n sourceParentId: string | undefined,\n sourceNodeId: string,\n targetParentId: string | undefined,\n targetIndex: number\n ): void {\n const sourceNodeSiblings = this.getChildren(sourceParentId);\n assert(sourceNodeSiblings !== undefined);\n\n const sourceIndex = this.getChildOffset(sourceParentId, sourceNodeId);\n assert(sourceIndex !== undefined);\n\n sourceNodeSiblings.remove(sourceIndex);\n if (targetParentId === sourceParentId && targetIndex > sourceIndex) {\n targetIndex -= 1;\n }\n\n const targetNodeSiblings = this.getChildren(targetParentId, true);\n assert(targetNodeSiblings !== undefined);\n targetNodeSiblings.insert(targetIndex, sourceNodeId);\n }\n\n public setNumChildren(parentId: string | undefined, numChildren: number) {\n const children = this.getChildren(parentId, true)!;\n for (const [childId] of children.iterateValues()) {\n this.deleteSubtree(childId);\n }\n\n children.setLength(numChildren);\n }\n\n public removeChild(\n parentId: string | undefined,\n child: string | number\n ): void {\n const children = this.getChildren(parentId);\n if (children === undefined) return;\n\n if (typeof child === \"string\") {\n const childIndex = children.getIndex(child);\n if (childIndex !== undefined) {\n children.remove(childIndex);\n }\n\n this.deleteSubtree(child);\n } else {\n const childId = children.get(child);\n children.remove(child);\n if (childId !== undefined) {\n this.deleteSubtree(childId);\n }\n }\n }\n\n public deleteSubtree(\n parentId: string | undefined,\n deleteParent: boolean = true\n ) {\n const children = this.getChildren(parentId);\n if (children !== undefined) {\n for (const [childId] of children.iterateValues()) {\n this.deleteSubtree(childId);\n }\n }\n\n if (parentId === undefined) {\n this._rootNodes.setLength(0);\n return;\n }\n if (deleteParent) {\n delete this._idToNode[parentId];\n }\n delete this._parentToChildren[parentId];\n }\n}\n\n/**\n * Structure for sparse array value storage.\n * The main advantage of this class over the standard javascript array is that\n * this class does not need to check each index when iterating values that are\n * stored in the array.\n * @public\n */\nexport class SparseArray<T> implements Iterable<T | undefined> {\n public [immerable]: boolean;\n\n private _length = 0;\n private _array: Array<[T, number]> = [];\n\n constructor() {\n this[immerable] = true;\n }\n\n /** Returns length of array including intermediate 'undefined' values */\n public getLength(): number {\n return this._length;\n }\n\n /** Sets length of array. */\n public setLength(length: number) {\n const { index } = this.lowerBound(length);\n this._array.length = index;\n this._length = length;\n }\n\n /** Returns index of supplied value.\n *\n * @returns index of value or undefined if value is not found.\n */\n public getIndex(lookupValue: T): number | undefined {\n for (const [value, index] of this._array) {\n if (value === lookupValue) return index;\n }\n return undefined;\n }\n\n /** Returns value at specific position.\n *\n * @returns stored value or undefined.\n */\n public get(index: number): T | undefined {\n const { index: i, equal } = this.lowerBound(index);\n return equal ? this._array[i][0] : undefined;\n }\n\n /** Sets value at specific position. Overrides any existing value. */\n public set(index: number, value: T) {\n const { index: i, equal } = this.lowerBound(index);\n this._array.splice(i, equal ? 1 : 0, [value, index]);\n this._length = Math.max(this._length, index + 1);\n }\n\n /** Inserts value at specific position. Increases array length by one. */\n public insert(index: number, value: T) {\n const { index: i } = this.lowerBound(index);\n this._array.splice(i, 0, [value, index]);\n\n for (let j = i + 1; j < this._array.length; j++) {\n this._array[j][1]++;\n }\n\n this._length = Math.max(this._length + 1, index + 1);\n }\n\n /** Removes value at specified index and reduces array length by one. */\n public remove(index: number): void {\n if (index >= this._length) {\n return;\n }\n\n const { index: i, equal } = this.lowerBound(index);\n this._array.splice(i, equal ? 1 : 0);\n\n for (let j = i; j < this._array.length; j++) {\n this._array[j][1]--;\n }\n\n this._length = Math.max(0, this._length - 1);\n }\n\n /**\n * Iterates values that are stored in the array\n * @returns `[value, index]` tuples.\n */\n public iterateValues(): IterableIterator<[T, number]> {\n return this._array[Symbol.iterator]();\n }\n\n /** Iterates the array with all intermediate `undefined` values */\n public [Symbol.iterator](): IterableIterator<T | undefined> {\n const array = this._array;\n const length = this._length;\n return (function* () {\n let currentIndex = 0;\n for (const [value, index] of array) {\n for (; currentIndex < index; ++currentIndex) {\n yield undefined;\n }\n\n yield value;\n ++currentIndex;\n }\n\n for (; currentIndex < length; ++currentIndex) {\n yield undefined;\n }\n })();\n }\n\n private lowerBound(index: number): {\n index: number;\n equal: boolean;\n } {\n return lowerBound(index, this._array, SparseArray.compare);\n }\n\n private static compare<T>(index: number, value: [T, number]): number {\n return compareNumbers(index, value[1]);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SparseTree.js","sourceRoot":"","sources":["../../../../../../src/components-react/tree/controlled/internal/SparseTree.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/** @packageDocumentation\n * @module Tree\n */\n\nimport { immerable } from \"immer\";\nimport { assert, compareNumbers, lowerBound } from \"@itwin/core-bentley\";\n\n/** @internal */\nexport interface Node {\n readonly id: string;\n}\n\n/**\n * Structure for sparse tree storage.\n * It uses SparseArray to store children ids for parent. This allows\n * having tree structure with some nodes missing in the tree branch.\n * @internal\n */\nexport class SparseTree<T extends Node> {\n public [immerable]: boolean;\n\n private _rootNodes = new SparseArray<string>();\n private _parentToChildren: Record<string, SparseArray<string>> = {};\n private _idToNode: Record<string, T> = {};\n\n constructor() {\n this[immerable] = true;\n }\n\n public getNode(nodeId: string): T | undefined {\n return this._idToNode[nodeId];\n }\n\n public getChildOffset(\n parentId: string | undefined,\n childId: string\n ): number | undefined {\n const children = this.getChildren(parentId);\n if (!children) return undefined;\n\n return children.getIndex(childId);\n }\n\n public getChildren(\n parentId: string | undefined,\n createIfNotExist: boolean = false\n ): SparseArray<string> | undefined {\n if (parentId === undefined) {\n return this._rootNodes;\n }\n\n if (this._parentToChildren[parentId] === undefined && createIfNotExist) {\n this._parentToChildren[parentId] = new SparseArray<string>();\n }\n\n return this._parentToChildren[parentId];\n }\n\n public setChildren(\n parentId: string | undefined,\n children: T[],\n offset: number\n ) {\n const existingChildren = this.getChildren(parentId, true)!;\n children.forEach((child, index) => {\n const existingChildId = existingChildren.get(offset + index);\n if (existingChildId !== undefined) {\n this.deleteSubtree(existingChildId);\n }\n\n existingChildren.set(offset + index, child.id);\n this._idToNode[child.id] = child;\n });\n }\n\n public insertChild(parentId: string | undefined, child: T, offset: number) {\n const existingChildren = this.getChildren(parentId, true)!;\n existingChildren.insert(offset, child.id);\n this._idToNode[child.id] = child;\n }\n\n public setNodeId(\n parentId: string | undefined,\n index: number,\n newId: string\n ): boolean {\n const previousNodeId = this.getChildren(parentId)?.get(index);\n if (previousNodeId === undefined) {\n return false;\n }\n\n if (previousNodeId === newId) {\n return true;\n }\n\n if (this.getNode(newId) !== undefined) {\n return false;\n }\n\n this._idToNode[newId] = this._idToNode[previousNodeId];\n delete this._idToNode[previousNodeId];\n\n this._parentToChildren[newId] = this._parentToChildren[previousNodeId];\n delete this._parentToChildren[previousNodeId];\n\n if (parentId === undefined) {\n this._rootNodes.set(index, newId);\n } else {\n this._parentToChildren[parentId].set(index, newId);\n }\n\n return true;\n }\n\n public moveNode(\n sourceParentId: string | undefined,\n sourceNodeId: string,\n targetParentId: string | undefined,\n targetIndex: number\n ): void {\n const sourceNodeSiblings = this.getChildren(sourceParentId);\n assert(sourceNodeSiblings !== undefined);\n\n const sourceIndex = this.getChildOffset(sourceParentId, sourceNodeId);\n assert(sourceIndex !== undefined);\n\n sourceNodeSiblings.remove(sourceIndex);\n if (targetParentId === sourceParentId && targetIndex > sourceIndex) {\n targetIndex -= 1;\n }\n\n const targetNodeSiblings = this.getChildren(targetParentId, true);\n assert(targetNodeSiblings !== undefined);\n targetNodeSiblings.insert(targetIndex, sourceNodeId);\n }\n\n public setNumChildren(parentId: string | undefined, numChildren: number) {\n const children = this.getChildren(parentId, true)!;\n for (const [childId] of children.iterateValues()) {\n this.deleteSubtree(childId);\n }\n\n children.setLength(numChildren);\n }\n\n public removeChild(\n parentId: string | undefined,\n child: string | number\n ): void {\n const children = this.getChildren(parentId);\n if (children === undefined) return;\n\n if (typeof child === \"string\") {\n const childIndex = children.getIndex(child);\n if (childIndex !== undefined) {\n children.remove(childIndex);\n }\n\n this.deleteSubtree(child);\n } else {\n const childId = children.get(child);\n children.remove(child);\n if (childId !== undefined) {\n this.deleteSubtree(childId);\n }\n }\n }\n\n public deleteSubtree(\n parentId: string | undefined,\n deleteParent: boolean = true\n ) {\n const children = this.getChildren(parentId);\n if (children !== undefined) {\n for (const [childId] of children.iterateValues()) {\n this.deleteSubtree(childId);\n }\n }\n\n if (parentId === undefined) {\n this._rootNodes.setLength(0);\n return;\n }\n if (deleteParent) {\n delete this._idToNode[parentId];\n }\n delete this._parentToChildren[parentId];\n }\n}\n\n/**\n * Structure for sparse array value storage.\n * The main advantage of this class over the standard javascript array is that\n * this class does not need to check each index when iterating values that are\n * stored in the array.\n * @public\n */\nexport class SparseArray<T> implements Iterable<T | undefined> {\n public [immerable]: boolean;\n\n private _length = 0;\n private _array: Array<[T, number]> = [];\n\n constructor() {\n this[immerable] = true;\n }\n\n /** Returns length of array including intermediate 'undefined' values */\n public getLength(): number {\n return this._length;\n }\n\n /** Sets length of array. */\n public setLength(length: number) {\n const { index } = this.lowerBound(length);\n this._array.length = index;\n this._length = length;\n }\n\n /** Returns index of supplied value.\n *\n * @returns index of value or undefined if value is not found.\n */\n public getIndex(lookupValue: T): number | undefined {\n for (const [value, index] of this._array) {\n if (value === lookupValue) return index;\n }\n return undefined;\n }\n\n /** Returns value at specific position.\n *\n * @returns stored value or undefined.\n */\n public get(index: number): T | undefined {\n const { index: i, equal } = this.lowerBound(index);\n return equal ? this._array[i][0] : undefined;\n }\n\n /** Sets value at specific position. Overrides any existing value. */\n public set(index: number, value: T) {\n const { index: i, equal } = this.lowerBound(index);\n this._array.splice(i, equal ? 1 : 0, [value, index]);\n this._length = Math.max(this._length, index + 1);\n }\n\n /** Inserts value at specific position. Increases array length by one. */\n public insert(index: number, value: T) {\n const { index: i } = this.lowerBound(index);\n this._array.splice(i, 0, [value, index]);\n\n for (let j = i + 1; j < this._array.length; j++) {\n this._array[j][1]++;\n }\n\n this._length = Math.max(this._length + 1, index + 1);\n }\n\n /** Removes value at specified index and reduces array length by one. */\n public remove(index: number): void {\n if (index >= this._length) {\n return;\n }\n\n const { index: i, equal } = this.lowerBound(index);\n this._array.splice(i, equal ? 1 : 0);\n\n for (let j = i; j < this._array.length; j++) {\n this._array[j][1]--;\n }\n\n this._length = Math.max(0, this._length - 1);\n }\n\n /**\n * Iterates values that are stored in the array\n * @returns `[value, index]` tuples.\n */\n public iterateValues(): IterableIterator<[T, number]> {\n return this._array[Symbol.iterator]();\n }\n\n /** Iterates the array with all intermediate `undefined` values */\n public [Symbol.iterator](): IterableIterator<T | undefined> {\n const array = this._array;\n const length = this._length;\n return (function* () {\n let currentIndex = 0;\n for (const [value, index] of array) {\n for (; currentIndex < index; ++currentIndex) {\n yield undefined;\n }\n\n yield value;\n ++currentIndex;\n }\n\n for (; currentIndex < length; ++currentIndex) {\n yield undefined;\n }\n })();\n }\n\n private lowerBound(index: number): {\n index: number;\n equal: boolean;\n } {\n return lowerBound(index, this._array, SparseArray.compare);\n }\n\n private static compare<T>(index: number, value: [T, number]): number {\n return compareNumbers(index, value[1]);\n }\n}\n"]}
|
|
@@ -210,11 +210,13 @@ class ItemHandler {
|
|
|
210
210
|
deselect() { }
|
|
211
211
|
// eslint-disable-next-line @itwin/prefer-get
|
|
212
212
|
isSelected() {
|
|
213
|
+
var _a;
|
|
213
214
|
// istanbul ignore next
|
|
214
|
-
return !!this._node
|
|
215
|
+
return !!((_a = this._node) === null || _a === void 0 ? void 0 : _a.isSelected);
|
|
215
216
|
}
|
|
216
217
|
item() {
|
|
217
|
-
|
|
218
|
+
var _a, _b;
|
|
219
|
+
return (_b = (_a = this._node) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : "";
|
|
218
220
|
}
|
|
219
221
|
}
|
|
220
222
|
//# sourceMappingURL=TreeSelectionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeSelectionManager.js","sourceRoot":"","sources":["../../../../../../src/components-react/tree/controlled/internal/TreeSelectionManager.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAI9E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AA2B3B,gBAAgB;AAChB,MAAM,UAAU,gBAAgB,CAAC,SAAc;IAC7C,OAAO,CACL,SAAS;QACT,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAClC,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,CACjC,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,OAAO,oBAAoB;IAc/B,YACE,aAA4B,EAC5B,eAAuC;QANlC,uBAAkB,GAAG,IAAI,SAAS,EAA8B,CAAC;QACjE,wBAAmB,GAAG,IAAI,SAAS,EAA6B,CAAC;QACjE,oBAAe,GAAG,IAAI,SAAS,EAA2B,CAAC;QAuK1D,qBAAgB,GAAG,CACzB,CAAsB,EACtB,OAAoB,EACpB,SAAkB,EAClB,EAAE;YACF,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;YAC7D,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE;gBACtE,OAAO;aACR;YAED,MAAM,YAAY,GAAG,CAAC,IAAmB,EAAW,EAAE,CACpD,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,CAAC,IAAmB,EAAW,EAAE,CACjD,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;YAEjC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;iBAC1C,QAAQ,EAAE;iBACV,OAAO,CAAC,eAAe,CAAC,CAAC;YAE5B,qBAAqB;YACrB,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC;gBAAE,OAAO;YAEvD,MAAM,wBAAwB,GAAG,CAAC,KAAa,EAAE,EAAE;gBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,CAAC,CAAC;gBACxE,qBAAqB;gBACrB,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC;oBAAE,OAAO;gBAErC,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAClE,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CACzC,CAAC;gBACF,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC,CAAC;YACF,MAAM,0BAA0B,GAAG,CAAC,MAAc,EAAE,EAAE;gBACpD,IAAI,YAAY,CAAC,aAAa,CAAC,EAAE;oBAC/B,IAAI,CAAC,aAAa,CAAC,UAAU;wBAAE,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;;wBACnE,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;iBAChD;qBAAM;oBACL,OAAO,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;iBACjD;YACH,CAAC,CAAC;YACF,MAAM,uBAAuB,GAAG,CAAC,OAAgB,EAAE,EAAE;gBACnD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;oBAAE,OAAO;gBAEzC,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU;oBACtC,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;qBACtC,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,UAAU;oBAC3C,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC,CAAC;YAEF,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,CACrD,wBAAwB,EACxB,0BAA0B,CAC3B,CAAC;YACF,qBAAqB,CAAC,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC;YACzD,qBAAqB,CAAC,wBAAwB,GAAG,uBAAuB,CAAC;YACzE,qBAAqB,CAAC,SAAS,GAAG,KAAK,CAAC;YACxC,qBAAqB,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,EAAE,CAAC;YAExE,MAAM,kBAAkB,GACtB,IAAI,CAAC,gBAAgB,EAAE,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YAC1D,SAAS;gBACP,CAAC,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,CAAC;gBACjE,CAAC,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACpE,CAAC,CAAC;QAhOA,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QAExC,MAAM,eAAe,GAAG,CAAC,UAAuB,EAAE,WAAoB,EAAE,EAAE;YACxE,+DAA+D;YAC/D,iEAAiE;YACjE,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;gBACxC,IAAI,WAAW,EAAE;oBACf,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;wBAC5B,eAAe,EAAE,UAAiC;qBACnD,CAAC,CAAC;iBACJ;qBAAM;oBACL,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;wBAC3B,aAAa,EAAE,UAAiC;wBAChD,eAAe,EAAE,EAAE;qBACpB,CAAC,CAAC;iBACJ;aACF;iBAAM;gBACL,IAAI,WAAW,EAAE;oBACf,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;wBAC5B,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;qBAC/B,CAAC,CAAC;iBACJ;qBAAM;oBACL,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;wBAC3B,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;wBAC5B,eAAe,EAAE,EAAE;qBACpB,CAAC,CAAC;iBACJ;aACF;QACH,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CAAC,YAAyB,EAAE,EAAE;YACtD,2EAA2E;YAC3E,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBAC3B,aAAa,EAAE,EAAE;gBACjB,eAAe,EAAE,YAAmC;aACrD,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAC3C,aAAa,EACb,eAAe,EACf,iBAAiB,CAClB,CAAC;QAEF,4DAA4D;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,KAAK,CAC5B,EAAE,EACF;YACE,GAAG,CAAC,OAAO,EAAE,IAAI;gBACf,IAAI,IAAI,KAAK,QAAQ,EAAE;oBACrB,OAAO,KAAK,CAAC,gBAAgB,EAAE,CAAC,WAAW,EAAE,CAAC;iBAC/C;gBAED,MAAM,KAAK,GAAW,CAAE,IAAe,CAAC;gBACxC,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CACtC,KAAK,CAAC,gBAAgB,EAAE,EACxB,KAAK,CACN,CAAC;gBACF,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;SACF,CACuC,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAEO,qBAAqB,CAC3B,KAAmC,EACnC,KAAa;QAEb,MAAM,SAAS,GACb,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,0BAA0B,CAAC,SAAS,CAAC;QAC3C,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,CAAC;IAEM,aAAa,CAAC,MAAc,EAAE,KAAuB;QAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAClE,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CACxC,CAAC;QACF,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,eAAe,CAAC,MAAc;QACnC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CACrC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EACvC,IAAI,CAAC,aAAa,EAClB,MAAM,CACP,CAAC;QACF,MAAM,CAAC,gBAAgB,CACrB,SAAS,EACT,GAAG,EAAE;YACH,0BAA0B;YAC1B,IAAI,IAAI,CAAC,uBAAuB,EAAE;gBAChC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC;gBAC5C,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC;gBACxC,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;aAC1C;QACH,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;QACF,IAAI,CAAC,uBAAuB,GAAG,IAAI,OAAO,EAAE,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YACxB,gBAAgB,EAAE,IAAI,CAAC,uBAAuB;SAC/C,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CAAC,MAAc;QACnC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEO,uBAAuB,CAC7B,MAAc;QAEd,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,MAAM,qBAAqB,GAAqC;YAC9D,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/B,EAAE,IAAI,EAAE,KAAe,EAAE,EAAE,EAAE,KAAe,EAAE;aAC/C;YACD,eAAe,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE;gBAC5C,uEAAuE;gBACvE,MAAM,eAAe,GAAG,UAAsB,CAAC;gBAC/C,MAAM,iBAAiB,GAAG,YAAwB,CAAC;gBACnD,IAAI,CAAC,uBAAwB,CAAC,IAAI,CAAC;oBACjC,aAAa,EAAE,eAAe;oBAC9B,eAAe,EAAE,iBAAiB;iBACnC,CAAC,CAAC;YACL,CAAC;YACD,WAAW,EAAE,GAAG,EAAE;gBAChB,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK;SAC5C,CAAC;QAEF,MAAM,sBAAsB,GAAmC;YAC7D,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;YACnB,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;YAChB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;YAClB,UAAU,EAAE,GAAG,EAAE;gBACf,IAAI,aAAa,EAAE;oBACjB,OAAO,KAAK,CAAC;iBACd;gBAED,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAChE,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC;YAC/C,CAAC;YACD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM;SACnB,CAAC;QAEF,OAAO,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CAAC;IACzD,CAAC;IAEM,aAAa,CAAC,KAA0B,EAAE,OAAoB;QACnE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEM,WAAW,CAAC,KAA0B,EAAE,OAAoB;QACjE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;CAkEF;AAID,SAAS,qBAAqB,CAC5B,SAAgC;IAEhC,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC;AACvC,CAAC;AAED,MAAM,WAAW;IAGf,YAAY,IAA+B;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,gCAAgC;IACzB,SAAS,KAAI,CAAC;IAErB,gCAAgC;IACzB,MAAM,KAAI,CAAC;IAElB,gCAAgC;IACzB,QAAQ,KAAI,CAAC;IAEpB,6CAA6C;IACtC,UAAU;QACf,uBAAuB;QACvB,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC;IAClC,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;CACF","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/** @packageDocumentation\n * @module Tree\n */\n\nimport type { Observable } from \"rxjs\";\nimport { Subject } from \"rxjs\";\nimport { BeUiEvent } from \"@itwin/core-bentley\";\nimport type {\n MultiSelectionHandler,\n SingleSelectionHandler,\n} from \"../../../common/selection/SelectionHandler\";\nimport { SelectionHandler } from \"../../../common/selection/SelectionHandler\";\nimport type { SelectionMode } from \"../../../common/selection/SelectionModes\";\nimport type { TreeActions } from \"../TreeActions\";\nimport type { TreeModelNode, VisibleTreeNodes } from \"../TreeModel\";\nimport { isTreeModelNode } from \"../TreeModel\";\nimport {\n isNavigationKey,\n ItemKeyboardNavigator,\n Orientation,\n} from \"@itwin/core-react\";\n\n/** @internal */\nexport interface SelectionReplacementEvent {\n selectedNodeIds: IndividualSelection | RangeSelection;\n}\n\n/** @internal */\nexport interface SelectionModificationEvent {\n selectedNodes: IndividualSelection | RangeSelection;\n deselectedNodes: IndividualSelection;\n}\n\n/** @internal */\nexport interface DragSelectionStartEvent {\n selectionChanges: Observable<SelectionModificationEvent>;\n}\n\n/** @internal */\nexport type IndividualSelection = string[];\n\n/** @internal */\nexport interface RangeSelection {\n from: string;\n to: string;\n}\n\n/** @internal */\nexport function isRangeSelection(selection: any): selection is RangeSelection {\n return (\n selection &&\n typeof selection.from === \"string\" &&\n typeof selection.to === \"string\"\n );\n}\n\n/** @internal */\nexport class TreeSelectionManager\n implements\n Pick<TreeActions, \"onNodeClicked\" | \"onNodeMouseDown\" | \"onNodeMouseMove\">\n{\n private _selectionHandler: SelectionHandler<Selection>;\n private _dragSelectionOperation?: Subject<SelectionModificationEvent>;\n private _itemHandlers: Array<Array<SingleSelectionHandler<string>>>;\n\n private _getVisibleNodes: () => VisibleTreeNodes;\n\n public onSelectionChanged = new BeUiEvent<SelectionModificationEvent>();\n public onSelectionReplaced = new BeUiEvent<SelectionReplacementEvent>();\n public onDragSelection = new BeUiEvent<DragSelectionStartEvent>();\n\n constructor(\n selectionMode: SelectionMode,\n getVisibleNodes: () => VisibleTreeNodes\n ) {\n this._getVisibleNodes = getVisibleNodes;\n\n const onItemsSelected = (selections: Selection[], replacement: boolean) => {\n // Assumes that `selections` will only contain either a list of\n // `IndividualSelection` items or a single `RangeSelection` item.\n if (isIndividualSelection(selections[0])) {\n if (replacement) {\n this.onSelectionReplaced.emit({\n selectedNodeIds: selections as IndividualSelection,\n });\n } else {\n this.onSelectionChanged.emit({\n selectedNodes: selections as IndividualSelection,\n deselectedNodes: [],\n });\n }\n } else {\n if (replacement) {\n this.onSelectionReplaced.emit({\n selectedNodeIds: selections[0],\n });\n } else {\n this.onSelectionChanged.emit({\n selectedNodes: selections[0],\n deselectedNodes: [],\n });\n }\n }\n };\n\n const onItemsDeselected = (deselections: Selection[]) => {\n // Assumes that this will be always called with `IndividualSelection` items\n this.onSelectionChanged.emit({\n selectedNodes: [],\n deselectedNodes: deselections as IndividualSelection,\n });\n };\n\n this._selectionHandler = new SelectionHandler(\n selectionMode,\n onItemsSelected,\n onItemsDeselected\n );\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n const itemHandlers = new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"length\") {\n return _this._getVisibleNodes().getNumNodes();\n }\n\n const index: number = +(prop as string);\n const node = _this.getVisibleNodeAtIndex(\n _this._getVisibleNodes(),\n index\n );\n return new ItemHandler(node);\n },\n }\n ) as Array<SingleSelectionHandler<string>>;\n this._itemHandlers = [itemHandlers];\n }\n\n private getVisibleNodeAtIndex(\n nodes: VisibleTreeNodes | undefined,\n index: number\n ): TreeModelNode | undefined {\n const foundNode =\n nodes !== undefined\n ? nodes.getAtIndex(index)\n : /* istanbul ignore next */ undefined;\n return isTreeModelNode(foundNode) ? foundNode : undefined;\n }\n\n public onNodeClicked(nodeId: string, event: React.MouseEvent) {\n const selectionFunc = this._selectionHandler.createSelectionFunction(\n ...this.createSelectionHandlers(nodeId)\n );\n selectionFunc(event.shiftKey, event.ctrlKey);\n }\n\n public onNodeMouseDown(nodeId: string) {\n this._selectionHandler.createDragAction(\n this.createSelectionHandlers(nodeId)[0],\n this._itemHandlers,\n nodeId\n );\n window.addEventListener(\n \"mouseup\",\n () => {\n /* istanbul ignore else */\n if (this._dragSelectionOperation) {\n this._selectionHandler.completeDragAction();\n this._dragSelectionOperation.complete();\n this._dragSelectionOperation = undefined;\n }\n },\n { once: true }\n );\n this._dragSelectionOperation = new Subject();\n this.onDragSelection.emit({\n selectionChanges: this._dragSelectionOperation,\n });\n }\n\n public onNodeMouseMove(nodeId: string) {\n this._selectionHandler.updateDragAction(nodeId);\n }\n\n private createSelectionHandlers(\n nodeId: string\n ): [MultiSelectionHandler<Selection>, SingleSelectionHandler<string>] {\n let deselectedAll = false;\n const multiSelectionHandler: MultiSelectionHandler<Selection> = {\n selectBetween: (item1, item2) => [\n { from: item1 as string, to: item2 as string },\n ],\n updateSelection: (selections, deselections) => {\n // Assumes `updateSelection` will never be called with selection ranges\n const selectedNodeIds = selections as string[];\n const deselectedNodeIds = deselections as string[];\n this._dragSelectionOperation!.next({\n selectedNodes: selectedNodeIds,\n deselectedNodes: deselectedNodeIds,\n });\n },\n deselectAll: () => {\n deselectedAll = true;\n },\n areEqual: (item1, item2) => item1 === item2,\n };\n\n const singleSelectionHandler: SingleSelectionHandler<string> = {\n preselect: () => {},\n select: () => {},\n deselect: () => {},\n isSelected: () => {\n if (deselectedAll) {\n return false;\n }\n\n const node = this._getVisibleNodes().getModel().getNode(nodeId);\n return node !== undefined && node.isSelected;\n },\n item: () => nodeId,\n };\n\n return [multiSelectionHandler, singleSelectionHandler];\n }\n\n public onTreeKeyDown(event: React.KeyboardEvent, actions: TreeActions): void {\n this._onKeyboardEvent(event, actions, true);\n }\n\n public onTreeKeyUp(event: React.KeyboardEvent, actions: TreeActions): void {\n this._onKeyboardEvent(event, actions, false);\n }\n\n private _onKeyboardEvent = (\n e: React.KeyboardEvent,\n actions: TreeActions,\n isKeyDown: boolean\n ) => {\n const processedNodeId = this._selectionHandler.processedItem;\n if (!isNavigationKey(e.key) || !isIndividualSelection(processedNodeId)) {\n return;\n }\n\n const isExpandable = (node: TreeModelNode): boolean =>\n !node.isLoading && node.numChildren !== 0;\n const isEditing = (node: TreeModelNode): boolean =>\n node.editingInfo !== undefined;\n\n const processedNode = this._getVisibleNodes()\n .getModel()\n .getNode(processedNodeId);\n\n // istanbul ignore if\n if (!processedNode || isEditing(processedNode)) return;\n\n const handleKeyboardSelectItem = (index: number) => {\n const node = this.getVisibleNodeAtIndex(this._getVisibleNodes(), index);\n // istanbul ignore if\n if (!node || isEditing(node)) return;\n\n const selectionFunc = this._selectionHandler.createSelectionFunction(\n ...this.createSelectionHandlers(node.id)\n );\n selectionFunc(e.shiftKey, e.ctrlKey);\n };\n const handleKeyboardActivateItem = (_index: number) => {\n if (isExpandable(processedNode)) {\n if (!processedNode.isExpanded) actions.onNodeExpanded(processedNode.id);\n else actions.onNodeCollapsed(processedNode.id);\n } else {\n actions.onNodeEditorActivated(processedNode.id);\n }\n };\n const handleCrossAxisArrowKey = (forward: boolean) => {\n if (!isExpandable(processedNode)) return;\n\n if (forward && !processedNode.isExpanded)\n actions.onNodeExpanded(processedNode.id);\n else if (!forward && processedNode.isExpanded)\n actions.onNodeCollapsed(processedNode.id);\n };\n\n const itemKeyboardNavigator = new ItemKeyboardNavigator(\n handleKeyboardSelectItem,\n handleKeyboardActivateItem\n );\n itemKeyboardNavigator.orientation = Orientation.Vertical;\n itemKeyboardNavigator.crossAxisArrowKeyHandler = handleCrossAxisArrowKey;\n itemKeyboardNavigator.allowWrap = false;\n itemKeyboardNavigator.itemCount = this._getVisibleNodes().getNumNodes();\n\n const processedNodeIndex =\n this._getVisibleNodes().getIndexOfNode(processedNodeId);\n isKeyDown\n ? itemKeyboardNavigator.handleKeyDownEvent(e, processedNodeIndex)\n : itemKeyboardNavigator.handleKeyUpEvent(e, processedNodeIndex);\n };\n}\n\ntype Selection = string | RangeSelection;\n\nfunction isIndividualSelection(\n selection: Selection | undefined\n): selection is string {\n return typeof selection === \"string\";\n}\n\nclass ItemHandler implements SingleSelectionHandler<string> {\n private _node: TreeModelNode | undefined;\n\n constructor(node: TreeModelNode | undefined) {\n this._node = node;\n }\n\n /* istanbul ignore next: noop */\n public preselect() {}\n\n /* istanbul ignore next: noop */\n public select() {}\n\n /* istanbul ignore next: noop */\n public deselect() {}\n\n // eslint-disable-next-line @itwin/prefer-get\n public isSelected(): boolean {\n // istanbul ignore next\n return !!this._node?.isSelected;\n }\n\n public item(): string {\n return this._node?.id ?? \"\";\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TreeSelectionManager.js","sourceRoot":"","sources":["../../../../../../src/components-react/tree/controlled/internal/TreeSelectionManager.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/** @packageDocumentation\n * @module Tree\n */\n\nimport type { Observable } from \"rxjs\";\nimport { Subject } from \"rxjs\";\nimport { BeUiEvent } from \"@itwin/core-bentley\";\nimport type {\n MultiSelectionHandler,\n SingleSelectionHandler,\n} from \"../../../common/selection/SelectionHandler\";\nimport { SelectionHandler } from \"../../../common/selection/SelectionHandler\";\nimport type { SelectionMode } from \"../../../common/selection/SelectionModes\";\nimport type { TreeActions } from \"../TreeActions\";\nimport type { TreeModelNode, VisibleTreeNodes } from \"../TreeModel\";\nimport { isTreeModelNode } from \"../TreeModel\";\nimport {\n isNavigationKey,\n ItemKeyboardNavigator,\n Orientation,\n} from \"@itwin/core-react\";\n\n/** @internal */\nexport interface SelectionReplacementEvent {\n selectedNodeIds: IndividualSelection | RangeSelection;\n}\n\n/** @internal */\nexport interface SelectionModificationEvent {\n selectedNodes: IndividualSelection | RangeSelection;\n deselectedNodes: IndividualSelection;\n}\n\n/** @internal */\nexport interface DragSelectionStartEvent {\n selectionChanges: Observable<SelectionModificationEvent>;\n}\n\n/** @internal */\nexport type IndividualSelection = string[];\n\n/** @internal */\nexport interface RangeSelection {\n from: string;\n to: string;\n}\n\n/** @internal */\nexport function isRangeSelection(selection: any): selection is RangeSelection {\n return (\n selection &&\n typeof selection.from === \"string\" &&\n typeof selection.to === \"string\"\n );\n}\n\n/** @internal */\nexport class TreeSelectionManager\n implements\n Pick<TreeActions, \"onNodeClicked\" | \"onNodeMouseDown\" | \"onNodeMouseMove\">\n{\n private _selectionHandler: SelectionHandler<Selection>;\n private _dragSelectionOperation?: Subject<SelectionModificationEvent>;\n private _itemHandlers: Array<Array<SingleSelectionHandler<string>>>;\n\n private _getVisibleNodes: () => VisibleTreeNodes;\n\n public onSelectionChanged = new BeUiEvent<SelectionModificationEvent>();\n public onSelectionReplaced = new BeUiEvent<SelectionReplacementEvent>();\n public onDragSelection = new BeUiEvent<DragSelectionStartEvent>();\n\n constructor(\n selectionMode: SelectionMode,\n getVisibleNodes: () => VisibleTreeNodes\n ) {\n this._getVisibleNodes = getVisibleNodes;\n\n const onItemsSelected = (selections: Selection[], replacement: boolean) => {\n // Assumes that `selections` will only contain either a list of\n // `IndividualSelection` items or a single `RangeSelection` item.\n if (isIndividualSelection(selections[0])) {\n if (replacement) {\n this.onSelectionReplaced.emit({\n selectedNodeIds: selections as IndividualSelection,\n });\n } else {\n this.onSelectionChanged.emit({\n selectedNodes: selections as IndividualSelection,\n deselectedNodes: [],\n });\n }\n } else {\n if (replacement) {\n this.onSelectionReplaced.emit({\n selectedNodeIds: selections[0],\n });\n } else {\n this.onSelectionChanged.emit({\n selectedNodes: selections[0],\n deselectedNodes: [],\n });\n }\n }\n };\n\n const onItemsDeselected = (deselections: Selection[]) => {\n // Assumes that this will be always called with `IndividualSelection` items\n this.onSelectionChanged.emit({\n selectedNodes: [],\n deselectedNodes: deselections as IndividualSelection,\n });\n };\n\n this._selectionHandler = new SelectionHandler(\n selectionMode,\n onItemsSelected,\n onItemsDeselected\n );\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n const itemHandlers = new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"length\") {\n return _this._getVisibleNodes().getNumNodes();\n }\n\n const index: number = +(prop as string);\n const node = _this.getVisibleNodeAtIndex(\n _this._getVisibleNodes(),\n index\n );\n return new ItemHandler(node);\n },\n }\n ) as Array<SingleSelectionHandler<string>>;\n this._itemHandlers = [itemHandlers];\n }\n\n private getVisibleNodeAtIndex(\n nodes: VisibleTreeNodes | undefined,\n index: number\n ): TreeModelNode | undefined {\n const foundNode =\n nodes !== undefined\n ? nodes.getAtIndex(index)\n : /* istanbul ignore next */ undefined;\n return isTreeModelNode(foundNode) ? foundNode : undefined;\n }\n\n public onNodeClicked(nodeId: string, event: React.MouseEvent) {\n const selectionFunc = this._selectionHandler.createSelectionFunction(\n ...this.createSelectionHandlers(nodeId)\n );\n selectionFunc(event.shiftKey, event.ctrlKey);\n }\n\n public onNodeMouseDown(nodeId: string) {\n this._selectionHandler.createDragAction(\n this.createSelectionHandlers(nodeId)[0],\n this._itemHandlers,\n nodeId\n );\n window.addEventListener(\n \"mouseup\",\n () => {\n /* istanbul ignore else */\n if (this._dragSelectionOperation) {\n this._selectionHandler.completeDragAction();\n this._dragSelectionOperation.complete();\n this._dragSelectionOperation = undefined;\n }\n },\n { once: true }\n );\n this._dragSelectionOperation = new Subject();\n this.onDragSelection.emit({\n selectionChanges: this._dragSelectionOperation,\n });\n }\n\n public onNodeMouseMove(nodeId: string) {\n this._selectionHandler.updateDragAction(nodeId);\n }\n\n private createSelectionHandlers(\n nodeId: string\n ): [MultiSelectionHandler<Selection>, SingleSelectionHandler<string>] {\n let deselectedAll = false;\n const multiSelectionHandler: MultiSelectionHandler<Selection> = {\n selectBetween: (item1, item2) => [\n { from: item1 as string, to: item2 as string },\n ],\n updateSelection: (selections, deselections) => {\n // Assumes `updateSelection` will never be called with selection ranges\n const selectedNodeIds = selections as string[];\n const deselectedNodeIds = deselections as string[];\n this._dragSelectionOperation!.next({\n selectedNodes: selectedNodeIds,\n deselectedNodes: deselectedNodeIds,\n });\n },\n deselectAll: () => {\n deselectedAll = true;\n },\n areEqual: (item1, item2) => item1 === item2,\n };\n\n const singleSelectionHandler: SingleSelectionHandler<string> = {\n preselect: () => {},\n select: () => {},\n deselect: () => {},\n isSelected: () => {\n if (deselectedAll) {\n return false;\n }\n\n const node = this._getVisibleNodes().getModel().getNode(nodeId);\n return node !== undefined && node.isSelected;\n },\n item: () => nodeId,\n };\n\n return [multiSelectionHandler, singleSelectionHandler];\n }\n\n public onTreeKeyDown(event: React.KeyboardEvent, actions: TreeActions): void {\n this._onKeyboardEvent(event, actions, true);\n }\n\n public onTreeKeyUp(event: React.KeyboardEvent, actions: TreeActions): void {\n this._onKeyboardEvent(event, actions, false);\n }\n\n private _onKeyboardEvent = (\n e: React.KeyboardEvent,\n actions: TreeActions,\n isKeyDown: boolean\n ) => {\n const processedNodeId = this._selectionHandler.processedItem;\n if (!isNavigationKey(e.key) || !isIndividualSelection(processedNodeId)) {\n return;\n }\n\n const isExpandable = (node: TreeModelNode): boolean =>\n !node.isLoading && node.numChildren !== 0;\n const isEditing = (node: TreeModelNode): boolean =>\n node.editingInfo !== undefined;\n\n const processedNode = this._getVisibleNodes()\n .getModel()\n .getNode(processedNodeId);\n\n // istanbul ignore if\n if (!processedNode || isEditing(processedNode)) return;\n\n const handleKeyboardSelectItem = (index: number) => {\n const node = this.getVisibleNodeAtIndex(this._getVisibleNodes(), index);\n // istanbul ignore if\n if (!node || isEditing(node)) return;\n\n const selectionFunc = this._selectionHandler.createSelectionFunction(\n ...this.createSelectionHandlers(node.id)\n );\n selectionFunc(e.shiftKey, e.ctrlKey);\n };\n const handleKeyboardActivateItem = (_index: number) => {\n if (isExpandable(processedNode)) {\n if (!processedNode.isExpanded) actions.onNodeExpanded(processedNode.id);\n else actions.onNodeCollapsed(processedNode.id);\n } else {\n actions.onNodeEditorActivated(processedNode.id);\n }\n };\n const handleCrossAxisArrowKey = (forward: boolean) => {\n if (!isExpandable(processedNode)) return;\n\n if (forward && !processedNode.isExpanded)\n actions.onNodeExpanded(processedNode.id);\n else if (!forward && processedNode.isExpanded)\n actions.onNodeCollapsed(processedNode.id);\n };\n\n const itemKeyboardNavigator = new ItemKeyboardNavigator(\n handleKeyboardSelectItem,\n handleKeyboardActivateItem\n );\n itemKeyboardNavigator.orientation = Orientation.Vertical;\n itemKeyboardNavigator.crossAxisArrowKeyHandler = handleCrossAxisArrowKey;\n itemKeyboardNavigator.allowWrap = false;\n itemKeyboardNavigator.itemCount = this._getVisibleNodes().getNumNodes();\n\n const processedNodeIndex =\n this._getVisibleNodes().getIndexOfNode(processedNodeId);\n isKeyDown\n ? itemKeyboardNavigator.handleKeyDownEvent(e, processedNodeIndex)\n : itemKeyboardNavigator.handleKeyUpEvent(e, processedNodeIndex);\n };\n}\n\ntype Selection = string | RangeSelection;\n\nfunction isIndividualSelection(\n selection: Selection | undefined\n): selection is string {\n return typeof selection === \"string\";\n}\n\nclass ItemHandler implements SingleSelectionHandler<string> {\n private _node: TreeModelNode | undefined;\n\n constructor(node: TreeModelNode | undefined) {\n this._node = node;\n }\n\n /* istanbul ignore next: noop */\n public preselect() {}\n\n /* istanbul ignore next: noop */\n public select() {}\n\n /* istanbul ignore next: noop */\n public deselect() {}\n\n // eslint-disable-next-line @itwin/prefer-get\n public isSelected(): boolean {\n // istanbul ignore next\n return !!this._node?.isSelected;\n }\n\n public item(): string {\n return this._node?.id ?? \"\";\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/components-react",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.8.1",
|
|
4
4
|
"description": "iTwin.js UI complex components",
|
|
5
5
|
"main": "lib/cjs/components-react.js",
|
|
6
6
|
"module": "lib/esm/components-react.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"@itwin/appui-abstract": "^3.7.0 || ^4.0.0",
|
|
26
26
|
"@itwin/core-bentley": "^3.7.0 || ^4.0.0",
|
|
27
|
-
"@itwin/core-react": "^4.
|
|
27
|
+
"@itwin/core-react": "^4.8.1",
|
|
28
28
|
"react": "^17.0.0 || ^18.0.0",
|
|
29
29
|
"react-dom": "^17.0.0 || ^18.0.0"
|
|
30
30
|
},
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"@itwin/core-common": "^3.7.0",
|
|
40
40
|
"@itwin/core-geometry": "^3.7.0",
|
|
41
41
|
"@itwin/core-i18n": "^3.7.0",
|
|
42
|
-
"@itwin/core-react": "4.
|
|
42
|
+
"@itwin/core-react": "4.8.1",
|
|
43
43
|
"@itwin/eslint-plugin": "^4.0.0-dev.45",
|
|
44
44
|
"@testing-library/dom": "^8.11.2",
|
|
45
45
|
"@testing-library/react": "^12.0.0",
|