@itwin/map-layers 4.0.0-dev.4 → 4.0.0-dev.40

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 (82) hide show
  1. package/CHANGELOG.md +21 -5
  2. package/lib/cjs/MapLayerPreferences.js +1 -2
  3. package/lib/cjs/MapLayerPreferences.js.map +1 -1
  4. package/lib/cjs/mapLayers.js +10 -12
  5. package/lib/cjs/mapLayers.js.map +1 -1
  6. package/lib/cjs/ui/FeatureInfoUiItemsProvider.js +1 -2
  7. package/lib/cjs/ui/FeatureInfoUiItemsProvider.js.map +1 -1
  8. package/lib/cjs/ui/MapFeatureInfoTool.d.ts.map +1 -1
  9. package/lib/cjs/ui/MapFeatureInfoTool.js +1 -1
  10. package/lib/cjs/ui/MapFeatureInfoTool.js.map +1 -1
  11. package/lib/cjs/ui/MapLayersUiItemsProvider.js +1 -1
  12. package/lib/cjs/ui/MapLayersUiItemsProvider.js.map +1 -1
  13. package/lib/cjs/ui/widget/AttachLayerPopupButton.js +20 -23
  14. package/lib/cjs/ui/widget/AttachLayerPopupButton.js.map +1 -1
  15. package/lib/cjs/ui/widget/BasemapPanel.js +4 -4
  16. package/lib/cjs/ui/widget/BasemapPanel.js.map +1 -1
  17. package/lib/cjs/ui/widget/ConfirmMessageDialog.js +4 -7
  18. package/lib/cjs/ui/widget/ConfirmMessageDialog.js.map +1 -1
  19. package/lib/cjs/ui/widget/FeatureInfoDataProvider.js +3 -4
  20. package/lib/cjs/ui/widget/FeatureInfoDataProvider.js.map +1 -1
  21. package/lib/cjs/ui/widget/FeatureInfoWidget.js +10 -16
  22. package/lib/cjs/ui/widget/FeatureInfoWidget.js.map +1 -1
  23. package/lib/cjs/ui/widget/MapLayerDroppable.js +4 -7
  24. package/lib/cjs/ui/widget/MapLayerDroppable.js.map +1 -1
  25. package/lib/cjs/ui/widget/MapLayerManager.js +17 -19
  26. package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
  27. package/lib/cjs/ui/widget/MapLayerSettingsMenu.js +2 -3
  28. package/lib/cjs/ui/widget/MapLayerSettingsMenu.js.map +1 -1
  29. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js +2 -2
  30. package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
  31. package/lib/cjs/ui/widget/MapLayersWidget.js +4 -4
  32. package/lib/cjs/ui/widget/MapLayersWidget.js.map +1 -1
  33. package/lib/cjs/ui/widget/MapUrlDialog.d.ts.map +1 -1
  34. package/lib/cjs/ui/widget/MapUrlDialog.js +35 -32
  35. package/lib/cjs/ui/widget/MapUrlDialog.js.map +1 -1
  36. package/lib/cjs/ui/widget/SelectMapFormat.js +7 -12
  37. package/lib/cjs/ui/widget/SelectMapFormat.js.map +1 -1
  38. package/lib/cjs/ui/widget/SubLayersDataProvider.js +4 -5
  39. package/lib/cjs/ui/widget/SubLayersDataProvider.js.map +1 -1
  40. package/lib/cjs/ui/widget/SubLayersTree.js +28 -34
  41. package/lib/cjs/ui/widget/SubLayersTree.js.map +1 -1
  42. package/lib/esm/MapLayerPreferences.js +1 -2
  43. package/lib/esm/MapLayerPreferences.js.map +1 -1
  44. package/lib/esm/mapLayers.js +10 -12
  45. package/lib/esm/mapLayers.js.map +1 -1
  46. package/lib/esm/ui/FeatureInfoUiItemsProvider.js +1 -2
  47. package/lib/esm/ui/FeatureInfoUiItemsProvider.js.map +1 -1
  48. package/lib/esm/ui/MapFeatureInfoTool.d.ts.map +1 -1
  49. package/lib/esm/ui/MapFeatureInfoTool.js +2 -2
  50. package/lib/esm/ui/MapFeatureInfoTool.js.map +1 -1
  51. package/lib/esm/ui/MapLayersUiItemsProvider.js +1 -1
  52. package/lib/esm/ui/MapLayersUiItemsProvider.js.map +1 -1
  53. package/lib/esm/ui/widget/AttachLayerPopupButton.js +21 -24
  54. package/lib/esm/ui/widget/AttachLayerPopupButton.js.map +1 -1
  55. package/lib/esm/ui/widget/BasemapPanel.js +5 -5
  56. package/lib/esm/ui/widget/BasemapPanel.js.map +1 -1
  57. package/lib/esm/ui/widget/ConfirmMessageDialog.js +4 -7
  58. package/lib/esm/ui/widget/ConfirmMessageDialog.js.map +1 -1
  59. package/lib/esm/ui/widget/FeatureInfoDataProvider.js +3 -4
  60. package/lib/esm/ui/widget/FeatureInfoDataProvider.js.map +1 -1
  61. package/lib/esm/ui/widget/FeatureInfoWidget.js +10 -16
  62. package/lib/esm/ui/widget/FeatureInfoWidget.js.map +1 -1
  63. package/lib/esm/ui/widget/MapLayerDroppable.js +5 -8
  64. package/lib/esm/ui/widget/MapLayerDroppable.js.map +1 -1
  65. package/lib/esm/ui/widget/MapLayerManager.js +17 -19
  66. package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
  67. package/lib/esm/ui/widget/MapLayerSettingsMenu.js +2 -3
  68. package/lib/esm/ui/widget/MapLayerSettingsMenu.js.map +1 -1
  69. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js +2 -2
  70. package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
  71. package/lib/esm/ui/widget/MapLayersWidget.js +4 -4
  72. package/lib/esm/ui/widget/MapLayersWidget.js.map +1 -1
  73. package/lib/esm/ui/widget/MapUrlDialog.d.ts.map +1 -1
  74. package/lib/esm/ui/widget/MapUrlDialog.js +36 -33
  75. package/lib/esm/ui/widget/MapUrlDialog.js.map +1 -1
  76. package/lib/esm/ui/widget/SelectMapFormat.js +7 -12
  77. package/lib/esm/ui/widget/SelectMapFormat.js.map +1 -1
  78. package/lib/esm/ui/widget/SubLayersDataProvider.js +4 -5
  79. package/lib/esm/ui/widget/SubLayersDataProvider.js.map +1 -1
  80. package/lib/esm/ui/widget/SubLayersTree.js +28 -34
  81. package/lib/esm/ui/widget/SubLayersTree.js.map +1 -1
  82. package/package.json +27 -27
@@ -1 +1 @@
1
- {"version":3,"file":"SubLayersDataProvider.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersDataProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { BeEvent, compareStringsOrUndefined } from \"@itwin/core-bentley\";\r\nimport { MapSubLayerProps, SubLayerId } from \"@itwin/core-common\";\r\nimport { PropertyRecord } from \"@itwin/appui-abstract\";\r\nimport { DelayLoadedTreeNodeItem, ITreeDataProvider, TreeDataChangesListener, TreeNodeItem } from \"@itwin/components-react\";\r\nimport { CheckBoxState } from \"@itwin/core-react\";\r\nimport { StyleMapLayerSettings } from \"../Interfaces\";\r\n\r\n/**\r\n * Data provider that returns some fake nodes to show in tree.\r\n */\r\nexport class SubLayersDataProvider implements ITreeDataProvider {\r\n private readonly _nodeMap = new Map<string, TreeNodeItem[]>();\r\n private readonly _mapLayer: StyleMapLayerSettings;\r\n\r\n constructor(mapLayer: StyleMapLayerSettings) {\r\n this._mapLayer = mapLayer;\r\n this.loadNodes(mapLayer.subLayers);\r\n }\r\n\r\n public static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\r\n if (!subLayer)\r\n return false;\r\n\r\n return (!subLayer.name || subLayer.name.length === 0) && (subLayer.children !== undefined && subLayer.children.length > 0);\r\n }\r\n\r\n private createId(props: MapSubLayerProps): string {\r\n return undefined !== props.id ? `${props.id}` : props.name ? props.name : \"no-id\";\r\n }\r\n\r\n private createNode(props: MapSubLayerProps, expanded?: boolean, isCheckboxDisabled?: boolean, icon?: string): DelayLoadedTreeNodeItem {\r\n return {\r\n id: this.createId(props),\r\n label: PropertyRecord.fromString(props.title ?? props.name ?? \"unknown\"),\r\n hasChildren: !!props.children,\r\n isCheckboxVisible: true,\r\n checkBoxState: props.visible && !isCheckboxDisabled ? CheckBoxState.On : CheckBoxState.Off,\r\n extendedData: { subLayerId: props.id },\r\n isCheckboxDisabled,\r\n autoExpand: expanded,\r\n icon,\r\n };\r\n }\r\n\r\n private loadChildNodes(allSubLayers: MapSubLayerProps[], parentId?: SubLayerId) {\r\n const filteredProps = allSubLayers.filter((props) => parentId === props.parent);\r\n if (filteredProps.length) {\r\n filteredProps?.sort((a: MapSubLayerProps, b: MapSubLayerProps) => compareStringsOrUndefined(a.title, b.title));\r\n const treeNodes: TreeNodeItem[] = [];\r\n\r\n filteredProps.forEach((props) => {\r\n treeNodes.push(this.createNode(props,\r\n (!parentId && props?.children !== undefined) ? true : undefined, // expand root group only (i.e. not the entire tree),\r\n undefined,\r\n SubLayersDataProvider.isUnnamedGroup(props) ? \"icon-folder\" : \"icon-layers\"\r\n\r\n ));\r\n if (props.children)\r\n this.loadChildNodes(allSubLayers, props.id);\r\n });\r\n\r\n this._nodeMap.set(undefined !== parentId ? `${parentId}` : \"\", treeNodes);\r\n }\r\n }\r\n\r\n private loadNodes(subLayerNodes: MapSubLayerProps[] | undefined) {\r\n subLayerNodes?.sort((a: MapSubLayerProps, b: MapSubLayerProps) => compareStringsOrUndefined(a.title, b.title));\r\n if (subLayerNodes) {\r\n this.loadChildNodes(subLayerNodes, undefined);\r\n }\r\n }\r\n\r\n public onTreeNodeChanged = new BeEvent<TreeDataChangesListener>();\r\n\r\n public async getNodesCount(parent?: TreeNodeItem) {\r\n const nodeArray: TreeNodeItem[] | undefined = parent ? this._nodeMap.get(parent.id) : this._nodeMap.get(\"\");\r\n if (nodeArray)\r\n return nodeArray.length;\r\n\r\n return 0;\r\n }\r\n\r\n public async getNodes(parent?: TreeNodeItem) {\r\n const nodeArray: TreeNodeItem[] | undefined = parent ? this._nodeMap.get(parent.id) : this._nodeMap.get(\"\");\r\n if (nodeArray)\r\n return nodeArray;\r\n\r\n return [];\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SubLayersDataProvider.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersDataProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { BeEvent, compareStringsOrUndefined } from \"@itwin/core-bentley\";\r\nimport { MapSubLayerProps, SubLayerId } from \"@itwin/core-common\";\r\nimport { PropertyRecord } from \"@itwin/appui-abstract\";\r\nimport { DelayLoadedTreeNodeItem, ITreeDataProvider, TreeDataChangesListener, TreeNodeItem } from \"@itwin/components-react\";\r\nimport { CheckBoxState } from \"@itwin/core-react\";\r\nimport { StyleMapLayerSettings } from \"../Interfaces\";\r\n\r\n/**\r\n * Data provider that returns some fake nodes to show in tree.\r\n */\r\nexport class SubLayersDataProvider implements ITreeDataProvider {\r\n private readonly _nodeMap = new Map<string, TreeNodeItem[]>();\r\n private readonly _mapLayer: StyleMapLayerSettings;\r\n\r\n constructor(mapLayer: StyleMapLayerSettings) {\r\n this._mapLayer = mapLayer;\r\n this.loadNodes(mapLayer.subLayers);\r\n }\r\n\r\n public static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\r\n if (!subLayer)\r\n return false;\r\n\r\n return (!subLayer.name || subLayer.name.length === 0) && (subLayer.children !== undefined && subLayer.children.length > 0);\r\n }\r\n\r\n private createId(props: MapSubLayerProps): string {\r\n return undefined !== props.id ? `${props.id}` : props.name ? props.name : \"no-id\";\r\n }\r\n\r\n private createNode(props: MapSubLayerProps, expanded?: boolean, isCheckboxDisabled?: boolean, icon?: string): DelayLoadedTreeNodeItem {\r\n return {\r\n id: this.createId(props),\r\n label: PropertyRecord.fromString(props.title ?? props.name ?? \"unknown\"),\r\n hasChildren: !!props.children,\r\n isCheckboxVisible: true,\r\n checkBoxState: props.visible && !isCheckboxDisabled ? CheckBoxState.On : CheckBoxState.Off,\r\n extendedData: { subLayerId: props.id },\r\n isCheckboxDisabled,\r\n autoExpand: expanded,\r\n icon,\r\n };\r\n }\r\n\r\n private loadChildNodes(allSubLayers: MapSubLayerProps[], parentId?: SubLayerId) {\r\n const filteredProps = allSubLayers.filter((props) => parentId === props.parent);\r\n if (filteredProps.length) {\r\n filteredProps?.sort((a: MapSubLayerProps, b: MapSubLayerProps) => compareStringsOrUndefined(a.title, b.title));\r\n const treeNodes: TreeNodeItem[] = [];\r\n\r\n filteredProps.forEach((props) => {\r\n treeNodes.push(this.createNode(props,\r\n (!parentId && props?.children !== undefined) ? true : undefined, // expand root group only (i.e. not the entire tree),\r\n undefined,\r\n SubLayersDataProvider.isUnnamedGroup(props) ? \"icon-folder\" : \"icon-layers\"\r\n\r\n ));\r\n if (props.children)\r\n this.loadChildNodes(allSubLayers, props.id);\r\n });\r\n\r\n this._nodeMap.set(undefined !== parentId ? `${parentId}` : \"\", treeNodes);\r\n }\r\n }\r\n\r\n private loadNodes(subLayerNodes: MapSubLayerProps[] | undefined) {\r\n subLayerNodes?.sort((a: MapSubLayerProps, b: MapSubLayerProps) => compareStringsOrUndefined(a.title, b.title));\r\n if (subLayerNodes) {\r\n this.loadChildNodes(subLayerNodes, undefined);\r\n }\r\n }\r\n\r\n public onTreeNodeChanged = new BeEvent<TreeDataChangesListener>();\r\n\r\n public async getNodesCount(parent?: TreeNodeItem) {\r\n const nodeArray: TreeNodeItem[] | undefined = parent ? this._nodeMap.get(parent.id) : this._nodeMap.get(\"\");\r\n if (nodeArray)\r\n return nodeArray.length;\r\n\r\n return 0;\r\n }\r\n\r\n public async getNodes(parent?: TreeNodeItem) {\r\n const nodeArray: TreeNodeItem[] | undefined = parent ? this._nodeMap.get(parent.id) : this._nodeMap.get(\"\");\r\n if (nodeArray)\r\n return nodeArray;\r\n\r\n return [];\r\n }\r\n}\r\n"]}
@@ -21,14 +21,13 @@ const getWindow = () => {
21
21
  const useResizeObserver = (onResize) => {
22
22
  const resizeObserver = React.useRef();
23
23
  const elementRef = React.useCallback((element) => {
24
- var _a, _b, _c;
25
- if (!((_a = getWindow()) === null || _a === void 0 ? void 0 : _a.ResizeObserver)) {
24
+ if (!getWindow()?.ResizeObserver) {
26
25
  return;
27
26
  }
28
- (_b = resizeObserver.current) === null || _b === void 0 ? void 0 : _b.disconnect();
27
+ resizeObserver.current?.disconnect();
29
28
  if (element) {
30
29
  resizeObserver.current = new ResizeObserver(([{ contentRect }]) => onResize(contentRect));
31
- (_c = resizeObserver.current) === null || _c === void 0 ? void 0 : _c.observe(element);
30
+ resizeObserver.current?.observe(element);
32
31
  }
33
32
  }, [onResize]);
34
33
  return [elementRef, resizeObserver.current];
@@ -86,7 +85,6 @@ function getStyleMapLayerSettings(settings, isOverlay, layerIndex, treeVisibilit
86
85
  */
87
86
  // eslint-disable-next-line @typescript-eslint/naming-convention
88
87
  function SubLayersTree(props) {
89
- var _a;
90
88
  const [placeholderLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:SubLayers.SearchPlaceholder"));
91
89
  const [allOnLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:SubLayers.AllOn"));
92
90
  const [allOffLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:SubLayers.AllOff"));
@@ -106,7 +104,7 @@ function SubLayersTree(props) {
106
104
  const treeModel = (0, components_react_1.useTreeModel)(modelSource);
107
105
  const showAll = React.useCallback(async () => {
108
106
  const vp = core_frontend_1.IModelApp.viewManager.selectedView;
109
- const displayStyle = vp === null || vp === void 0 ? void 0 : vp.displayStyle;
107
+ const displayStyle = vp?.displayStyle;
110
108
  if (displayStyle && vp) {
111
109
  const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(mapLayer.name, mapLayer.source, mapLayer.isOverlay) : -1;
112
110
  displayStyle.changeMapSubLayerProps({ visible: true }, -1, indexInDisplayStyle, mapLayer.isOverlay);
@@ -122,7 +120,7 @@ function SubLayersTree(props) {
122
120
  }, [mapLayer]);
123
121
  const hideAll = React.useCallback(async () => {
124
122
  const vp = core_frontend_1.IModelApp.viewManager.selectedView;
125
- const displayStyle = vp === null || vp === void 0 ? void 0 : vp.displayStyle;
123
+ const displayStyle = vp?.displayStyle;
126
124
  if (displayStyle && vp) {
127
125
  const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(mapLayer.name, mapLayer.source, mapLayer.isOverlay) : -1;
128
126
  displayStyle.changeMapSubLayerProps({ visible: false }, -1, indexInDisplayStyle, mapLayer.isOverlay);
@@ -140,7 +138,7 @@ function SubLayersTree(props) {
140
138
  const { width, height, ref: containerRef } = useResizeDetector();
141
139
  return React.createElement(React.Fragment, null,
142
140
  React.createElement("div", { className: "map-manager-sublayer-tree" },
143
- React.createElement(Toolbar, { searchField: React.createElement(itwinui_react_1.Input, { type: "text", className: "map-manager-source-list-filter", placeholder: placeholderLabel, value: layerFilterString, onChange: handleFilterTextChanged, size: "small" }) }, ((_a = mapLayer.provider) === null || _a === void 0 ? void 0 : _a.mutualExclusiveSubLayer) ? undefined : [
141
+ React.createElement(Toolbar, { searchField: React.createElement(itwinui_react_1.Input, { type: "text", className: "map-manager-source-list-filter", placeholder: placeholderLabel, value: layerFilterString, onChange: handleFilterTextChanged, size: "small" }) }, mapLayer.provider?.mutualExclusiveSubLayer ? undefined : [
144
142
  React.createElement(itwinui_react_1.Button, { size: "small", styleType: "borderless", key: "show-all-btn", title: allOnLabel, onClick: showAll },
145
143
  React.createElement(core_react_1.WebFontIcon, { iconName: "icon-visibility" })),
146
144
  React.createElement(itwinui_react_1.Button, { size: "small", styleType: "borderless", key: "hide-all-btn", title: allOffLabel, onClick: hideAll },
@@ -197,10 +195,10 @@ class SubLayerCheckboxHandler extends components_react_1.TreeEventHandler {
197
195
  }
198
196
  applyMutualExclusiveState(model, nodeId) {
199
197
  const changedNode = model.getNode(nodeId);
200
- if ((changedNode === null || changedNode === void 0 ? void 0 : changedNode.checkbox.state) === core_react_1.CheckBoxState.Off)
198
+ if (changedNode?.checkbox.state === core_react_1.CheckBoxState.Off)
201
199
  return;
202
200
  for (const node of model.iterateTreeModelNodes()) {
203
- if (node.id === (changedNode === null || changedNode === void 0 ? void 0 : changedNode.id))
201
+ if (node.id === changedNode?.id)
204
202
  continue;
205
203
  if (node && node.checkbox.state === core_react_1.CheckBoxState.On)
206
204
  node.checkbox.state = core_react_1.CheckBoxState.Off;
@@ -213,7 +211,6 @@ class SubLayerCheckboxHandler extends components_react_1.TreeEventHandler {
213
211
  }
214
212
  // Ensure the state of changed node matches the state of its parent.
215
213
  syncNodeStateWithParent(model, changedNode) {
216
- var _a, _b, _c, _d, _e, _f;
217
214
  // Lookup node parent. If non exists, I assume thats the root node,
218
215
  // and it must have a proper initial state.
219
216
  const parentNode = changedNode.parentId ? model.getNode(changedNode.parentId) : undefined;
@@ -221,8 +218,8 @@ class SubLayerCheckboxHandler extends components_react_1.TreeEventHandler {
221
218
  return;
222
219
  if (!changedNode.checkbox)
223
220
  return; // don't see why this would happen, but if there is no checkbox, we cant do much here.
224
- const parentLayerId = undefined !== ((_a = parentNode.item.extendedData) === null || _a === void 0 ? void 0 : _a.subLayerId) ? (_b = parentNode.item.extendedData) === null || _b === void 0 ? void 0 : _b.subLayerId : parentNode.item.id;
225
- const parentSubLayer = (_c = this._mapLayer.subLayers) === null || _c === void 0 ? void 0 : _c.find((subLayer) => subLayer.id === parentLayerId);
221
+ const parentLayerId = undefined !== parentNode.item.extendedData?.subLayerId ? parentNode.item.extendedData?.subLayerId : parentNode.item.id;
222
+ const parentSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === parentLayerId);
226
223
  // If parent is disabled, then children must be too.
227
224
  // Also, Non-visible unnamed group must have their children disabled (unamed groups have visibility inherence)
228
225
  if (parentNode.checkbox.isDisabled || (SubLayerCheckboxHandler.isUnnamedGroup(parentSubLayer) && parentNode.checkbox.state === core_react_1.CheckBoxState.Off)) {
@@ -231,10 +228,10 @@ class SubLayerCheckboxHandler extends components_react_1.TreeEventHandler {
231
228
  }
232
229
  else {
233
230
  // Visibility state from StyleMapLayerSettings applies
234
- const subLayerId = undefined !== ((_d = changedNode.item.extendedData) === null || _d === void 0 ? void 0 : _d.subLayerId) ? (_e = changedNode.item.extendedData) === null || _e === void 0 ? void 0 : _e.subLayerId : changedNode.item.id;
235
- const foundSubLayer = (_f = this._mapLayer.subLayers) === null || _f === void 0 ? void 0 : _f.find((subLayer) => subLayer.id === subLayerId);
231
+ const subLayerId = undefined !== changedNode.item.extendedData?.subLayerId ? changedNode.item.extendedData?.subLayerId : changedNode.item.id;
232
+ const foundSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === subLayerId);
236
233
  changedNode.checkbox.isDisabled = false;
237
- changedNode.checkbox.state = (foundSubLayer === null || foundSubLayer === void 0 ? void 0 : foundSubLayer.visible) ? core_react_1.CheckBoxState.On : core_react_1.CheckBoxState.Off;
234
+ changedNode.checkbox.state = foundSubLayer?.visible ? core_react_1.CheckBoxState.On : core_react_1.CheckBoxState.Off;
238
235
  }
239
236
  }
240
237
  /** Changes nodes checkboxes states until event is handled or handler is disposed */
@@ -245,22 +242,21 @@ class SubLayerCheckboxHandler extends components_react_1.TreeEventHandler {
245
242
  const selectionHandling = stateChanges.subscribe({
246
243
  next: (changes) => {
247
244
  const vp = core_frontend_1.IModelApp.viewManager.selectedView;
248
- const displayStyle = vp === null || vp === void 0 ? void 0 : vp.displayStyle;
245
+ const displayStyle = vp?.displayStyle;
249
246
  const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(this._mapLayer.name, this._mapLayer.source, this._mapLayer.isOverlay) : -1;
250
247
  changes.forEach((change) => {
251
- var _a, _b, _c, _d, _e;
252
248
  const isSelected = (change.newState === core_react_1.CheckBoxState.On);
253
- const subLayerId = undefined !== ((_a = change.nodeItem.extendedData) === null || _a === void 0 ? void 0 : _a.subLayerId) ? (_b = change.nodeItem.extendedData) === null || _b === void 0 ? void 0 : _b.subLayerId : change.nodeItem.id;
249
+ const subLayerId = undefined !== change.nodeItem.extendedData?.subLayerId ? change.nodeItem.extendedData?.subLayerId : change.nodeItem.id;
254
250
  // Get the previously visible node if any
255
251
  let prevVisibleLayer;
256
- if ((_c = this._mapLayer.provider) === null || _c === void 0 ? void 0 : _c.mutualExclusiveSubLayer) {
257
- prevVisibleLayer = (_d = this._mapLayer.subLayers) === null || _d === void 0 ? void 0 : _d.find((subLayer) => subLayer.visible && subLayer.id !== subLayerId);
252
+ if (this._mapLayer.provider?.mutualExclusiveSubLayer) {
253
+ prevVisibleLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.visible && subLayer.id !== subLayerId);
258
254
  }
259
255
  // Update sublayer object, otherwise state would get out of sync with DisplayStyle each time the TreeView is re-rendered
260
- const foundSubLayer = (_e = this._mapLayer.subLayers) === null || _e === void 0 ? void 0 : _e.find((subLayer) => subLayer.id === subLayerId);
256
+ const foundSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === subLayerId);
261
257
  if (foundSubLayer)
262
258
  foundSubLayer.visible = isSelected;
263
- if (prevVisibleLayer === null || prevVisibleLayer === void 0 ? void 0 : prevVisibleLayer.visible)
259
+ if (prevVisibleLayer?.visible)
264
260
  prevVisibleLayer.visible = false;
265
261
  // Update displaystyle state
266
262
  if (-1 !== indexInDisplayStyle && displayStyle) {
@@ -270,8 +266,7 @@ class SubLayerCheckboxHandler extends components_react_1.TreeEventHandler {
270
266
  }
271
267
  // Cascade state
272
268
  this.modelSource.modifyModel((model) => {
273
- var _a;
274
- if ((_a = this._mapLayer.provider) === null || _a === void 0 ? void 0 : _a.mutualExclusiveSubLayer)
269
+ if (this._mapLayer.provider?.mutualExclusiveSubLayer)
275
270
  this.applyMutualExclusiveState(model, change.nodeItem.id);
276
271
  this.cascadeStateToAllChildren(model, change.nodeItem.id);
277
272
  });
@@ -281,7 +276,7 @@ class SubLayerCheckboxHandler extends components_react_1.TreeEventHandler {
281
276
  },
282
277
  });
283
278
  // stop handling selection when checkboxes handling is stopped
284
- baseHandling === null || baseHandling === void 0 ? void 0 : baseHandling.add(selectionHandling);
279
+ baseHandling?.add(selectionHandling);
285
280
  return baseHandling;
286
281
  }
287
282
  }
@@ -334,7 +329,7 @@ class FullTreeHierarchy {
334
329
  }
335
330
  async initNode(parent) {
336
331
  const nodes = await this._dataProvider.getNodes(parent);
337
- this._hierarchy.set(parent === null || parent === void 0 ? void 0 : parent.id, nodes);
332
+ this._hierarchy.set(parent?.id, nodes);
338
333
  for (const node of nodes) {
339
334
  await this.initNode(node);
340
335
  }
@@ -364,7 +359,7 @@ class FilteredTreeHierarchy {
364
359
  /** Initializes `this._filtered` field. Returns a node if it matches a filter. */
365
360
  filterNodes(hierarchy, current) {
366
361
  const matches = current ? this.matchesFilter(current) : false;
367
- const children = hierarchy.get(current === null || current === void 0 ? void 0 : current.id);
362
+ const children = hierarchy.get(current?.id);
368
363
  if (!children)
369
364
  return matches ? current : undefined;
370
365
  const matchedChildren = new Array();
@@ -376,7 +371,7 @@ class FilteredTreeHierarchy {
376
371
  const included = matches || hasChildren;
377
372
  let filtered;
378
373
  if (included) {
379
- this._filtered.set(current === null || current === void 0 ? void 0 : current.id, matchedChildren);
374
+ this._filtered.set(current?.id, matchedChildren);
380
375
  // Return a modified copy of current node (to persist initial hierarchy when filter is cleared).
381
376
  if (current) {
382
377
  filtered = {
@@ -389,10 +384,9 @@ class FilteredTreeHierarchy {
389
384
  return filtered;
390
385
  }
391
386
  matchesFilter(node) {
392
- var _a;
393
387
  if (node.label.value.valueFormat !== appui_abstract_1.PropertyValueFormat.Primitive)
394
388
  return false;
395
- const value = (_a = node.label.value.displayValue) === null || _a === void 0 ? void 0 : _a.toLowerCase();
389
+ const value = node.label.value.displayValue?.toLowerCase();
396
390
  if (!value)
397
391
  return false;
398
392
  return value.includes(this._filter.toLowerCase());
@@ -408,13 +402,13 @@ class FilteredTreeDataProvider {
408
402
  }
409
403
  async getNodes(parent) {
410
404
  const hierarchy = await this._hierarchy.getHierarchy();
411
- const nodes = hierarchy.get(parent === null || parent === void 0 ? void 0 : parent.id);
405
+ const nodes = hierarchy.get(parent?.id);
412
406
  return nodes || [];
413
407
  }
414
408
  async getNodesCount(parent) {
415
409
  const hierarchy = await this._hierarchy.getHierarchy();
416
- const nodes = hierarchy.get(parent === null || parent === void 0 ? void 0 : parent.id);
417
- return (nodes === null || nodes === void 0 ? void 0 : nodes.length) || 0;
410
+ const nodes = hierarchy.get(parent?.id);
411
+ return nodes?.length || 0;
418
412
  }
419
413
  }
420
414
  //# sourceMappingURL=SubLayersTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubLayersTree.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport {\r\n AbstractTreeNodeLoaderWithProvider, ControlledTree, DelayLoadedTreeNodeItem, HighlightableTreeProps, ITreeDataProvider,\r\n MutableTreeModel,\r\n MutableTreeModelNode,\r\n SelectionMode, TreeCheckboxStateChangeEventArgs, TreeDataProvider, TreeEventHandler, TreeImageLoader, TreeModel, TreeModelChanges, TreeModelSource, TreeNodeItem, TreeNodeLoader,\r\n TreeNodeRenderer, TreeNodeRendererProps, TreeRenderer, TreeRendererProps, useTreeModel,\r\n} from \"@itwin/components-react\";\r\nimport { ImageMapLayerSettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\r\nimport { IModelApp, MapTileTreeScaleRangeVisibility, ScreenViewport } from \"@itwin/core-frontend\";\r\nimport { CheckBoxState, ImageCheckBox, NodeCheckboxRenderProps, useDisposable, WebFontIcon } from \"@itwin/core-react\";\r\nimport { Button, Input } from \"@itwin/itwinui-react\";\r\nimport * as React from \"react\";\r\nimport { StyleMapLayerSettings } from \"../Interfaces\";\r\nimport { SubLayersDataProvider } from \"./SubLayersDataProvider\";\r\nimport \"./SubLayersTree.scss\";\r\nimport { MapLayersUI } from \"../../mapLayers\";\r\n\r\nconst getWindow = () => {\r\n return typeof window === \"undefined\" ? undefined : window;\r\n};\r\n\r\nconst useResizeObserver = <T extends HTMLElement>(\r\n onResize: (size: DOMRectReadOnly) => void,\r\n) => {\r\n const resizeObserver = React.useRef<ResizeObserver>();\r\n\r\n const elementRef = React.useCallback(\r\n (element: T | null) => {\r\n if (!getWindow()?.ResizeObserver) {\r\n return;\r\n }\r\n\r\n resizeObserver.current?.disconnect();\r\n if (element) {\r\n resizeObserver.current = new ResizeObserver(([{ contentRect }]) =>\r\n onResize(contentRect),\r\n );\r\n resizeObserver.current?.observe(element);\r\n }\r\n },\r\n [onResize],\r\n );\r\n\r\n return [elementRef, resizeObserver.current] as const;\r\n};\r\n\r\n/**\r\n Mimic processing of `react-resize-detector` to return width and height.\r\n* @internal\r\n */\r\nfunction useResizeDetector(): { width: number | undefined, height: number | undefined, ref: React.Ref<HTMLDivElement> } {\r\n const [width, setWidth] = React.useState<number>();\r\n const [height, setHeight] = React.useState<number>();\r\n const [ref] = useResizeObserver(React.useCallback((size: DOMRectReadOnly) => {\r\n setWidth(size.width);\r\n setHeight(size.height);\r\n }, []));\r\n return { width, height, ref };\r\n}\r\n\r\ninterface ToolbarProps {\r\n searchField?: React.ReactNode;\r\n children?: React.ReactNode[];\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction Toolbar(props: ToolbarProps) {\r\n return (\r\n <div className=\"map-manager-sublayer-tree-toolbar\">\r\n <div className=\"tree-toolbar-action-buttons\">\r\n {props.children}\r\n </div>\r\n {props.searchField && <div className=\"tree-toolbar-searchbox\">\r\n {props.searchField}\r\n </div>}\r\n </div>\r\n );\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function SubLayersPanel({ mapLayer, viewport }: { mapLayer: StyleMapLayerSettings, viewport: ScreenViewport | undefined }) {\r\n const [noneAvailableLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoSubLayers\"));\r\n if (!viewport || (undefined === mapLayer.subLayers || 0 === mapLayer.subLayers.length)) {\r\n return <div className=\"map-manager-sublayer-panel\">\r\n <div>{noneAvailableLabel}</div>\r\n </div>;\r\n }\r\n\r\n return (\r\n <SubLayersTree mapLayer={mapLayer} />\r\n );\r\n}\r\n\r\nfunction getSubLayerProps(subLayerSettings: MapSubLayerSettings[]): MapSubLayerProps[] {\r\n return subLayerSettings.map((subLayer) => subLayer.toJSON());\r\n}\r\n\r\nfunction getStyleMapLayerSettings(settings: ImageMapLayerSettings, isOverlay: boolean, layerIndex: number, treeVisibility: MapTileTreeScaleRangeVisibility): StyleMapLayerSettings {\r\n return {\r\n visible: settings.visible,\r\n name: settings.name,\r\n source: settings.source,\r\n transparency: settings.transparency,\r\n transparentBackground: settings.transparentBackground,\r\n subLayers: settings.subLayers ? getSubLayerProps(settings.subLayers) : undefined,\r\n showSubLayers: true,\r\n isOverlay,\r\n layerIndex,\r\n provider: IModelApp.mapLayerFormatRegistry.createImageryProvider(settings),\r\n treeVisibility,\r\n };\r\n}\r\n\r\n/**\r\n * Tree Control that displays sub-layer hierarchy\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function SubLayersTree(props: { mapLayer: StyleMapLayerSettings }) {\r\n const [placeholderLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.SearchPlaceholder\"));\r\n const [allOnLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOn\"));\r\n const [allOffLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOff\"));\r\n const [mapLayer, setMapLayer] = React.useState(props.mapLayer);\r\n const [layerFilterString, setLayerFilterString] = React.useState<string>(\"\");\r\n\r\n // create data provider to get some nodes to show in tree\r\n // `React.useMemo' is used avoid creating new object on each render cycle\r\n const dataProvider = React.useMemo(() => new SubLayersDataProvider(mapLayer), [mapLayer]);\r\n\r\n const {\r\n modelSource,\r\n nodeLoader,\r\n nodeHighlightingProps,\r\n } = useTreeFiltering(dataProvider, layerFilterString);\r\n\r\n // create custom event handler. It handles all tree event same as `TreeEventHandler` but additionally\r\n // it selects/deselects node when checkbox is checked/unchecked and vice versa.\r\n // `useDisposable` takes care of disposing old event handler when new is created in case 'nodeLoader' has changed\r\n // `React.useCallback` is used to avoid creating new callback that creates handler on each render\r\n const eventHandler = useDisposable(React.useCallback(() => new SubLayerCheckboxHandler(mapLayer, nodeLoader), [nodeLoader, mapLayer]));\r\n\r\n // Get an immutable tree model from the model source. The model is regenerated every time the model source\r\n // emits the `onModelChanged` event.\r\n const treeModel = useTreeModel(modelSource);\r\n\r\n const showAll = React.useCallback(async () => {\r\n const vp = IModelApp.viewManager.selectedView;\r\n const displayStyle = vp?.displayStyle;\r\n if (displayStyle && vp) {\r\n const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(mapLayer.name, mapLayer.source, mapLayer.isOverlay) : -1;\r\n displayStyle.changeMapSubLayerProps({ visible: true }, -1, indexInDisplayStyle, mapLayer.isOverlay);\r\n vp.invalidateRenderPlan();\r\n const updatedMapLayer = displayStyle.mapLayerAtIndex(indexInDisplayStyle, mapLayer.isOverlay);\r\n if (updatedMapLayer) {\r\n if (updatedMapLayer instanceof ImageMapLayerSettings) {\r\n const treeVisibility = vp.getMapLayerScaleRangeVisibility(indexInDisplayStyle, mapLayer.isOverlay);\r\n setMapLayer(getStyleMapLayerSettings(updatedMapLayer, mapLayer.isOverlay, indexInDisplayStyle, treeVisibility));\r\n }\r\n\r\n }\r\n }\r\n }, [mapLayer]);\r\n\r\n const hideAll = React.useCallback(async () => {\r\n const vp = IModelApp.viewManager.selectedView;\r\n const displayStyle = vp?.displayStyle;\r\n if (displayStyle && vp) {\r\n const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(mapLayer.name, mapLayer.source, mapLayer.isOverlay) : -1;\r\n displayStyle.changeMapSubLayerProps({ visible: false }, -1, indexInDisplayStyle, mapLayer.isOverlay);\r\n const updatedMapLayer = displayStyle.mapLayerAtIndex(indexInDisplayStyle, mapLayer.isOverlay);\r\n if (updatedMapLayer && updatedMapLayer instanceof ImageMapLayerSettings) {\r\n const treeVisibility = vp.getMapLayerScaleRangeVisibility(indexInDisplayStyle, mapLayer.isOverlay);\r\n setMapLayer(getStyleMapLayerSettings(updatedMapLayer, mapLayer.isOverlay, indexInDisplayStyle, treeVisibility));\r\n }\r\n vp.invalidateRenderPlan();\r\n }\r\n }, [mapLayer]);\r\n\r\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setLayerFilterString(event.target.value);\r\n }, []);\r\n\r\n const { width, height, ref: containerRef } = useResizeDetector();\r\n\r\n return <>\r\n <div className=\"map-manager-sublayer-tree\">\r\n <Toolbar\r\n searchField={\r\n <Input type=\"text\" className=\"map-manager-source-list-filter\"\r\n placeholder={placeholderLabel}\r\n value={layerFilterString}\r\n onChange={handleFilterTextChanged}\r\n size=\"small\" />\r\n }\r\n >\r\n {mapLayer.provider?.mutualExclusiveSubLayer ? undefined : [\r\n <Button size=\"small\" styleType=\"borderless\" key=\"show-all-btn\" title={allOnLabel} onClick={showAll}>\r\n <WebFontIcon iconName=\"icon-visibility\" />\r\n </Button>,\r\n <Button size=\"small\" styleType=\"borderless\" key=\"hide-all-btn\" title={allOffLabel} onClick={hideAll}>\r\n <WebFontIcon iconName=\"icon-visibility-hide-2\" />\r\n </Button>,\r\n ]}\r\n </Toolbar>\r\n <div ref={containerRef} className=\"map-manager-sublayer-tree-content\">\r\n {width !== undefined && height !== undefined && <ControlledTree\r\n nodeLoader={nodeLoader}\r\n selectionMode={SelectionMode.None}\r\n eventsHandler={eventHandler}\r\n model={treeModel}\r\n treeRenderer={nodeWithEyeCheckboxTreeRenderer}\r\n nodeHighlightingProps={nodeHighlightingProps}\r\n width={width}\r\n height={height}\r\n />}\r\n </div>\r\n </div>\r\n </>;\r\n}\r\n\r\n/** TreeEventHandler derived class that handler processing changes to subLayer visibility */\r\nclass SubLayerCheckboxHandler extends TreeEventHandler {\r\n private _removeModelChangedListener: () => void;\r\n\r\n constructor(private _mapLayer: StyleMapLayerSettings, nodeLoader: AbstractTreeNodeLoaderWithProvider<TreeDataProvider>) {\r\n super({ modelSource: nodeLoader.modelSource, nodeLoader, collapsedChildrenDisposalEnabled: true });\r\n this._removeModelChangedListener = this.modelSource.onModelChanged.addListener(this.onModelChanged);\r\n }\r\n\r\n public override dispose() {\r\n this._removeModelChangedListener();\r\n super.dispose();\r\n }\r\n\r\n // Cascade state\r\n // Children on unnamed groups must get disabled in the tree view, because\r\n // they get rendered anyway.\r\n private cascadeStateToAllChildren(model: MutableTreeModel, parentId?: string) {\r\n const children = model.getChildren(parentId);\r\n if (children === undefined)\r\n return;\r\n\r\n for (const childID of children) {\r\n const childNode = childID ? model.getNode(childID) : undefined;\r\n\r\n if (childNode)\r\n this.syncNodeStateWithParent(model, childNode);\r\n\r\n // Drill down the tree.\r\n this.cascadeStateToAllChildren(model, childID);\r\n }\r\n }\r\n\r\n private applyMutualExclusiveState(model: MutableTreeModel, nodeId: string) {\r\n const changedNode = model.getNode(nodeId);\r\n if (changedNode?.checkbox.state === CheckBoxState.Off)\r\n return;\r\n\r\n for (const node of model.iterateTreeModelNodes()) {\r\n if (node.id === changedNode?.id)\r\n continue;\r\n\r\n if (node && node.checkbox.state === CheckBoxState.On)\r\n node.checkbox.state = CheckBoxState.Off;\r\n }\r\n }\r\n\r\n //-----------------------------------------------------------------------\r\n // Listen to model changes\r\n //------------------------------------------------------------------------\r\n // This is required because nodes are delay loaded in the model until\r\n // they are made visible (i.e. parent node is expanded). So even though\r\n // you might have created nodes in the data provided with a proper\r\n // initial state, by the time it gets loaded, their state might have became\r\n // out of date in the TreeView's active model. So whenever a node\r\n // is added, when must confirm its state matches the current model\r\n // (i.e. state of their parent.)\r\n public onModelChanged = (args: [TreeModel, TreeModelChanges]) => {\r\n this.modelSource.modifyModel((model) => {\r\n const addedNodes = args[1].addedNodeIds.map((id) => model.getNode(id));\r\n addedNodes.forEach((node) => {\r\n if (!node)\r\n return;\r\n\r\n this.syncNodeStateWithParent(model, node);\r\n });\r\n });\r\n };\r\n\r\n private static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\r\n if (!subLayer)\r\n return false;\r\n\r\n return (!subLayer.name || subLayer.name.length === 0) && (subLayer.children !== undefined && subLayer.children.length > 0);\r\n }\r\n\r\n // Ensure the state of changed node matches the state of its parent.\r\n private syncNodeStateWithParent(model: MutableTreeModel, changedNode: MutableTreeModelNode) {\r\n // Lookup node parent. If non exists, I assume thats the root node,\r\n // and it must have a proper initial state.\r\n const parentNode = changedNode.parentId ? model.getNode(changedNode.parentId) : undefined;\r\n if (!parentNode)\r\n return;\r\n\r\n if (!changedNode.checkbox)\r\n return; // don't see why this would happen, but if there is no checkbox, we cant do much here.\r\n\r\n const parentLayerId = undefined !== parentNode.item.extendedData?.subLayerId ? parentNode.item.extendedData?.subLayerId : parentNode.item.id;\r\n const parentSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === parentLayerId);\r\n\r\n // If parent is disabled, then children must be too.\r\n // Also, Non-visible unnamed group must have their children disabled (unamed groups have visibility inherence)\r\n if (parentNode.checkbox.isDisabled || (SubLayerCheckboxHandler.isUnnamedGroup(parentSubLayer) && parentNode.checkbox.state === CheckBoxState.Off)) {\r\n changedNode.checkbox.isDisabled = true;\r\n changedNode.checkbox.state = CheckBoxState.Off;\r\n } else {\r\n // Visibility state from StyleMapLayerSettings applies\r\n const subLayerId = undefined !== changedNode.item.extendedData?.subLayerId ? changedNode.item.extendedData?.subLayerId : changedNode.item.id;\r\n const foundSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === subLayerId);\r\n changedNode.checkbox.isDisabled = false;\r\n changedNode.checkbox.state = foundSubLayer?.visible ? CheckBoxState.On : CheckBoxState.Off;\r\n }\r\n }\r\n\r\n /** Changes nodes checkboxes states until event is handled or handler is disposed */\r\n public override onCheckboxStateChanged({ stateChanges }: TreeCheckboxStateChangeEventArgs) {\r\n // call base checkbox handling\r\n const baseHandling = super.onCheckboxStateChanged({ stateChanges });\r\n\r\n // subscribe to checkbox state changes to new checkbox states and do some additional work with them\r\n const selectionHandling = stateChanges.subscribe({\r\n next: (changes) => {\r\n const vp = IModelApp.viewManager.selectedView;\r\n const displayStyle = vp?.displayStyle;\r\n const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(this._mapLayer.name, this._mapLayer.source, this._mapLayer.isOverlay) : -1;\r\n changes.forEach((change) => {\r\n const isSelected = (change.newState === CheckBoxState.On);\r\n\r\n const subLayerId = undefined !== change.nodeItem.extendedData?.subLayerId ? change.nodeItem.extendedData?.subLayerId : change.nodeItem.id;\r\n\r\n // Get the previously visible node if any\r\n let prevVisibleLayer: MapSubLayerProps | undefined;\r\n if (this._mapLayer.provider?.mutualExclusiveSubLayer) {\r\n prevVisibleLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.visible && subLayer.id !== subLayerId);\r\n }\r\n\r\n // Update sublayer object, otherwise state would get out of sync with DisplayStyle each time the TreeView is re-rendered\r\n const foundSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === subLayerId);\r\n if (foundSubLayer)\r\n foundSubLayer.visible = isSelected;\r\n if (prevVisibleLayer?.visible)\r\n prevVisibleLayer.visible = false;\r\n\r\n // Update displaystyle state\r\n if (-1 !== indexInDisplayStyle && displayStyle) {\r\n if (prevVisibleLayer && prevVisibleLayer.id !== undefined)\r\n displayStyle.changeMapSubLayerProps({ visible: false }, prevVisibleLayer.id, indexInDisplayStyle, this._mapLayer.isOverlay);\r\n displayStyle.changeMapSubLayerProps({ visible: isSelected }, subLayerId, indexInDisplayStyle, this._mapLayer.isOverlay);\r\n }\r\n\r\n // Cascade state\r\n this.modelSource.modifyModel((model) => {\r\n if (this._mapLayer.provider?.mutualExclusiveSubLayer)\r\n this.applyMutualExclusiveState(model, change.nodeItem.id);\r\n this.cascadeStateToAllChildren(model, change.nodeItem.id);\r\n });\r\n });\r\n\r\n if (vp)\r\n vp.invalidateRenderPlan();\r\n },\r\n });\r\n // stop handling selection when checkboxes handling is stopped\r\n baseHandling?.add(selectionHandling);\r\n return baseHandling;\r\n }\r\n}\r\n\r\n/** Custom checkbox renderer that renders checkbox as an eye */\r\nconst eyeCheckboxRenderer = (props: NodeCheckboxRenderProps) => (\r\n <ImageCheckBox\r\n checked={props.checked}\r\n disabled={props.disabled}\r\n imageOn=\"icon-visibility\"\r\n imageOff=\"icon-visibility-hide-2\"\r\n onClick={props.onChange}\r\n tooltip={props.title}\r\n />\r\n);\r\n\r\n/** Custom node renderer. It uses default 'TreeNodeRenderer' but overrides default checkbox renderer to render checkbox as an eye */\r\nconst imageLoader = new TreeImageLoader();\r\nconst nodeWithEyeCheckboxRenderer = (props: TreeNodeRendererProps) => (\r\n <TreeNodeRenderer\r\n {...props}\r\n checkboxRenderer={eyeCheckboxRenderer}\r\n imageLoader={imageLoader}\r\n />\r\n);\r\n\r\n/** Custom tree renderer. It uses default `TreeRenderer` but overrides default node renderer to render node with custom checkbox */\r\nconst nodeWithEyeCheckboxTreeRenderer = (props: TreeRendererProps) => (\r\n <TreeRenderer\r\n {...props}\r\n nodeRenderer={nodeWithEyeCheckboxRenderer}\r\n />\r\n);\r\n\r\nfunction useTreeFiltering(\r\n dataProvider: ITreeDataProvider,\r\n filter: string,\r\n) {\r\n const nodeLoader = useFilteredProvider(dataProvider, filter);\r\n const nodeHighlightingProps = useNodeHighlightingProps(filter);\r\n return {\r\n nodeLoader,\r\n modelSource: nodeLoader.modelSource,\r\n nodeHighlightingProps,\r\n };\r\n}\r\n\r\nfunction useFilteredProvider(\r\n dataProvider: ITreeDataProvider,\r\n filter: string,\r\n) {\r\n const filteredProvider = React.useMemo(() => {\r\n return new FilteredTreeDataProvider(dataProvider, filter);\r\n }, [dataProvider, filter]);\r\n\r\n const nodeLoader = React.useMemo(() => {\r\n return new TreeNodeLoader(filteredProvider, new TreeModelSource());\r\n }, [filteredProvider]);\r\n\r\n return nodeLoader;\r\n}\r\n\r\nfunction useNodeHighlightingProps(\r\n filter: string,\r\n) {\r\n const [nodeHighlightingProps, setNodeHighlightingProps] = React.useState<HighlightableTreeProps>();\r\n\r\n React.useEffect(() => {\r\n if (filter === \"\") {\r\n setNodeHighlightingProps(undefined);\r\n return;\r\n }\r\n setNodeHighlightingProps({\r\n searchText: filter,\r\n activeMatch: undefined,\r\n });\r\n }, [filter]);\r\n\r\n return nodeHighlightingProps;\r\n}\r\n\r\nclass FullTreeHierarchy {\r\n private _dataProvider: ITreeDataProvider;\r\n private _hierarchy = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\r\n private _init: Promise<void>;\r\n\r\n public constructor(dataProvider: ITreeDataProvider) {\r\n this._dataProvider = dataProvider;\r\n\r\n this._init = (async () => {\r\n await this.initNode();\r\n })();\r\n }\r\n\r\n private async initNode(parent?: TreeNodeItem) {\r\n const nodes = await this._dataProvider.getNodes(parent);\r\n this._hierarchy.set(parent?.id, nodes);\r\n for (const node of nodes) {\r\n await this.initNode(node);\r\n }\r\n }\r\n\r\n public async getHierarchy() {\r\n await this._init;\r\n return this._hierarchy;\r\n }\r\n}\r\n\r\nclass FilteredTreeHierarchy {\r\n private _fullHierarchy: FullTreeHierarchy;\r\n private _filter: string;\r\n private _filtered = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\r\n private _init: Promise<void>;\r\n\r\n public constructor(dataProvider: ITreeDataProvider, filter: string) {\r\n this._fullHierarchy = new FullTreeHierarchy(dataProvider);\r\n this._filter = filter;\r\n\r\n this._init = (async () => {\r\n await this.init();\r\n })();\r\n }\r\n\r\n private async init() {\r\n const hierarchy = await this._fullHierarchy.getHierarchy();\r\n if (this._filter === \"\") {\r\n this._filtered = hierarchy;\r\n return;\r\n }\r\n this.filterNodes(hierarchy);\r\n }\r\n\r\n /** Initializes `this._filtered` field. Returns a node if it matches a filter. */\r\n private filterNodes(hierarchy: Map<string | undefined, DelayLoadedTreeNodeItem[]>, current?: DelayLoadedTreeNodeItem): DelayLoadedTreeNodeItem | undefined {\r\n const matches = current ? this.matchesFilter(current) : false;\r\n const children = hierarchy.get(current?.id);\r\n if (!children)\r\n return matches ? current : undefined;\r\n\r\n const matchedChildren = new Array<DelayLoadedTreeNodeItem>();\r\n for (const child of children) {\r\n const matchedChild = this.filterNodes(hierarchy, child);\r\n matchedChild && matchedChildren.push(matchedChild);\r\n }\r\n\r\n const hasChildren = matchedChildren.length > 0;\r\n const included = matches || hasChildren;\r\n let filtered: DelayLoadedTreeNodeItem | undefined;\r\n if (included) {\r\n this._filtered.set(current?.id, matchedChildren);\r\n\r\n // Return a modified copy of current node (to persist initial hierarchy when filter is cleared).\r\n if (current) {\r\n filtered = {\r\n ...current,\r\n hasChildren,\r\n autoExpand: hasChildren ? true : current.autoExpand,\r\n };\r\n }\r\n }\r\n return filtered;\r\n }\r\n\r\n private matchesFilter(node: TreeNodeItem) {\r\n if (node.label.value.valueFormat !== PropertyValueFormat.Primitive)\r\n return false;\r\n\r\n const value = node.label.value.displayValue?.toLowerCase();\r\n if (!value)\r\n return false;\r\n return value.includes(this._filter.toLowerCase());\r\n }\r\n\r\n public async getHierarchy() {\r\n await this._init;\r\n return this._filtered;\r\n }\r\n}\r\n\r\nclass FilteredTreeDataProvider implements ITreeDataProvider {\r\n private _hierarchy: FilteredTreeHierarchy;\r\n\r\n public constructor(\r\n parentDataProvider: ITreeDataProvider,\r\n filter: string,\r\n ) {\r\n this._hierarchy = new FilteredTreeHierarchy(parentDataProvider, filter);\r\n }\r\n\r\n public async getNodes(parent?: TreeNodeItem) {\r\n const hierarchy = await this._hierarchy.getHierarchy();\r\n const nodes = hierarchy.get(parent?.id);\r\n return nodes || [];\r\n }\r\n\r\n public async getNodesCount(parent?: TreeNodeItem) {\r\n const hierarchy = await this._hierarchy.getHierarchy();\r\n const nodes = hierarchy.get(parent?.id);\r\n return nodes?.length || 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SubLayersTree.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport {\r\n AbstractTreeNodeLoaderWithProvider, ControlledTree, DelayLoadedTreeNodeItem, HighlightableTreeProps, ITreeDataProvider,\r\n MutableTreeModel,\r\n MutableTreeModelNode,\r\n SelectionMode, TreeCheckboxStateChangeEventArgs, TreeDataProvider, TreeEventHandler, TreeImageLoader, TreeModel, TreeModelChanges, TreeModelSource, TreeNodeItem, TreeNodeLoader,\r\n TreeNodeRenderer, TreeNodeRendererProps, TreeRenderer, TreeRendererProps, useTreeModel,\r\n} from \"@itwin/components-react\";\r\nimport { ImageMapLayerSettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\r\nimport { IModelApp, MapTileTreeScaleRangeVisibility, ScreenViewport } from \"@itwin/core-frontend\";\r\nimport { CheckBoxState, ImageCheckBox, NodeCheckboxRenderProps, useDisposable, WebFontIcon } from \"@itwin/core-react\";\r\nimport { Button, Input } from \"@itwin/itwinui-react\";\r\nimport * as React from \"react\";\r\nimport { StyleMapLayerSettings } from \"../Interfaces\";\r\nimport { SubLayersDataProvider } from \"./SubLayersDataProvider\";\r\nimport \"./SubLayersTree.scss\";\r\nimport { MapLayersUI } from \"../../mapLayers\";\r\n\r\nconst getWindow = () => {\r\n return typeof window === \"undefined\" ? undefined : window;\r\n};\r\n\r\nconst useResizeObserver = <T extends HTMLElement>(\r\n onResize: (size: DOMRectReadOnly) => void,\r\n) => {\r\n const resizeObserver = React.useRef<ResizeObserver>();\r\n\r\n const elementRef = React.useCallback(\r\n (element: T | null) => {\r\n if (!getWindow()?.ResizeObserver) {\r\n return;\r\n }\r\n\r\n resizeObserver.current?.disconnect();\r\n if (element) {\r\n resizeObserver.current = new ResizeObserver(([{ contentRect }]) =>\r\n onResize(contentRect),\r\n );\r\n resizeObserver.current?.observe(element);\r\n }\r\n },\r\n [onResize],\r\n );\r\n\r\n return [elementRef, resizeObserver.current] as const;\r\n};\r\n\r\n/**\r\n Mimic processing of `react-resize-detector` to return width and height.\r\n* @internal\r\n */\r\nfunction useResizeDetector(): { width: number | undefined, height: number | undefined, ref: React.Ref<HTMLDivElement> } {\r\n const [width, setWidth] = React.useState<number>();\r\n const [height, setHeight] = React.useState<number>();\r\n const [ref] = useResizeObserver(React.useCallback((size: DOMRectReadOnly) => {\r\n setWidth(size.width);\r\n setHeight(size.height);\r\n }, []));\r\n return { width, height, ref };\r\n}\r\n\r\ninterface ToolbarProps {\r\n searchField?: React.ReactNode;\r\n children?: React.ReactNode[];\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction Toolbar(props: ToolbarProps) {\r\n return (\r\n <div className=\"map-manager-sublayer-tree-toolbar\">\r\n <div className=\"tree-toolbar-action-buttons\">\r\n {props.children}\r\n </div>\r\n {props.searchField && <div className=\"tree-toolbar-searchbox\">\r\n {props.searchField}\r\n </div>}\r\n </div>\r\n );\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function SubLayersPanel({ mapLayer, viewport }: { mapLayer: StyleMapLayerSettings, viewport: ScreenViewport | undefined }) {\r\n const [noneAvailableLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoSubLayers\"));\r\n if (!viewport || (undefined === mapLayer.subLayers || 0 === mapLayer.subLayers.length)) {\r\n return <div className=\"map-manager-sublayer-panel\">\r\n <div>{noneAvailableLabel}</div>\r\n </div>;\r\n }\r\n\r\n return (\r\n <SubLayersTree mapLayer={mapLayer} />\r\n );\r\n}\r\n\r\nfunction getSubLayerProps(subLayerSettings: MapSubLayerSettings[]): MapSubLayerProps[] {\r\n return subLayerSettings.map((subLayer) => subLayer.toJSON());\r\n}\r\n\r\nfunction getStyleMapLayerSettings(settings: ImageMapLayerSettings, isOverlay: boolean, layerIndex: number, treeVisibility: MapTileTreeScaleRangeVisibility): StyleMapLayerSettings {\r\n return {\r\n visible: settings.visible,\r\n name: settings.name,\r\n source: settings.source,\r\n transparency: settings.transparency,\r\n transparentBackground: settings.transparentBackground,\r\n subLayers: settings.subLayers ? getSubLayerProps(settings.subLayers) : undefined,\r\n showSubLayers: true,\r\n isOverlay,\r\n layerIndex,\r\n provider: IModelApp.mapLayerFormatRegistry.createImageryProvider(settings),\r\n treeVisibility,\r\n };\r\n}\r\n\r\n/**\r\n * Tree Control that displays sub-layer hierarchy\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function SubLayersTree(props: { mapLayer: StyleMapLayerSettings }) {\r\n const [placeholderLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.SearchPlaceholder\"));\r\n const [allOnLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOn\"));\r\n const [allOffLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.AllOff\"));\r\n const [mapLayer, setMapLayer] = React.useState(props.mapLayer);\r\n const [layerFilterString, setLayerFilterString] = React.useState<string>(\"\");\r\n\r\n // create data provider to get some nodes to show in tree\r\n // `React.useMemo' is used avoid creating new object on each render cycle\r\n const dataProvider = React.useMemo(() => new SubLayersDataProvider(mapLayer), [mapLayer]);\r\n\r\n const {\r\n modelSource,\r\n nodeLoader,\r\n nodeHighlightingProps,\r\n } = useTreeFiltering(dataProvider, layerFilterString);\r\n\r\n // create custom event handler. It handles all tree event same as `TreeEventHandler` but additionally\r\n // it selects/deselects node when checkbox is checked/unchecked and vice versa.\r\n // `useDisposable` takes care of disposing old event handler when new is created in case 'nodeLoader' has changed\r\n // `React.useCallback` is used to avoid creating new callback that creates handler on each render\r\n const eventHandler = useDisposable(React.useCallback(() => new SubLayerCheckboxHandler(mapLayer, nodeLoader), [nodeLoader, mapLayer]));\r\n\r\n // Get an immutable tree model from the model source. The model is regenerated every time the model source\r\n // emits the `onModelChanged` event.\r\n const treeModel = useTreeModel(modelSource);\r\n\r\n const showAll = React.useCallback(async () => {\r\n const vp = IModelApp.viewManager.selectedView;\r\n const displayStyle = vp?.displayStyle;\r\n if (displayStyle && vp) {\r\n const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(mapLayer.name, mapLayer.source, mapLayer.isOverlay) : -1;\r\n displayStyle.changeMapSubLayerProps({ visible: true }, -1, indexInDisplayStyle, mapLayer.isOverlay);\r\n vp.invalidateRenderPlan();\r\n const updatedMapLayer = displayStyle.mapLayerAtIndex(indexInDisplayStyle, mapLayer.isOverlay);\r\n if (updatedMapLayer) {\r\n if (updatedMapLayer instanceof ImageMapLayerSettings) {\r\n const treeVisibility = vp.getMapLayerScaleRangeVisibility(indexInDisplayStyle, mapLayer.isOverlay);\r\n setMapLayer(getStyleMapLayerSettings(updatedMapLayer, mapLayer.isOverlay, indexInDisplayStyle, treeVisibility));\r\n }\r\n\r\n }\r\n }\r\n }, [mapLayer]);\r\n\r\n const hideAll = React.useCallback(async () => {\r\n const vp = IModelApp.viewManager.selectedView;\r\n const displayStyle = vp?.displayStyle;\r\n if (displayStyle && vp) {\r\n const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(mapLayer.name, mapLayer.source, mapLayer.isOverlay) : -1;\r\n displayStyle.changeMapSubLayerProps({ visible: false }, -1, indexInDisplayStyle, mapLayer.isOverlay);\r\n const updatedMapLayer = displayStyle.mapLayerAtIndex(indexInDisplayStyle, mapLayer.isOverlay);\r\n if (updatedMapLayer && updatedMapLayer instanceof ImageMapLayerSettings) {\r\n const treeVisibility = vp.getMapLayerScaleRangeVisibility(indexInDisplayStyle, mapLayer.isOverlay);\r\n setMapLayer(getStyleMapLayerSettings(updatedMapLayer, mapLayer.isOverlay, indexInDisplayStyle, treeVisibility));\r\n }\r\n vp.invalidateRenderPlan();\r\n }\r\n }, [mapLayer]);\r\n\r\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\r\n setLayerFilterString(event.target.value);\r\n }, []);\r\n\r\n const { width, height, ref: containerRef } = useResizeDetector();\r\n\r\n return <>\r\n <div className=\"map-manager-sublayer-tree\">\r\n <Toolbar\r\n searchField={\r\n <Input type=\"text\" className=\"map-manager-source-list-filter\"\r\n placeholder={placeholderLabel}\r\n value={layerFilterString}\r\n onChange={handleFilterTextChanged}\r\n size=\"small\" />\r\n }\r\n >\r\n {mapLayer.provider?.mutualExclusiveSubLayer ? undefined : [\r\n <Button size=\"small\" styleType=\"borderless\" key=\"show-all-btn\" title={allOnLabel} onClick={showAll}>\r\n <WebFontIcon iconName=\"icon-visibility\" />\r\n </Button>,\r\n <Button size=\"small\" styleType=\"borderless\" key=\"hide-all-btn\" title={allOffLabel} onClick={hideAll}>\r\n <WebFontIcon iconName=\"icon-visibility-hide-2\" />\r\n </Button>,\r\n ]}\r\n </Toolbar>\r\n <div ref={containerRef} className=\"map-manager-sublayer-tree-content\">\r\n {width !== undefined && height !== undefined && <ControlledTree\r\n nodeLoader={nodeLoader}\r\n selectionMode={SelectionMode.None}\r\n eventsHandler={eventHandler}\r\n model={treeModel}\r\n treeRenderer={nodeWithEyeCheckboxTreeRenderer}\r\n nodeHighlightingProps={nodeHighlightingProps}\r\n width={width}\r\n height={height}\r\n />}\r\n </div>\r\n </div>\r\n </>;\r\n}\r\n\r\n/** TreeEventHandler derived class that handler processing changes to subLayer visibility */\r\nclass SubLayerCheckboxHandler extends TreeEventHandler {\r\n private _removeModelChangedListener: () => void;\r\n\r\n constructor(private _mapLayer: StyleMapLayerSettings, nodeLoader: AbstractTreeNodeLoaderWithProvider<TreeDataProvider>) {\r\n super({ modelSource: nodeLoader.modelSource, nodeLoader, collapsedChildrenDisposalEnabled: true });\r\n this._removeModelChangedListener = this.modelSource.onModelChanged.addListener(this.onModelChanged);\r\n }\r\n\r\n public override dispose() {\r\n this._removeModelChangedListener();\r\n super.dispose();\r\n }\r\n\r\n // Cascade state\r\n // Children on unnamed groups must get disabled in the tree view, because\r\n // they get rendered anyway.\r\n private cascadeStateToAllChildren(model: MutableTreeModel, parentId?: string) {\r\n const children = model.getChildren(parentId);\r\n if (children === undefined)\r\n return;\r\n\r\n for (const childID of children) {\r\n const childNode = childID ? model.getNode(childID) : undefined;\r\n\r\n if (childNode)\r\n this.syncNodeStateWithParent(model, childNode);\r\n\r\n // Drill down the tree.\r\n this.cascadeStateToAllChildren(model, childID);\r\n }\r\n }\r\n\r\n private applyMutualExclusiveState(model: MutableTreeModel, nodeId: string) {\r\n const changedNode = model.getNode(nodeId);\r\n if (changedNode?.checkbox.state === CheckBoxState.Off)\r\n return;\r\n\r\n for (const node of model.iterateTreeModelNodes()) {\r\n if (node.id === changedNode?.id)\r\n continue;\r\n\r\n if (node && node.checkbox.state === CheckBoxState.On)\r\n node.checkbox.state = CheckBoxState.Off;\r\n }\r\n }\r\n\r\n //-----------------------------------------------------------------------\r\n // Listen to model changes\r\n //------------------------------------------------------------------------\r\n // This is required because nodes are delay loaded in the model until\r\n // they are made visible (i.e. parent node is expanded). So even though\r\n // you might have created nodes in the data provided with a proper\r\n // initial state, by the time it gets loaded, their state might have became\r\n // out of date in the TreeView's active model. So whenever a node\r\n // is added, when must confirm its state matches the current model\r\n // (i.e. state of their parent.)\r\n public onModelChanged = (args: [TreeModel, TreeModelChanges]) => {\r\n this.modelSource.modifyModel((model) => {\r\n const addedNodes = args[1].addedNodeIds.map((id) => model.getNode(id));\r\n addedNodes.forEach((node) => {\r\n if (!node)\r\n return;\r\n\r\n this.syncNodeStateWithParent(model, node);\r\n });\r\n });\r\n };\r\n\r\n private static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\r\n if (!subLayer)\r\n return false;\r\n\r\n return (!subLayer.name || subLayer.name.length === 0) && (subLayer.children !== undefined && subLayer.children.length > 0);\r\n }\r\n\r\n // Ensure the state of changed node matches the state of its parent.\r\n private syncNodeStateWithParent(model: MutableTreeModel, changedNode: MutableTreeModelNode) {\r\n // Lookup node parent. If non exists, I assume thats the root node,\r\n // and it must have a proper initial state.\r\n const parentNode = changedNode.parentId ? model.getNode(changedNode.parentId) : undefined;\r\n if (!parentNode)\r\n return;\r\n\r\n if (!changedNode.checkbox)\r\n return; // don't see why this would happen, but if there is no checkbox, we cant do much here.\r\n\r\n const parentLayerId = undefined !== parentNode.item.extendedData?.subLayerId ? parentNode.item.extendedData?.subLayerId : parentNode.item.id;\r\n const parentSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === parentLayerId);\r\n\r\n // If parent is disabled, then children must be too.\r\n // Also, Non-visible unnamed group must have their children disabled (unamed groups have visibility inherence)\r\n if (parentNode.checkbox.isDisabled || (SubLayerCheckboxHandler.isUnnamedGroup(parentSubLayer) && parentNode.checkbox.state === CheckBoxState.Off)) {\r\n changedNode.checkbox.isDisabled = true;\r\n changedNode.checkbox.state = CheckBoxState.Off;\r\n } else {\r\n // Visibility state from StyleMapLayerSettings applies\r\n const subLayerId = undefined !== changedNode.item.extendedData?.subLayerId ? changedNode.item.extendedData?.subLayerId : changedNode.item.id;\r\n const foundSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === subLayerId);\r\n changedNode.checkbox.isDisabled = false;\r\n changedNode.checkbox.state = foundSubLayer?.visible ? CheckBoxState.On : CheckBoxState.Off;\r\n }\r\n }\r\n\r\n /** Changes nodes checkboxes states until event is handled or handler is disposed */\r\n public override onCheckboxStateChanged({ stateChanges }: TreeCheckboxStateChangeEventArgs) {\r\n // call base checkbox handling\r\n const baseHandling = super.onCheckboxStateChanged({ stateChanges });\r\n\r\n // subscribe to checkbox state changes to new checkbox states and do some additional work with them\r\n const selectionHandling = stateChanges.subscribe({\r\n next: (changes) => {\r\n const vp = IModelApp.viewManager.selectedView;\r\n const displayStyle = vp?.displayStyle;\r\n const indexInDisplayStyle = displayStyle ? displayStyle.findMapLayerIndexByNameAndSource(this._mapLayer.name, this._mapLayer.source, this._mapLayer.isOverlay) : -1;\r\n changes.forEach((change) => {\r\n const isSelected = (change.newState === CheckBoxState.On);\r\n\r\n const subLayerId = undefined !== change.nodeItem.extendedData?.subLayerId ? change.nodeItem.extendedData?.subLayerId : change.nodeItem.id;\r\n\r\n // Get the previously visible node if any\r\n let prevVisibleLayer: MapSubLayerProps | undefined;\r\n if (this._mapLayer.provider?.mutualExclusiveSubLayer) {\r\n prevVisibleLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.visible && subLayer.id !== subLayerId);\r\n }\r\n\r\n // Update sublayer object, otherwise state would get out of sync with DisplayStyle each time the TreeView is re-rendered\r\n const foundSubLayer = this._mapLayer.subLayers?.find((subLayer) => subLayer.id === subLayerId);\r\n if (foundSubLayer)\r\n foundSubLayer.visible = isSelected;\r\n if (prevVisibleLayer?.visible)\r\n prevVisibleLayer.visible = false;\r\n\r\n // Update displaystyle state\r\n if (-1 !== indexInDisplayStyle && displayStyle) {\r\n if (prevVisibleLayer && prevVisibleLayer.id !== undefined)\r\n displayStyle.changeMapSubLayerProps({ visible: false }, prevVisibleLayer.id, indexInDisplayStyle, this._mapLayer.isOverlay);\r\n displayStyle.changeMapSubLayerProps({ visible: isSelected }, subLayerId, indexInDisplayStyle, this._mapLayer.isOverlay);\r\n }\r\n\r\n // Cascade state\r\n this.modelSource.modifyModel((model) => {\r\n if (this._mapLayer.provider?.mutualExclusiveSubLayer)\r\n this.applyMutualExclusiveState(model, change.nodeItem.id);\r\n this.cascadeStateToAllChildren(model, change.nodeItem.id);\r\n });\r\n });\r\n\r\n if (vp)\r\n vp.invalidateRenderPlan();\r\n },\r\n });\r\n // stop handling selection when checkboxes handling is stopped\r\n baseHandling?.add(selectionHandling);\r\n return baseHandling;\r\n }\r\n}\r\n\r\n/** Custom checkbox renderer that renders checkbox as an eye */\r\nconst eyeCheckboxRenderer = (props: NodeCheckboxRenderProps) => (\r\n <ImageCheckBox\r\n checked={props.checked}\r\n disabled={props.disabled}\r\n imageOn=\"icon-visibility\"\r\n imageOff=\"icon-visibility-hide-2\"\r\n onClick={props.onChange}\r\n tooltip={props.title}\r\n />\r\n);\r\n\r\n/** Custom node renderer. It uses default 'TreeNodeRenderer' but overrides default checkbox renderer to render checkbox as an eye */\r\nconst imageLoader = new TreeImageLoader();\r\nconst nodeWithEyeCheckboxRenderer = (props: TreeNodeRendererProps) => (\r\n <TreeNodeRenderer\r\n {...props}\r\n checkboxRenderer={eyeCheckboxRenderer}\r\n imageLoader={imageLoader}\r\n />\r\n);\r\n\r\n/** Custom tree renderer. It uses default `TreeRenderer` but overrides default node renderer to render node with custom checkbox */\r\nconst nodeWithEyeCheckboxTreeRenderer = (props: TreeRendererProps) => (\r\n <TreeRenderer\r\n {...props}\r\n nodeRenderer={nodeWithEyeCheckboxRenderer}\r\n />\r\n);\r\n\r\nfunction useTreeFiltering(\r\n dataProvider: ITreeDataProvider,\r\n filter: string,\r\n) {\r\n const nodeLoader = useFilteredProvider(dataProvider, filter);\r\n const nodeHighlightingProps = useNodeHighlightingProps(filter);\r\n return {\r\n nodeLoader,\r\n modelSource: nodeLoader.modelSource,\r\n nodeHighlightingProps,\r\n };\r\n}\r\n\r\nfunction useFilteredProvider(\r\n dataProvider: ITreeDataProvider,\r\n filter: string,\r\n) {\r\n const filteredProvider = React.useMemo(() => {\r\n return new FilteredTreeDataProvider(dataProvider, filter);\r\n }, [dataProvider, filter]);\r\n\r\n const nodeLoader = React.useMemo(() => {\r\n return new TreeNodeLoader(filteredProvider, new TreeModelSource());\r\n }, [filteredProvider]);\r\n\r\n return nodeLoader;\r\n}\r\n\r\nfunction useNodeHighlightingProps(\r\n filter: string,\r\n) {\r\n const [nodeHighlightingProps, setNodeHighlightingProps] = React.useState<HighlightableTreeProps>();\r\n\r\n React.useEffect(() => {\r\n if (filter === \"\") {\r\n setNodeHighlightingProps(undefined);\r\n return;\r\n }\r\n setNodeHighlightingProps({\r\n searchText: filter,\r\n activeMatch: undefined,\r\n });\r\n }, [filter]);\r\n\r\n return nodeHighlightingProps;\r\n}\r\n\r\nclass FullTreeHierarchy {\r\n private _dataProvider: ITreeDataProvider;\r\n private _hierarchy = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\r\n private _init: Promise<void>;\r\n\r\n public constructor(dataProvider: ITreeDataProvider) {\r\n this._dataProvider = dataProvider;\r\n\r\n this._init = (async () => {\r\n await this.initNode();\r\n })();\r\n }\r\n\r\n private async initNode(parent?: TreeNodeItem) {\r\n const nodes = await this._dataProvider.getNodes(parent);\r\n this._hierarchy.set(parent?.id, nodes);\r\n for (const node of nodes) {\r\n await this.initNode(node);\r\n }\r\n }\r\n\r\n public async getHierarchy() {\r\n await this._init;\r\n return this._hierarchy;\r\n }\r\n}\r\n\r\nclass FilteredTreeHierarchy {\r\n private _fullHierarchy: FullTreeHierarchy;\r\n private _filter: string;\r\n private _filtered = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\r\n private _init: Promise<void>;\r\n\r\n public constructor(dataProvider: ITreeDataProvider, filter: string) {\r\n this._fullHierarchy = new FullTreeHierarchy(dataProvider);\r\n this._filter = filter;\r\n\r\n this._init = (async () => {\r\n await this.init();\r\n })();\r\n }\r\n\r\n private async init() {\r\n const hierarchy = await this._fullHierarchy.getHierarchy();\r\n if (this._filter === \"\") {\r\n this._filtered = hierarchy;\r\n return;\r\n }\r\n this.filterNodes(hierarchy);\r\n }\r\n\r\n /** Initializes `this._filtered` field. Returns a node if it matches a filter. */\r\n private filterNodes(hierarchy: Map<string | undefined, DelayLoadedTreeNodeItem[]>, current?: DelayLoadedTreeNodeItem): DelayLoadedTreeNodeItem | undefined {\r\n const matches = current ? this.matchesFilter(current) : false;\r\n const children = hierarchy.get(current?.id);\r\n if (!children)\r\n return matches ? current : undefined;\r\n\r\n const matchedChildren = new Array<DelayLoadedTreeNodeItem>();\r\n for (const child of children) {\r\n const matchedChild = this.filterNodes(hierarchy, child);\r\n matchedChild && matchedChildren.push(matchedChild);\r\n }\r\n\r\n const hasChildren = matchedChildren.length > 0;\r\n const included = matches || hasChildren;\r\n let filtered: DelayLoadedTreeNodeItem | undefined;\r\n if (included) {\r\n this._filtered.set(current?.id, matchedChildren);\r\n\r\n // Return a modified copy of current node (to persist initial hierarchy when filter is cleared).\r\n if (current) {\r\n filtered = {\r\n ...current,\r\n hasChildren,\r\n autoExpand: hasChildren ? true : current.autoExpand,\r\n };\r\n }\r\n }\r\n return filtered;\r\n }\r\n\r\n private matchesFilter(node: TreeNodeItem) {\r\n if (node.label.value.valueFormat !== PropertyValueFormat.Primitive)\r\n return false;\r\n\r\n const value = node.label.value.displayValue?.toLowerCase();\r\n if (!value)\r\n return false;\r\n return value.includes(this._filter.toLowerCase());\r\n }\r\n\r\n public async getHierarchy() {\r\n await this._init;\r\n return this._filtered;\r\n }\r\n}\r\n\r\nclass FilteredTreeDataProvider implements ITreeDataProvider {\r\n private _hierarchy: FilteredTreeHierarchy;\r\n\r\n public constructor(\r\n parentDataProvider: ITreeDataProvider,\r\n filter: string,\r\n ) {\r\n this._hierarchy = new FilteredTreeHierarchy(parentDataProvider, filter);\r\n }\r\n\r\n public async getNodes(parent?: TreeNodeItem) {\r\n const hierarchy = await this._hierarchy.getHierarchy();\r\n const nodes = hierarchy.get(parent?.id);\r\n return nodes || [];\r\n }\r\n\r\n public async getNodesCount(parent?: TreeNodeItem) {\r\n const hierarchy = await this._hierarchy.getHierarchy();\r\n const nodes = hierarchy.get(parent?.id);\r\n return nodes?.length || 0;\r\n }\r\n}\r\n"]}
@@ -226,7 +226,6 @@ export class MapLayerPreferences {
226
226
  * @param iModelId
227
227
  */
228
228
  static async getByUrl(url, iTwinId, iModelId) {
229
- var _a;
230
229
  if (!MapLayersUI.iTwinConfig)
231
230
  return undefined;
232
231
  const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;
@@ -240,7 +239,7 @@ export class MapLayerPreferences {
240
239
  if (undefined === settingResponse || 0 === settingResponse.length)
241
240
  return undefined;
242
241
  let savedMapLayer;
243
- (_a = settingResponse.settingsMap) === null || _a === void 0 ? void 0 : _a.forEach((savedLayer) => {
242
+ settingResponse.settingsMap?.forEach((savedLayer) => {
244
243
  if (savedLayer.url === url) {
245
244
  savedMapLayer = savedLayer;
246
245
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerPreferences.js","sourceRoot":"","sources":["../../src/MapLayerPreferences.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IModelApp, MapLayerSource, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\r\nimport { BeEvent, GuidString } from \"@itwin/core-bentley\";\r\nimport { MapLayersUI } from \"./mapLayers\";\r\n\r\n/** @internal */\r\nexport interface MapLayerPreferencesContent {\r\n url: string;\r\n name: string;\r\n formatId: string;\r\n transparentBackground: boolean | undefined;\r\n}\r\n\r\n/** @internal */\r\nexport enum MapLayerSourceChangeType {\r\n Added = 0,\r\n Removed = 1,\r\n Replaced = 2,\r\n}\r\n\r\n/** @internal */\r\nexport interface MapLayerSourceArg {\r\n readonly source: MapLayerSource;\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n}\r\n\r\n/** A wrapper around user preferences to provide a way to store [[MapLayerSettings]].\r\n *\r\n * Note: This is currently internal only and used directly by the MapLayersExtension. It makes use of the IModelApp.authorizationClient if it exists.\r\n *\r\n * @internal\r\n */\r\nexport class MapLayerPreferences {\r\n /** Event raised whenever a source is added, replaced or removed:\r\n * changeType : Type of changed occurred.\r\n * oldSource : Source that was removed or replaced.\r\n * newSource : Source that was added or replacement of oldSource.\r\n *\r\n * @see [[MapLayerSourceChangeType]]\r\n */\r\n public static readonly onLayerSourceChanged = new BeEvent<(changeType: MapLayerSourceChangeType, oldSource?: MapLayerSource, newSource?: MapLayerSource) => void>(); // Used to notify the frontend that it needs to update its list of available layers\r\n\r\n /** Store the Map Layer source preference. If the same setting exists at a higher level, an error will be thrown and the setting will not be updated.\r\n *\r\n * Returns false if the settings object would override some other settings object in a larger scope i.e. storing settings on model when\r\n * a project setting exists with same name or map layer url.\r\n * @param source source to be stored on the setting service\r\n * @param storeOnIModel if true store the settings object on the model, if false store it on the project\r\n */\r\n public static async storeSource(source: MapLayerSource, iTwinId: GuidString, iModelId?: GuidString, storeOnIModel?: boolean): Promise<boolean> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return false;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const sourceJSON = source.toJSON();\r\n const mapLayerSetting: MapLayerPreferencesContent = {\r\n url: sourceJSON.url,\r\n name: sourceJSON.name,\r\n formatId: sourceJSON.formatId,\r\n transparentBackground: sourceJSON.transparentBackground,\r\n };\r\n\r\n const result: boolean = await MapLayerPreferences.delete(sourceJSON.url, sourceJSON.name, iTwinId, iModelId, storeOnIModel);\r\n if (result) {\r\n await MapLayersUI.iTwinConfig.save({\r\n accessToken,\r\n content: mapLayerSetting,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: sourceJSON.name,\r\n iTwinId,\r\n iModelId: storeOnIModel ? iModelId : undefined,\r\n });\r\n MapLayerPreferences.onLayerSourceChanged.raiseEvent(MapLayerSourceChangeType.Added, undefined, MapLayerSource.fromJSON(mapLayerSetting));\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /** Replace the old map layer source with a new map layer source.\r\n *\r\n * The source is replaced at the same level that the original source is defined. (i.e. if the old source is defined at a project level, the new source will also be defined there.)\r\n *\r\n * @param oldSource\r\n * @param newSource\r\n * @param iTwinId\r\n * @param iModelId\r\n */\r\n public static async replaceSource(oldSource: MapLayerSource, newSource: MapLayerSource, iTwinId: GuidString, iModelId?: GuidString): Promise<void> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n let storeOnIModel = false;\r\n try {\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: oldSource.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n } catch (_err) {\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: oldSource.name,\r\n iTwinId,\r\n });\r\n storeOnIModel = true;\r\n }\r\n\r\n const mapLayerSetting: MapLayerPreferencesContent = {\r\n url: newSource.url,\r\n name: newSource.name,\r\n formatId: newSource.formatId,\r\n transparentBackground: newSource.transparentBackground,\r\n };\r\n\r\n await MapLayersUI.iTwinConfig.save({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: `${MapLayerPreferences._preferenceNamespace}.${newSource.name}`,\r\n iTwinId,\r\n iModelId: storeOnIModel ? iModelId : undefined,\r\n content: mapLayerSetting,\r\n });\r\n\r\n MapLayerPreferences.onLayerSourceChanged.raiseEvent(MapLayerSourceChangeType.Replaced, oldSource, newSource);\r\n }\r\n\r\n /** Deletes the provided MapLayerSource by name from both the iTwin or iModel level.\r\n *\r\n * @param source The source to delete. The name is used to identify the source.\r\n * @param iTwinId\r\n * @param iModelId\r\n */\r\n public static async deleteByName(source: MapLayerSource, iTwinId: GuidString, iModelId?: GuidString): Promise<void> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n try {\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: source.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n } catch (_err) {\r\n // failed to store based on iModelId, attempt using iTwinId\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: source.name,\r\n iTwinId,\r\n });\r\n }\r\n\r\n MapLayerPreferences.onLayerSourceChanged.raiseEvent(MapLayerSourceChangeType.Removed, source, undefined);\r\n }\r\n\r\n /** Deletes the current setting with the provided key if it is defined at the same preference level.\r\n *\r\n * If the preference is defined within a different level, false will be returned indicating the setting should not be overriden.\r\n *\r\n * The two potential preference levels are iTwin and iModel.\r\n *\r\n * @param url\r\n * @param name\r\n * @param iTwinId\r\n * @param iModelId\r\n * @param storeOnIModel\r\n */\r\n private static async delete(url: string, name: string, iTwinId: GuidString, iModelId?: GuidString, storeOnIModel?: boolean): Promise<boolean> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return true;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const iTwinPreferenceByName = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: name,\r\n iTwinId,\r\n });\r\n\r\n if (undefined !== iTwinPreferenceByName && storeOnIModel) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerExistsAsProjectSetting\", { layer: iTwinPreferenceByName.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return false;\r\n } else if (iTwinPreferenceByName) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerExistsOverwriting\", { layer: iTwinPreferenceByName.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: iTwinPreferenceByName.name,\r\n iTwinId,\r\n });\r\n }\r\n\r\n // check if setting with url already exists, if it does, delete it\r\n const settingFromUrl = await MapLayerPreferences.getByUrl(url, iTwinId, undefined);\r\n if (settingFromUrl && storeOnIModel) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerWithUrlExistsAsProjectSetting\", { url: settingFromUrl.url, name: settingFromUrl.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return false;\r\n } else if (settingFromUrl) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerWithUrlExistsOverwriting\", { url: settingFromUrl.url, oldName: settingFromUrl.name, newName: name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: settingFromUrl.name,\r\n iTwinId,\r\n });\r\n }\r\n\r\n if (iModelId) { // delete any settings on model so user can update them if theres collisions\r\n const settingOnIModelFromName = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n const settingFromUrlOnIModel = await MapLayerPreferences.getByUrl(url, iTwinId, iModelId);\r\n if (settingOnIModelFromName) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerExistsOverwriting\", { layer: settingOnIModelFromName.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: settingOnIModelFromName.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n }\r\n if (settingFromUrlOnIModel) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerWithUrlExistsOverwriting\", { url: settingFromUrlOnIModel.url, oldName: settingFromUrlOnIModel.name, newName: name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: settingFromUrlOnIModel.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Attempts to get a map layer based off a specific url.\r\n * @param url\r\n * @param iTwinId\r\n * @param iModelId\r\n */\r\n public static async getByUrl(url: string, iTwinId: string, iModelId?: string): Promise<MapLayerPreferencesContent | undefined> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return undefined;\r\n\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const settingResponse = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: \"\",\r\n iTwinId,\r\n iModelId,\r\n });\r\n\r\n if (undefined === settingResponse || 0 === settingResponse.length)\r\n return undefined;\r\n\r\n let savedMapLayer;\r\n settingResponse.settingsMap?.forEach((savedLayer: any) => {\r\n if (savedLayer.url === url) {\r\n savedMapLayer = savedLayer;\r\n }\r\n });\r\n return savedMapLayer;\r\n }\r\n\r\n /** Get all MapLayerSources from the user's preferences, iTwin setting and iModel settings.\r\n * @param iTwinId id of the iTwin\r\n * @param iModelId id of the iModel\r\n * @throws if any of the calls to grab settings fail.\r\n */\r\n public static async getSources(iTwinId: GuidString, iModelId?: GuidString): Promise<MapLayerSource[]> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return [];\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const mapLayerList = [];\r\n\r\n try {\r\n const userResultByProject = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: \"\",\r\n iTwinId,\r\n });\r\n if (undefined !== userResultByProject)\r\n mapLayerList.push(userResultByProject);\r\n } catch (err: any) {\r\n throw new Error(IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorRetrieveUserProject\", { errorMessage: err }));\r\n }\r\n\r\n try {\r\n const userResultByIModel = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: \"\",\r\n iTwinId,\r\n iModelId,\r\n });\r\n if (undefined !== userResultByIModel)\r\n mapLayerList.push(userResultByIModel);\r\n } catch (err: any) {\r\n throw new Error(IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorRetrieveUserProject\", { errorMessage: err }));\r\n }\r\n\r\n const savedMapLayerSources: MapLayerSource[] = [];\r\n for (const mapLayer of mapLayerList) {\r\n mapLayer.forEach((savedLayer: any) => {\r\n const mapLayerSource = MapLayerSource.fromJSON(savedLayer as MapLayerPreferencesContent);\r\n if (mapLayerSource)\r\n savedMapLayerSources.push(mapLayerSource);\r\n });\r\n }\r\n return savedMapLayerSources;\r\n }\r\n\r\n private static get _preferenceNamespace() {\r\n return \"MapLayerSource-SettingsService\";\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"MapLayerPreferences.js","sourceRoot":"","sources":["../../src/MapLayerPreferences.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IModelApp, MapLayerSource, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\r\nimport { BeEvent, GuidString } from \"@itwin/core-bentley\";\r\nimport { MapLayersUI } from \"./mapLayers\";\r\n\r\n/** @internal */\r\nexport interface MapLayerPreferencesContent {\r\n url: string;\r\n name: string;\r\n formatId: string;\r\n transparentBackground: boolean | undefined;\r\n}\r\n\r\n/** @internal */\r\nexport enum MapLayerSourceChangeType {\r\n Added = 0,\r\n Removed = 1,\r\n Replaced = 2,\r\n}\r\n\r\n/** @internal */\r\nexport interface MapLayerSourceArg {\r\n readonly source: MapLayerSource;\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n}\r\n\r\n/** A wrapper around user preferences to provide a way to store [[MapLayerSettings]].\r\n *\r\n * Note: This is currently internal only and used directly by the MapLayersExtension. It makes use of the IModelApp.authorizationClient if it exists.\r\n *\r\n * @internal\r\n */\r\nexport class MapLayerPreferences {\r\n /** Event raised whenever a source is added, replaced or removed:\r\n * changeType : Type of changed occurred.\r\n * oldSource : Source that was removed or replaced.\r\n * newSource : Source that was added or replacement of oldSource.\r\n *\r\n * @see [[MapLayerSourceChangeType]]\r\n */\r\n public static readonly onLayerSourceChanged = new BeEvent<(changeType: MapLayerSourceChangeType, oldSource?: MapLayerSource, newSource?: MapLayerSource) => void>(); // Used to notify the frontend that it needs to update its list of available layers\r\n\r\n /** Store the Map Layer source preference. If the same setting exists at a higher level, an error will be thrown and the setting will not be updated.\r\n *\r\n * Returns false if the settings object would override some other settings object in a larger scope i.e. storing settings on model when\r\n * a project setting exists with same name or map layer url.\r\n * @param source source to be stored on the setting service\r\n * @param storeOnIModel if true store the settings object on the model, if false store it on the project\r\n */\r\n public static async storeSource(source: MapLayerSource, iTwinId: GuidString, iModelId?: GuidString, storeOnIModel?: boolean): Promise<boolean> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return false;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const sourceJSON = source.toJSON();\r\n const mapLayerSetting: MapLayerPreferencesContent = {\r\n url: sourceJSON.url,\r\n name: sourceJSON.name,\r\n formatId: sourceJSON.formatId,\r\n transparentBackground: sourceJSON.transparentBackground,\r\n };\r\n\r\n const result: boolean = await MapLayerPreferences.delete(sourceJSON.url, sourceJSON.name, iTwinId, iModelId, storeOnIModel);\r\n if (result) {\r\n await MapLayersUI.iTwinConfig.save({\r\n accessToken,\r\n content: mapLayerSetting,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: sourceJSON.name,\r\n iTwinId,\r\n iModelId: storeOnIModel ? iModelId : undefined,\r\n });\r\n MapLayerPreferences.onLayerSourceChanged.raiseEvent(MapLayerSourceChangeType.Added, undefined, MapLayerSource.fromJSON(mapLayerSetting));\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /** Replace the old map layer source with a new map layer source.\r\n *\r\n * The source is replaced at the same level that the original source is defined. (i.e. if the old source is defined at a project level, the new source will also be defined there.)\r\n *\r\n * @param oldSource\r\n * @param newSource\r\n * @param iTwinId\r\n * @param iModelId\r\n */\r\n public static async replaceSource(oldSource: MapLayerSource, newSource: MapLayerSource, iTwinId: GuidString, iModelId?: GuidString): Promise<void> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n let storeOnIModel = false;\r\n try {\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: oldSource.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n } catch (_err) {\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: oldSource.name,\r\n iTwinId,\r\n });\r\n storeOnIModel = true;\r\n }\r\n\r\n const mapLayerSetting: MapLayerPreferencesContent = {\r\n url: newSource.url,\r\n name: newSource.name,\r\n formatId: newSource.formatId,\r\n transparentBackground: newSource.transparentBackground,\r\n };\r\n\r\n await MapLayersUI.iTwinConfig.save({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: `${MapLayerPreferences._preferenceNamespace}.${newSource.name}`,\r\n iTwinId,\r\n iModelId: storeOnIModel ? iModelId : undefined,\r\n content: mapLayerSetting,\r\n });\r\n\r\n MapLayerPreferences.onLayerSourceChanged.raiseEvent(MapLayerSourceChangeType.Replaced, oldSource, newSource);\r\n }\r\n\r\n /** Deletes the provided MapLayerSource by name from both the iTwin or iModel level.\r\n *\r\n * @param source The source to delete. The name is used to identify the source.\r\n * @param iTwinId\r\n * @param iModelId\r\n */\r\n public static async deleteByName(source: MapLayerSource, iTwinId: GuidString, iModelId?: GuidString): Promise<void> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n try {\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: source.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n } catch (_err) {\r\n // failed to store based on iModelId, attempt using iTwinId\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: source.name,\r\n iTwinId,\r\n });\r\n }\r\n\r\n MapLayerPreferences.onLayerSourceChanged.raiseEvent(MapLayerSourceChangeType.Removed, source, undefined);\r\n }\r\n\r\n /** Deletes the current setting with the provided key if it is defined at the same preference level.\r\n *\r\n * If the preference is defined within a different level, false will be returned indicating the setting should not be overriden.\r\n *\r\n * The two potential preference levels are iTwin and iModel.\r\n *\r\n * @param url\r\n * @param name\r\n * @param iTwinId\r\n * @param iModelId\r\n * @param storeOnIModel\r\n */\r\n private static async delete(url: string, name: string, iTwinId: GuidString, iModelId?: GuidString, storeOnIModel?: boolean): Promise<boolean> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return true;\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const iTwinPreferenceByName = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: name,\r\n iTwinId,\r\n });\r\n\r\n if (undefined !== iTwinPreferenceByName && storeOnIModel) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerExistsAsProjectSetting\", { layer: iTwinPreferenceByName.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return false;\r\n } else if (iTwinPreferenceByName) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerExistsOverwriting\", { layer: iTwinPreferenceByName.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: iTwinPreferenceByName.name,\r\n iTwinId,\r\n });\r\n }\r\n\r\n // check if setting with url already exists, if it does, delete it\r\n const settingFromUrl = await MapLayerPreferences.getByUrl(url, iTwinId, undefined);\r\n if (settingFromUrl && storeOnIModel) {\r\n const errorMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerWithUrlExistsAsProjectSetting\", { url: settingFromUrl.url, name: settingFromUrl.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, errorMessage));\r\n return false;\r\n } else if (settingFromUrl) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerWithUrlExistsOverwriting\", { url: settingFromUrl.url, oldName: settingFromUrl.name, newName: name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: settingFromUrl.name,\r\n iTwinId,\r\n });\r\n }\r\n\r\n if (iModelId) { // delete any settings on model so user can update them if theres collisions\r\n const settingOnIModelFromName = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n const settingFromUrlOnIModel = await MapLayerPreferences.getByUrl(url, iTwinId, iModelId);\r\n if (settingOnIModelFromName) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerExistsOverwriting\", { layer: settingOnIModelFromName.name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: settingOnIModelFromName.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n }\r\n if (settingFromUrlOnIModel) {\r\n const infoMessage = IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.LayerWithUrlExistsOverwriting\", { url: settingFromUrlOnIModel.url, oldName: settingFromUrlOnIModel.name, newName: name });\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, infoMessage));\r\n await MapLayersUI.iTwinConfig.delete({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: settingFromUrlOnIModel.name,\r\n iTwinId,\r\n iModelId,\r\n });\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Attempts to get a map layer based off a specific url.\r\n * @param url\r\n * @param iTwinId\r\n * @param iModelId\r\n */\r\n public static async getByUrl(url: string, iTwinId: string, iModelId?: string): Promise<MapLayerPreferencesContent | undefined> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return undefined;\r\n\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const settingResponse = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: \"\",\r\n iTwinId,\r\n iModelId,\r\n });\r\n\r\n if (undefined === settingResponse || 0 === settingResponse.length)\r\n return undefined;\r\n\r\n let savedMapLayer;\r\n settingResponse.settingsMap?.forEach((savedLayer: any) => {\r\n if (savedLayer.url === url) {\r\n savedMapLayer = savedLayer;\r\n }\r\n });\r\n return savedMapLayer;\r\n }\r\n\r\n /** Get all MapLayerSources from the user's preferences, iTwin setting and iModel settings.\r\n * @param iTwinId id of the iTwin\r\n * @param iModelId id of the iModel\r\n * @throws if any of the calls to grab settings fail.\r\n */\r\n public static async getSources(iTwinId: GuidString, iModelId?: GuidString): Promise<MapLayerSource[]> {\r\n if (!MapLayersUI.iTwinConfig)\r\n return [];\r\n const accessToken = undefined !== IModelApp.authorizationClient ? (await IModelApp.authorizationClient.getAccessToken()) : undefined;\r\n\r\n const mapLayerList = [];\r\n\r\n try {\r\n const userResultByProject = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: \"\",\r\n iTwinId,\r\n });\r\n if (undefined !== userResultByProject)\r\n mapLayerList.push(userResultByProject);\r\n } catch (err: any) {\r\n throw new Error(IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorRetrieveUserProject\", { errorMessage: err }));\r\n }\r\n\r\n try {\r\n const userResultByIModel = await MapLayersUI.iTwinConfig.get({\r\n accessToken,\r\n namespace: MapLayerPreferences._preferenceNamespace,\r\n key: \"\",\r\n iTwinId,\r\n iModelId,\r\n });\r\n if (undefined !== userResultByIModel)\r\n mapLayerList.push(userResultByIModel);\r\n } catch (err: any) {\r\n throw new Error(IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorRetrieveUserProject\", { errorMessage: err }));\r\n }\r\n\r\n const savedMapLayerSources: MapLayerSource[] = [];\r\n for (const mapLayer of mapLayerList) {\r\n mapLayer.forEach((savedLayer: any) => {\r\n const mapLayerSource = MapLayerSource.fromJSON(savedLayer as MapLayerPreferencesContent);\r\n if (mapLayerSource)\r\n savedMapLayerSources.push(mapLayerSource);\r\n });\r\n }\r\n return savedMapLayerSources;\r\n }\r\n\r\n private static get _preferenceNamespace() {\r\n return \"MapLayerSource-SettingsService\";\r\n }\r\n}\r\n"]}