@itwin/map-layers 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/lib/cjs/public/locales/en/mapLayers.json +7 -2
  3. package/lib/cjs/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  4. package/lib/cjs/ui/widget/AttachLayerPopupButton.js +144 -64
  5. package/lib/cjs/ui/widget/AttachLayerPopupButton.js.map +1 -1
  6. package/lib/cjs/ui/widget/BasemapPanel.d.ts.map +1 -1
  7. package/lib/cjs/ui/widget/BasemapPanel.js +44 -15
  8. package/lib/cjs/ui/widget/BasemapPanel.js.map +1 -1
  9. package/lib/cjs/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  10. package/lib/cjs/ui/widget/MapLayerDroppable.js +26 -3
  11. package/lib/cjs/ui/widget/MapLayerDroppable.js.map +1 -1
  12. package/lib/cjs/ui/widget/MapLayerManager.d.ts.map +1 -1
  13. package/lib/cjs/ui/widget/MapLayerManager.js +35 -57
  14. package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
  15. package/lib/cjs/ui/widget/MapLayerManager.scss +2 -8
  16. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.d.ts +11 -0
  17. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.d.ts.map +1 -0
  18. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.js +58 -0
  19. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.js.map +1 -0
  20. package/lib/cjs/ui/widget/MapSelectFeaturesDialog.scss +17 -0
  21. package/lib/cjs/ui/widget/MapUrlDialog.d.ts +7 -2
  22. package/lib/cjs/ui/widget/MapUrlDialog.d.ts.map +1 -1
  23. package/lib/cjs/ui/widget/MapUrlDialog.js +38 -134
  24. package/lib/cjs/ui/widget/MapUrlDialog.js.map +1 -1
  25. package/lib/cjs/ui/widget/MapUrlDialog.scss +10 -10
  26. package/lib/cjs/ui/widget/SubLayersDataProvider.d.ts +3 -1
  27. package/lib/cjs/ui/widget/SubLayersDataProvider.d.ts.map +1 -1
  28. package/lib/cjs/ui/widget/SubLayersDataProvider.js +3 -3
  29. package/lib/cjs/ui/widget/SubLayersDataProvider.js.map +1 -1
  30. package/lib/cjs/ui/widget/SubLayersPopupButton.js +1 -1
  31. package/lib/cjs/ui/widget/SubLayersPopupButton.js.map +1 -1
  32. package/lib/cjs/ui/widget/SubLayersTree.d.ts +5 -0
  33. package/lib/cjs/ui/widget/SubLayersTree.d.ts.map +1 -1
  34. package/lib/cjs/ui/widget/SubLayersTree.js +12 -36
  35. package/lib/cjs/ui/widget/SubLayersTree.js.map +1 -1
  36. package/lib/cjs/ui/widget/SubLayersTree.scss +12 -3
  37. package/lib/esm/public/locales/en/mapLayers.json +7 -2
  38. package/lib/esm/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  39. package/lib/esm/ui/widget/AttachLayerPopupButton.js +145 -65
  40. package/lib/esm/ui/widget/AttachLayerPopupButton.js.map +1 -1
  41. package/lib/esm/ui/widget/BasemapPanel.d.ts.map +1 -1
  42. package/lib/esm/ui/widget/BasemapPanel.js +44 -15
  43. package/lib/esm/ui/widget/BasemapPanel.js.map +1 -1
  44. package/lib/esm/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  45. package/lib/esm/ui/widget/MapLayerDroppable.js +27 -4
  46. package/lib/esm/ui/widget/MapLayerDroppable.js.map +1 -1
  47. package/lib/esm/ui/widget/MapLayerManager.d.ts.map +1 -1
  48. package/lib/esm/ui/widget/MapLayerManager.js +36 -58
  49. package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
  50. package/lib/esm/ui/widget/MapLayerManager.scss +2 -8
  51. package/lib/esm/ui/widget/MapSelectFeaturesDialog.d.ts +11 -0
  52. package/lib/esm/ui/widget/MapSelectFeaturesDialog.d.ts.map +1 -0
  53. package/lib/esm/ui/widget/MapSelectFeaturesDialog.js +54 -0
  54. package/lib/esm/ui/widget/MapSelectFeaturesDialog.js.map +1 -0
  55. package/lib/esm/ui/widget/MapSelectFeaturesDialog.scss +17 -0
  56. package/lib/esm/ui/widget/MapUrlDialog.d.ts +7 -2
  57. package/lib/esm/ui/widget/MapUrlDialog.d.ts.map +1 -1
  58. package/lib/esm/ui/widget/MapUrlDialog.js +38 -134
  59. package/lib/esm/ui/widget/MapUrlDialog.js.map +1 -1
  60. package/lib/esm/ui/widget/MapUrlDialog.scss +10 -10
  61. package/lib/esm/ui/widget/SubLayersDataProvider.d.ts +3 -1
  62. package/lib/esm/ui/widget/SubLayersDataProvider.d.ts.map +1 -1
  63. package/lib/esm/ui/widget/SubLayersDataProvider.js +3 -3
  64. package/lib/esm/ui/widget/SubLayersDataProvider.js.map +1 -1
  65. package/lib/esm/ui/widget/SubLayersPopupButton.js +1 -1
  66. package/lib/esm/ui/widget/SubLayersPopupButton.js.map +1 -1
  67. package/lib/esm/ui/widget/SubLayersTree.d.ts +5 -0
  68. package/lib/esm/ui/widget/SubLayersTree.d.ts.map +1 -1
  69. package/lib/esm/ui/widget/SubLayersTree.js +13 -37
  70. package/lib/esm/ui/widget/SubLayersTree.js.map +1 -1
  71. package/lib/esm/ui/widget/SubLayersTree.scss +12 -3
  72. package/lib/public/locales/en/mapLayers.json +7 -2
  73. package/package.json +16 -15
@@ -1 +1 @@
1
- {"version":3,"file":"SubLayersTree.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\nimport {\n AbstractTreeNodeLoaderWithProvider, ControlledTree, DelayLoadedTreeNodeItem, HighlightableTreeProps, ITreeDataProvider,\n MutableTreeModel, MutableTreeModelNode, SelectionMode, TreeCheckboxStateChangeEventArgs, TreeDataProvider,\n TreeEventHandler, TreeImageLoader, TreeModel, TreeModelChanges, TreeModelSource, TreeNodeItem, TreeNodeLoader,\n TreeNodeRenderer, TreeNodeRendererProps, TreeRenderer, TreeRendererProps, useTreeModel,\n} from \"@itwin/components-react\";\nimport { MapSubLayerProps, SubLayerId } from \"@itwin/core-common\";\nimport { CheckBoxState, ImageCheckBox, NodeCheckboxRenderProps, useDisposable, WebFontIcon } from \"@itwin/core-react\";\nimport { Button, Input } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { SubLayersDataProvider } from \"./SubLayersDataProvider\";\nimport \"./SubLayersTree.scss\";\nimport { MapLayersUI } from \"../../mapLayers\";\n\nconst getWindow = () => {\n return typeof window === \"undefined\" ? undefined : window;\n};\n\nconst useResizeObserver = <T extends HTMLElement>(\n onResize: (size: DOMRectReadOnly) => void,\n) => {\n const resizeObserver = React.useRef<ResizeObserver>();\n\n const elementRef = React.useCallback(\n (element: T | null) => {\n if (!getWindow()?.ResizeObserver) {\n return;\n }\n\n resizeObserver.current?.disconnect();\n if (element) {\n resizeObserver.current = new ResizeObserver(([{ contentRect }]) =>\n onResize(contentRect),\n );\n resizeObserver.current?.observe(element);\n }\n },\n [onResize],\n );\n\n return [elementRef, resizeObserver.current] as const;\n};\n\n/** Mimic processing of `react-resize-detector` to return width and height.\n * @internal\n */\nfunction useResizeDetector(): { width: number | undefined, height: number | undefined, ref: React.Ref<HTMLDivElement> } {\n const [width, setWidth] = React.useState<number>();\n const [height, setHeight] = React.useState<number>();\n const [ref] = useResizeObserver(React.useCallback((size: DOMRectReadOnly) => {\n setWidth(size.width);\n setHeight(size.height);\n }, []));\n return { width, height, ref };\n}\n\ninterface ToolbarProps {\n searchField?: React.ReactNode;\n children?: React.ReactNode[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction Toolbar(props: ToolbarProps) {\n return (\n <div className=\"map-manager-sublayer-tree-toolbar\">\n <div className=\"tree-toolbar-action-buttons\">\n {props.children}\n </div>\n {props.searchField && <div className=\"tree-toolbar-searchbox\">\n {props.searchField}\n </div>}\n </div>\n );\n}\n\nexport type OnSubLayerStateChangeType = (subLayerId: SubLayerId, isSelected: boolean) => void;\nexport interface SubLayersPanelProps extends Omit<SubLayersTreeProps, \"subLayers\"> {\n subLayers?: MapSubLayerProps[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function SubLayersPanel(props: SubLayersPanelProps) {\n const [noneAvailableLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoSubLayers\"));\n if (undefined === props.subLayers || 0 === props.subLayers.length) {\n return <div className=\"map-manager-sublayer-panel\">\n <div>{noneAvailableLabel}</div>\n </div>;\n } else {\n return (\n <SubLayersTree subLayers={props.subLayers} {...props} />\n );\n }\n}\n\nexport interface SubLayersTreeProps {\n subLayers: MapSubLayerProps[];\n singleVisibleSubLayer?: boolean;\n onSubLayerStateChange?: OnSubLayerStateChangeType;\n}\n/**\n * Tree Control that displays sub-layer hierarchy\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function SubLayersTree(props: SubLayersTreeProps) {\n\n const [placeholderLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.SearchPlaceholder\"));\n const [allOnLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOn\"));\n const [allOffLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOff\"));\n const [subLayers, setSubLayers] = React.useState(props.subLayers);\n const [layerFilterString, setLayerFilterString] = React.useState<string>(\"\");\n\n // create data provider to get some nodes to show in tree\n // `React.useMemo' is used avoid creating new object on each render cycle\n const dataProvider = React.useMemo(() => new SubLayersDataProvider(subLayers), [subLayers]);\n\n const {\n modelSource,\n nodeLoader,\n nodeHighlightingProps,\n } = useTreeFiltering(dataProvider, layerFilterString);\n\n // create custom event handler. It handles all tree event same as `TreeEventHandler` but additionally\n // it selects/deselects node when checkbox is checked/unchecked and vice versa.\n // `useDisposable` takes care of disposing old event handler when new is created in case 'nodeLoader' has changed\n // `React.useCallback` is used to avoid creating new callback that creates handler on each render\n const eventHandler = useDisposable(React.useCallback(() => new SubLayerCheckboxHandler(subLayers, props.singleVisibleSubLayer ?? false, nodeLoader, props.onSubLayerStateChange), [nodeLoader, subLayers, props.onSubLayerStateChange, props.singleVisibleSubLayer]));\n\n // Get an immutable tree model from the model source. The model is regenerated every time the model source\n // emits the `onModelChanged` event.\n const treeModel = useTreeModel(modelSource);\n const changeAll = React.useCallback(async (visible: boolean) => {\n const tmpSubLayers = [...subLayers]; // deep copy to trigger state change\n if (tmpSubLayers) {\n tmpSubLayers?.forEach((subLayer: MapSubLayerProps) => {\n subLayer.visible = visible;\n });\n\n setSubLayers(tmpSubLayers);\n }\n\n if (props.onSubLayerStateChange)\n props.onSubLayerStateChange(-1, visible);\n }, [subLayers, props]);\n\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setLayerFilterString(event.target.value);\n }, []);\n\n const { width, height, ref: containerRef } = useResizeDetector();\n\n return <>\n <div className=\"map-manager-sublayer-tree\">\n <Toolbar\n searchField={\n <Input type=\"text\" className=\"map-manager-source-list-filter\"\n placeholder={placeholderLabel}\n value={layerFilterString}\n onChange={handleFilterTextChanged}\n size=\"small\" />\n }\n >\n {props.singleVisibleSubLayer ? undefined : [\n <Button size=\"small\" styleType=\"borderless\" key=\"show-all-btn\" title={allOnLabel} onClick={async () => changeAll(true)}>\n <WebFontIcon iconName=\"icon-visibility\" />\n </Button>,\n <Button size=\"small\" styleType=\"borderless\" key=\"hide-all-btn\" title={allOffLabel} onClick={async () => changeAll(false)}>\n <WebFontIcon iconName=\"icon-visibility-hide-2\" />\n </Button>,\n ]}\n </Toolbar>\n <div ref={containerRef} className=\"map-manager-sublayer-tree-content\">\n {width !== undefined && height !== undefined && <ControlledTree\n nodeLoader={nodeLoader}\n selectionMode={SelectionMode.None}\n eventsHandler={eventHandler}\n model={treeModel}\n treeRenderer={nodeWithEyeCheckboxTreeRenderer}\n nodeHighlightingProps={nodeHighlightingProps}\n width={width}\n height={height}\n />}\n </div>\n </div >\n </>;\n}\n\n/** TreeEventHandler derived class that handler processing changes to subLayer visibility */\nclass SubLayerCheckboxHandler extends TreeEventHandler {\n private _removeModelChangedListener: () => void;\n private _onSubLayerStateChange?: OnSubLayerStateChangeType;\n private _subLayers: MapSubLayerProps[];\n private _singleVisibleSubLayer?: boolean;\n\n constructor(subLayers: MapSubLayerProps[], singleVisibleSubLayer: boolean, nodeLoader: AbstractTreeNodeLoaderWithProvider<TreeDataProvider>, onSubLayerStateChange?: OnSubLayerStateChangeType) {\n super({ modelSource: nodeLoader.modelSource, nodeLoader, collapsedChildrenDisposalEnabled: true });\n this._subLayers = subLayers;\n this._singleVisibleSubLayer = singleVisibleSubLayer;\n this._onSubLayerStateChange = onSubLayerStateChange;\n this._removeModelChangedListener = this.modelSource.onModelChanged.addListener(this.onModelChanged);\n }\n\n public override dispose() {\n this._removeModelChangedListener();\n super.dispose();\n }\n\n // Cascade state\n // Children on unnamed groups must get disabled in the tree view, because\n // they get rendered anyway.\n private cascadeStateToAllChildren(model: MutableTreeModel, parentId?: string) {\n const children = model.getChildren(parentId);\n if (children === undefined)\n return;\n\n for (const childID of children) {\n const childNode = childID ? model.getNode(childID) : undefined;\n\n if (childNode)\n this.syncNodeStateWithParent(model, childNode);\n\n // Drill down the tree.\n this.cascadeStateToAllChildren(model, childID);\n }\n }\n\n private applyMutualExclusiveState(model: MutableTreeModel, nodeId: string) {\n const changedNode = model.getNode(nodeId);\n if (changedNode?.checkbox.state === CheckBoxState.Off)\n return;\n\n for (const node of model.iterateTreeModelNodes()) {\n if (node.id === changedNode?.id)\n continue;\n\n if (node && node.checkbox.state === CheckBoxState.On)\n node.checkbox.state = CheckBoxState.Off;\n }\n }\n\n //-----------------------------------------------------------------------\n // Listen to model changes\n //------------------------------------------------------------------------\n // This is required because nodes are delay loaded in the model until\n // they are made visible (i.e. parent node is expanded). So even though\n // you might have created nodes in the data provided with a proper\n // initial state, by the time it gets loaded, their state might have became\n // out of date in the TreeView's active model. So whenever a node\n // is added, when must confirm its state matches the current model\n // (i.e. state of their parent.)\n public onModelChanged = (args: [TreeModel, TreeModelChanges]) => {\n this.modelSource.modifyModel((model) => {\n const addedNodes = args[1].addedNodeIds.map((id) => model.getNode(id));\n addedNodes.forEach((node) => {\n if (!node)\n return;\n\n this.syncNodeStateWithParent(model, node);\n });\n });\n };\n\n private static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\n if (!subLayer)\n return false;\n\n return (!subLayer.name || subLayer.name.length === 0) && (subLayer.children !== undefined && subLayer.children.length > 0);\n }\n\n // Ensure the state of changed node matches the state of its parent.\n private syncNodeStateWithParent(model: MutableTreeModel, changedNode: MutableTreeModelNode) {\n // Lookup node parent. If non exists, I assume thats the root node,\n // and it must have a proper initial state.\n const parentNode = changedNode.parentId ? model.getNode(changedNode.parentId) : undefined;\n if (!parentNode)\n return;\n\n if (!changedNode.checkbox)\n return; // don't see why this would happen, but if there is no checkbox, we cant do much here.\n\n const parentLayerId = undefined !== parentNode.item.extendedData?.subLayerId ? parentNode.item.extendedData?.subLayerId : parentNode.item.id;\n const parentSubLayer = this._subLayers?.find((subLayer) => subLayer.id === parentLayerId);\n\n // If parent is disabled, then children must be too.\n // Also, Non-visible unnamed group must have their children disabled (unamed groups have visibility inherence)\n if (parentNode.checkbox.isDisabled || (SubLayerCheckboxHandler.isUnnamedGroup(parentSubLayer) && parentNode.checkbox.state === CheckBoxState.Off)) {\n changedNode.checkbox.isDisabled = true;\n changedNode.checkbox.state = CheckBoxState.Off;\n } else {\n // Visibility state from StyleMapLayerSettings applies\n const subLayerId = undefined !== changedNode.item.extendedData?.subLayerId ? changedNode.item.extendedData?.subLayerId : changedNode.item.id;\n const foundSubLayer = this._subLayers?.find((subLayer) => subLayer.id === subLayerId);\n changedNode.checkbox.isDisabled = false;\n changedNode.checkbox.state = foundSubLayer?.visible ? CheckBoxState.On : CheckBoxState.Off;\n }\n }\n\n /** Changes nodes checkboxes states until event is handled or handler is disposed */\n public override onCheckboxStateChanged({ stateChanges }: TreeCheckboxStateChangeEventArgs) {\n // call base checkbox handling\n const baseHandling = super.onCheckboxStateChanged({ stateChanges });\n\n // subscribe to checkbox state changes to new checkbox states and do some additional work with them\n const selectionHandling = stateChanges.subscribe({\n next: (changes) => {\n changes.forEach((change) => {\n const isSelected = (change.newState === CheckBoxState.On);\n const subLayerId = undefined !== change.nodeItem.extendedData?.subLayerId ? change.nodeItem.extendedData?.subLayerId : change.nodeItem.id;\n\n // Get the previously visible node if we are in 'singleVisibleSubLayer' node\n let prevVisibleSubLayers: SubLayerId[] = [];\n if (this._singleVisibleSubLayer) {\n prevVisibleSubLayers = this._subLayers.reduce((filtered: SubLayerId[], subLayer) => {\n if (subLayer.visible && subLayer.id !== undefined)\n filtered.push(subLayer.id);\n return filtered;\n }, []);\n }\n\n // Inform caller that subLayer state is going to change (i.e. update display style state)\n if (this._onSubLayerStateChange) {\n for (const slId of prevVisibleSubLayers)\n this._onSubLayerStateChange(slId, false);\n\n this._onSubLayerStateChange(subLayerId, isSelected);\n }\n\n // Update sublayer object, otherwise state would get out of sync with DisplayStyle each time the TreeView is re-rendered\n this._subLayers?.forEach((curSubLayer) => {\n if (curSubLayer.id) {\n if (curSubLayer.id === subLayerId)\n curSubLayer.visible = isSelected;\n else if (prevVisibleSubLayers.includes(curSubLayer.id))\n curSubLayer.visible = false;\n }\n });\n\n // Cascade state\n this.modelSource.modifyModel((model) => {\n if (this._singleVisibleSubLayer)\n this.applyMutualExclusiveState(model, change.nodeItem.id);\n this.cascadeStateToAllChildren(model, change.nodeItem.id);\n });\n });\n },\n });\n // stop handling selection when checkboxes handling is stopped\n baseHandling?.add(selectionHandling);\n return baseHandling;\n }\n}\n\n/** Custom checkbox renderer that renders checkbox as an eye */\nconst eyeCheckboxRenderer = (props: NodeCheckboxRenderProps) => (\n <ImageCheckBox\n checked={props.checked}\n disabled={props.disabled}\n imageOn=\"icon-visibility\"\n imageOff=\"icon-visibility-hide-2\"\n onClick={props.onChange}\n tooltip={props.title}\n />\n);\n\n/** Custom node renderer. It uses default 'TreeNodeRenderer' but overrides default checkbox renderer to render checkbox as an eye */\nconst imageLoader = new TreeImageLoader();\nconst nodeWithEyeCheckboxRenderer = (props: TreeNodeRendererProps) => (\n <TreeNodeRenderer\n {...props}\n checkboxRenderer={eyeCheckboxRenderer}\n imageLoader={imageLoader}\n />\n);\n\n/** Custom tree renderer. It uses default `TreeRenderer` but overrides default node renderer to render node with custom checkbox */\nconst nodeWithEyeCheckboxTreeRenderer = (props: TreeRendererProps) => (\n <TreeRenderer\n {...props}\n nodeRenderer={nodeWithEyeCheckboxRenderer}\n />\n);\n\nfunction useTreeFiltering(\n dataProvider: ITreeDataProvider,\n filter: string,\n) {\n const nodeLoader = useFilteredProvider(dataProvider, filter);\n const nodeHighlightingProps = useNodeHighlightingProps(filter);\n return {\n nodeLoader,\n modelSource: nodeLoader.modelSource,\n nodeHighlightingProps,\n };\n}\n\nfunction useFilteredProvider(\n dataProvider: ITreeDataProvider,\n filter: string,\n) {\n const filteredProvider = React.useMemo(() => {\n return new FilteredTreeDataProvider(dataProvider, filter);\n }, [dataProvider, filter]);\n\n const nodeLoader = React.useMemo(() => {\n return new TreeNodeLoader(filteredProvider, new TreeModelSource());\n }, [filteredProvider]);\n\n return nodeLoader;\n}\n\nfunction useNodeHighlightingProps(\n filter: string,\n) {\n const [nodeHighlightingProps, setNodeHighlightingProps] = React.useState<HighlightableTreeProps>();\n\n React.useEffect(() => {\n if (filter === \"\") {\n setNodeHighlightingProps(undefined);\n return;\n }\n setNodeHighlightingProps({\n searchText: filter,\n activeMatch: undefined,\n });\n }, [filter]);\n\n return nodeHighlightingProps;\n}\n\nclass FullTreeHierarchy {\n private _dataProvider: ITreeDataProvider;\n private _hierarchy = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider) {\n this._dataProvider = dataProvider;\n\n this._init = (async () => {\n await this.initNode();\n })();\n }\n\n private async initNode(parent?: TreeNodeItem) {\n const nodes = await this._dataProvider.getNodes(parent);\n this._hierarchy.set(parent?.id, nodes);\n for (const node of nodes) {\n await this.initNode(node);\n }\n }\n\n public async getHierarchy() {\n await this._init;\n return this._hierarchy;\n }\n}\n\nclass FilteredTreeHierarchy {\n private _fullHierarchy: FullTreeHierarchy;\n private _filter: string;\n private _filtered = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider, filter: string) {\n this._fullHierarchy = new FullTreeHierarchy(dataProvider);\n this._filter = filter;\n\n this._init = (async () => {\n await this.init();\n })();\n }\n\n private async init() {\n const hierarchy = await this._fullHierarchy.getHierarchy();\n if (this._filter === \"\") {\n this._filtered = hierarchy;\n return;\n }\n this.filterNodes(hierarchy);\n }\n\n /** Initializes `this._filtered` field. Returns a node if it matches a filter. */\n private filterNodes(hierarchy: Map<string | undefined, DelayLoadedTreeNodeItem[]>, current?: DelayLoadedTreeNodeItem): DelayLoadedTreeNodeItem | undefined {\n const matches = current ? this.matchesFilter(current) : false;\n const children = hierarchy.get(current?.id);\n if (!children)\n return matches ? current : undefined;\n\n const matchedChildren = new Array<DelayLoadedTreeNodeItem>();\n for (const child of children) {\n const matchedChild = this.filterNodes(hierarchy, child);\n matchedChild && matchedChildren.push(matchedChild);\n }\n\n const hasChildren = matchedChildren.length > 0;\n const included = matches || hasChildren;\n let filtered: DelayLoadedTreeNodeItem | undefined;\n if (included) {\n this._filtered.set(current?.id, matchedChildren);\n\n // Return a modified copy of current node (to persist initial hierarchy when filter is cleared).\n if (current) {\n filtered = {\n ...current,\n hasChildren,\n autoExpand: hasChildren ? true : current.autoExpand,\n };\n }\n }\n return filtered;\n }\n\n private matchesFilter(node: TreeNodeItem) {\n if (node.label.value.valueFormat !== PropertyValueFormat.Primitive)\n return false;\n\n const value = node.label.value.displayValue?.toLowerCase();\n if (!value)\n return false;\n return value.includes(this._filter.toLowerCase());\n }\n\n public async getHierarchy() {\n await this._init;\n return this._filtered;\n }\n}\n\nclass FilteredTreeDataProvider implements ITreeDataProvider {\n private _hierarchy: FilteredTreeHierarchy;\n\n public constructor(\n parentDataProvider: ITreeDataProvider,\n filter: string,\n ) {\n this._hierarchy = new FilteredTreeHierarchy(parentDataProvider, filter);\n }\n\n public async getNodes(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes || [];\n }\n\n public async getNodesCount(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes?.length || 0;\n }\n}\n"]}
1
+ {"version":3,"file":"SubLayersTree.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\nimport {\n AbstractTreeNodeLoaderWithProvider, ControlledTree, DelayLoadedTreeNodeItem, HighlightableTreeProps, ITreeDataProvider,\n MutableTreeModel, MutableTreeModelNode, SelectionMode, TreeCheckboxStateChangeEventArgs, TreeDataProvider,\n TreeEventHandler, TreeImageLoader, TreeModel, TreeModelChanges, TreeModelSource, TreeNodeItem, TreeNodeLoader,\n TreeNodeRenderer, TreeNodeRendererProps, TreeRenderer, TreeRendererProps, useTreeModel,\n} from \"@itwin/components-react\";\nimport { MapSubLayerProps, SubLayerId } from \"@itwin/core-common\";\nimport { CheckBoxState, ImageCheckBox, NodeCheckboxRenderProps, ResizableContainerObserver, useDisposable, WebFontIcon } from \"@itwin/core-react\";\nimport { Button, Input } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { SubLayersDataProvider, SubLayersTreeExpandMode } from \"./SubLayersDataProvider\";\nimport \"./SubLayersTree.scss\";\nimport { MapLayersUI } from \"../../mapLayers\";\n\ninterface ToolbarProps {\n searchField?: React.ReactNode;\n children?: React.ReactNode[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction Toolbar(props: ToolbarProps) {\n return (\n <div className=\"map-manager-sublayer-tree-toolbar\">\n <div className=\"tree-toolbar-action-buttons\">\n {props.children}\n </div>\n {props.searchField && <div className=\"tree-toolbar-searchbox\">\n {props.searchField}\n </div>}\n </div>\n );\n}\n\nexport type OnSubLayerStateChangeType = (subLayerId: SubLayerId, isSelected: boolean) => void;\nexport interface SubLayersPanelProps extends Omit<SubLayersTreeProps, \"subLayers\"> {\n subLayers?: MapSubLayerProps[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function SubLayersPanel(props: SubLayersPanelProps) {\n const [noneAvailableLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoSubLayers\"));\n if (undefined === props.subLayers || 0 === props.subLayers.length) {\n return <div className=\"map-manager-sublayer-panel\">\n <div>{noneAvailableLabel}</div>\n </div>;\n } else {\n return (\n <SubLayersTree subLayers={props.subLayers} {...props} />\n );\n }\n}\n\nexport interface SubLayersTreeProps {\n checkboxStyle: \"standard\" | \"eye\";\n expandMode: SubLayersTreeExpandMode;\n subLayers: MapSubLayerProps[];\n singleVisibleSubLayer?: boolean;\n onSubLayerStateChange?: OnSubLayerStateChangeType;\n height?: number;\n width?: number;\n}\n\n/**\n * Tree Control that displays sub-layer hierarchy\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function SubLayersTree(props: SubLayersTreeProps) {\n const [width, setWidth] = React.useState<number|undefined>(props.width);\n const [height, setHeight] = React.useState<number|undefined>(props.height);\n\n const [placeholderLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.SearchPlaceholder\"));\n const [noResults] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoResults\"));\n const [allOnLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOn\"));\n const [allOffLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOff\"));\n const [subLayers, setSubLayers] = React.useState(props.subLayers);\n const [layerFilterString, setLayerFilterString] = React.useState<string>(\"\");\n\n // create data provider to get some nodes to show in tree\n // `React.useMemo' is used avoid creating new object on each render cycle\n const dataProvider = React.useMemo(() => new SubLayersDataProvider(subLayers, props.expandMode), [subLayers, props.expandMode]);\n\n const {\n modelSource,\n nodeLoader,\n nodeHighlightingProps,\n } = useTreeFiltering(dataProvider, layerFilterString);\n\n // create custom event handler. It handles all tree event same as `TreeEventHandler` but additionally\n // it selects/deselects node when checkbox is checked/unchecked and vice versa.\n // `useDisposable` takes care of disposing old event handler when new is created in case 'nodeLoader' has changed\n // `React.useCallback` is used to avoid creating new callback that creates handler on each render\n const eventHandler = useDisposable(React.useCallback(() => new SubLayerCheckboxHandler(subLayers, props.singleVisibleSubLayer ?? false, nodeLoader, props.onSubLayerStateChange), [nodeLoader, subLayers, props.onSubLayerStateChange, props.singleVisibleSubLayer]));\n\n // Get an immutable tree model from the model source. The model is regenerated every time the model source\n // emits the `onModelChanged` event.\n const treeModel = useTreeModel(modelSource);\n const changeAll = React.useCallback(async (visible: boolean) => {\n const tmpSubLayers = [...subLayers]; // deep copy to trigger state change\n if (tmpSubLayers) {\n tmpSubLayers?.forEach((subLayer: MapSubLayerProps) => {\n subLayer.visible = visible;\n });\n\n setSubLayers(tmpSubLayers);\n }\n\n if (props.onSubLayerStateChange)\n props.onSubLayerStateChange(-1, visible);\n }, [subLayers, props]);\n\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setLayerFilterString(event.target.value);\n }, []);\n\n return <>\n <div className=\"map-manager-sublayer-tree\">\n <Toolbar\n searchField={\n <Input type=\"text\" className=\"map-manager-sublayer-tree-searchbox\"\n placeholder={placeholderLabel}\n value={layerFilterString}\n onChange={handleFilterTextChanged}\n size=\"small\" />\n }\n >\n {props.singleVisibleSubLayer ? undefined : [\n <Button size=\"small\" styleType=\"borderless\" key=\"show-all-btn\" title={allOnLabel} onClick={async () => changeAll(true)}>\n <WebFontIcon iconName={props.checkboxStyle === \"eye\" ? \"icon-visibility\" : \"icon-checkbox-select\" } />\n </Button>,\n <Button size=\"small\" styleType=\"borderless\" key=\"hide-all-btn\" title={allOffLabel} onClick={async () => changeAll(false)}>\n <WebFontIcon iconName={props.checkboxStyle === \"eye\" ? \"icon-visibility-hide-2\" : \"icon-checkbox-deselect\" } />\n </Button>,\n ]}\n </Toolbar>\n <div className=\"map-manager-sublayer-tree-content\" >\n {(props.width === undefined && props.height === undefined) && <ResizableContainerObserver onResize={(w, h) => {setWidth(w); setHeight(h);} }/> }\n {(width !== undefined && height !== undefined)\n && <ControlledTree\n nodeLoader={nodeLoader}\n selectionMode={SelectionMode.None}\n eventsHandler={eventHandler}\n model={treeModel}\n treeRenderer={props.checkboxStyle === \"eye\" ? nodeWithEyeCheckboxTreeRenderer : undefined}\n nodeHighlightingProps={nodeHighlightingProps}\n width={width}\n height={height}\n noDataRenderer={()=>(<p className=\"components-controlledTree-errorMessage\">{noResults}</p>)}\n />}\n </div>\n </div >\n </>;\n}\n\n/** TreeEventHandler derived class that handler processing changes to subLayer visibility */\nclass SubLayerCheckboxHandler extends TreeEventHandler {\n private _removeModelChangedListener: () => void;\n private _onSubLayerStateChange?: OnSubLayerStateChangeType;\n private _subLayers: MapSubLayerProps[];\n private _singleVisibleSubLayer?: boolean;\n\n constructor(subLayers: MapSubLayerProps[], singleVisibleSubLayer: boolean, nodeLoader: AbstractTreeNodeLoaderWithProvider<TreeDataProvider>, onSubLayerStateChange?: OnSubLayerStateChangeType) {\n super({ modelSource: nodeLoader.modelSource, nodeLoader, collapsedChildrenDisposalEnabled: true });\n this._subLayers = subLayers;\n this._singleVisibleSubLayer = singleVisibleSubLayer;\n this._onSubLayerStateChange = onSubLayerStateChange;\n this._removeModelChangedListener = this.modelSource.onModelChanged.addListener(this.onModelChanged);\n }\n\n public override dispose() {\n this._removeModelChangedListener();\n super.dispose();\n }\n\n // Cascade state\n // Children on unnamed groups must get disabled in the tree view, because\n // they get rendered anyway.\n private cascadeStateToAllChildren(model: MutableTreeModel, parentId?: string) {\n const children = model.getChildren(parentId);\n if (children === undefined)\n return;\n\n for (const childID of children) {\n const childNode = childID ? model.getNode(childID) : undefined;\n\n if (childNode)\n this.syncNodeStateWithParent(model, childNode);\n\n // Drill down the tree.\n this.cascadeStateToAllChildren(model, childID);\n }\n }\n\n private applyMutualExclusiveState(model: MutableTreeModel, nodeId: string) {\n const changedNode = model.getNode(nodeId);\n if (changedNode?.checkbox.state === CheckBoxState.Off)\n return;\n\n for (const node of model.iterateTreeModelNodes()) {\n if (node.id === changedNode?.id)\n continue;\n\n if (node && node.checkbox.state === CheckBoxState.On)\n node.checkbox.state = CheckBoxState.Off;\n }\n }\n\n //-----------------------------------------------------------------------\n // Listen to model changes\n //------------------------------------------------------------------------\n // This is required because nodes are delay loaded in the model until\n // they are made visible (i.e. parent node is expanded). So even though\n // you might have created nodes in the data provided with a proper\n // initial state, by the time it gets loaded, their state might have became\n // out of date in the TreeView's active model. So whenever a node\n // is added, when must confirm its state matches the current model\n // (i.e. state of their parent.)\n public onModelChanged = (args: [TreeModel, TreeModelChanges]) => {\n this.modelSource.modifyModel((model) => {\n const addedNodes = args[1].addedNodeIds.map((id) => model.getNode(id));\n addedNodes.forEach((node) => {\n if (!node)\n return;\n\n this.syncNodeStateWithParent(model, node);\n });\n });\n };\n\n private static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\n if (!subLayer)\n return false;\n\n return (!subLayer.name || subLayer.name.length === 0) && (subLayer.children !== undefined && subLayer.children.length > 0);\n }\n\n // Ensure the state of changed node matches the state of its parent.\n private syncNodeStateWithParent(model: MutableTreeModel, changedNode: MutableTreeModelNode) {\n // Lookup node parent. If non exists, I assume thats the root node,\n // and it must have a proper initial state.\n const parentNode = changedNode.parentId ? model.getNode(changedNode.parentId) : undefined;\n if (!parentNode)\n return;\n\n if (!changedNode.checkbox)\n return; // don't see why this would happen, but if there is no checkbox, we cant do much here.\n\n const parentLayerId = undefined !== parentNode.item.extendedData?.subLayerId ? parentNode.item.extendedData?.subLayerId : parentNode.item.id;\n const parentSubLayer = this._subLayers?.find((subLayer) => subLayer.id === parentLayerId);\n\n // If parent is disabled, then children must be too.\n // Also, Non-visible unnamed group must have their children disabled (unamed groups have visibility inherence)\n if (parentNode.checkbox.isDisabled || (SubLayerCheckboxHandler.isUnnamedGroup(parentSubLayer) && parentNode.checkbox.state === CheckBoxState.Off)) {\n changedNode.checkbox.isDisabled = true;\n changedNode.checkbox.state = CheckBoxState.Off;\n } else {\n // Visibility state from StyleMapLayerSettings applies\n const subLayerId = undefined !== changedNode.item.extendedData?.subLayerId ? changedNode.item.extendedData?.subLayerId : changedNode.item.id;\n const foundSubLayer = this._subLayers?.find((subLayer) => subLayer.id === subLayerId);\n changedNode.checkbox.isDisabled = false;\n changedNode.checkbox.state = foundSubLayer?.visible ? CheckBoxState.On : CheckBoxState.Off;\n }\n }\n\n /** Changes nodes checkboxes states until event is handled or handler is disposed */\n public override onCheckboxStateChanged({ stateChanges }: TreeCheckboxStateChangeEventArgs) {\n // call base checkbox handling\n const baseHandling = super.onCheckboxStateChanged({ stateChanges });\n\n // subscribe to checkbox state changes to new checkbox states and do some additional work with them\n const selectionHandling = stateChanges.subscribe({\n next: (changes) => {\n changes.forEach((change) => {\n const isSelected = (change.newState === CheckBoxState.On);\n const subLayerId = undefined !== change.nodeItem.extendedData?.subLayerId ? change.nodeItem.extendedData?.subLayerId : change.nodeItem.id;\n\n // Get the previously visible node if we are in 'singleVisibleSubLayer' node\n let prevVisibleSubLayers: SubLayerId[] = [];\n if (this._singleVisibleSubLayer) {\n prevVisibleSubLayers = this._subLayers.reduce((filtered: SubLayerId[], subLayer) => {\n if (subLayer.visible && subLayer.id !== undefined)\n filtered.push(subLayer.id);\n return filtered;\n }, []);\n }\n\n // Inform caller that subLayer state is going to change (i.e. update display style state)\n if (this._onSubLayerStateChange) {\n for (const slId of prevVisibleSubLayers)\n this._onSubLayerStateChange(slId, false);\n\n this._onSubLayerStateChange(subLayerId, isSelected);\n }\n\n // Update sublayer object, otherwise state would get out of sync with DisplayStyle each time the TreeView is re-rendered\n this._subLayers?.forEach((curSubLayer) => {\n if (curSubLayer.id !== undefined) {\n if (curSubLayer.id === subLayerId)\n curSubLayer.visible = isSelected;\n else if (prevVisibleSubLayers.includes(curSubLayer.id))\n curSubLayer.visible = false;\n }\n });\n\n // Cascade state\n this.modelSource.modifyModel((model) => {\n if (this._singleVisibleSubLayer)\n this.applyMutualExclusiveState(model, change.nodeItem.id);\n this.cascadeStateToAllChildren(model, change.nodeItem.id);\n });\n });\n },\n });\n // stop handling selection when checkboxes handling is stopped\n baseHandling?.add(selectionHandling);\n return baseHandling;\n }\n}\n\n/** Custom checkbox renderer that renders checkbox as an eye */\nconst eyeCheckboxRenderer = (props: NodeCheckboxRenderProps) => (\n <ImageCheckBox\n checked={props.checked}\n disabled={props.disabled}\n imageOn=\"icon-visibility\"\n imageOff=\"icon-visibility-hide-2\"\n onClick={props.onChange}\n tooltip={props.title}\n />\n);\n\n/** Custom node renderer. It uses default 'TreeNodeRenderer' but overrides default checkbox renderer to render checkbox as an eye */\nconst imageLoader = new TreeImageLoader();\nconst nodeWithEyeCheckboxRenderer = (props: TreeNodeRendererProps) => (\n <TreeNodeRenderer\n {...props}\n checkboxRenderer={eyeCheckboxRenderer}\n imageLoader={imageLoader}\n />\n);\n\n/** Custom tree renderer. It uses default `TreeRenderer` but overrides default node renderer to render node with custom checkbox */\nconst nodeWithEyeCheckboxTreeRenderer = (props: TreeRendererProps) => (\n <TreeRenderer\n {...props}\n nodeRenderer={nodeWithEyeCheckboxRenderer}\n />\n);\n\nfunction useTreeFiltering(\n dataProvider: ITreeDataProvider,\n filter: string,\n) {\n const nodeLoader = useFilteredProvider(dataProvider, filter);\n const nodeHighlightingProps = useNodeHighlightingProps(filter);\n return {\n nodeLoader,\n modelSource: nodeLoader.modelSource,\n nodeHighlightingProps,\n };\n}\n\nfunction useFilteredProvider(\n dataProvider: ITreeDataProvider,\n filter: string,\n) {\n const filteredProvider = React.useMemo(() => {\n return new FilteredTreeDataProvider(dataProvider, filter);\n }, [dataProvider, filter]);\n\n const nodeLoader = React.useMemo(() => {\n return new TreeNodeLoader(filteredProvider, new TreeModelSource());\n }, [filteredProvider]);\n\n return nodeLoader;\n}\n\nfunction useNodeHighlightingProps(\n filter: string,\n) {\n const [nodeHighlightingProps, setNodeHighlightingProps] = React.useState<HighlightableTreeProps>();\n\n React.useEffect(() => {\n if (filter === \"\") {\n setNodeHighlightingProps(undefined);\n return;\n }\n setNodeHighlightingProps({\n searchText: filter,\n activeMatch: undefined,\n });\n }, [filter]);\n\n return nodeHighlightingProps;\n}\n\nclass FullTreeHierarchy {\n private _dataProvider: ITreeDataProvider;\n private _hierarchy = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider) {\n this._dataProvider = dataProvider;\n\n this._init = (async () => {\n await this.initNode();\n })();\n }\n\n private async initNode(parent?: TreeNodeItem) {\n const nodes = await this._dataProvider.getNodes(parent);\n this._hierarchy.set(parent?.id, nodes);\n for (const node of nodes) {\n await this.initNode(node);\n }\n }\n\n public async getHierarchy() {\n await this._init;\n return this._hierarchy;\n }\n}\n\nclass FilteredTreeHierarchy {\n private _fullHierarchy: FullTreeHierarchy;\n private _filter: string;\n private _filtered = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider, filter: string) {\n this._fullHierarchy = new FullTreeHierarchy(dataProvider);\n this._filter = filter;\n\n this._init = (async () => {\n await this.init();\n })();\n }\n\n private async init() {\n const hierarchy = await this._fullHierarchy.getHierarchy();\n if (this._filter === \"\") {\n this._filtered = hierarchy;\n return;\n }\n this.filterNodes(hierarchy);\n }\n\n /** Initializes `this._filtered` field. Returns a node if it matches a filter. */\n private filterNodes(hierarchy: Map<string | undefined, DelayLoadedTreeNodeItem[]>, current?: DelayLoadedTreeNodeItem): DelayLoadedTreeNodeItem | undefined {\n const matches = current ? this.matchesFilter(current) : false;\n const children = hierarchy.get(current?.id);\n if (!children)\n return matches ? current : undefined;\n\n const matchedChildren = new Array<DelayLoadedTreeNodeItem>();\n for (const child of children) {\n const matchedChild = this.filterNodes(hierarchy, child);\n matchedChild && matchedChildren.push(matchedChild);\n }\n\n const hasChildren = matchedChildren.length > 0;\n const included = matches || hasChildren;\n let filtered: DelayLoadedTreeNodeItem | undefined;\n if (included) {\n this._filtered.set(current?.id, matchedChildren);\n\n // Return a modified copy of current node (to persist initial hierarchy when filter is cleared).\n if (current) {\n filtered = {\n ...current,\n hasChildren,\n autoExpand: hasChildren ? true : current.autoExpand,\n };\n }\n }\n return filtered;\n }\n\n private matchesFilter(node: TreeNodeItem) {\n if (node.label.value.valueFormat !== PropertyValueFormat.Primitive)\n return false;\n\n const value = node.label.value.displayValue?.toLowerCase();\n if (!value)\n return false;\n return value.includes(this._filter.toLowerCase());\n }\n\n public async getHierarchy() {\n await this._init;\n return this._filtered;\n }\n}\n\nclass FilteredTreeDataProvider implements ITreeDataProvider {\n private _hierarchy: FilteredTreeHierarchy;\n\n public constructor(\n parentDataProvider: ITreeDataProvider,\n filter: string,\n ) {\n this._hierarchy = new FilteredTreeHierarchy(parentDataProvider, filter);\n }\n\n public async getNodes(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes || [];\n }\n\n public async getNodesCount(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes?.length || 0;\n }\n}\n"]}
@@ -65,7 +65,16 @@
65
65
 
66
66
  .map-manager-sublayer-tree-content {
67
67
  flex-grow: 1;
68
- width: "100%";
69
- height: "100%";
70
- overflow: "hidden"
68
+ width: 100%;
69
+ height: 100%;
70
+ overflow: auto;
71
+ }
72
+ .map-manager-sublayer-tree-searchbox {
73
+ padding-top: 3.3px;
74
+ padding-bottom: 3.3px;
75
+
76
+ // We override the default padding of the search box input otherwise it
77
+ // makes the vertical scrollbar of the tree of padded too, and doesnt look good.
78
+ padding-inline: 0px;
79
+ padding-inline-start: 4px;
71
80
  }
@@ -39,15 +39,18 @@
39
39
  "MissingCredentials": "This layer requires credentials to be provided",
40
40
  "Name": "Name",
41
41
  "NameInputPlaceHolder": "Enter Map Name",
42
+ "NoLayersSelected": "Please select at least one layer",
42
43
  "RemoveLayerDefButtonTitle": "Delete layer definition",
43
44
  "RemoveLayerDefDialogMessage": "Are you sure you want to delete {{layerName}} ?",
44
45
  "RemoveLayerDefDialogTitle": "Delete layer definition",
45
46
  "RemoveLayerDefError": "Could not delete map layer definition: {{layerName}}",
46
47
  "RemoveLayerDefSuccess": "Successfully deleted map layer definition: {{layerName}}",
47
48
  "SearchPlaceholder": "Search...",
49
+ "SelectLayersToCreate": "Select layers to be created",
48
50
  "StoreOnModelSettings": "Store on Model Settings",
49
51
  "StoreOnITwinSettings": "Store on iTwin Settings",
50
52
  "TechPreviewBadgeTooltip": "Technology preview",
53
+ "TooManyLayersSelected": "There are currently {{layerCount}} layers selected; Adding too many layers may impact performance.",
51
54
  "Type": "Type",
52
55
  "URL": "URL",
53
56
  "UrlInputPlaceHolder": "Enter Map Source URL",
@@ -64,9 +67,10 @@
64
67
  "NotSupported": "No active viewport or geo-located iModel available.",
65
68
  "NoRangeDefined": "No range is defined for Map Layer",
66
69
  "Start": "Map Layers Extension Loaded",
67
- "MapLayerAttached": "Map layer {{sourceName}} attached from URL: {{sourceUrl}}",
70
+ "MapLayerAttached": "Map layer {{layerNames}} attached",
71
+ "MapLayersAttached": "Map layers ({{sourceName}}) attached",
68
72
  "MapLayerAttachedRequiresAuth": "Map layer {{sourceName}} attached, but requires credentials to be provided",
69
- "MapLayerAttachError": "Error '{{error}}' occurred attaching MapLayer from URL: {{sourceUrl}}",
73
+ "MapLayerAttachError": "Error '{{error}}' occurred attaching MapLayer '{{sourceName}}'",
70
74
  "MapLayerAttachMissingViewOrSource": "Missing view or source",
71
75
  "MapLayerEditError": "Failed to edit '{{layerName}}'",
72
76
  "MapLayerLayerSettingsConversionError": "Conversion to layer settings failed",
@@ -119,6 +123,7 @@
119
123
  "AllOn": "Turn on all Sub-layers",
120
124
  "AllOff": "Turn off all Sub-layers",
121
125
  "Hide": "Hide Sub-layers",
126
+ "NoResults": "No Results",
122
127
  "NoSubLayers": "No Sub-layers Available",
123
128
  "SearchPlaceholder": "Search...",
124
129
  "Show": "Show Sub-layers"
@@ -1 +1 @@
1
- {"version":3,"file":"AttachLayerPopupButton.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.tsx"],"names":[],"mappings":"AAyWA,gBAAgB;AAChB,oBAAY,qBAAqB;IAC/B,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,IAAI,IAAA;CACL;AACD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gBAAgB;AAEhB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,eAiHxE"}
1
+ {"version":3,"file":"AttachLayerPopupButton.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.tsx"],"names":[],"mappings":"AAocA,gBAAgB;AAChB,oBAAY,qBAAqB;IAC/B,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,IAAI,IAAA;CACL;AACD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gBAAgB;AAEhB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,eAkHxE"}
@@ -3,7 +3,7 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import * as React from "react";
6
- import { IModelApp, MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority } from "@itwin/core-frontend";
6
+ import { IModelApp, MapLayerSource, MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority } from "@itwin/core-frontend";
7
7
  import { RelativePosition } from "@itwin/appui-abstract";
8
8
  import * as UiCore from "@itwin/core-react";
9
9
  import { UiFramework } from "@itwin/appui-react";
@@ -13,11 +13,12 @@ import { ConfirmMessageDialog } from "./ConfirmMessageDialog";
13
13
  import { Button, Input } from "@itwin/itwinui-react";
14
14
  import { MapLayerPreferences } from "../../MapLayerPreferences";
15
15
  import { MapLayersUI } from "../../mapLayers";
16
+ import { MapSelectFeaturesDialog } from "./MapSelectFeaturesDialog";
16
17
  // cSpell:ignore droppable Sublayer
17
18
  var LayerAction;
18
19
  (function (LayerAction) {
19
- LayerAction[LayerAction["Attached"] = 0] = "Attached";
20
- LayerAction[LayerAction["Edited"] = 1] = "Edited";
20
+ LayerAction[LayerAction["New"] = 0] = "New";
21
+ LayerAction[LayerAction["Edit"] = 1] = "Edit";
21
22
  })(LayerAction || (LayerAction = {}));
22
23
  // eslint-disable-next-line @typescript-eslint/naming-convention
23
24
  function AttachLayerPanel({ isOverlay, onLayerAttached, onHandleOutsideClick }) {
@@ -60,93 +61,172 @@ function AttachLayerPanel({ isOverlay, onLayerAttached, onHandleOutsideClick })
60
61
  const mapTypesOptions = mapLayerOptions?.mapTypeOptions;
61
62
  const iTwinId = activeViewport?.iModel?.iTwinId;
62
63
  const iModelId = activeViewport?.iModel?.iModelId;
63
- const styleContainsLayer = React.useCallback((name) => {
64
- if (backgroundLayers) {
65
- if (-1 !== backgroundLayers.findIndex((layer) => layer.name === name))
66
- return true;
67
- }
68
- if (overlayLayers) {
69
- if (-1 !== overlayLayers.findIndex((layer) => layer.name === name))
70
- return true;
64
+ const attachLayer = React.useCallback((source, subLayers, oneMapLayerPerSubLayer) => {
65
+ if (activeViewport) {
66
+ const generateUniqueMapLayerName = (layerName) => {
67
+ let uniqueLayerName = layerName;
68
+ let layerNameIdx = 1;
69
+ while ((backgroundLayers && backgroundLayers.some((layer) => uniqueLayerName === layer.name))
70
+ || (overlayLayers && overlayLayers.some((layer) => uniqueLayerName === layer.name))) {
71
+ uniqueLayerName = `${layerName} (${layerNameIdx++})`;
72
+ }
73
+ return { layerNameUpdate: layerNameIdx > 1, uniqueLayerName };
74
+ };
75
+ const doAttachLayer = (layerName, subLayer) => {
76
+ const generatedName = generateUniqueMapLayerName(layerName);
77
+ let sourceToAdd = source;
78
+ if (generatedName.layerNameUpdate || sourceToAdd.name !== generatedName.uniqueLayerName) {
79
+ // create a source with a unique name
80
+ const clonedSource = MapLayerSource.fromJSON({ ...source.toJSON(), name: generatedName.uniqueLayerName });
81
+ if (clonedSource !== undefined) {
82
+ clonedSource.userName = source.userName;
83
+ clonedSource.password = source.password;
84
+ sourceToAdd = clonedSource;
85
+ }
86
+ }
87
+ const settings = sourceToAdd.toLayerSettings(subLayer ? [subLayer] : subLayers);
88
+ if (settings) {
89
+ activeViewport.displayStyle.attachMapLayer({ settings, mapLayerIndex: { index: -1, isOverlay } });
90
+ return generatedName.uniqueLayerName;
91
+ }
92
+ return undefined;
93
+ };
94
+ if (oneMapLayerPerSubLayer && subLayers) {
95
+ const layerNamesAttached = [];
96
+ for (const subLayer of subLayers) {
97
+ const attachedLayerName = doAttachLayer(`${source.name} - ${subLayer.name}`, subLayer);
98
+ if (attachedLayerName !== undefined) {
99
+ layerNamesAttached.push(attachedLayerName);
100
+ }
101
+ }
102
+ if (layerNamesAttached.length > 0) {
103
+ const msg = IModelApp.localization.getLocalizedString("mapLayers:Messages.MapLayersAttached", { layerNames: layerNamesAttached.join(", ") });
104
+ IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));
105
+ }
106
+ }
107
+ else {
108
+ const attachedLayerName = doAttachLayer(source.name);
109
+ if (attachedLayerName !== undefined) {
110
+ const msg = IModelApp.localization.getLocalizedString("mapLayers:Messages.MapLayerAttached", { sourceName: attachedLayerName });
111
+ IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));
112
+ }
113
+ }
114
+ if (isMounted.current) {
115
+ setLoading(false);
116
+ }
71
117
  }
72
- return false;
73
- }, [backgroundLayers, overlayLayers]);
74
- const handleModalUrlDialogOk = React.useCallback((action) => {
75
- if (LayerAction.Attached === action) {
76
- // close popup and refresh UI
77
- onLayerAttached();
118
+ onLayerAttached();
119
+ resumeOutsideClick();
120
+ }, [activeViewport, backgroundLayers, isOverlay, onLayerAttached, overlayLayers, resumeOutsideClick]);
121
+ const handleSelectFeaturesCancel = React.useCallback(() => {
122
+ if (isMounted.current) {
123
+ setLoading(false);
78
124
  }
79
125
  resumeOutsideClick();
80
- }, [onLayerAttached, resumeOutsideClick]);
126
+ UiFramework.dialogs.modal.close();
127
+ }, [resumeOutsideClick, setLoading]);
128
+ const handleSelectFeaturesOk = React.useCallback((source, sourceSubLayers, selectedSubLayers) => {
129
+ // keep only visible subLayers
130
+ const visibleSubLayers = selectedSubLayers.filter((value) => value.visible);
131
+ // Re-apply default visibility from the source validation
132
+ visibleSubLayers.forEach((visible) => {
133
+ const found = sourceSubLayers.find((value) => { visible.name === value.name; });
134
+ if (found)
135
+ visible.visible = found?.visible;
136
+ });
137
+ attachLayer(source, visibleSubLayers, true);
138
+ }, [attachLayer]);
139
+ const openFeatureSelectionDialog = React.useCallback((subLayers, source) => {
140
+ // Keep leafs sub-layers and force default visibility to false
141
+ const noGroupLayers = subLayers.filter((value) => value.children === undefined);
142
+ const visibleLayers = noGroupLayers.map((value) => { return { ...value, visible: false }; });
143
+ UiFramework.dialogs.modal.open(React.createElement(MapSelectFeaturesDialog, { handleOk: (selectedLayers) => { handleSelectFeaturesOk(source, subLayers, selectedLayers); }, handleCancel: handleSelectFeaturesCancel, source: source, subLayers: visibleLayers }));
144
+ }, [handleSelectFeaturesCancel, handleSelectFeaturesOk]);
145
+ const needsFeatureSelection = React.useCallback((source, validation) => {
146
+ return (source.formatId === "ArcGISFeature" || source.formatId === "WMTS") // TODO, replace this with a flag in MapLayerSourceStatus
147
+ && validation.subLayers
148
+ && validation.subLayers.length > 1;
149
+ }, []);
150
+ const handleModalUrlDialogOk = React.useCallback((action, sourceState) => {
151
+ UiFramework.dialogs.modal.close();
152
+ if (LayerAction.New === action
153
+ && sourceState
154
+ && (sourceState.validation.status === MapLayerSourceStatus.Valid)) {
155
+ if (needsFeatureSelection(sourceState.source, sourceState.validation)) {
156
+ openFeatureSelectionDialog(sourceState.validation.subLayers, sourceState.source);
157
+ }
158
+ else {
159
+ attachLayer(sourceState.source, sourceState.validation.subLayers, false);
160
+ }
161
+ }
162
+ else {
163
+ resumeOutsideClick();
164
+ }
165
+ }, [attachLayer, needsFeatureSelection, openFeatureSelectionDialog, resumeOutsideClick]);
81
166
  const handleModalUrlDialogCancel = React.useCallback(() => {
82
167
  // close popup and refresh UI
83
168
  setLoading(false);
84
169
  UiFramework.dialogs.modal.close();
85
170
  resumeOutsideClick();
86
- }, [resumeOutsideClick]);
171
+ }, [setLoading, resumeOutsideClick]);
87
172
  React.useEffect(() => {
88
- async function attemptToAddLayer(layerName) {
89
- if (layerName && activeViewport) {
173
+ async function attemptToAddLayer() {
174
+ if (layerNameToAdd && activeViewport) {
90
175
  // if the layer is not in the style add it now.
91
- if (undefined === backgroundLayers?.find((layer) => layerName === layer.name) && undefined === overlayLayers?.find((layer) => layerName === layer.name)) {
92
- const mapLayerSettings = sources?.find((source) => source.name === layerName);
93
- if (mapLayerSettings === undefined) {
94
- return;
176
+ const mapLayerSettings = sources?.find((source) => source.name === layerNameToAdd);
177
+ if (mapLayerSettings === undefined) {
178
+ return;
179
+ }
180
+ try {
181
+ if (isMounted.current) {
182
+ setLoading(true);
95
183
  }
96
- try {
97
- if (isMounted.current) {
98
- setLoading(true);
99
- }
100
- const { status, subLayers } = await mapLayerSettings.validateSource();
101
- if (status === MapLayerSourceStatus.Valid || status === MapLayerSourceStatus.RequireAuth) {
102
- if (status === MapLayerSourceStatus.Valid) {
103
- const settings = mapLayerSettings.toLayerSettings(subLayers);
104
- if (settings) {
105
- activeViewport.displayStyle.attachMapLayer({ settings, mapLayerIndex: { index: -1, isOverlay } });
106
- const msg = IModelApp.localization.getLocalizedString("mapLayers:Messages.MapLayerAttached", { sourceName: settings.name, sourceUrl: settings.url });
107
- IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));
108
- }
109
- if (isMounted.current) {
110
- setLoading(false);
111
- }
112
- if (onLayerAttached) {
113
- onLayerAttached();
114
- }
115
- }
116
- else if (status === MapLayerSourceStatus.RequireAuth && isMounted.current) {
117
- UiFramework.dialogs.modal.open(React.createElement(MapUrlDialog, { activeViewport: activeViewport, isOverlay: isOverlay, layerRequiringCredentials: mapLayerSettings.toJSON(), onOkResult: () => handleModalUrlDialogOk(LayerAction.Attached), onCancelResult: handleModalUrlDialogCancel, mapTypesOptions: mapTypesOptions }));
184
+ const sourceValidation = await mapLayerSettings.validateSource();
185
+ if (sourceValidation.status === MapLayerSourceStatus.Valid || sourceValidation.status === MapLayerSourceStatus.RequireAuth) {
186
+ if (sourceValidation.status === MapLayerSourceStatus.Valid) {
187
+ if (sourceValidation.subLayers && needsFeatureSelection(mapLayerSettings, sourceValidation)) {
188
+ openFeatureSelectionDialog(sourceValidation.subLayers, mapLayerSettings);
118
189
  if (onHandleOutsideClick) {
119
190
  onHandleOutsideClick(false);
120
191
  }
121
192
  }
193
+ else {
194
+ attachLayer(mapLayerSettings, sourceValidation.subLayers, false);
195
+ }
122
196
  }
123
- else {
124
- const msg = IModelApp.localization.getLocalizedString("mapLayers:Messages.MapLayerValidationFailed", { sourceUrl: mapLayerSettings.url });
125
- IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));
126
- if (isMounted.current) {
127
- setLoading(false);
197
+ else if (sourceValidation.status === MapLayerSourceStatus.RequireAuth && isMounted.current) {
198
+ UiFramework.dialogs.modal.open(React.createElement(MapUrlDialog, { activeViewport: activeViewport, isOverlay: isOverlay, layerRequiringCredentials: mapLayerSettings.toJSON(), onOkResult: (sourceState) => handleModalUrlDialogOk(LayerAction.New, sourceState), onCancelResult: handleModalUrlDialogCancel, mapTypesOptions: mapTypesOptions }));
199
+ if (onHandleOutsideClick) {
200
+ onHandleOutsideClick(false);
128
201
  }
129
202
  }
130
203
  }
131
- catch (err) {
204
+ else {
205
+ const msg = IModelApp.localization.getLocalizedString("mapLayers:Messages.MapLayerValidationFailed", { sourceUrl: mapLayerSettings.url });
206
+ IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));
132
207
  if (isMounted.current) {
133
208
  setLoading(false);
134
209
  }
135
- const msg = IModelApp.localization.getLocalizedString("mapLayers:Messages.MapLayerAttachError", { error: err, sourceUrl: mapLayerSettings.url });
136
- IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));
137
210
  }
138
211
  }
212
+ catch (err) {
213
+ if (isMounted.current) {
214
+ setLoading(false);
215
+ }
216
+ const msg = IModelApp.localization.getLocalizedString("mapLayers:Messages.MapLayerAttachError", { error: err, sourceName: mapLayerSettings.name });
217
+ IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));
218
+ }
139
219
  }
140
220
  return;
141
221
  }
142
- if (layerNameToAdd) {
143
- attemptToAddLayer(layerNameToAdd); // eslint-disable-line @typescript-eslint/no-floating-promises
144
- if (isMounted.current) {
145
- setLayerNameToAdd(undefined);
146
- }
222
+ attemptToAddLayer(); // eslint-disable-line @typescript-eslint/no-floating-promises
223
+ if (isMounted.current) {
224
+ setLayerNameToAdd(undefined);
147
225
  }
148
- }, [setLayerNameToAdd, layerNameToAdd, activeViewport, sources, backgroundLayers, isOverlay, overlayLayers, onLayerAttached, handleModalUrlDialogOk, mapTypesOptions, handleModalUrlDialogCancel, onHandleOutsideClick]);
149
- const options = React.useMemo(() => sources?.filter((source) => !styleContainsLayer(source.name)), [sources, styleContainsLayer]);
226
+ }, [attachLayer, needsFeatureSelection, setLayerNameToAdd, layerNameToAdd, activeViewport, sources, backgroundLayers, isOverlay, overlayLayers,
227
+ onLayerAttached, handleModalUrlDialogOk, handleSelectFeaturesCancel, handleSelectFeaturesOk, mapTypesOptions,
228
+ handleModalUrlDialogCancel, onHandleOutsideClick, openFeatureSelectionDialog]);
229
+ const options = React.useMemo(() => sources, [sources]);
150
230
  const filteredOptions = React.useMemo(() => {
151
231
  if (undefined === sourceFilterString || 0 === sourceFilterString.length) {
152
232
  return options;
@@ -156,7 +236,7 @@ function AttachLayerPanel({ isOverlay, onLayerAttached, onHandleOutsideClick })
156
236
  }
157
237
  }, [options, sourceFilterString]);
158
238
  const handleAddNewMapSource = React.useCallback(() => {
159
- UiFramework.dialogs.modal.open(React.createElement(MapUrlDialog, { activeViewport: activeViewport, isOverlay: isOverlay, onOkResult: () => handleModalUrlDialogOk(LayerAction.Attached), onCancelResult: handleModalUrlDialogCancel, mapTypesOptions: mapTypesOptions }));
239
+ UiFramework.dialogs.modal.open(React.createElement(MapUrlDialog, { activeViewport: activeViewport, isOverlay: isOverlay, onOkResult: (result) => handleModalUrlDialogOk(LayerAction.New, result), onCancelResult: handleModalUrlDialogCancel, mapTypesOptions: mapTypesOptions }));
160
240
  if (onHandleOutsideClick) {
161
241
  onHandleOutsideClick(false);
162
242
  }
@@ -221,7 +301,7 @@ function AttachLayerPanel({ isOverlay, onLayerAttached, onHandleOutsideClick })
221
301
  if (matchingSource === undefined) {
222
302
  return;
223
303
  }
224
- UiFramework.dialogs.modal.open(React.createElement(MapUrlDialog, { activeViewport: activeViewport, isOverlay: isOverlay, mapLayerSourceToEdit: matchingSource, onOkResult: () => handleModalUrlDialogOk(LayerAction.Edited), onCancelResult: handleModalUrlDialogCancel, mapTypesOptions: mapTypesOptions }));
304
+ UiFramework.dialogs.modal.open(React.createElement(MapUrlDialog, { activeViewport: activeViewport, isOverlay: isOverlay, mapLayerSourceToEdit: matchingSource, onOkResult: (result) => handleModalUrlDialogOk(LayerAction.Edit, result), onCancelResult: handleModalUrlDialogCancel, mapTypesOptions: mapTypesOptions }));
225
305
  if (onHandleOutsideClick) {
226
306
  onHandleOutsideClick(false);
227
307
  }
@@ -324,7 +404,7 @@ export function AttachLayerPopupButton(props) {
324
404
  }
325
405
  return (React.createElement(React.Fragment, null,
326
406
  renderButton(),
327
- React.createElement(UiCore.Popup, { isOpen: popupOpen, position: RelativePosition.BottomRight, onClose: handleClosePopup, onOutsideClick: onHandleOutsideClick, target: buttonRef.current, closeOnEnter: false, closeOnContextMenu: false },
407
+ React.createElement(UiCore.Popup, { isOpen: popupOpen, position: RelativePosition.BottomRight, onClose: handleClosePopup, onOutsideClick: onHandleOutsideClick, closeOnWheel: false, target: buttonRef.current, closeOnEnter: false, closeOnContextMenu: false },
328
408
  React.createElement("div", { ref: panelRef, className: "map-sources-popup-panel" },
329
409
  React.createElement(AttachLayerPanel, { isOverlay: props.isOverlay, onLayerAttached: handleLayerAttached, onHandleOutsideClick: setHandleOutsideClick })))));
330
410
  }