@itwin/map-layers 5.1.2 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/lib/cjs/map-layers.d.ts +0 -1
  3. package/lib/cjs/map-layers.d.ts.map +1 -1
  4. package/lib/cjs/map-layers.js +0 -1
  5. package/lib/cjs/map-layers.js.map +1 -1
  6. package/lib/cjs/public/locales/en/mapLayers.json +6 -0
  7. package/lib/cjs/ui/FeatureInfoUiItemsProvider.d.ts +3 -2
  8. package/lib/cjs/ui/FeatureInfoUiItemsProvider.d.ts.map +1 -1
  9. package/lib/cjs/ui/FeatureInfoUiItemsProvider.js +14 -5
  10. package/lib/cjs/ui/FeatureInfoUiItemsProvider.js.map +1 -1
  11. package/lib/cjs/ui/Interfaces.d.ts +1 -6
  12. package/lib/cjs/ui/Interfaces.d.ts.map +1 -1
  13. package/lib/cjs/ui/Interfaces.js.map +1 -1
  14. package/lib/cjs/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  15. package/lib/cjs/ui/widget/AttachLayerPopupButton.js +3 -2
  16. package/lib/cjs/ui/widget/AttachLayerPopupButton.js.map +1 -1
  17. package/lib/cjs/ui/widget/BasemapPanel.js +1 -1
  18. package/lib/cjs/ui/widget/BasemapPanel.js.map +1 -1
  19. package/lib/cjs/ui/widget/FeatureInfoDataProvider.d.ts +10 -18
  20. package/lib/cjs/ui/widget/FeatureInfoDataProvider.d.ts.map +1 -1
  21. package/lib/cjs/ui/widget/FeatureInfoDataProvider.js +59 -45
  22. package/lib/cjs/ui/widget/FeatureInfoDataProvider.js.map +1 -1
  23. package/lib/cjs/ui/widget/FeatureInfoWidget.d.ts.map +1 -1
  24. package/lib/cjs/ui/widget/FeatureInfoWidget.js +7 -27
  25. package/lib/cjs/ui/widget/FeatureInfoWidget.js.map +1 -1
  26. package/lib/cjs/ui/widget/MapLayerActionButtons.d.ts +13 -0
  27. package/lib/cjs/ui/widget/MapLayerActionButtons.d.ts.map +1 -0
  28. package/lib/cjs/ui/widget/MapLayerActionButtons.js +31 -0
  29. package/lib/cjs/ui/widget/MapLayerActionButtons.js.map +1 -0
  30. package/lib/cjs/ui/widget/MapLayerDroppable.d.ts +1 -0
  31. package/lib/cjs/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  32. package/lib/cjs/ui/widget/MapLayerDroppable.js +13 -3
  33. package/lib/cjs/ui/widget/MapLayerDroppable.js.map +1 -1
  34. package/lib/cjs/ui/widget/MapLayerManager.d.ts.map +1 -1
  35. package/lib/cjs/ui/widget/MapLayerManager.js +74 -15
  36. package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
  37. package/lib/cjs/ui/widget/MapLayerManager.scss +42 -17
  38. package/lib/cjs/ui/widget/MapLayerSettingsMenu.js +1 -1
  39. package/lib/cjs/ui/widget/MapLayerSettingsMenu.js.map +1 -1
  40. package/lib/cjs/ui/widget/MapManagerMapLayersHeader.d.ts +9 -0
  41. package/lib/cjs/ui/widget/MapManagerMapLayersHeader.d.ts.map +1 -0
  42. package/lib/cjs/ui/widget/MapManagerMapLayersHeader.js +19 -0
  43. package/lib/cjs/ui/widget/MapManagerMapLayersHeader.js.map +1 -0
  44. package/lib/esm/map-layers.d.ts +0 -1
  45. package/lib/esm/map-layers.d.ts.map +1 -1
  46. package/lib/esm/map-layers.js +0 -1
  47. package/lib/esm/map-layers.js.map +1 -1
  48. package/lib/esm/public/locales/en/mapLayers.json +6 -0
  49. package/lib/esm/ui/FeatureInfoUiItemsProvider.d.ts +3 -2
  50. package/lib/esm/ui/FeatureInfoUiItemsProvider.d.ts.map +1 -1
  51. package/lib/esm/ui/FeatureInfoUiItemsProvider.js +13 -5
  52. package/lib/esm/ui/FeatureInfoUiItemsProvider.js.map +1 -1
  53. package/lib/esm/ui/Interfaces.d.ts +1 -6
  54. package/lib/esm/ui/Interfaces.d.ts.map +1 -1
  55. package/lib/esm/ui/Interfaces.js.map +1 -1
  56. package/lib/esm/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
  57. package/lib/esm/ui/widget/AttachLayerPopupButton.js +4 -3
  58. package/lib/esm/ui/widget/AttachLayerPopupButton.js.map +1 -1
  59. package/lib/esm/ui/widget/BasemapPanel.js +1 -1
  60. package/lib/esm/ui/widget/BasemapPanel.js.map +1 -1
  61. package/lib/esm/ui/widget/FeatureInfoDataProvider.d.ts +10 -18
  62. package/lib/esm/ui/widget/FeatureInfoDataProvider.d.ts.map +1 -1
  63. package/lib/esm/ui/widget/FeatureInfoDataProvider.js +58 -44
  64. package/lib/esm/ui/widget/FeatureInfoDataProvider.js.map +1 -1
  65. package/lib/esm/ui/widget/FeatureInfoWidget.d.ts.map +1 -1
  66. package/lib/esm/ui/widget/FeatureInfoWidget.js +8 -28
  67. package/lib/esm/ui/widget/FeatureInfoWidget.js.map +1 -1
  68. package/lib/esm/ui/widget/MapLayerActionButtons.d.ts +13 -0
  69. package/lib/esm/ui/widget/MapLayerActionButtons.d.ts.map +1 -0
  70. package/lib/esm/ui/widget/MapLayerActionButtons.js +27 -0
  71. package/lib/esm/ui/widget/MapLayerActionButtons.js.map +1 -0
  72. package/lib/esm/ui/widget/MapLayerDroppable.d.ts +1 -0
  73. package/lib/esm/ui/widget/MapLayerDroppable.d.ts.map +1 -1
  74. package/lib/esm/ui/widget/MapLayerDroppable.js +14 -4
  75. package/lib/esm/ui/widget/MapLayerDroppable.js.map +1 -1
  76. package/lib/esm/ui/widget/MapLayerManager.d.ts.map +1 -1
  77. package/lib/esm/ui/widget/MapLayerManager.js +74 -15
  78. package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
  79. package/lib/esm/ui/widget/MapLayerManager.scss +42 -17
  80. package/lib/esm/ui/widget/MapLayerSettingsMenu.js +1 -1
  81. package/lib/esm/ui/widget/MapLayerSettingsMenu.js.map +1 -1
  82. package/lib/esm/ui/widget/MapManagerMapLayersHeader.d.ts +9 -0
  83. package/lib/esm/ui/widget/MapManagerMapLayersHeader.d.ts.map +1 -0
  84. package/lib/esm/ui/widget/MapManagerMapLayersHeader.js +15 -0
  85. package/lib/esm/ui/widget/MapManagerMapLayersHeader.js.map +1 -0
  86. package/lib/public/locales/en/mapLayers.json +6 -0
  87. package/package.json +34 -15
  88. package/lib/cjs/ui/MapFeatureInfoTool.d.ts +0 -14
  89. package/lib/cjs/ui/MapFeatureInfoTool.d.ts.map +0 -1
  90. package/lib/cjs/ui/MapFeatureInfoTool.js +0 -51
  91. package/lib/cjs/ui/MapFeatureInfoTool.js.map +0 -1
  92. package/lib/esm/ui/MapFeatureInfoTool.d.ts +0 -14
  93. package/lib/esm/ui/MapFeatureInfoTool.d.ts.map +0 -1
  94. package/lib/esm/ui/MapFeatureInfoTool.js +0 -46
  95. package/lib/esm/ui/MapFeatureInfoTool.js.map +0 -1
@@ -15,12 +15,12 @@ const itwinui_react_1 = require("@itwin/itwinui-react");
15
15
  const React = require("react");
16
16
  const react_beautiful_dnd_1 = require("react-beautiful-dnd");
17
17
  const MapLayerPreferences_1 = require("../../MapLayerPreferences");
18
- const AttachLayerPopupButton_1 = require("./AttachLayerPopupButton");
19
18
  const BasemapPanel_1 = require("./BasemapPanel");
20
19
  const MapLayerDroppable_1 = require("./MapLayerDroppable");
21
20
  require("./MapLayerManager.scss");
22
- const MapLayerSettingsPopupButton_1 = require("./MapLayerSettingsPopupButton");
23
21
  const mapLayers_1 = require("../../mapLayers");
22
+ const MapLayerActionButtons_1 = require("./MapLayerActionButtons");
23
+ const MapManagerMapLayersHeader_1 = require("./MapManagerMapLayersHeader");
24
24
  /** @internal */
25
25
  exports.SourceMapContext = React.createContext({
26
26
  sources: [],
@@ -60,6 +60,7 @@ function getMapLayerSettingsFromViewport(viewport, getBackgroundMap, populateSub
60
60
  isOverlay,
61
61
  layerIndex,
62
62
  provider: layerProvider,
63
+ selected: false,
63
64
  });
64
65
  }
65
66
  // since we want to display higher level maps above lower maps in UI reverse their order here.
@@ -342,6 +343,72 @@ function MapLayerManager(props) {
342
343
  if (activeViewport)
343
344
  loadMapLayerSettingsFromViewport(activeViewport);
344
345
  }, [activeViewport, loadMapLayerSettingsFromViewport]);
346
+ const handleItemSelected = React.useCallback((isOverlay, _index) => {
347
+ if (isOverlay) {
348
+ if (overlayMapLayers)
349
+ setOverlayMapLayers([...overlayMapLayers]);
350
+ }
351
+ else {
352
+ if (backgroundMapLayers)
353
+ setBackgroundMapLayers([...backgroundMapLayers]);
354
+ }
355
+ }, [backgroundMapLayers, overlayMapLayers]);
356
+ const hasItemSelected = React.useCallback((isOverlay) => {
357
+ const layerList = (isOverlay ? overlayMapLayers : backgroundMapLayers);
358
+ if (!layerList)
359
+ return false;
360
+ return undefined !== layerList?.find((value) => value.selected === true);
361
+ }, [backgroundMapLayers, overlayMapLayers]);
362
+ const changeLayerVisibility = React.useCallback((visible, index, isOverlay) => {
363
+ activeViewport.displayStyle.changeMapLayerProps({ visible }, { index, isOverlay });
364
+ }, [activeViewport]);
365
+ const changeAllLayerVisibility = React.useCallback(async (visible, isOverlay) => {
366
+ if (isOverlay === undefined || !isOverlay)
367
+ backgroundMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));
368
+ if (isOverlay === undefined || isOverlay)
369
+ overlayMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));
370
+ }, [backgroundMapLayers, overlayMapLayers, changeLayerVisibility]);
371
+ const invertAllLayerVisibility = React.useCallback(async (isOverlay) => {
372
+ if (isOverlay === undefined || !isOverlay)
373
+ backgroundMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));
374
+ if (isOverlay === undefined || isOverlay)
375
+ overlayMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));
376
+ }, [backgroundMapLayers, overlayMapLayers, changeLayerVisibility]);
377
+ const detachSelectedLayers = React.useCallback(async (isOverlay) => {
378
+ const layerList = (isOverlay ? overlayMapLayers : backgroundMapLayers);
379
+ if (!layerList || layerList.length === 0)
380
+ return;
381
+ for (let i = 0; i < layerList.length; i++) {
382
+ if (layerList[i].selected) {
383
+ const index = (layerList.length - 1) - i; // Layers are reverted order is display style
384
+ activeViewport.displayStyle.detachMapLayerByIndex({ isOverlay, index });
385
+ }
386
+ }
387
+ }, [activeViewport, overlayMapLayers, backgroundMapLayers]);
388
+ const selectAllLayers = React.useCallback(async (isOverlay) => {
389
+ if (!overlayMapLayers || !backgroundMapLayers)
390
+ return;
391
+ const layerList = (isOverlay ? [...overlayMapLayers] : [...backgroundMapLayers]);
392
+ const hasCheckedLayer = undefined !== layerList?.find((value) => value.selected === true);
393
+ layerList.forEach((layer) => { layer.selected = !hasCheckedLayer; });
394
+ if (isOverlay)
395
+ setOverlayMapLayers(layerList);
396
+ else
397
+ setBackgroundMapLayers(layerList);
398
+ }, [overlayMapLayers, backgroundMapLayers]);
399
+ const renderMapLayersList = React.useCallback((options) => {
400
+ if (!overlayMapLayers || !backgroundMapLayers)
401
+ return React.createElement(React.Fragment, null);
402
+ const { isOverlay } = options;
403
+ const layerList = (isOverlay ? [...overlayMapLayers] : [...backgroundMapLayers]);
404
+ const label = (isOverlay ? overlaysLabel : underlaysLabel);
405
+ return (React.createElement("div", { className: "map-manager-layer-wrapper", "data-testid": "map-manager-layer-section" },
406
+ React.createElement(MapManagerMapLayersHeader_1.MapManagerLayersHeader, { label: label, isOverlay: isOverlay, disabled: !backgroundMapVisible }),
407
+ (layerList && layerList.length > 0) &&
408
+ React.createElement(React.Fragment, null,
409
+ React.createElement(MapLayerActionButtons_1.MapLayerActionButtons, { disabled: !backgroundMapVisible, disabledUnlink: !hasItemSelected(isOverlay), hideAll: async () => changeAllLayerVisibility(false, isOverlay), showAll: async () => changeAllLayerVisibility(true, isOverlay), invert: async () => invertAllLayerVisibility(isOverlay), selectAll: async () => selectAllLayers(isOverlay), unlink: async () => detachSelectedLayers(isOverlay), checked: hasItemSelected(isOverlay) })),
410
+ React.createElement(MapLayerDroppable_1.MapLayerDroppable, { disabled: !backgroundMapVisible, isOverlay: isOverlay, layersList: layerList, mapTypesOptions: props.mapLayerOptions?.mapTypeOptions, getContainerForClone: props.getContainerForClone, activeViewport: props.activeViewport, onMenuItemSelected: handleOnMenuItemSelection, onItemVisibilityToggleClicked: handleLayerVisibilityChange, onItemSelected: handleItemSelected, onItemEdited: handleRefreshFromStyle })));
411
+ }, [backgroundMapLayers, backgroundMapVisible, changeAllLayerVisibility, detachSelectedLayers, handleItemSelected, handleLayerVisibilityChange, handleOnMenuItemSelection, handleRefreshFromStyle, hasItemSelected, invertAllLayerVisibility, overlayMapLayers, overlaysLabel, props.activeViewport, props.getContainerForClone, props.mapLayerOptions?.mapTypeOptions, selectAllLayers, underlaysLabel]);
345
412
  const [baseMapPanelLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Basemap.BaseMapPanelTitle"));
346
413
  return (React.createElement(exports.SourceMapContext.Provider, { value: {
347
414
  activeViewport,
@@ -356,23 +423,15 @@ function MapLayerManager(props) {
356
423
  React.createElement("div", { className: "map-manager-top-header" },
357
424
  React.createElement("span", { className: "map-manager-header-label" }, baseMapPanelLabel),
358
425
  React.createElement("div", { className: "map-manager-header-buttons-group" },
359
- React.createElement(itwinui_react_1.ToggleSwitch, { className: "map-manager-toggle", checked: backgroundMapVisible, onChange: handleMapLayersToggle }),
360
- React.createElement(MapLayerSettingsPopupButton_1.MapLayerSettingsPopupButton, { disabled: !backgroundMapVisible }))),
426
+ React.createElement(itwinui_react_1.ToggleSwitch, { className: "map-manager-toggle", checked: backgroundMapVisible, onChange: handleMapLayersToggle }))),
361
427
  React.createElement("div", { className: "map-manager-container" },
362
428
  React.createElement("div", { className: "map-manager-basemap" },
363
429
  React.createElement(BasemapPanel_1.BasemapPanel, { disabled: !backgroundMapVisible })),
364
430
  !hideExternalMapLayersSection &&
365
- React.createElement(react_beautiful_dnd_1.DragDropContext, { onDragEnd: handleOnMapLayerDragEnd },
366
- React.createElement("div", { className: "map-manager-layer-wrapper" },
367
- React.createElement("div", { className: "map-manager-underlays" },
368
- React.createElement("span", { className: "map-manager-underlays-label" }, underlaysLabel),
369
- React.createElement(AttachLayerPopupButton_1.AttachLayerPopupButton, { disabled: !backgroundMapVisible, isOverlay: false })),
370
- React.createElement(MapLayerDroppable_1.MapLayerDroppable, { disabled: !backgroundMapVisible, isOverlay: false, layersList: backgroundMapLayers, mapTypesOptions: props.mapLayerOptions?.mapTypeOptions, getContainerForClone: props.getContainerForClone, activeViewport: props.activeViewport, onMenuItemSelected: handleOnMenuItemSelection, onItemVisibilityToggleClicked: handleLayerVisibilityChange, onItemEdited: handleRefreshFromStyle })),
371
- React.createElement("div", { className: "map-manager-layer-wrapper" },
372
- React.createElement("div", { className: "map-manager-overlays" },
373
- React.createElement("span", { className: "map-manager-overlays-label" }, overlaysLabel),
374
- React.createElement(AttachLayerPopupButton_1.AttachLayerPopupButton, { disabled: !backgroundMapVisible, isOverlay: true })),
375
- React.createElement(MapLayerDroppable_1.MapLayerDroppable, { disabled: !backgroundMapVisible, isOverlay: true, layersList: overlayMapLayers, mapTypesOptions: props.mapLayerOptions?.mapTypeOptions, getContainerForClone: props.getContainerForClone, activeViewport: props.activeViewport, onMenuItemSelected: handleOnMenuItemSelection, onItemVisibilityToggleClicked: handleLayerVisibilityChange, onItemEdited: handleRefreshFromStyle }))))));
431
+ React.createElement("div", null,
432
+ React.createElement(react_beautiful_dnd_1.DragDropContext, { onDragEnd: handleOnMapLayerDragEnd },
433
+ renderMapLayersList({ isOverlay: false }),
434
+ renderMapLayersList({ isOverlay: true }))))));
376
435
  }
377
436
  exports.MapLayerManager = MapLayerManager;
378
437
  //# sourceMappingURL=MapLayerManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerManager.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore droppable Sublayer Basemap\n\n// the following quiet warning caused by react-beautiful-dnd package\n/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { BentleyError, compareStrings } from \"@itwin/core-bentley\";\nimport { ImageMapLayerSettings, MapImagerySettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\nimport {\n ImageryMapTileTree, IModelApp, MapLayerImageryProvider, MapLayerScaleRangeVisibility, MapLayerSource, MapLayerSources, NotifyMessageDetails, OutputMessagePriority,\n ScreenViewport, TileTreeOwner, Viewport,\n} from \"@itwin/core-frontend\";\nimport { ToggleSwitch } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { DragDropContext, DropResult } from \"react-beautiful-dnd\";\nimport { MapLayerPreferences, MapLayerSourceChangeType } from \"../../MapLayerPreferences\";\nimport { MapLayerOptions, StyleMapLayerSettings } from \"../Interfaces\";\nimport { AttachLayerPopupButton } from \"./AttachLayerPopupButton\";\nimport { BasemapPanel } from \"./BasemapPanel\";\nimport { MapLayerDroppable } from \"./MapLayerDroppable\";\nimport \"./MapLayerManager.scss\";\nimport { MapLayerSettingsPopupButton } from \"./MapLayerSettingsPopupButton\";\nimport { MapLayersUI } from \"../../mapLayers\";\n\n/** @internal */\nexport interface SourceMapContextProps {\n readonly sources: MapLayerSource[];\n readonly loadingSources: boolean;\n readonly bases: MapLayerSource[];\n readonly refreshFromStyle: () => void;\n readonly activeViewport?: ScreenViewport;\n readonly backgroundLayers?: StyleMapLayerSettings[];\n readonly overlayLayers?: StyleMapLayerSettings[];\n readonly mapLayerOptions?: MapLayerOptions;\n}\n\n/** @internal */\nexport const SourceMapContext = React.createContext<SourceMapContextProps>({ // eslint-disable-line @typescript-eslint/naming-convention\n sources: [],\n loadingSources: false,\n bases: [],\n refreshFromStyle: () => { },\n});\n\n/** @internal */\nexport function useSourceMapContext(): SourceMapContextProps {\n return React.useContext(SourceMapContext);\n}\n\nfunction getSubLayerProps(subLayerSettings: MapSubLayerSettings[]): MapSubLayerProps[] {\n return subLayerSettings.map((subLayer) => subLayer.toJSON());\n}\n\nfunction getMapLayerSettingsFromViewport(viewport: Viewport, getBackgroundMap: boolean, populateSubLayers = true): StyleMapLayerSettings[] | undefined {\n const displayStyle = viewport.displayStyle;\n if (!displayStyle)\n return undefined;\n\n const layers = new Array<StyleMapLayerSettings>();\n\n const displayStyleLayers = (getBackgroundMap ? displayStyle.settings.mapImagery.backgroundLayers : displayStyle.settings.mapImagery.overlayLayers);\n for (let layerIndex = 0; layerIndex < displayStyleLayers.length; layerIndex++) {\n const layerSettings = displayStyleLayers[layerIndex];\n const isOverlay = !getBackgroundMap;\n const layerProvider = viewport.getMapLayerImageryProvider({index: layerIndex, isOverlay});\n const treeVisibility = viewport.getMapLayerScaleRangeVisibility({index: layerIndex, isOverlay});\n const popSubLayers = populateSubLayers && (layerSettings instanceof ImageMapLayerSettings);\n layers.push({\n visible: layerSettings.visible,\n treeVisibility,\n name: layerSettings.name,\n source: layerSettings.source,\n transparency: layerSettings.transparency,\n transparentBackground: layerSettings.transparentBackground,\n subLayers: popSubLayers ? getSubLayerProps(layerSettings.subLayers) : undefined,\n showSubLayers: false,\n isOverlay,\n layerIndex,\n provider: layerProvider,\n });\n }\n\n // since we want to display higher level maps above lower maps in UI reverse their order here.\n return layers.reverse();\n}\n\ninterface MapLayerManagerProps {\n getContainerForClone: () => HTMLElement;\n activeViewport: ScreenViewport;\n mapLayerOptions?: MapLayerOptions;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapLayerManager(props: MapLayerManagerProps) {\n const [mapSources, setMapSources] = React.useState<MapLayerSource[] | undefined>();\n const [loadingSources, setLoadingSources] = React.useState(false);\n const [baseSources, setBaseSources] = React.useState<MapLayerSource[] | undefined>();\n const [overlaysLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:Widget.OverlayLayers\"));\n const [underlaysLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:Widget.BackgroundLayers\"));\n const { activeViewport, mapLayerOptions } = props;\n const hideExternalMapLayersSection = mapLayerOptions?.hideExternalMapLayers ? mapLayerOptions.hideExternalMapLayers : false;\n const fetchPublicMapLayerSources = mapLayerOptions?.fetchPublicMapLayerSources ? mapLayerOptions.fetchPublicMapLayerSources : false;\n\n // map layer settings from display style\n const [backgroundMapLayers, setBackgroundMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, true));\n const [overlayMapLayers, setOverlayMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, false));\n\n const loadMapLayerSettingsFromViewport = React.useCallback((viewport: Viewport) => {\n setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));\n setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));\n }, [setBackgroundMapLayers, setOverlayMapLayers]);\n\n const [backgroundMapVisible, setBackgroundMapVisible] = React.useState(() => {\n if (activeViewport) {\n return activeViewport.viewFlags.backgroundMap;\n }\n return false;\n });\n\n React.useEffect(() => {\n const updateBackgroundMapVisible = () => setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);\n return activeViewport.onDisplayStyleChanged.addListener(updateBackgroundMapVisible);\n }, [activeViewport]);\n\n // 'isMounted' is used to prevent any async operation once the hook has been\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\n const isMounted = React.useRef(false);\n React.useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n });\n\n // Setup onTileTreeLoad events listening.\n // This is needed because we need to know when the imagery provider\n // is created, and be able to monitor to status change.\n React.useEffect(() => {\n const handleTileTreeLoad = (args: TileTreeOwner) => {\n\n // Ignore non-map tile trees\n if (args.tileTree instanceof ImageryMapTileTree) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n };\n\n return IModelApp.tileAdmin.onTileTreeLoad.addListener(handleTileTreeLoad);\n\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n React.useEffect(() => {\n const handleScaleRangeVisibilityChanged = (layerIndexes: MapLayerScaleRangeVisibility[]) => {\n const updateLayers = (array: StyleMapLayerSettings[] | undefined) => {\n if (array === undefined)\n return undefined;\n\n return array.map((curStyledLayer) => {\n const foundScaleRangeVisibility = layerIndexes.find((layerIdx) => layerIdx.index === curStyledLayer.layerIndex && layerIdx.isOverlay === curStyledLayer.isOverlay);\n if (undefined === foundScaleRangeVisibility)\n return curStyledLayer;\n else\n return { ...curStyledLayer, treeVisibility: foundScaleRangeVisibility.visibility };\n });\n\n };\n setBackgroundMapLayers(updateLayers(backgroundMapLayers));\n setOverlayMapLayers(updateLayers(overlayMapLayers));\n\n };\n\n return activeViewport.onMapLayerScaleRangeVisibilityChanged.addListener(handleScaleRangeVisibilityChanged);\n\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\n\n // Setup onMapImageryChanged events listening.\n\n React.useEffect(() => {\n const handleMapImageryChanged = (args: Readonly<MapImagerySettings>) => {\n\n if (args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0)\n || args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n };\n return activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\n\n const handleProviderStatusChanged = React.useCallback((_args: MapLayerImageryProvider) => {\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [loadMapLayerSettingsFromViewport, activeViewport]);\n\n // Triggered whenever a provider status change\n React.useEffect(() => {\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\n\n return () => {\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\n };\n\n }, [backgroundMapLayers, overlayMapLayers, activeViewport, loadMapLayerSettingsFromViewport, handleProviderStatusChanged]);\n\n // Monitor viewport updates, and refresh the widget accordingly.\n // Note: This is needed for multiple viewport applications.\n React.useEffect(() => {\n // Update background map status\n setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);\n\n // Refresh list of layers\n loadMapLayerSettingsFromViewport(activeViewport);\n\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n React.useEffect(() => {\n async function fetchSources() {\n\n let preferenceSources: MapLayerSource[] = [];\n const sourceLayers = await MapLayerSources.create(undefined, (fetchPublicMapLayerSources && !hideExternalMapLayersSection));\n\n const iModel = activeViewport.iModel;\n try {\n if (iModel?.iTwinId !== undefined) {\n preferenceSources = await MapLayerPreferences.getSources(iModel.iTwinId, iModel.iModelId);\n }\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorLoadingLayers\"), BentleyError.getErrorMessage(err)));\n }\n\n if (!isMounted.current) {\n return;\n }\n\n // This is where the list of layers first gets populated...\n const sources: MapLayerSource[] = [];\n const bases: MapLayerSource[] = [];\n const addSource = (source: MapLayerSource) => source.baseMap ? bases.push(source) : sources.push(source);\n sourceLayers?.allSource.forEach(addSource);\n preferenceSources.forEach((source) => {\n // Do not add duplicate\n if (!sources.find((curSource) => source.name === curSource.name))\n addSource(source);\n });\n sources.sort((a: MapLayerSource, b: MapLayerSource) => compareStrings(a.name.toLowerCase(), b.name.toLowerCase()));\n\n setMapSources(sources);\n setBaseSources(bases);\n }\n\n setLoadingSources(true);\n\n fetchSources().then(() => {\n if (isMounted.current) {\n setLoadingSources(false);\n }\n\n }).catch(() => {\n if (isMounted.current) {\n setLoadingSources(false);\n }\n });\n }, [setMapSources, fetchPublicMapLayerSources, hideExternalMapLayersSection, activeViewport.iModel]);\n\n /**\n * Handle change events in the MapLayerPreferences\n */\n React.useEffect(() => {\n const handleLayerSourceChange = async (changeType: MapLayerSourceChangeType, oldSource?: MapLayerSource, newSource?: MapLayerSource) => {\n const removeSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Removed);\n const addSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Added);\n\n let tmpSources = (mapSources ? [...mapSources] : undefined);\n if (removeSource) {\n if (oldSource && tmpSources) {\n tmpSources = tmpSources.filter((source) => source.name !== oldSource.name);\n\n // We don't update state in case of replacement... it will be done when the source is re-added right after.\n if (changeType !== MapLayerSourceChangeType.Replaced )\n setMapSources(tmpSources);\n }\n }\n\n if (addSource) {\n if (tmpSources && newSource && !tmpSources.find((curSource) => newSource.name === curSource.name)) {\n tmpSources.push(newSource);\n tmpSources.sort((a: MapLayerSource, b: MapLayerSource) => compareStrings(a.name.toLowerCase(), b.name.toLowerCase()));\n setMapSources(tmpSources);\n }\n }\n };\n return MapLayerPreferences.onLayerSourceChanged.addListener(handleLayerSourceChange);\n\n }, [setMapSources, mapSources]);\n\n // update when a different display style is loaded.\n React.useEffect(() => {\n const handleDisplayStyleChange = (vp: Viewport) => {\n loadMapLayerSettingsFromViewport(vp);\n };\n return activeViewport?.onDisplayStyleChanged.addListener(handleDisplayStyleChange);\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleOnMenuItemSelection = React.useCallback((action: string, mapLayerSettings: StyleMapLayerSettings) => {\n if (!activeViewport || !activeViewport.displayStyle)\n return;\n\n const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (indexInDisplayStyle < 0)\n return;\n\n switch (action) {\n case \"delete\":\n activeViewport.displayStyle.detachMapLayerByIndex({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay});\n break;\n case \"zoom-to-layer\":\n activeViewport.viewMapLayerRange({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay}, activeViewport).then((status) => {\n if (!status) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.NoRangeDefined\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} [${mapLayerSettings.name}]`));\n }\n }).catch((_error) => { });\n break;\n }\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleLayerVisibilityChange = React.useCallback((mapLayerSettings: StyleMapLayerSettings) => {\n if (activeViewport) {\n const isVisible = !mapLayerSettings.visible;\n\n const displayStyle = activeViewport.displayStyle;\n const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (-1 !== indexInDisplayStyle) {\n // update the display style\n displayStyle.changeMapLayerProps({ visible: isVisible }, {index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay});\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n }\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleMapLayersToggle = React.useCallback(() => {\n if (activeViewport) {\n const newState = !backgroundMapVisible;\n activeViewport.viewFlags = activeViewport.viewFlags.with(\"backgroundMap\", newState);\n setBackgroundMapVisible(newState);\n }\n }, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);\n\n const handleOnMapLayerDragEnd = React.useCallback((result: DropResult /* , _provided: ResponderProvided*/) => {\n const { destination, source } = result;\n\n if (!destination) // dropped outside of list\n return;\n\n // item was not moved\n if (destination.droppableId === source.droppableId && destination.index === source.index)\n return;\n\n let fromMapLayer: StyleMapLayerSettings | undefined;\n if (source.droppableId === \"overlayMapLayers\" && overlayMapLayers)\n fromMapLayer = overlayMapLayers[source.index];\n else if (source.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\n fromMapLayer = backgroundMapLayers[source.index];\n\n if (!fromMapLayer || !activeViewport)\n return;\n\n const displayStyle = activeViewport.displayStyle;\n let toMapLayer: StyleMapLayerSettings | undefined;\n let toIndexInDisplayStyle = -1;\n\n // If destination.index is undefined then the user dropped the map at the end of list of maps. To get the \"actual\" index in the style, look up index in style by name.\n // We need to do this because the order of layers in UI are reversed so higher layers appear above lower layers.\n if (undefined !== destination.index) {\n if (destination.droppableId === \"overlayMapLayers\" && overlayMapLayers)\n toMapLayer = overlayMapLayers[destination.index];\n else if (destination.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\n toMapLayer = backgroundMapLayers[destination.index];\n if (toMapLayer)\n toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(toMapLayer.name, toMapLayer.source, toMapLayer.isOverlay);\n }\n\n const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(fromMapLayer.name, fromMapLayer.source, fromMapLayer.isOverlay);\n if (fromIndexInDisplayStyle < 0)\n return;\n\n if (destination.droppableId !== source.droppableId) {\n // see if we moved from \"overlayMapLayers\" to \"backgroundMapLayers\" or vice-versa\n const settings = activeViewport.displayStyle.mapLayerAtIndex({index: fromIndexInDisplayStyle, isOverlay: fromMapLayer.isOverlay});\n if (settings) {\n activeViewport.displayStyle.detachMapLayerByIndex({index: fromIndexInDisplayStyle, isOverlay: fromMapLayer.isOverlay});\n\n // Manually reverse index when moved from one section to the other\n if (fromMapLayer.isOverlay && backgroundMapLayers) {\n toIndexInDisplayStyle = displayStyle.settings.mapImagery.backgroundLayers.length - destination.index;\n } else if (!fromMapLayer.isOverlay && overlayMapLayers) {\n toIndexInDisplayStyle = overlayMapLayers.length - destination.index;\n }\n\n activeViewport.displayStyle.attachMapLayer({ settings, mapLayerIndex: {isOverlay: !fromMapLayer.isOverlay, index: toIndexInDisplayStyle} });\n }\n } else {\n if (undefined === destination.index) {\n displayStyle.moveMapLayerToBottom({index: fromIndexInDisplayStyle, isOverlay: destination.droppableId === \"overlayMapLayers\"});\n } else {\n if (toMapLayer) {\n if (toIndexInDisplayStyle !== -1)\n displayStyle.moveMapLayerToIndex(fromIndexInDisplayStyle, toIndexInDisplayStyle, toMapLayer.isOverlay);\n }\n }\n }\n // Note: display style change is automatically applied to view via DisplayStyleState._synchBackgroundMapImagery()\n // So no need to call Viewport.invalidateRenderPlan() here\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers]);\n\n const handleRefreshFromStyle = React.useCallback(() => {\n if (activeViewport)\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const [baseMapPanelLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:Basemap.BaseMapPanelTitle\"));\n\n return (\n <SourceMapContext.Provider value={{\n activeViewport,\n loadingSources,\n sources: mapSources ? mapSources : [],\n bases: baseSources ? baseSources : [],\n refreshFromStyle: handleRefreshFromStyle,\n backgroundLayers: backgroundMapLayers,\n overlayLayers: overlayMapLayers,\n mapLayerOptions,\n }}>\n <div className=\"map-manager-top-header\">\n <span className=\"map-manager-header-label\">{baseMapPanelLabel}</span>\n <div className=\"map-manager-header-buttons-group\">\n <ToggleSwitch className=\"map-manager-toggle\" checked={backgroundMapVisible} onChange={handleMapLayersToggle} />\n <MapLayerSettingsPopupButton disabled={!backgroundMapVisible} />\n </div>\n </div>\n\n <div className=\"map-manager-container\">\n\n <div className=\"map-manager-basemap\">\n <BasemapPanel disabled={!backgroundMapVisible} />\n </div>\n {!hideExternalMapLayersSection &&\n <DragDropContext onDragEnd={handleOnMapLayerDragEnd}>\n <div className=\"map-manager-layer-wrapper\">\n <div className=\"map-manager-underlays\" >\n <span className=\"map-manager-underlays-label\">{underlaysLabel}</span><AttachLayerPopupButton disabled={!backgroundMapVisible} isOverlay={false} />\n </div>\n <MapLayerDroppable\n disabled={!backgroundMapVisible}\n isOverlay={false}\n layersList={backgroundMapLayers}\n mapTypesOptions={props.mapLayerOptions?.mapTypeOptions}\n getContainerForClone={props.getContainerForClone as any}\n activeViewport={props.activeViewport}\n onMenuItemSelected={handleOnMenuItemSelection}\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\n onItemEdited={handleRefreshFromStyle} />\n </div>\n\n <div className=\"map-manager-layer-wrapper\">\n <div className=\"map-manager-overlays\" >\n <span className=\"map-manager-overlays-label\">{overlaysLabel}</span><AttachLayerPopupButton disabled={!backgroundMapVisible} isOverlay={true} />\n </div>\n <MapLayerDroppable\n disabled={!backgroundMapVisible}\n isOverlay={true}\n layersList={overlayMapLayers}\n mapTypesOptions={props.mapLayerOptions?.mapTypeOptions}\n getContainerForClone={props.getContainerForClone as any}\n activeViewport={props.activeViewport}\n onMenuItemSelected={handleOnMenuItemSelection}\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\n onItemEdited={handleRefreshFromStyle} />\n </div>\n </DragDropContext>\n }\n </div >\n </SourceMapContext.Provider >\n );\n}\n\n"]}
1
+ {"version":3,"file":"MapLayerManager.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// cSpell:ignore droppable Sublayer Basemap\n\n// the following quiet warning caused by react-beautiful-dnd package\n/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { BentleyError, compareStrings } from \"@itwin/core-bentley\";\nimport { ImageMapLayerSettings, MapImagerySettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\nimport {\n ImageryMapTileTree, IModelApp, MapLayerImageryProvider, MapLayerScaleRangeVisibility, MapLayerSource, MapLayerSources, NotifyMessageDetails, OutputMessagePriority,\n ScreenViewport, TileTreeOwner, Viewport,\n} from \"@itwin/core-frontend\";\nimport { ToggleSwitch } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { DragDropContext, DropResult } from \"react-beautiful-dnd\";\nimport { MapLayerPreferences, MapLayerSourceChangeType } from \"../../MapLayerPreferences\";\nimport { MapLayerOptions, StyleMapLayerSettings } from \"../Interfaces\";\nimport { BasemapPanel } from \"./BasemapPanel\";\nimport { MapLayerDroppable } from \"./MapLayerDroppable\";\nimport \"./MapLayerManager.scss\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapLayerActionButtons } from \"./MapLayerActionButtons\";\nimport { MapManagerLayersHeader } from \"./MapManagerMapLayersHeader\";\n\n/** @internal */\nexport interface SourceMapContextProps {\n readonly sources: MapLayerSource[];\n readonly loadingSources: boolean;\n readonly bases: MapLayerSource[];\n readonly refreshFromStyle: () => void;\n readonly activeViewport?: ScreenViewport;\n readonly backgroundLayers?: StyleMapLayerSettings[];\n readonly overlayLayers?: StyleMapLayerSettings[];\n readonly mapLayerOptions?: MapLayerOptions;\n}\n\n/** @internal */\nexport const SourceMapContext = React.createContext<SourceMapContextProps>({ // eslint-disable-line @typescript-eslint/naming-convention\n sources: [],\n loadingSources: false,\n bases: [],\n refreshFromStyle: () => { },\n});\n\n/** @internal */\nexport function useSourceMapContext(): SourceMapContextProps {\n return React.useContext(SourceMapContext);\n}\n\nfunction getSubLayerProps(subLayerSettings: MapSubLayerSettings[]): MapSubLayerProps[] {\n return subLayerSettings.map((subLayer) => subLayer.toJSON());\n}\n\nfunction getMapLayerSettingsFromViewport(viewport: Viewport, getBackgroundMap: boolean, populateSubLayers = true): StyleMapLayerSettings[] | undefined {\n const displayStyle = viewport.displayStyle;\n if (!displayStyle)\n return undefined;\n\n const layers = new Array<StyleMapLayerSettings>();\n\n const displayStyleLayers = (getBackgroundMap ? displayStyle.settings.mapImagery.backgroundLayers : displayStyle.settings.mapImagery.overlayLayers);\n for (let layerIndex = 0; layerIndex < displayStyleLayers.length; layerIndex++) {\n const layerSettings = displayStyleLayers[layerIndex];\n const isOverlay = !getBackgroundMap;\n const layerProvider = viewport.getMapLayerImageryProvider({index: layerIndex, isOverlay});\n const treeVisibility = viewport.getMapLayerScaleRangeVisibility({index: layerIndex, isOverlay});\n const popSubLayers = populateSubLayers && (layerSettings instanceof ImageMapLayerSettings);\n layers.push({\n visible: layerSettings.visible,\n treeVisibility,\n name: layerSettings.name,\n source: layerSettings.source,\n transparency: layerSettings.transparency,\n transparentBackground: layerSettings.transparentBackground,\n subLayers: popSubLayers ? getSubLayerProps(layerSettings.subLayers) : undefined,\n showSubLayers: false,\n isOverlay,\n layerIndex,\n provider: layerProvider,\n selected: false,\n });\n }\n\n // since we want to display higher level maps above lower maps in UI reverse their order here.\n return layers.reverse();\n}\n\ninterface MapLayerManagerProps {\n getContainerForClone: () => HTMLElement;\n activeViewport: ScreenViewport;\n mapLayerOptions?: MapLayerOptions;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapLayerManager(props: MapLayerManagerProps) {\n const [mapSources, setMapSources] = React.useState<MapLayerSource[] | undefined>();\n const [loadingSources, setLoadingSources] = React.useState(false);\n const [baseSources, setBaseSources] = React.useState<MapLayerSource[] | undefined>();\n const [overlaysLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:Widget.OverlayLayers\"));\n const [underlaysLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:Widget.BackgroundLayers\"));\n const { activeViewport, mapLayerOptions } = props;\n const hideExternalMapLayersSection = mapLayerOptions?.hideExternalMapLayers ? mapLayerOptions.hideExternalMapLayers : false;\n const fetchPublicMapLayerSources = mapLayerOptions?.fetchPublicMapLayerSources ? mapLayerOptions.fetchPublicMapLayerSources : false;\n\n // map layer settings from display style\n const [backgroundMapLayers, setBackgroundMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, true));\n const [overlayMapLayers, setOverlayMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, false));\n\n const loadMapLayerSettingsFromViewport = React.useCallback((viewport: Viewport) => {\n setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));\n setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));\n }, [setBackgroundMapLayers, setOverlayMapLayers]);\n\n const [backgroundMapVisible, setBackgroundMapVisible] = React.useState(() => {\n if (activeViewport) {\n return activeViewport.viewFlags.backgroundMap;\n }\n return false;\n });\n\n React.useEffect(() => {\n const updateBackgroundMapVisible = () => setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);\n return activeViewport.onDisplayStyleChanged.addListener(updateBackgroundMapVisible);\n }, [activeViewport]);\n\n // 'isMounted' is used to prevent any async operation once the hook has been\n // unloaded. Otherwise we get a 'Can't perform a React state update on an unmounted component.' warning in the console.\n const isMounted = React.useRef(false);\n React.useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n });\n\n // Setup onTileTreeLoad events listening.\n // This is needed because we need to know when the imagery provider\n // is created, and be able to monitor to status change.\n React.useEffect(() => {\n const handleTileTreeLoad = (args: TileTreeOwner) => {\n\n // Ignore non-map tile trees\n if (args.tileTree instanceof ImageryMapTileTree) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n };\n\n return IModelApp.tileAdmin.onTileTreeLoad.addListener(handleTileTreeLoad);\n\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n React.useEffect(() => {\n const handleScaleRangeVisibilityChanged = (layerIndexes: MapLayerScaleRangeVisibility[]) => {\n const updateLayers = (array: StyleMapLayerSettings[] | undefined) => {\n if (array === undefined)\n return undefined;\n\n return array.map((curStyledLayer) => {\n const foundScaleRangeVisibility = layerIndexes.find((layerIdx) => layerIdx.index === curStyledLayer.layerIndex && layerIdx.isOverlay === curStyledLayer.isOverlay);\n if (undefined === foundScaleRangeVisibility)\n return curStyledLayer;\n else\n return { ...curStyledLayer, treeVisibility: foundScaleRangeVisibility.visibility };\n });\n\n };\n setBackgroundMapLayers(updateLayers(backgroundMapLayers));\n setOverlayMapLayers(updateLayers(overlayMapLayers));\n\n };\n\n return activeViewport.onMapLayerScaleRangeVisibilityChanged.addListener(handleScaleRangeVisibilityChanged);\n\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\n\n // Setup onMapImageryChanged events listening.\n\n React.useEffect(() => {\n const handleMapImageryChanged = (args: Readonly<MapImagerySettings>) => {\n\n if (args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0)\n || args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n };\n return activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\n\n const handleProviderStatusChanged = React.useCallback((_args: MapLayerImageryProvider) => {\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [loadMapLayerSettingsFromViewport, activeViewport]);\n\n // Triggered whenever a provider status change\n React.useEffect(() => {\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged); });\n\n return () => {\n backgroundMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\n overlayMapLayers?.forEach((layer) => { layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged); });\n };\n\n }, [backgroundMapLayers, overlayMapLayers, activeViewport, loadMapLayerSettingsFromViewport, handleProviderStatusChanged]);\n\n // Monitor viewport updates, and refresh the widget accordingly.\n // Note: This is needed for multiple viewport applications.\n React.useEffect(() => {\n // Update background map status\n setBackgroundMapVisible(activeViewport.viewFlags.backgroundMap);\n\n // Refresh list of layers\n loadMapLayerSettingsFromViewport(activeViewport);\n\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n React.useEffect(() => {\n async function fetchSources() {\n\n let preferenceSources: MapLayerSource[] = [];\n const sourceLayers = await MapLayerSources.create(undefined, (fetchPublicMapLayerSources && !hideExternalMapLayersSection));\n\n const iModel = activeViewport.iModel;\n try {\n if (iModel?.iTwinId !== undefined) {\n preferenceSources = await MapLayerPreferences.getSources(iModel.iTwinId, iModel.iModelId);\n }\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorLoadingLayers\"), BentleyError.getErrorMessage(err)));\n }\n\n if (!isMounted.current) {\n return;\n }\n\n // This is where the list of layers first gets populated...\n const sources: MapLayerSource[] = [];\n const bases: MapLayerSource[] = [];\n const addSource = (source: MapLayerSource) => source.baseMap ? bases.push(source) : sources.push(source);\n sourceLayers?.allSource.forEach(addSource);\n preferenceSources.forEach((source) => {\n // Do not add duplicate\n if (!sources.find((curSource) => source.name === curSource.name))\n addSource(source);\n });\n sources.sort((a: MapLayerSource, b: MapLayerSource) => compareStrings(a.name.toLowerCase(), b.name.toLowerCase()));\n\n setMapSources(sources);\n setBaseSources(bases);\n }\n\n setLoadingSources(true);\n\n fetchSources().then(() => {\n if (isMounted.current) {\n setLoadingSources(false);\n }\n\n }).catch(() => {\n if (isMounted.current) {\n setLoadingSources(false);\n }\n });\n }, [setMapSources, fetchPublicMapLayerSources, hideExternalMapLayersSection, activeViewport.iModel]);\n\n /**\n * Handle change events in the MapLayerPreferences\n */\n React.useEffect(() => {\n const handleLayerSourceChange = async (changeType: MapLayerSourceChangeType, oldSource?: MapLayerSource, newSource?: MapLayerSource) => {\n const removeSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Removed);\n const addSource = (changeType === MapLayerSourceChangeType.Replaced || changeType === MapLayerSourceChangeType.Added);\n\n let tmpSources = (mapSources ? [...mapSources] : undefined);\n if (removeSource) {\n if (oldSource && tmpSources) {\n tmpSources = tmpSources.filter((source) => source.name !== oldSource.name);\n\n // We don't update state in case of replacement... it will be done when the source is re-added right after.\n if (changeType !== MapLayerSourceChangeType.Replaced )\n setMapSources(tmpSources);\n }\n }\n\n if (addSource) {\n if (tmpSources && newSource && !tmpSources.find((curSource) => newSource.name === curSource.name)) {\n tmpSources.push(newSource);\n tmpSources.sort((a: MapLayerSource, b: MapLayerSource) => compareStrings(a.name.toLowerCase(), b.name.toLowerCase()));\n setMapSources(tmpSources);\n }\n }\n };\n return MapLayerPreferences.onLayerSourceChanged.addListener(handleLayerSourceChange);\n\n }, [setMapSources, mapSources]);\n\n // update when a different display style is loaded.\n React.useEffect(() => {\n const handleDisplayStyleChange = (vp: Viewport) => {\n loadMapLayerSettingsFromViewport(vp);\n };\n return activeViewport?.onDisplayStyleChanged.addListener(handleDisplayStyleChange);\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleOnMenuItemSelection = React.useCallback((action: string, mapLayerSettings: StyleMapLayerSettings) => {\n if (!activeViewport || !activeViewport.displayStyle)\n return;\n\n const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (indexInDisplayStyle < 0)\n return;\n\n switch (action) {\n case \"delete\":\n activeViewport.displayStyle.detachMapLayerByIndex({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay});\n break;\n case \"zoom-to-layer\":\n activeViewport.viewMapLayerRange({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay}, activeViewport).then((status) => {\n if (!status) {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:Messages.NoRangeDefined\");\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, `${msg} [${mapLayerSettings.name}]`));\n }\n }).catch((_error) => { });\n break;\n }\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleLayerVisibilityChange = React.useCallback((mapLayerSettings: StyleMapLayerSettings) => {\n if (activeViewport) {\n const isVisible = !mapLayerSettings.visible;\n\n const displayStyle = activeViewport.displayStyle;\n const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (-1 !== indexInDisplayStyle) {\n // update the display style\n displayStyle.changeMapLayerProps({ visible: isVisible }, {index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay});\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n }\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleMapLayersToggle = React.useCallback(() => {\n if (activeViewport) {\n const newState = !backgroundMapVisible;\n activeViewport.viewFlags = activeViewport.viewFlags.with(\"backgroundMap\", newState);\n setBackgroundMapVisible(newState);\n }\n }, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);\n\n const handleOnMapLayerDragEnd = React.useCallback((result: DropResult /* , _provided: ResponderProvided*/) => {\n const { destination, source } = result;\n\n if (!destination) // dropped outside of list\n return;\n\n // item was not moved\n if (destination.droppableId === source.droppableId && destination.index === source.index)\n return;\n\n let fromMapLayer: StyleMapLayerSettings | undefined;\n if (source.droppableId === \"overlayMapLayers\" && overlayMapLayers)\n fromMapLayer = overlayMapLayers[source.index];\n else if (source.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\n fromMapLayer = backgroundMapLayers[source.index];\n\n if (!fromMapLayer || !activeViewport)\n return;\n\n const displayStyle = activeViewport.displayStyle;\n let toMapLayer: StyleMapLayerSettings | undefined;\n let toIndexInDisplayStyle = -1;\n\n // If destination.index is undefined then the user dropped the map at the end of list of maps. To get the \"actual\" index in the style, look up index in style by name.\n // We need to do this because the order of layers in UI are reversed so higher layers appear above lower layers.\n if (undefined !== destination.index) {\n if (destination.droppableId === \"overlayMapLayers\" && overlayMapLayers)\n toMapLayer = overlayMapLayers[destination.index];\n else if (destination.droppableId === \"backgroundMapLayers\" && backgroundMapLayers)\n toMapLayer = backgroundMapLayers[destination.index];\n if (toMapLayer)\n toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(toMapLayer.name, toMapLayer.source, toMapLayer.isOverlay);\n }\n\n const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(fromMapLayer.name, fromMapLayer.source, fromMapLayer.isOverlay);\n if (fromIndexInDisplayStyle < 0)\n return;\n\n if (destination.droppableId !== source.droppableId) {\n // see if we moved from \"overlayMapLayers\" to \"backgroundMapLayers\" or vice-versa\n const settings = activeViewport.displayStyle.mapLayerAtIndex({index: fromIndexInDisplayStyle, isOverlay: fromMapLayer.isOverlay});\n if (settings) {\n activeViewport.displayStyle.detachMapLayerByIndex({index: fromIndexInDisplayStyle, isOverlay: fromMapLayer.isOverlay});\n\n // Manually reverse index when moved from one section to the other\n if (fromMapLayer.isOverlay && backgroundMapLayers) {\n toIndexInDisplayStyle = displayStyle.settings.mapImagery.backgroundLayers.length - destination.index;\n } else if (!fromMapLayer.isOverlay && overlayMapLayers) {\n toIndexInDisplayStyle = overlayMapLayers.length - destination.index;\n }\n\n activeViewport.displayStyle.attachMapLayer({ settings, mapLayerIndex: {isOverlay: !fromMapLayer.isOverlay, index: toIndexInDisplayStyle} });\n }\n } else {\n if (undefined === destination.index) {\n displayStyle.moveMapLayerToBottom({index: fromIndexInDisplayStyle, isOverlay: destination.droppableId === \"overlayMapLayers\"});\n } else {\n if (toMapLayer) {\n if (toIndexInDisplayStyle !== -1)\n displayStyle.moveMapLayerToIndex(fromIndexInDisplayStyle, toIndexInDisplayStyle, toMapLayer.isOverlay);\n }\n }\n }\n // Note: display style change is automatically applied to view via DisplayStyleState._synchBackgroundMapImagery()\n // So no need to call Viewport.invalidateRenderPlan() here\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers]);\n\n const handleRefreshFromStyle = React.useCallback(() => {\n if (activeViewport)\n loadMapLayerSettingsFromViewport(activeViewport);\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleItemSelected = React.useCallback((isOverlay: boolean, _index: number) => {\n if (isOverlay ) {\n if (overlayMapLayers)\n setOverlayMapLayers([...overlayMapLayers]);\n } else {\n if (backgroundMapLayers)\n setBackgroundMapLayers([...backgroundMapLayers]);\n }\n }, [backgroundMapLayers, overlayMapLayers]);\n\n const hasItemSelected = React.useCallback((isOverlay: boolean) => {\n const layerList = (isOverlay ? overlayMapLayers : backgroundMapLayers);\n if (!layerList)\n return false;\n return undefined !== layerList?.find((value) => value.selected === true);\n }, [backgroundMapLayers, overlayMapLayers]);\n\n const changeLayerVisibility = React.useCallback((visible: boolean, index: number, isOverlay: boolean) => {\n activeViewport.displayStyle.changeMapLayerProps({ visible }, {index, isOverlay});\n }, [activeViewport]);\n\n const changeAllLayerVisibility = React.useCallback(async (visible: boolean, isOverlay?: boolean) => {\n if (isOverlay === undefined || !isOverlay)\n backgroundMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));\n\n if (isOverlay === undefined || isOverlay)\n overlayMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));\n }, [backgroundMapLayers, overlayMapLayers, changeLayerVisibility]);\n\n const invertAllLayerVisibility = React.useCallback(async (isOverlay?: boolean) => {\n if (isOverlay === undefined || !isOverlay)\n backgroundMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));\n\n if (isOverlay === undefined || isOverlay)\n overlayMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));\n }, [backgroundMapLayers, overlayMapLayers, changeLayerVisibility]);\n\n const detachSelectedLayers = React.useCallback(async (isOverlay: boolean) => {\n const layerList = (isOverlay ? overlayMapLayers : backgroundMapLayers);\n if (!layerList || layerList.length === 0)\n return;\n\n for (let i=0; i<layerList.length; i++) {\n if (layerList[i].selected) {\n const index = (layerList.length -1) - i; // Layers are reverted order is display style\n activeViewport.displayStyle.detachMapLayerByIndex({isOverlay, index});\n }\n }\n\n }, [activeViewport, overlayMapLayers, backgroundMapLayers]);\n\n const selectAllLayers = React.useCallback(async (isOverlay: boolean) => {\n if (!overlayMapLayers || !backgroundMapLayers)\n return;\n\n const layerList = (isOverlay ? [...overlayMapLayers] : [...backgroundMapLayers]);\n const hasCheckedLayer = undefined !== layerList?.find((value) => value.selected === true);\n layerList.forEach((layer) => {layer.selected = !hasCheckedLayer;} );\n\n if (isOverlay)\n setOverlayMapLayers(layerList);\n else\n setBackgroundMapLayers(layerList);\n\n }, [overlayMapLayers, backgroundMapLayers]);\n\n const renderMapLayersList = React.useCallback((options: {isOverlay: boolean}): React.ReactElement<HTMLElement> => {\n if (!overlayMapLayers || !backgroundMapLayers)\n return <></>;\n\n const {isOverlay} = options;\n const layerList = (isOverlay ? [...overlayMapLayers] : [...backgroundMapLayers]);\n\n const label = (isOverlay ? overlaysLabel : underlaysLabel);\n return (\n <div className=\"map-manager-layer-wrapper\" data-testid={\"map-manager-layer-section\"}>\n <MapManagerLayersHeader\n label={label}\n isOverlay={isOverlay}\n disabled={!backgroundMapVisible}\n />\n {(layerList && layerList.length > 0) &&\n <>\n <MapLayerActionButtons\n disabled={!backgroundMapVisible}\n disabledUnlink={!hasItemSelected(isOverlay)}\n hideAll={async () => changeAllLayerVisibility(false, isOverlay)}\n showAll={async () => changeAllLayerVisibility(true, isOverlay)}\n invert={async ()=>invertAllLayerVisibility(isOverlay)}\n selectAll={async ()=>selectAllLayers(isOverlay)}\n unlink={async ()=>detachSelectedLayers(isOverlay)}\n checked={hasItemSelected(isOverlay)}\n />\n </>\n }\n <MapLayerDroppable\n disabled={!backgroundMapVisible}\n isOverlay={isOverlay}\n layersList={layerList}\n mapTypesOptions={props.mapLayerOptions?.mapTypeOptions}\n getContainerForClone={props.getContainerForClone as any}\n activeViewport={props.activeViewport}\n onMenuItemSelected={handleOnMenuItemSelection}\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\n onItemSelected={handleItemSelected}\n onItemEdited={handleRefreshFromStyle} />\n </div>\n );\n\n },[backgroundMapLayers, backgroundMapVisible, changeAllLayerVisibility, detachSelectedLayers, handleItemSelected, handleLayerVisibilityChange, handleOnMenuItemSelection, handleRefreshFromStyle, hasItemSelected, invertAllLayerVisibility, overlayMapLayers, overlaysLabel, props.activeViewport, props.getContainerForClone, props.mapLayerOptions?.mapTypeOptions, selectAllLayers, underlaysLabel]);\n\n const [baseMapPanelLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:Basemap.BaseMapPanelTitle\"));\n\n return (\n <SourceMapContext.Provider value={{\n activeViewport,\n loadingSources,\n sources: mapSources ? mapSources : [],\n bases: baseSources ? baseSources : [],\n refreshFromStyle: handleRefreshFromStyle,\n backgroundLayers: backgroundMapLayers,\n overlayLayers: overlayMapLayers,\n mapLayerOptions,\n }}>\n {/* Header*/}\n <div className=\"map-manager-top-header\">\n <span className=\"map-manager-header-label\">{baseMapPanelLabel}</span>\n <div className=\"map-manager-header-buttons-group\">\n <ToggleSwitch className=\"map-manager-toggle\" checked={backgroundMapVisible} onChange={handleMapLayersToggle} />\n </div>\n </div>\n\n <div className=\"map-manager-container\">\n\n {/* Base map*/}\n <div className=\"map-manager-basemap\">\n <BasemapPanel disabled={!backgroundMapVisible} />\n </div>\n\n {/* List of Layers (droppable) */}\n {!hideExternalMapLayersSection &&\n <div>\n <DragDropContext onDragEnd={handleOnMapLayerDragEnd}>\n {renderMapLayersList({isOverlay: false})}\n {renderMapLayersList({isOverlay: true})}\n </DragDropContext>\n </div>\n }\n </div >\n </SourceMapContext.Provider >\n );\n}\n"]}
@@ -68,10 +68,8 @@ $default-font-size: --iui-font-size-1;
68
68
  padding: 10px;
69
69
  }
70
70
 
71
- .map-manager-underlays,
72
- .map-manager-overlays {
71
+ .map-manager-layers {
73
72
  display: flex;
74
- align-content: center;
75
73
 
76
74
  .map-manager-attach-layer-button {
77
75
  margin-left: auto;
@@ -104,13 +102,14 @@ $default-font-size: --iui-font-size-1;
104
102
  margin-top: 0;
105
103
  }
106
104
 
107
- .map-manager-overlays-label {
108
- display: block;
109
- margin-bottom: 4px;
110
- }
111
-
112
- .map-manager-underlays-label {
113
- display: block;
105
+ .map-manager-layers-label {
106
+ // display: block;
107
+ flex: 1 1;
108
+ text-overflow: ellipsis;
109
+ /* Required for text-overflow to do anything */
110
+ white-space: nowrap;
111
+ overflow: hidden;
112
+ margin-left: 2px;
114
113
  margin-bottom: 4px;
115
114
  }
116
115
 
@@ -218,6 +217,39 @@ $default-font-size: --iui-font-size-1;
218
217
  }
219
218
  }
220
219
 
220
+ .map-manager-layer-action-buttons {
221
+ display: flex;
222
+ justify-content: flex-start;
223
+ align-items: center;
224
+ height: 2.5em;
225
+ width: 100%;
226
+ padding-right: 4px;
227
+ border-bottom: #ccc;
228
+ border-bottom-style: solid;
229
+ border-bottom-width: thin;
230
+ margin-bottom: 1em;
231
+ background-color: $buic-background-1;
232
+ }
233
+
234
+ .map-manager-layer-action-unlink-button {
235
+ margin-right: 2px;
236
+ }
237
+
238
+ .map-manager-layer-action-buttons-inside-separator {
239
+ border-left-width: thin;
240
+ border-left-style: solid;
241
+ border-left-color: #ccc;
242
+ margin-left: 10px;
243
+ padding-left: 5px;
244
+ }
245
+
246
+ .map-manager-basemap-visibility {
247
+ margin: 0 2px;
248
+ }
249
+
250
+ .map-manager-visibility-icon {
251
+ padding-top: 0.5ex;
252
+ }
221
253
  .map-manager-source-item {
222
254
  display: flex;
223
255
  justify-content: flex-start;
@@ -225,9 +257,6 @@ $default-font-size: --iui-font-size-1;
225
257
  height: 2.5em;
226
258
  width: 100%;
227
259
  padding-right: 4px;
228
- border-width: 0 0 1px 0;
229
- border-style: solid;
230
- border-color: $uicore-gray-a;
231
260
  background-color: $buic-background-1;
232
261
 
233
262
  .map-manager-item-label {
@@ -248,10 +277,6 @@ $default-font-size: --iui-font-size-1;
248
277
  margin-right: 6px;
249
278
  }
250
279
 
251
- .map-manager-item-visibility {
252
- margin: 0 2px;
253
- }
254
-
255
280
  .map-layer-settings {
256
281
  margin-left: 2px;
257
282
  }
@@ -64,7 +64,7 @@ function MapLayerSettingsMenu({ mapLayerSettings, onMenuItemSelection, activeVie
64
64
  React.createElement(itwinui_react_1.Slider, { className: "map-manager-item-dropdown-slider", min: 0, max: 100, values: [transparency * 100], step: 1, onChange: handleTransparencyChange })),
65
65
  ];
66
66
  return (React.createElement(React.Fragment, null,
67
- React.createElement(itwinui_react_1.DropdownMenu, { placement: "auto-start", menuItems: dropdownMenuItems, disabled: disabled, "data-testid": "map-layer-settings" },
67
+ React.createElement(itwinui_react_1.DropdownMenu, { placement: "auto-start", menuItems: dropdownMenuItems, disabled: disabled },
68
68
  React.createElement(itwinui_react_1.IconButton, { size: "small", styleType: "borderless" },
69
69
  React.createElement(itwinui_icons_react_1.SvgMoreVertical, null)))));
70
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerSettingsMenu.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerSettingsMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport { ScreenViewport } from \"@itwin/core-frontend\";\nimport { DropdownMenu, IconButton, MenuItem, Slider } from \"@itwin/itwinui-react\";\nimport \"./MapLayerManager.scss\";\nimport { StyleMapLayerSettings } from \"../Interfaces\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { SvgMoreVertical } from \"@itwin/itwinui-icons-react\";\n\ninterface MapLayerSettingsMenuProps {\n mapLayerSettings: StyleMapLayerSettings;\n onMenuItemSelection: (action: string, mapLayerSettings: StyleMapLayerSettings) => void;\n activeViewport: ScreenViewport;\n disabled?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapLayerSettingsMenu({ mapLayerSettings, onMenuItemSelection, activeViewport, disabled }: MapLayerSettingsMenuProps) {\n const [labelDetach] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:LayerMenu.Detach\"));\n const [labelZoomToLayer] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:LayerMenu.ZoomToLayer\"));\n const [hasRangeData, setHasRangeData] = React.useState<boolean | undefined>();\n const [transparency, setTransparency] = React.useState(mapLayerSettings.transparency);\n\n React.useEffect(() => {\n async function fetchRangeData() {\n let hasRange = false;\n const indexInDisplayStyle = activeViewport?.displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (undefined !== indexInDisplayStyle) {\n hasRange = (undefined !== await activeViewport.getMapLayerRange({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay}));\n }\n setHasRangeData(hasRange);\n }\n fetchRangeData(); // eslint-disable-line @typescript-eslint/no-floating-promises\n }, [activeViewport, mapLayerSettings]);\n\n const handleRemoveLayer = React.useCallback(() => {\n onMenuItemSelection(\"delete\", mapLayerSettings);\n }, [onMenuItemSelection, mapLayerSettings]);\n\n const handleZoomToLayer = React.useCallback(() => {\n onMenuItemSelection(\"zoom-to-layer\", mapLayerSettings);\n }, [onMenuItemSelection, mapLayerSettings]);\n\n const applyTransparencyChange = React.useCallback((value: number) => {\n if (activeViewport) {\n const newTransparency = value;\n const displayStyle = activeViewport.displayStyle;\n const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (-1 !== indexInDisplayStyle) {\n const styleTransparency = displayStyle.mapLayerAtIndex({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay})?.transparency;\n const styleTransparencyValue = styleTransparency ? styleTransparency : 0;\n if (Math.abs(styleTransparencyValue - newTransparency) > 0.01) {\n // update the display style\n displayStyle.changeMapLayerProps({ transparency: newTransparency }, {index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay});\n }\n }\n }\n }, [activeViewport, mapLayerSettings]);\n\n const handleTransparencyChange = React.useCallback((values: readonly number[]) => {\n if (values.length) {\n const newTransparency = values[0] / 100.0;\n if (newTransparency !== transparency) {\n setTransparency(newTransparency);\n applyTransparencyChange(newTransparency);\n }\n }\n }, [transparency, applyTransparencyChange]);\n\n const dropdownMenuItems = () => [\n <MenuItem disabled={!hasRangeData} key={0} onClick={() => handleZoomToLayer()}>{labelZoomToLayer}</MenuItem>,\n <MenuItem key={1} onClick={() => handleRemoveLayer()}>{labelDetach}</MenuItem>,\n <MenuItem key={2} >\n <Slider className=\"map-manager-item-dropdown-slider\" min={0} max={100} values={[transparency * 100]} step={1} onChange={handleTransparencyChange} />\n </MenuItem>,\n ];\n\n return (\n <>\n <DropdownMenu placement=\"auto-start\" menuItems={dropdownMenuItems} disabled={disabled} data-testid=\"map-layer-settings\" >\n <IconButton size=\"small\" styleType=\"borderless\">\n <SvgMoreVertical />\n </IconButton>\n </DropdownMenu>\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"MapLayerSettingsMenu.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerSettingsMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport { ScreenViewport } from \"@itwin/core-frontend\";\nimport { DropdownMenu, IconButton, MenuItem, Slider } from \"@itwin/itwinui-react\";\nimport \"./MapLayerManager.scss\";\nimport { StyleMapLayerSettings } from \"../Interfaces\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { SvgMoreVertical } from \"@itwin/itwinui-icons-react\";\n\ninterface MapLayerSettingsMenuProps {\n mapLayerSettings: StyleMapLayerSettings;\n onMenuItemSelection: (action: string, mapLayerSettings: StyleMapLayerSettings) => void;\n activeViewport: ScreenViewport;\n disabled?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function MapLayerSettingsMenu({ mapLayerSettings, onMenuItemSelection, activeViewport, disabled }: MapLayerSettingsMenuProps) {\n const [labelDetach] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:LayerMenu.Detach\"));\n const [labelZoomToLayer] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:LayerMenu.ZoomToLayer\"));\n const [hasRangeData, setHasRangeData] = React.useState<boolean | undefined>();\n const [transparency, setTransparency] = React.useState(mapLayerSettings.transparency);\n\n React.useEffect(() => {\n async function fetchRangeData() {\n let hasRange = false;\n const indexInDisplayStyle = activeViewport?.displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (undefined !== indexInDisplayStyle) {\n hasRange = (undefined !== await activeViewport.getMapLayerRange({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay}));\n }\n setHasRangeData(hasRange);\n }\n fetchRangeData(); // eslint-disable-line @typescript-eslint/no-floating-promises\n }, [activeViewport, mapLayerSettings]);\n\n const handleRemoveLayer = React.useCallback(() => {\n onMenuItemSelection(\"delete\", mapLayerSettings);\n }, [onMenuItemSelection, mapLayerSettings]);\n\n const handleZoomToLayer = React.useCallback(() => {\n onMenuItemSelection(\"zoom-to-layer\", mapLayerSettings);\n }, [onMenuItemSelection, mapLayerSettings]);\n\n const applyTransparencyChange = React.useCallback((value: number) => {\n if (activeViewport) {\n const newTransparency = value;\n const displayStyle = activeViewport.displayStyle;\n const indexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(mapLayerSettings.name, mapLayerSettings.source, mapLayerSettings.isOverlay);\n if (-1 !== indexInDisplayStyle) {\n const styleTransparency = displayStyle.mapLayerAtIndex({index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay})?.transparency;\n const styleTransparencyValue = styleTransparency ? styleTransparency : 0;\n if (Math.abs(styleTransparencyValue - newTransparency) > 0.01) {\n // update the display style\n displayStyle.changeMapLayerProps({ transparency: newTransparency }, {index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay});\n }\n }\n }\n }, [activeViewport, mapLayerSettings]);\n\n const handleTransparencyChange = React.useCallback((values: readonly number[]) => {\n if (values.length) {\n const newTransparency = values[0] / 100.0;\n if (newTransparency !== transparency) {\n setTransparency(newTransparency);\n applyTransparencyChange(newTransparency);\n }\n }\n }, [transparency, applyTransparencyChange]);\n\n const dropdownMenuItems = () => [\n <MenuItem disabled={!hasRangeData} key={0} onClick={() => handleZoomToLayer()}>{labelZoomToLayer}</MenuItem>,\n <MenuItem key={1} onClick={() => handleRemoveLayer()}>{labelDetach}</MenuItem>,\n <MenuItem key={2} >\n <Slider className=\"map-manager-item-dropdown-slider\" min={0} max={100} values={[transparency * 100]} step={1} onChange={handleTransparencyChange} />\n </MenuItem>,\n ];\n\n return (\n <>\n <DropdownMenu placement=\"auto-start\" menuItems={dropdownMenuItems} disabled={disabled} >\n <IconButton size=\"small\" styleType=\"borderless\">\n <SvgMoreVertical />\n </IconButton>\n </DropdownMenu>\n </>\n );\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import "./MapLayerManager.scss";
2
+ interface MapManagerLayersHeaderProps {
3
+ label: string;
4
+ isOverlay: boolean;
5
+ disabled?: boolean;
6
+ }
7
+ export declare function MapManagerLayersHeader(props: MapManagerLayersHeaderProps): JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=MapManagerMapLayersHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapManagerMapLayersHeader.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapManagerMapLayersHeader.tsx"],"names":[],"mappings":"AAOA,OAAO,wBAAwB,CAAC;AAEhC,UAAU,2BAA2B;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,eAUxE"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MapManagerLayersHeader = void 0;
4
+ /*---------------------------------------------------------------------------------------------
5
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
+ * See LICENSE.md in the project root for license terms and full copyright notice.
7
+ *--------------------------------------------------------------------------------------------*/
8
+ const itwinui_react_1 = require("@itwin/itwinui-react");
9
+ const React = require("react");
10
+ const AttachLayerPopupButton_1 = require("./AttachLayerPopupButton");
11
+ require("./MapLayerManager.scss");
12
+ function MapManagerLayersHeader(props) {
13
+ return (React.createElement("div", { className: "map-manager-layers" },
14
+ React.createElement("span", { className: "map-manager-layers-label" }, props.label),
15
+ React.createElement(itwinui_react_1.ButtonGroup, null,
16
+ React.createElement(AttachLayerPopupButton_1.AttachLayerPopupButton, { disabled: props.disabled, isOverlay: props.isOverlay }))));
17
+ }
18
+ exports.MapManagerLayersHeader = MapManagerLayersHeader;
19
+ //# sourceMappingURL=MapManagerMapLayersHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapManagerMapLayersHeader.js","sourceRoot":"","sources":["../../../../src/ui/widget/MapManagerMapLayersHeader.tsx"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,wDAAmD;AACnD,+BAA+B;AAC/B,qEAAkE;AAClE,kCAAgC;AAQhC,SAAgB,sBAAsB,CAAC,KAAkC;IACvE,OAAO,CACL,6BAAK,SAAS,EAAC,oBAAoB;QACjC,8BAAM,SAAS,EAAC,0BAA0B,IAAE,KAAK,CAAC,KAAK,CAAQ;QAC/D,oBAAC,2BAAW;YACV,oBAAC,+CAAsB,IAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,GAAI,CAEpE,CACV,CACP,CAAC;AACJ,CAAC;AAVD,wDAUC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { ButtonGroup } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { AttachLayerPopupButton } from \"./AttachLayerPopupButton\";\nimport \"./MapLayerManager.scss\";\n\ninterface MapManagerLayersHeaderProps {\n label: string;\n isOverlay: boolean;\n disabled?: boolean;\n}\n\nexport function MapManagerLayersHeader(props: MapManagerLayersHeaderProps) {\n return (\n <div className=\"map-manager-layers\">\n <span className=\"map-manager-layers-label\">{props.label}</span>\n <ButtonGroup>\n <AttachLayerPopupButton disabled={props.disabled} isOverlay={props.isOverlay} />\n\n </ButtonGroup>\n </div>\n );\n}\n"]}
@@ -3,6 +3,5 @@ export * from "./MapLayersPrefBrowserStorage";
3
3
  export * from "./ui/Interfaces";
4
4
  export * from "./ui/MapLayersUiItemsProvider";
5
5
  export * from "./ui/FeatureInfoUiItemsProvider";
6
- export * from "./ui/MapFeatureInfoTool";
7
6
  export * from "./ui/widget/MapLayersWidget";
8
7
  //# sourceMappingURL=map-layers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-layers.d.ts","sourceRoot":"","sources":["../../src/map-layers.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"map-layers.d.ts","sourceRoot":"","sources":["../../src/map-layers.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
@@ -7,6 +7,5 @@ export * from "./MapLayersPrefBrowserStorage";
7
7
  export * from "./ui/Interfaces";
8
8
  export * from "./ui/MapLayersUiItemsProvider";
9
9
  export * from "./ui/FeatureInfoUiItemsProvider";
10
- export * from "./ui/MapFeatureInfoTool";
11
10
  export * from "./ui/widget/MapLayersWidget";
12
11
  //# sourceMappingURL=map-layers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-layers.js","sourceRoot":"","sources":["../../src/map-layers.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,cAAc,aAAa,CAAC;AAC5B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC","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\nexport * from \"./mapLayers\";\r\nexport * from \"./MapLayersPrefBrowserStorage\";\r\nexport * from \"./ui/Interfaces\";\r\nexport * from \"./ui/MapLayersUiItemsProvider\";\r\nexport * from \"./ui/FeatureInfoUiItemsProvider\";\r\nexport * from \"./ui/MapFeatureInfoTool\";\r\nexport * from \"./ui/widget/MapLayersWidget\";\r\n"]}
1
+ {"version":3,"file":"map-layers.js","sourceRoot":"","sources":["../../src/map-layers.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,cAAc,aAAa,CAAC;AAC5B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC","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\nexport * from \"./mapLayers\";\r\nexport * from \"./MapLayersPrefBrowserStorage\";\r\nexport * from \"./ui/Interfaces\";\r\nexport * from \"./ui/MapLayersUiItemsProvider\";\r\nexport * from \"./ui/FeatureInfoUiItemsProvider\";\r\nexport * from \"./ui/widget/MapLayersWidget\";\r\n"]}
@@ -12,6 +12,12 @@
12
12
  "ColorDialog": {
13
13
  "Title": "Specify Base Color"
14
14
  },
15
+ "MapLayerActionButtons": {
16
+ "ShowAllLabel": "Show all",
17
+ "HideAllLabel": "Hide all",
18
+ "InvertAllLabel": "Invert visibility",
19
+ "DetachSelectedLabel": "Detach selected map layers"
20
+ },
15
21
  "CustomAttach": {
16
22
  "LayerWithUrlExistsOverwriting": "Map layer with URL: {{url}} already exists. Updating name from {{oldName}} to {{newName}}.",
17
23
  "LayerWithUrlExistsAsITwinSetting": "Map Layer with URL: {{url}} already exists as a iTwin setting under name {{name}}. Cannot overwrite with a model setting!",
@@ -1,5 +1,6 @@
1
- import { StagePanelLocation, StagePanelSection, ToolbarItem, ToolbarOrientation, ToolbarUsage, UiItemsProvider, WidgetState } from "@itwin/appui-react";
1
+ import { StagePanelLocation, StagePanelSection, ToolbarItem, ToolbarOrientation, ToolbarUsage, ToolItemDef, UiItemsProvider, WidgetState } from "@itwin/appui-react";
2
2
  import { MapFeatureInfoOptions } from "./Interfaces";
3
+ export declare const getMapFeatureInfoToolItemDef: () => ToolItemDef;
3
4
  export declare class FeatureInfoUiItemsProvider implements UiItemsProvider {
4
5
  private _featureInfoOpts;
5
6
  readonly id = "FeatureInfoUiItemsProvider";
@@ -9,7 +10,7 @@ export declare class FeatureInfoUiItemsProvider implements UiItemsProvider {
9
10
  provideWidgets(_stageId: string, stageUsage: string, location: StagePanelLocation, section?: StagePanelSection): {
10
11
  id: string;
11
12
  label: string;
12
- icon: string;
13
+ icon: JSX.Element;
13
14
  content: JSX.Element;
14
15
  defaultState: WidgetState;
15
16
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureInfoUiItemsProvider.d.ts","sourceRoot":"","sources":["../../../src/ui/FeatureInfoUiItemsProvider.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAA6B,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEnL,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAIrD,qBAAa,0BAA2B,YAAW,eAAe;IAI7C,OAAO,CAAC,gBAAgB;IAH3C,SAAgB,EAAE,gCAAgC;IAClD,gBAAuB,QAAQ,qCAAqC;gBAEzC,gBAAgB,EAAE,qBAAqB;IAE3D,mBAAmB,CACxB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB,GACrC,aAAa,CAAC,WAAW,CAAC;IAgBtB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,iBAAiB;;;;;;;CAgBtH"}
1
+ {"version":3,"file":"FeatureInfoUiItemsProvider.d.ts","sourceRoot":"","sources":["../../../src/ui/FeatureInfoUiItemsProvider.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAA6B,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEhM,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAMrD,eAAO,MAAM,4BAA4B,QAAO,WAO5C,CAAC;AAEL,qBAAa,0BAA2B,YAAW,eAAe;IAI7C,OAAO,CAAC,gBAAgB;IAH3C,SAAgB,EAAE,gCAAgC;IAClD,gBAAuB,QAAQ,qCAAqC;gBAEzC,gBAAgB,EAAE,qBAAqB;IAE3D,mBAAmB,CACxB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB,GACrC,aAAa,CAAC,WAAW,CAAC;IAetB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,iBAAiB;;;;;;;CAgBtH"}