@itwin/map-layers 6.0.2 → 6.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -2
- package/lib/cjs/public/locales/en/mapLayers.json +1 -0
- package/lib/cjs/ui/Interfaces.d.ts +2 -0
- package/lib/cjs/ui/Interfaces.d.ts.map +1 -1
- package/lib/cjs/ui/Interfaces.js.map +1 -1
- package/lib/cjs/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
- package/lib/cjs/ui/widget/AttachLayerPopupButton.js +1 -1
- package/lib/cjs/ui/widget/AttachLayerPopupButton.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerManager.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapLayerManager.js +3 -1
- package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerManager.scss +8 -0
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js +1 -1
- package/lib/cjs/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
- package/lib/esm/public/locales/en/mapLayers.json +1 -0
- package/lib/esm/ui/Interfaces.d.ts +2 -0
- package/lib/esm/ui/Interfaces.d.ts.map +1 -1
- package/lib/esm/ui/Interfaces.js.map +1 -1
- package/lib/esm/ui/widget/AttachLayerPopupButton.d.ts.map +1 -1
- package/lib/esm/ui/widget/AttachLayerPopupButton.js +1 -1
- package/lib/esm/ui/widget/AttachLayerPopupButton.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerManager.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapLayerManager.js +3 -1
- package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerManager.scss +8 -0
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js +1 -1
- package/lib/esm/ui/widget/MapLayerSettingsPopupButton.js.map +1 -1
- package/lib/public/locales/en/mapLayers.json +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
# Change Log - @itwin/map-layers
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on
|
|
3
|
+
<!-- This log was last generated on Wed, 03 Sep 2025 19:13:06 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 6.0.4
|
|
8
|
+
|
|
9
|
+
Wed, 03 Sep 2025 19:13:06 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Fix map layer popover list overflow issue ([#1436](https://github.com/iTwin/viewer-components-react/pull/1436))
|
|
14
|
+
|
|
15
|
+
## 6.0.3
|
|
16
|
+
|
|
17
|
+
Tue, 02 Sep 2025 13:55:23 GMT
|
|
18
|
+
|
|
19
|
+
### Patches
|
|
20
|
+
|
|
21
|
+
- Restore maplayers header label and add optional flag to hide it ([#1434](https://github.com/iTwin/viewer-components-react/pull/1434))
|
|
22
|
+
- Increase height of maplayers settings popup to eliminate scroll bar. ([#1432](https://github.com/iTwin/viewer-components-react/pull/1432))
|
|
23
|
+
|
|
7
24
|
## 6.0.2
|
|
8
25
|
|
|
9
|
-
Thu, 21 Aug 2025 19:04:
|
|
26
|
+
Thu, 21 Aug 2025 19:04:55 GMT
|
|
10
27
|
|
|
11
28
|
### Patches
|
|
12
29
|
|
|
@@ -37,6 +37,8 @@ export interface MapLayerOptions {
|
|
|
37
37
|
baseMapLayers?: BaseMapLayerSettings[];
|
|
38
38
|
/** Optionally show the user preferences storage options(i.e. iTwin vs iModel). Defaults to false */
|
|
39
39
|
showUserPreferencesStorageOptions?: boolean;
|
|
40
|
+
/** Optionally hide the header label */
|
|
41
|
+
hideHeaderLabel?: boolean;
|
|
40
42
|
}
|
|
41
43
|
export interface MapFeatureInfoPropertyGridOptions {
|
|
42
44
|
isPropertySelectionEnabled?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interfaces.d.ts","sourceRoot":"","sources":["../../../src/ui/Interfaces.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEhH,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,+BAA+B,CAAC;IAChD,2MAA2M;IAC3M,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,iCAAiC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAEnC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC,iFAAiF;IACjF,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAEvC,qGAAqG;IACrG,iCAAiC,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Interfaces.d.ts","sourceRoot":"","sources":["../../../src/ui/Interfaces.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEhH,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,+BAA+B,CAAC;IAChD,2MAA2M;IAC3M,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,iCAAiC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAEnC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,cAAc,CAAC,EAAE,eAAe,CAAC;IAEjC,iFAAiF;IACjF,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAEvC,qGAAqG;IACrG,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAE5C,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iCAAiC;IAChD,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,mBAAmB,CAAC,EAAE,iCAAiC,CAAC;CACzD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Interfaces.js","sourceRoot":"","sources":["../../../src/ui/Interfaces.ts"],"names":[],"mappings":"","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 type { BeEvent } from \"@itwin/core-bentley\";\nimport type { BaseMapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\nimport type { HitDetail, MapLayerImageryProvider, MapTileTreeScaleRangeVisibility } from \"@itwin/core-frontend\";\n\nexport interface StyleMapLayerSettings {\n /** Name */\n name: string;\n /** source (i.URL for ImageMapLayerSettings or modelId for ModelMapLayerSettings) */\n source: string;\n /** Controls visibility of layer */\n visible: boolean;\n treeVisibility: MapTileTreeScaleRangeVisibility;\n /** A transparency value from 0.0 (fully opaque) to 1.0 (fully transparent) to apply to map graphics when drawing, or false to indicate the transparency should not be overridden. Default value: false. */\n transparency: number;\n /** Transparent background */\n transparentBackground: boolean;\n /** set map as underlay or overlay */\n isOverlay: boolean;\n /** layer index in the viewport */\n layerIndex: number;\n /** Available map sub-layer */\n subLayers?: MapSubLayerProps[];\n /** sub-layer panel displayed. */\n showSubLayers: boolean;\n /** Some format can publish only a single layer at a time (i.e WMTS) */\n provider?: MapLayerImageryProvider;\n\n selected: boolean;\n}\n\nexport interface MapTypesOptions {\n readonly supportTileUrl: boolean;\n readonly supportWmsAuthentication: boolean;\n}\n\nexport interface MapLayerOptions {\n hideExternalMapLayers?: boolean;\n fetchPublicMapLayerSources?: boolean;\n mapTypeOptions?: MapTypesOptions;\n\n /** Optional list of base map-layers to display in the base map select control */\n baseMapLayers?: BaseMapLayerSettings[];\n\n /** Optionally show the user preferences storage options(i.e. iTwin vs iModel). Defaults to false */\n showUserPreferencesStorageOptions?: boolean;\n}\n\nexport interface MapFeatureInfoPropertyGridOptions {\n isPropertySelectionEnabled?: boolean;\n}\n\nexport type MapHitEvent = BeEvent<(hit: HitDetail) => void>;\n\nexport interface MapFeatureInfoOptions {\n disableDefaultFeatureInfoTool?: boolean;\n showLoadProgressAnimation?: boolean;\n propertyGridOptions?: MapFeatureInfoPropertyGridOptions;\n}\n\nexport interface CustomParamItem {\n name: string;\n key: string;\n value: string;\n secret: boolean;\n}\n\nexport interface CustomParamsMappingItem {\n customParamNames: string[];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Interfaces.js","sourceRoot":"","sources":["../../../src/ui/Interfaces.ts"],"names":[],"mappings":"","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 type { BeEvent } from \"@itwin/core-bentley\";\nimport type { BaseMapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\nimport type { HitDetail, MapLayerImageryProvider, MapTileTreeScaleRangeVisibility } from \"@itwin/core-frontend\";\n\nexport interface StyleMapLayerSettings {\n /** Name */\n name: string;\n /** source (i.URL for ImageMapLayerSettings or modelId for ModelMapLayerSettings) */\n source: string;\n /** Controls visibility of layer */\n visible: boolean;\n treeVisibility: MapTileTreeScaleRangeVisibility;\n /** A transparency value from 0.0 (fully opaque) to 1.0 (fully transparent) to apply to map graphics when drawing, or false to indicate the transparency should not be overridden. Default value: false. */\n transparency: number;\n /** Transparent background */\n transparentBackground: boolean;\n /** set map as underlay or overlay */\n isOverlay: boolean;\n /** layer index in the viewport */\n layerIndex: number;\n /** Available map sub-layer */\n subLayers?: MapSubLayerProps[];\n /** sub-layer panel displayed. */\n showSubLayers: boolean;\n /** Some format can publish only a single layer at a time (i.e WMTS) */\n provider?: MapLayerImageryProvider;\n\n selected: boolean;\n}\n\nexport interface MapTypesOptions {\n readonly supportTileUrl: boolean;\n readonly supportWmsAuthentication: boolean;\n}\n\nexport interface MapLayerOptions {\n hideExternalMapLayers?: boolean;\n fetchPublicMapLayerSources?: boolean;\n mapTypeOptions?: MapTypesOptions;\n\n /** Optional list of base map-layers to display in the base map select control */\n baseMapLayers?: BaseMapLayerSettings[];\n\n /** Optionally show the user preferences storage options(i.e. iTwin vs iModel). Defaults to false */\n showUserPreferencesStorageOptions?: boolean;\n\n /** Optionally hide the header label */\n hideHeaderLabel?: boolean;\n}\n\nexport interface MapFeatureInfoPropertyGridOptions {\n isPropertySelectionEnabled?: boolean;\n}\n\nexport type MapHitEvent = BeEvent<(hit: HitDetail) => void>;\n\nexport interface MapFeatureInfoOptions {\n disableDefaultFeatureInfoTool?: boolean;\n showLoadProgressAnimation?: boolean;\n propertyGridOptions?: MapFeatureInfoPropertyGridOptions;\n}\n\nexport interface CustomParamItem {\n name: string;\n key: string;\n value: string;\n secret: boolean;\n}\n\nexport interface CustomParamsMappingItem {\n customParamNames: string[];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachLayerPopupButton.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.tsx"],"names":[],"mappings":"AAwgBA,gBAAgB;AAChB,oBAAY,qBAAqB;IAC/B,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,IAAI,IAAA;CACL;AACD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,
|
|
1
|
+
{"version":3,"file":"AttachLayerPopupButton.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.tsx"],"names":[],"mappings":"AAwgBA,gBAAgB;AAChB,oBAAY,qBAAqB;IAC/B,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,IAAI,IAAA;CACL;AACD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,2CAuGxE"}
|
|
@@ -423,6 +423,6 @@ function AttachLayerPopupButton(props) {
|
|
|
423
423
|
}
|
|
424
424
|
return button;
|
|
425
425
|
}
|
|
426
|
-
return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(itwinui_react_1.Popover, { content: (0, jsx_runtime_1.jsx)("div", { ref: panelRef, className: "map-sources-popup-panel", children: (0, jsx_runtime_1.jsx)(AttachLayerPanel, { isOverlay: props.isOverlay, onLayerAttached: handleLayerAttached, onHandleOutsideClick: setHandleOutsideClick, setMapUrlModalOpen: setMapUrlModalOpen }) }), applyBackground: true, visible: popupOpen || mapUrlModalOpen, onVisibleChange: setPopupOpen, closeOnOutsideClick: handleOutsideClick, placement: "bottom-end", children: renderButton() }) }));
|
|
426
|
+
return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(itwinui_react_1.Popover, { content: (0, jsx_runtime_1.jsx)("div", { ref: panelRef, className: "map-sources-popup-panel", children: (0, jsx_runtime_1.jsx)(AttachLayerPanel, { isOverlay: props.isOverlay, onLayerAttached: handleLayerAttached, onHandleOutsideClick: setHandleOutsideClick, setMapUrlModalOpen: setMapUrlModalOpen }) }), applyBackground: true, visible: popupOpen || mapUrlModalOpen, onVisibleChange: setPopupOpen, closeOnOutsideClick: handleOutsideClick, placement: "bottom-end", style: { overflow: "auto" }, children: renderButton() }) }));
|
|
427
427
|
}
|
|
428
428
|
//# sourceMappingURL=AttachLayerPopupButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachLayerPopupButton.js","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.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 { UiFramework } from \"@itwin/appui-react\";\nimport { IModelApp, MapLayerSource, MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\nimport { SvgAdd, SvgDelete, SvgEdit } from \"@itwin/itwinui-icons-react\";\nimport { Button, IconButton, Input, List, ListItem, Popover, ProgressRadial } from \"@itwin/itwinui-react\";\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { ConfirmMessageDialog } from \"./ConfirmMessageDialog\";\nimport { useSourceMapContext } from \"./MapLayerManager\";\nimport { MapSelectFeaturesDialog } from \"./MapSelectFeaturesDialog\";\nimport { MapUrlDialog } from \"./MapUrlDialog\";\n\nimport type { MapSubLayerProps } from \"@itwin/core-common\";\nimport type { MapLayerSourceValidation } from \"@itwin/core-frontend\";\nimport type { SourceState } from \"./MapUrlDialog\";\n// cSpell:ignore droppable Sublayer\n\nenum LayerAction {\n New,\n Edit,\n}\n\ninterface AttachLayerPanelProps {\n isOverlay: boolean;\n onLayerAttached: () => void;\n onHandleOutsideClick?: (shouldHandle: boolean) => void;\n setMapUrlModalOpen: (open: boolean) => void;\n}\n\nfunction AttachLayerPanel({ isOverlay, onLayerAttached, onHandleOutsideClick, setMapUrlModalOpen}: AttachLayerPanelProps) {\n const [layerNameToAdd, setLayerNameToAdd] = React.useState<string | undefined>();\n const [sourceFilterString, setSourceFilterString] = React.useState<string | undefined>();\n\n const {\n placeholderLabel,\n addCustomLayerLabel,\n addCustomLayerToolTip,\n removeLayerDefButtonTitle,\n editLayerDefButtonTitle,\n removeLayerDefDialogTitle,\n } = React.useMemo(() => {\n return {\n placeholderLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.SearchPlaceholder\"),\n addCustomLayerLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Custom\"),\n addCustomLayerToolTip: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.AttachCustomLayer\"),\n removeLayerDefButtonTitle: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefButtonTitle\"),\n editLayerDefButtonTitle: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.EditLayerDefButtonTitle\"),\n removeLayerDefDialogTitle: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogTitle\"),\n };\n }, []);\n\n const [loading, setLoading] = React.useState(false);\n const [layerNameUnderCursor, setLayerNameUnderCursor] = React.useState<string | undefined>();\n\n const resumeOutsideClick = React.useCallback(() => {\n if (onHandleOutsideClick) {\n onHandleOutsideClick(true);\n }\n }, [onHandleOutsideClick]);\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 // We close any open dialogs that we might have opened\n // This was added because the modal dialog remained remained displayed after the session expired.\n UiFramework.dialogs.modal.close();\n };\n }, []);\n\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setSourceFilterString(event.target.value);\n }, []);\n\n const { loadingSources, sources, activeViewport, backgroundLayers, overlayLayers, mapLayerOptions } = useSourceMapContext();\n const iTwinId = activeViewport?.iModel?.iTwinId;\n const iModelId = activeViewport?.iModel?.iModelId;\n\n const attachLayer = React.useCallback(\n (source: MapLayerSource, subLayers: MapSubLayerProps[] | undefined, oneMapLayerPerSubLayer: boolean) => {\n if (activeViewport) {\n const generateUniqueMapLayerName = (layerName: string) => {\n let uniqueLayerName = layerName;\n let layerNameIdx = 1;\n while (\n (backgroundLayers && backgroundLayers.some((layer) => uniqueLayerName === layer.name)) ||\n (overlayLayers && overlayLayers.some((layer) => uniqueLayerName === layer.name))\n ) {\n uniqueLayerName = `${layerName} (${layerNameIdx++})`;\n }\n return { layerNameUpdate: layerNameIdx > 1, uniqueLayerName };\n };\n\n const doAttachLayer = (layerName: string, subLayer?: MapSubLayerProps) => {\n const generatedName = generateUniqueMapLayerName(layerName);\n let sourceToAdd = source;\n if (generatedName.layerNameUpdate || sourceToAdd.name !== generatedName.uniqueLayerName) {\n // create a source with a unique name\n const clonedSource = MapLayerSource.fromJSON({ ...source.toJSON(), name: generatedName.uniqueLayerName });\n if (clonedSource !== undefined) {\n clonedSource.userName = source.userName;\n clonedSource.password = source.password;\n clonedSource.unsavedQueryParams = { ...source.unsavedQueryParams };\n clonedSource.savedQueryParams = { ...source.savedQueryParams };\n sourceToAdd = clonedSource;\n }\n }\n\n const settings = sourceToAdd.toLayerSettings(subLayer ? [subLayer] : subLayers);\n if (settings) {\n activeViewport.displayStyle.attachMapLayer({ settings, mapLayerIndex: { index: -1, isOverlay } });\n return generatedName.uniqueLayerName;\n }\n return undefined;\n };\n\n if (oneMapLayerPerSubLayer && subLayers) {\n const layerNamesAttached: string[] = [];\n for (const subLayer of subLayers) {\n const attachedLayerName = doAttachLayer(`${source.name} - ${subLayer.name}`, subLayer);\n if (attachedLayerName !== undefined) {\n layerNamesAttached.push(attachedLayerName);\n }\n }\n\n if (layerNamesAttached.length > 0) {\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayersAttached\", { layerNames: layerNamesAttached.join(\", \") });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\n }\n } else {\n const attachedLayerName = doAttachLayer(source.name, undefined);\n if (attachedLayerName !== undefined) {\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: attachedLayerName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\n }\n }\n\n if (isMounted.current) {\n setLoading(false);\n }\n }\n if (isMounted.current) {\n onLayerAttached();\n resumeOutsideClick();\n }\n },\n [activeViewport, backgroundLayers, isOverlay, onLayerAttached, overlayLayers, resumeOutsideClick],\n );\n\n const handleSelectFeaturesCancel = React.useCallback(() => {\n if (isMounted.current) {\n setLoading(false);\n }\n resumeOutsideClick();\n UiFramework.dialogs.modal.close();\n }, [resumeOutsideClick, setLoading]);\n\n const handleSelectFeaturesOk = React.useCallback(\n (source: MapLayerSource, sourceSubLayers: MapSubLayerProps[], selectedSubLayers: MapSubLayerProps[]) => {\n // keep only visible subLayers\n const visibleSubLayers = selectedSubLayers.filter((value) => value.visible);\n\n // Re-apply default visibility from the source validation\n visibleSubLayers.forEach((visible) => {\n const found = sourceSubLayers.find((value) => {\n visible.name === value.name;\n });\n if (found) {\n visible.visible = found?.visible;\n }\n });\n attachLayer(source, visibleSubLayers, true);\n },\n [attachLayer],\n );\n\n const openFeatureSelectionDialog = React.useCallback(\n (subLayers: MapSubLayerProps[], source: MapLayerSource) => {\n // Keep leafs sub-layers and force default visibility to false\n const noGroupLayers = subLayers.filter((value: MapSubLayerProps) => value.children === undefined);\n const visibleLayers = noGroupLayers.map((value: MapSubLayerProps) => {\n return { ...value, visible: false };\n });\n UiFramework.dialogs.modal.open(\n <MapSelectFeaturesDialog\n handleOk={(selectedLayers) => {\n handleSelectFeaturesOk(source, subLayers, selectedLayers);\n }}\n handleCancel={handleSelectFeaturesCancel}\n source={source}\n subLayers={visibleLayers}\n />,\n );\n },\n [handleSelectFeaturesCancel, handleSelectFeaturesOk],\n );\n\n const needsFeatureSelection = React.useCallback((source: MapLayerSource, validation: MapLayerSourceValidation) => {\n return (\n (source.formatId === \"ArcGISFeature\" || source.formatId === \"WMTS\") && // TODO, replace this with a flag in MapLayerSourceStatus\n validation.subLayers &&\n validation.subLayers.length > 1\n );\n }, []);\n\n const handleModalUrlDialogOk = React.useCallback(\n (action: LayerAction, sourceState?: SourceState) => {\n setMapUrlModalOpen(false);\n UiFramework.dialogs.modal.close();\n if (LayerAction.New === action && sourceState && sourceState.validation.status === MapLayerSourceStatus.Valid) {\n if (needsFeatureSelection(sourceState.source, sourceState.validation)) {\n openFeatureSelectionDialog(sourceState.validation.subLayers!, sourceState.source);\n } else {\n attachLayer(sourceState.source, sourceState.validation.subLayers, false);\n }\n } else {\n resumeOutsideClick();\n }\n },\n [attachLayer, needsFeatureSelection, openFeatureSelectionDialog, resumeOutsideClick, setMapUrlModalOpen],\n );\n\n const handleModalUrlDialogCancel = React.useCallback(() => {\n // close popup and refresh UI\n setLoading(false);\n setMapUrlModalOpen(false);\n UiFramework.dialogs.modal.close();\n resumeOutsideClick();\n }, [setLoading, resumeOutsideClick, setMapUrlModalOpen]);\n\n React.useEffect(() => {\n async function attemptToAddLayer() {\n if (layerNameToAdd && activeViewport) {\n // if the layer is not in the style add it now.\n const foundSource = sources?.find((source) => source.name === layerNameToAdd);\n if (foundSource === undefined) {\n return;\n }\n\n try {\n if (isMounted.current) {\n setLoading(true);\n }\n\n const sourceValidation = await foundSource.validateSource();\n if (sourceValidation.status === MapLayerSourceStatus.Valid || sourceValidation.status === MapLayerSourceStatus.RequireAuth) {\n if (sourceValidation.status === MapLayerSourceStatus.Valid) {\n if (sourceValidation.subLayers && needsFeatureSelection(foundSource, sourceValidation)) {\n openFeatureSelectionDialog(sourceValidation.subLayers, foundSource);\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n } else {\n attachLayer(foundSource, sourceValidation.subLayers, false);\n }\n } else if (sourceValidation.status === MapLayerSourceStatus.RequireAuth && isMounted.current) {\n const layer = foundSource.toLayerSettings();\n if (layer) {\n setMapUrlModalOpen(true);\n UiFramework.dialogs.modal.open(\n <MapUrlDialog\n activeViewport={activeViewport}\n signInModeArgs={{ layer, validation: sourceValidation, source: foundSource }}\n onOkResult={(sourceState?: SourceState) => handleModalUrlDialogOk(LayerAction.New, sourceState)}\n onCancelResult={handleModalUrlDialogCancel}\n mapLayerOptions={mapLayerOptions}\n />,\n );\n }\n\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n }\n } else {\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerValidationFailed\", { sourceUrl: foundSource.url });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n if (isMounted.current) {\n setLoading(false);\n }\n }\n } catch (err) {\n if (isMounted.current) {\n setLoading(false);\n }\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: err, sourceName: foundSource.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n }\n }\n return;\n }\n\n attemptToAddLayer(); // eslint-disable-line @typescript-eslint/no-floating-promises\n\n if (isMounted.current) {\n setLayerNameToAdd(undefined);\n }\n }, [\n attachLayer,\n needsFeatureSelection,\n setLayerNameToAdd,\n layerNameToAdd,\n activeViewport,\n sources,\n backgroundLayers,\n isOverlay,\n overlayLayers,\n onLayerAttached,\n handleModalUrlDialogOk,\n handleSelectFeaturesCancel,\n handleSelectFeaturesOk,\n handleModalUrlDialogCancel,\n onHandleOutsideClick,\n openFeatureSelectionDialog,\n mapLayerOptions,\n setMapUrlModalOpen,\n ]);\n\n const options = React.useMemo(() => sources, [sources]);\n\n const filteredOptions = React.useMemo(() => {\n if (undefined === sourceFilterString || 0 === sourceFilterString.length) {\n return options;\n } else {\n return options?.filter((option) => option.name.toLowerCase().includes(sourceFilterString?.toLowerCase()));\n }\n }, [options, sourceFilterString]);\n\n const handleAddNewMapSource = React.useCallback((event: React.MouseEvent) => {\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\n setMapUrlModalOpen(true);\n UiFramework.dialogs.modal.open(\n <MapUrlDialog\n activeViewport={activeViewport}\n onOkResult={(result?: SourceState) => handleModalUrlDialogOk(LayerAction.New, result)}\n onCancelResult={handleModalUrlDialogCancel}\n mapLayerOptions={mapLayerOptions}\n />,\n );\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n}, [activeViewport, handleModalUrlDialogCancel, handleModalUrlDialogOk, mapLayerOptions, onHandleOutsideClick, setMapUrlModalOpen]);\n\n const handleAttach = React.useCallback((mapName: string) => {\n setLayerNameToAdd(mapName);\n }, []);\n\n const handleNoConfirmation = React.useCallback(\n (_layerName: string) => {\n UiFramework.dialogs.modal.close();\n resumeOutsideClick();\n },\n [resumeOutsideClick],\n );\n\n const handleYesConfirmation = React.useCallback(\n async (source: MapLayerSource) => {\n const layerName = source.name;\n if (!!iTwinId) {\n try {\n await MapLayerPreferences.deleteByName(source, iTwinId, iModelId);\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefSuccess\", { layerName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\n } catch {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefError\", { layerName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n }\n }\n\n UiFramework.dialogs.modal.close();\n resumeOutsideClick();\n },\n [iTwinId, iModelId, resumeOutsideClick],\n );\n\n /*\n Handle Remove layer button clicked\n */\n const onItemRemoveButtonClicked = React.useCallback(\n (source: MapLayerSource, event: React.MouseEvent) => {\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\n\n const layerName = source.name;\n\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogMessage\", { layerName });\n UiFramework.dialogs.modal.open(\n <ConfirmMessageDialog\n className=\"map-sources-delete-confirmation\"\n title={removeLayerDefDialogTitle}\n message={msg}\n maxWidth={400}\n opened\n onYesResult={async () => handleYesConfirmation(source)}\n onNoResult={() => handleNoConfirmation(layerName)}\n />,\n );\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n },\n [handleNoConfirmation, handleYesConfirmation, onHandleOutsideClick, removeLayerDefDialogTitle],\n );\n\n /*\n Handle Edit layer button clicked\n */\n const onItemEditButtonClicked = React.useCallback(\n (event: React.MouseEvent, source: MapLayerSource) => {\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\n\n // we expect a single layer source matching this name\n if (source === undefined) {\n return;\n }\n setMapUrlModalOpen(true);\n UiFramework.dialogs.modal.open(\n <MapUrlDialog\n activeViewport={activeViewport}\n mapLayerSourceToEdit={source}\n onOkResult={(result?: SourceState) => handleModalUrlDialogOk(LayerAction.Edit, result)}\n onCancelResult={handleModalUrlDialogCancel}\n mapLayerOptions={mapLayerOptions}\n />,\n );\n\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n },\n [activeViewport, handleModalUrlDialogCancel, handleModalUrlDialogOk, mapLayerOptions, onHandleOutsideClick, setMapUrlModalOpen],\n );\n\n return (\n <div className=\"map-manager-header\">\n {(loading || loadingSources) && (\n <div style={{\n position: \"absolute\",\n inset: 0,\n display: \"grid\",\n placeItems: \"center\",\n zIndex: 100,\n }}>\n <ProgressRadial as=\"div\"/>\n </div>\n )}\n <div className=\"map-manager-source-listbox-header\">\n <Input\n type=\"text\"\n className=\"map-manager-source-list-filter\"\n placeholder={placeholderLabel}\n value={sourceFilterString}\n onChange={handleFilterTextChanged}\n size=\"small\"\n />\n <Button className=\"map-manager-add-source-button\" title={addCustomLayerToolTip} onClick={handleAddNewMapSource}>\n {addCustomLayerLabel}\n </Button>\n </div>\n <div className=\"map-manager-sources\">\n <List\n id=\"map-sources\"\n as=\"div\"\n className=\"map-manager-source-list\"\n >\n {filteredOptions?.map((source) => (\n <ListItem\n as=\"div\"\n key={source.name}\n className=\"map-source-list-entry\"\n actionable\n onClick={() => handleAttach(source.name)}\n onMouseEnter={() => setLayerNameUnderCursor(source.name)}\n onMouseLeave={() => setLayerNameUnderCursor(undefined)}\n >\n <ListItem.Content>{source.name}</ListItem.Content>\n {\n // Display the delete icon only when the mouse over a specific item\n // otherwise list feels cluttered.\n !!iTwinId && layerNameUnderCursor && layerNameUnderCursor === source.name && (\n <>\n <IconButton\n size=\"small\"\n styleType=\"borderless\"\n className=\"map-source-list-entry-button\"\n label={editLayerDefButtonTitle}\n onClick={(e)=>onItemEditButtonClicked(e, source)}\n >\n <SvgEdit />\n </IconButton>\n <IconButton\n size=\"small\"\n styleType=\"borderless\"\n className=\"map-source-list-entry-button\"\n label={removeLayerDefButtonTitle}\n onClick={(event: React.MouseEvent) => {\n onItemRemoveButtonClicked(source, event);\n }}\n >\n <SvgDelete />\n </IconButton>\n </>\n )\n }\n </ListItem>\n ))}\n </List>\n </div>\n </div>\n );\n}\n\n/** @internal */\nexport enum AttachLayerButtonType {\n Primary,\n Blue,\n Icon,\n}\nexport interface AttachLayerPopupButtonProps {\n isOverlay: boolean;\n buttonType?: AttachLayerButtonType;\n disabled?: boolean;\n}\n\n/** @internal */\nexport function AttachLayerPopupButton(props: AttachLayerPopupButtonProps) {\n const { showAttachLayerLabel, hideAttachLayerLabel, addCustomLayerButtonLabel } = React.useMemo(() => {\n return {\n showAttachLayerLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Attach\"),\n hideAttachLayerLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Close\"),\n addCustomLayerButtonLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.AddCustomLayerButtonLabel\"),\n };\n }, []);\n\n const [handleOutsideClick, setHandleOutsideClick] = React.useState(true);\n const [mapUrlModalOpen, setMapUrlModalOpen] = React.useState(false);\n const [popupOpen, setPopupOpen] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\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 const togglePopup = React.useCallback(() => {\n setPopupOpen(!popupOpen);\n }, [popupOpen]);\n\n\n const { refreshFromStyle } = useSourceMapContext();\n\n const handleLayerAttached = React.useCallback(() => {\n if (!isMounted.current) {\n return;\n }\n setPopupOpen(false);\n refreshFromStyle();\n }, [refreshFromStyle]);\n\n function renderButton(): React.ReactNode {\n let button: React.ReactNode;\n\n if (props.buttonType === undefined || props.buttonType === AttachLayerButtonType.Icon) {\n button = (\n <IconButton\n disabled={props.disabled}\n size=\"small\"\n styleType=\"borderless\"\n ref={buttonRef}\n className=\"map-manager-attach-layer-button\"\n label={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\n onClick={togglePopup}\n >\n <SvgAdd />\n </IconButton>\n );\n } else {\n const determineStyleType = () => {\n switch (props.buttonType) {\n case AttachLayerButtonType.Blue:\n return \"high-visibility\";\n case AttachLayerButtonType.Primary:\n default:\n return \"cta\";\n }\n };\n const styleType = determineStyleType();\n button = (\n <Button\n disabled={props.disabled}\n ref={buttonRef}\n styleType={styleType}\n title={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\n onClick={togglePopup}\n >\n <span className=\"map-manager-attach-layer-label\">{addCustomLayerButtonLabel}</span>\n </Button>\n );\n }\n\n return button;\n }\n\n return (\n <>\n <Popover\n content={\n <div ref={panelRef} className=\"map-sources-popup-panel\">\n <AttachLayerPanel isOverlay={props.isOverlay} onLayerAttached={handleLayerAttached} onHandleOutsideClick={setHandleOutsideClick} setMapUrlModalOpen={setMapUrlModalOpen} />\n </div>\n }\n applyBackground\n visible={popupOpen || mapUrlModalOpen} // keep the Popover open while the mapUrlModal is active\n onVisibleChange={setPopupOpen}\n closeOnOutsideClick={handleOutsideClick}\n placement={\"bottom-end\"}\n >\n {renderButton()}\n </Popover>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AttachLayerPopupButton.js","sourceRoot":"","sources":["../../../../src/ui/widget/AttachLayerPopupButton.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 { UiFramework } from \"@itwin/appui-react\";\nimport { IModelApp, MapLayerSource, MapLayerSourceStatus, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\nimport { SvgAdd, SvgDelete, SvgEdit } from \"@itwin/itwinui-icons-react\";\nimport { Button, IconButton, Input, List, ListItem, Popover, ProgressRadial } from \"@itwin/itwinui-react\";\nimport { MapLayerPreferences } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { ConfirmMessageDialog } from \"./ConfirmMessageDialog\";\nimport { useSourceMapContext } from \"./MapLayerManager\";\nimport { MapSelectFeaturesDialog } from \"./MapSelectFeaturesDialog\";\nimport { MapUrlDialog } from \"./MapUrlDialog\";\n\nimport type { MapSubLayerProps } from \"@itwin/core-common\";\nimport type { MapLayerSourceValidation } from \"@itwin/core-frontend\";\nimport type { SourceState } from \"./MapUrlDialog\";\n// cSpell:ignore droppable Sublayer\n\nenum LayerAction {\n New,\n Edit,\n}\n\ninterface AttachLayerPanelProps {\n isOverlay: boolean;\n onLayerAttached: () => void;\n onHandleOutsideClick?: (shouldHandle: boolean) => void;\n setMapUrlModalOpen: (open: boolean) => void;\n}\n\nfunction AttachLayerPanel({ isOverlay, onLayerAttached, onHandleOutsideClick, setMapUrlModalOpen}: AttachLayerPanelProps) {\n const [layerNameToAdd, setLayerNameToAdd] = React.useState<string | undefined>();\n const [sourceFilterString, setSourceFilterString] = React.useState<string | undefined>();\n\n const {\n placeholderLabel,\n addCustomLayerLabel,\n addCustomLayerToolTip,\n removeLayerDefButtonTitle,\n editLayerDefButtonTitle,\n removeLayerDefDialogTitle,\n } = React.useMemo(() => {\n return {\n placeholderLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.SearchPlaceholder\"),\n addCustomLayerLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.Custom\"),\n addCustomLayerToolTip: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.AttachCustomLayer\"),\n removeLayerDefButtonTitle: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefButtonTitle\"),\n editLayerDefButtonTitle: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.EditLayerDefButtonTitle\"),\n removeLayerDefDialogTitle: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogTitle\"),\n };\n }, []);\n\n const [loading, setLoading] = React.useState(false);\n const [layerNameUnderCursor, setLayerNameUnderCursor] = React.useState<string | undefined>();\n\n const resumeOutsideClick = React.useCallback(() => {\n if (onHandleOutsideClick) {\n onHandleOutsideClick(true);\n }\n }, [onHandleOutsideClick]);\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 // We close any open dialogs that we might have opened\n // This was added because the modal dialog remained remained displayed after the session expired.\n UiFramework.dialogs.modal.close();\n };\n }, []);\n\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setSourceFilterString(event.target.value);\n }, []);\n\n const { loadingSources, sources, activeViewport, backgroundLayers, overlayLayers, mapLayerOptions } = useSourceMapContext();\n const iTwinId = activeViewport?.iModel?.iTwinId;\n const iModelId = activeViewport?.iModel?.iModelId;\n\n const attachLayer = React.useCallback(\n (source: MapLayerSource, subLayers: MapSubLayerProps[] | undefined, oneMapLayerPerSubLayer: boolean) => {\n if (activeViewport) {\n const generateUniqueMapLayerName = (layerName: string) => {\n let uniqueLayerName = layerName;\n let layerNameIdx = 1;\n while (\n (backgroundLayers && backgroundLayers.some((layer) => uniqueLayerName === layer.name)) ||\n (overlayLayers && overlayLayers.some((layer) => uniqueLayerName === layer.name))\n ) {\n uniqueLayerName = `${layerName} (${layerNameIdx++})`;\n }\n return { layerNameUpdate: layerNameIdx > 1, uniqueLayerName };\n };\n\n const doAttachLayer = (layerName: string, subLayer?: MapSubLayerProps) => {\n const generatedName = generateUniqueMapLayerName(layerName);\n let sourceToAdd = source;\n if (generatedName.layerNameUpdate || sourceToAdd.name !== generatedName.uniqueLayerName) {\n // create a source with a unique name\n const clonedSource = MapLayerSource.fromJSON({ ...source.toJSON(), name: generatedName.uniqueLayerName });\n if (clonedSource !== undefined) {\n clonedSource.userName = source.userName;\n clonedSource.password = source.password;\n clonedSource.unsavedQueryParams = { ...source.unsavedQueryParams };\n clonedSource.savedQueryParams = { ...source.savedQueryParams };\n sourceToAdd = clonedSource;\n }\n }\n\n const settings = sourceToAdd.toLayerSettings(subLayer ? [subLayer] : subLayers);\n if (settings) {\n activeViewport.displayStyle.attachMapLayer({ settings, mapLayerIndex: { index: -1, isOverlay } });\n return generatedName.uniqueLayerName;\n }\n return undefined;\n };\n\n if (oneMapLayerPerSubLayer && subLayers) {\n const layerNamesAttached: string[] = [];\n for (const subLayer of subLayers) {\n const attachedLayerName = doAttachLayer(`${source.name} - ${subLayer.name}`, subLayer);\n if (attachedLayerName !== undefined) {\n layerNamesAttached.push(attachedLayerName);\n }\n }\n\n if (layerNamesAttached.length > 0) {\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayersAttached\", { layerNames: layerNamesAttached.join(\", \") });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\n }\n } else {\n const attachedLayerName = doAttachLayer(source.name, undefined);\n if (attachedLayerName !== undefined) {\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttached\", { sourceName: attachedLayerName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\n }\n }\n\n if (isMounted.current) {\n setLoading(false);\n }\n }\n if (isMounted.current) {\n onLayerAttached();\n resumeOutsideClick();\n }\n },\n [activeViewport, backgroundLayers, isOverlay, onLayerAttached, overlayLayers, resumeOutsideClick],\n );\n\n const handleSelectFeaturesCancel = React.useCallback(() => {\n if (isMounted.current) {\n setLoading(false);\n }\n resumeOutsideClick();\n UiFramework.dialogs.modal.close();\n }, [resumeOutsideClick, setLoading]);\n\n const handleSelectFeaturesOk = React.useCallback(\n (source: MapLayerSource, sourceSubLayers: MapSubLayerProps[], selectedSubLayers: MapSubLayerProps[]) => {\n // keep only visible subLayers\n const visibleSubLayers = selectedSubLayers.filter((value) => value.visible);\n\n // Re-apply default visibility from the source validation\n visibleSubLayers.forEach((visible) => {\n const found = sourceSubLayers.find((value) => {\n visible.name === value.name;\n });\n if (found) {\n visible.visible = found?.visible;\n }\n });\n attachLayer(source, visibleSubLayers, true);\n },\n [attachLayer],\n );\n\n const openFeatureSelectionDialog = React.useCallback(\n (subLayers: MapSubLayerProps[], source: MapLayerSource) => {\n // Keep leafs sub-layers and force default visibility to false\n const noGroupLayers = subLayers.filter((value: MapSubLayerProps) => value.children === undefined);\n const visibleLayers = noGroupLayers.map((value: MapSubLayerProps) => {\n return { ...value, visible: false };\n });\n UiFramework.dialogs.modal.open(\n <MapSelectFeaturesDialog\n handleOk={(selectedLayers) => {\n handleSelectFeaturesOk(source, subLayers, selectedLayers);\n }}\n handleCancel={handleSelectFeaturesCancel}\n source={source}\n subLayers={visibleLayers}\n />,\n );\n },\n [handleSelectFeaturesCancel, handleSelectFeaturesOk],\n );\n\n const needsFeatureSelection = React.useCallback((source: MapLayerSource, validation: MapLayerSourceValidation) => {\n return (\n (source.formatId === \"ArcGISFeature\" || source.formatId === \"WMTS\") && // TODO, replace this with a flag in MapLayerSourceStatus\n validation.subLayers &&\n validation.subLayers.length > 1\n );\n }, []);\n\n const handleModalUrlDialogOk = React.useCallback(\n (action: LayerAction, sourceState?: SourceState) => {\n setMapUrlModalOpen(false);\n UiFramework.dialogs.modal.close();\n if (LayerAction.New === action && sourceState && sourceState.validation.status === MapLayerSourceStatus.Valid) {\n if (needsFeatureSelection(sourceState.source, sourceState.validation)) {\n openFeatureSelectionDialog(sourceState.validation.subLayers!, sourceState.source);\n } else {\n attachLayer(sourceState.source, sourceState.validation.subLayers, false);\n }\n } else {\n resumeOutsideClick();\n }\n },\n [attachLayer, needsFeatureSelection, openFeatureSelectionDialog, resumeOutsideClick, setMapUrlModalOpen],\n );\n\n const handleModalUrlDialogCancel = React.useCallback(() => {\n // close popup and refresh UI\n setLoading(false);\n setMapUrlModalOpen(false);\n UiFramework.dialogs.modal.close();\n resumeOutsideClick();\n }, [setLoading, resumeOutsideClick, setMapUrlModalOpen]);\n\n React.useEffect(() => {\n async function attemptToAddLayer() {\n if (layerNameToAdd && activeViewport) {\n // if the layer is not in the style add it now.\n const foundSource = sources?.find((source) => source.name === layerNameToAdd);\n if (foundSource === undefined) {\n return;\n }\n\n try {\n if (isMounted.current) {\n setLoading(true);\n }\n\n const sourceValidation = await foundSource.validateSource();\n if (sourceValidation.status === MapLayerSourceStatus.Valid || sourceValidation.status === MapLayerSourceStatus.RequireAuth) {\n if (sourceValidation.status === MapLayerSourceStatus.Valid) {\n if (sourceValidation.subLayers && needsFeatureSelection(foundSource, sourceValidation)) {\n openFeatureSelectionDialog(sourceValidation.subLayers, foundSource);\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n } else {\n attachLayer(foundSource, sourceValidation.subLayers, false);\n }\n } else if (sourceValidation.status === MapLayerSourceStatus.RequireAuth && isMounted.current) {\n const layer = foundSource.toLayerSettings();\n if (layer) {\n setMapUrlModalOpen(true);\n UiFramework.dialogs.modal.open(\n <MapUrlDialog\n activeViewport={activeViewport}\n signInModeArgs={{ layer, validation: sourceValidation, source: foundSource }}\n onOkResult={(sourceState?: SourceState) => handleModalUrlDialogOk(LayerAction.New, sourceState)}\n onCancelResult={handleModalUrlDialogCancel}\n mapLayerOptions={mapLayerOptions}\n />,\n );\n }\n\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n }\n } else {\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerValidationFailed\", { sourceUrl: foundSource.url });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n if (isMounted.current) {\n setLoading(false);\n }\n }\n } catch (err) {\n if (isMounted.current) {\n setLoading(false);\n }\n const msg = IModelApp.localization.getLocalizedString(\"mapLayers:Messages.MapLayerAttachError\", { error: err, sourceName: foundSource.name });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n }\n }\n return;\n }\n\n attemptToAddLayer(); // eslint-disable-line @typescript-eslint/no-floating-promises\n\n if (isMounted.current) {\n setLayerNameToAdd(undefined);\n }\n }, [\n attachLayer,\n needsFeatureSelection,\n setLayerNameToAdd,\n layerNameToAdd,\n activeViewport,\n sources,\n backgroundLayers,\n isOverlay,\n overlayLayers,\n onLayerAttached,\n handleModalUrlDialogOk,\n handleSelectFeaturesCancel,\n handleSelectFeaturesOk,\n handleModalUrlDialogCancel,\n onHandleOutsideClick,\n openFeatureSelectionDialog,\n mapLayerOptions,\n setMapUrlModalOpen,\n ]);\n\n const options = React.useMemo(() => sources, [sources]);\n\n const filteredOptions = React.useMemo(() => {\n if (undefined === sourceFilterString || 0 === sourceFilterString.length) {\n return options;\n } else {\n return options?.filter((option) => option.name.toLowerCase().includes(sourceFilterString?.toLowerCase()));\n }\n }, [options, sourceFilterString]);\n\n const handleAddNewMapSource = React.useCallback((event: React.MouseEvent) => {\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\n setMapUrlModalOpen(true);\n UiFramework.dialogs.modal.open(\n <MapUrlDialog\n activeViewport={activeViewport}\n onOkResult={(result?: SourceState) => handleModalUrlDialogOk(LayerAction.New, result)}\n onCancelResult={handleModalUrlDialogCancel}\n mapLayerOptions={mapLayerOptions}\n />,\n );\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n}, [activeViewport, handleModalUrlDialogCancel, handleModalUrlDialogOk, mapLayerOptions, onHandleOutsideClick, setMapUrlModalOpen]);\n\n const handleAttach = React.useCallback((mapName: string) => {\n setLayerNameToAdd(mapName);\n }, []);\n\n const handleNoConfirmation = React.useCallback(\n (_layerName: string) => {\n UiFramework.dialogs.modal.close();\n resumeOutsideClick();\n },\n [resumeOutsideClick],\n );\n\n const handleYesConfirmation = React.useCallback(\n async (source: MapLayerSource) => {\n const layerName = source.name;\n if (!!iTwinId) {\n try {\n await MapLayerPreferences.deleteByName(source, iTwinId, iModelId);\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefSuccess\", { layerName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Info, msg));\n } catch {\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefError\", { layerName });\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, msg));\n }\n }\n\n UiFramework.dialogs.modal.close();\n resumeOutsideClick();\n },\n [iTwinId, iModelId, resumeOutsideClick],\n );\n\n /*\n Handle Remove layer button clicked\n */\n const onItemRemoveButtonClicked = React.useCallback(\n (source: MapLayerSource, event: React.MouseEvent) => {\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\n\n const layerName = source.name;\n\n const msg = MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.RemoveLayerDefDialogMessage\", { layerName });\n UiFramework.dialogs.modal.open(\n <ConfirmMessageDialog\n className=\"map-sources-delete-confirmation\"\n title={removeLayerDefDialogTitle}\n message={msg}\n maxWidth={400}\n opened\n onYesResult={async () => handleYesConfirmation(source)}\n onNoResult={() => handleNoConfirmation(layerName)}\n />,\n );\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n },\n [handleNoConfirmation, handleYesConfirmation, onHandleOutsideClick, removeLayerDefDialogTitle],\n );\n\n /*\n Handle Edit layer button clicked\n */\n const onItemEditButtonClicked = React.useCallback(\n (event: React.MouseEvent, source: MapLayerSource) => {\n event.stopPropagation(); // We don't want the owning ListBox to react on mouse click.\n\n // we expect a single layer source matching this name\n if (source === undefined) {\n return;\n }\n setMapUrlModalOpen(true);\n UiFramework.dialogs.modal.open(\n <MapUrlDialog\n activeViewport={activeViewport}\n mapLayerSourceToEdit={source}\n onOkResult={(result?: SourceState) => handleModalUrlDialogOk(LayerAction.Edit, result)}\n onCancelResult={handleModalUrlDialogCancel}\n mapLayerOptions={mapLayerOptions}\n />,\n );\n\n if (onHandleOutsideClick) {\n onHandleOutsideClick(false);\n }\n },\n [activeViewport, handleModalUrlDialogCancel, handleModalUrlDialogOk, mapLayerOptions, onHandleOutsideClick, setMapUrlModalOpen],\n );\n\n return (\n <div className=\"map-manager-header\">\n {(loading || loadingSources) && (\n <div style={{\n position: \"absolute\",\n inset: 0,\n display: \"grid\",\n placeItems: \"center\",\n zIndex: 100,\n }}>\n <ProgressRadial as=\"div\"/>\n </div>\n )}\n <div className=\"map-manager-source-listbox-header\">\n <Input\n type=\"text\"\n className=\"map-manager-source-list-filter\"\n placeholder={placeholderLabel}\n value={sourceFilterString}\n onChange={handleFilterTextChanged}\n size=\"small\"\n />\n <Button className=\"map-manager-add-source-button\" title={addCustomLayerToolTip} onClick={handleAddNewMapSource}>\n {addCustomLayerLabel}\n </Button>\n </div>\n <div className=\"map-manager-sources\">\n <List\n id=\"map-sources\"\n as=\"div\"\n className=\"map-manager-source-list\"\n >\n {filteredOptions?.map((source) => (\n <ListItem\n as=\"div\"\n key={source.name}\n className=\"map-source-list-entry\"\n actionable\n onClick={() => handleAttach(source.name)}\n onMouseEnter={() => setLayerNameUnderCursor(source.name)}\n onMouseLeave={() => setLayerNameUnderCursor(undefined)}\n >\n <ListItem.Content>{source.name}</ListItem.Content>\n {\n // Display the delete icon only when the mouse over a specific item\n // otherwise list feels cluttered.\n !!iTwinId && layerNameUnderCursor && layerNameUnderCursor === source.name && (\n <>\n <IconButton\n size=\"small\"\n styleType=\"borderless\"\n className=\"map-source-list-entry-button\"\n label={editLayerDefButtonTitle}\n onClick={(e)=>onItemEditButtonClicked(e, source)}\n >\n <SvgEdit />\n </IconButton>\n <IconButton\n size=\"small\"\n styleType=\"borderless\"\n className=\"map-source-list-entry-button\"\n label={removeLayerDefButtonTitle}\n onClick={(event: React.MouseEvent) => {\n onItemRemoveButtonClicked(source, event);\n }}\n >\n <SvgDelete />\n </IconButton>\n </>\n )\n }\n </ListItem>\n ))}\n </List>\n </div>\n </div>\n );\n}\n\n/** @internal */\nexport enum AttachLayerButtonType {\n Primary,\n Blue,\n Icon,\n}\nexport interface AttachLayerPopupButtonProps {\n isOverlay: boolean;\n buttonType?: AttachLayerButtonType;\n disabled?: boolean;\n}\n\n/** @internal */\nexport function AttachLayerPopupButton(props: AttachLayerPopupButtonProps) {\n const { showAttachLayerLabel, hideAttachLayerLabel, addCustomLayerButtonLabel } = React.useMemo(() => {\n return {\n showAttachLayerLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Attach\"),\n hideAttachLayerLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:AttachLayerPopup.Close\"),\n addCustomLayerButtonLabel: MapLayersUI.localization.getLocalizedString(\"mapLayers:CustomAttach.AddCustomLayerButtonLabel\"),\n };\n }, []);\n\n const [handleOutsideClick, setHandleOutsideClick] = React.useState(true);\n const [mapUrlModalOpen, setMapUrlModalOpen] = React.useState(false);\n const [popupOpen, setPopupOpen] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\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 const togglePopup = React.useCallback(() => {\n setPopupOpen(!popupOpen);\n }, [popupOpen]);\n\n\n const { refreshFromStyle } = useSourceMapContext();\n\n const handleLayerAttached = React.useCallback(() => {\n if (!isMounted.current) {\n return;\n }\n setPopupOpen(false);\n refreshFromStyle();\n }, [refreshFromStyle]);\n\n function renderButton(): React.ReactNode {\n let button: React.ReactNode;\n\n if (props.buttonType === undefined || props.buttonType === AttachLayerButtonType.Icon) {\n button = (\n <IconButton\n disabled={props.disabled}\n size=\"small\"\n styleType=\"borderless\"\n ref={buttonRef}\n className=\"map-manager-attach-layer-button\"\n label={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\n onClick={togglePopup}\n >\n <SvgAdd />\n </IconButton>\n );\n } else {\n const determineStyleType = () => {\n switch (props.buttonType) {\n case AttachLayerButtonType.Blue:\n return \"high-visibility\";\n case AttachLayerButtonType.Primary:\n default:\n return \"cta\";\n }\n };\n const styleType = determineStyleType();\n button = (\n <Button\n disabled={props.disabled}\n ref={buttonRef}\n styleType={styleType}\n title={popupOpen ? hideAttachLayerLabel : showAttachLayerLabel}\n onClick={togglePopup}\n >\n <span className=\"map-manager-attach-layer-label\">{addCustomLayerButtonLabel}</span>\n </Button>\n );\n }\n\n return button;\n }\n\n return (\n <>\n <Popover\n content={\n <div ref={panelRef} className=\"map-sources-popup-panel\">\n <AttachLayerPanel isOverlay={props.isOverlay} onLayerAttached={handleLayerAttached} onHandleOutsideClick={setHandleOutsideClick} setMapUrlModalOpen={setMapUrlModalOpen} />\n </div>\n }\n applyBackground\n visible={popupOpen || mapUrlModalOpen} // keep the Popover open while the mapUrlModal is active\n onVisibleChange={setPopupOpen}\n closeOnOutsideClick={handleOutsideClick}\n placement={\"bottom-end\"}\n style={{ overflow: \"auto\" }}\n >\n {renderButton()}\n </Popover>\n </>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapLayerManager.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"AAOA,OAAO,wBAAwB,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAA4C,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AAiB3H,OAAO,KAAK,EAAyD,cAAc,EAAE,cAAc,EAAY,MAAM,sBAAsB,CAAC;AAC5I,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACpD,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACjD,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC5C;AAED,gBAAgB;AAChB,eAAO,MAAM,oBAAoB,wBAIhC,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,sCAK3B,CAAC;AAEH,gBAAgB;AAChB,wBAAgB,mBAAmB,IAAI,qBAAqB,CAE3D;AAyCD,UAAU,oBAAoB;IAC5B,oBAAoB,EAAE,MAAM,WAAW,CAAC;IACxC,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"MapLayerManager.d.ts","sourceRoot":"","sources":["../../../../src/ui/widget/MapLayerManager.tsx"],"names":[],"mappings":"AAOA,OAAO,wBAAwB,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAA4C,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AAiB3H,OAAO,KAAK,EAAyD,cAAc,EAAE,cAAc,EAAY,MAAM,sBAAsB,CAAC;AAC5I,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACpD,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACjD,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC5C;AAED,gBAAgB;AAChB,eAAO,MAAM,oBAAoB,wBAIhC,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,sCAK3B,CAAC;AAEH,gBAAgB;AAChB,wBAAgB,mBAAmB,IAAI,qBAAqB,CAE3D;AAyCD,UAAU,oBAAoB;IAC5B,oBAAoB,EAAE,MAAM,WAAW,CAAC;IACxC,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CAolB1D"}
|
|
@@ -512,6 +512,7 @@ function MapLayerManager(props) {
|
|
|
512
512
|
selectAllLayers,
|
|
513
513
|
underlaysLabel,
|
|
514
514
|
]);
|
|
515
|
+
const [baseMapPanelLabel] = React.useState(mapLayers_1.MapLayersUI.localization.getLocalizedString("mapLayers:Basemap.BaseMapPanelTitle"));
|
|
515
516
|
return ((0, jsx_runtime_1.jsxs)(exports.SourceMapContext.Provider, { value: {
|
|
516
517
|
activeViewport,
|
|
517
518
|
loadingSources,
|
|
@@ -521,6 +522,7 @@ function MapLayerManager(props) {
|
|
|
521
522
|
backgroundLayers: backgroundMapLayers,
|
|
522
523
|
overlayLayers: overlayMapLayers,
|
|
523
524
|
mapLayerOptions,
|
|
524
|
-
}, children: [(0, jsx_runtime_1.
|
|
525
|
+
}, children: [(0, jsx_runtime_1.jsxs)("div", { className: "map-manager-top-header", children: [!props.mapLayerOptions?.hideHeaderLabel &&
|
|
526
|
+
(0, jsx_runtime_1.jsx)("span", { className: "map-manager-header-label", children: baseMapPanelLabel }), (0, jsx_runtime_1.jsxs)("div", { className: "map-manager-header-buttons-group", children: [(0, jsx_runtime_1.jsx)(itwinui_react_1.ToggleSwitch, { className: "map-manager-toggle", checked: backgroundMapVisible, onChange: handleMapLayersToggle }), (0, jsx_runtime_1.jsx)(MapLayerSettingsPopupButton_1.MapLayerSettingsPopupButton, { disabled: !backgroundMapVisible })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "map-manager-container", children: [(0, jsx_runtime_1.jsx)("div", { className: "map-manager-basemap", children: (0, jsx_runtime_1.jsx)(BasemapPanel_1.BasemapPanel, { disabled: !backgroundMapVisible }) }), !hideExternalMapLayersSection && ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)(react_beautiful_dnd_1.DragDropContext, { onDragEnd: handleOnMapLayerDragEnd, children: [renderMapLayersList({ isOverlay: false }), renderMapLayersList({ isOverlay: true })] }) }))] })] }));
|
|
525
527
|
}
|
|
526
528
|
//# 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\nimport \"./MapLayerManager.scss\";\nimport * as React from \"react\";\nimport { DragDropContext } from \"react-beautiful-dnd\";\nimport { BentleyError, compareStrings } from \"@itwin/core-bentley\";\nimport { BackgroundMapProvider, BackgroundMapType, BaseMapLayerSettings, ImageMapLayerSettings } from \"@itwin/core-common\";\nimport { IModelApp, MapLayerSources, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\nimport { ToggleSwitch } from \"@itwin/itwinui-react\";\nimport { GoogleMaps } from \"@itwin/map-layers-formats\";\nimport { CustomParamsMappingStorage } from \"../../CustomParamsMappingStorage\";\nimport { CustomParamUtils } from \"../../CustomParamUtils\";\nimport { MapLayerPreferences, MapLayerSourceChangeType } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapLayersSyncUiEventId } from \"../../MapLayersActionIds\";\nimport { BasemapPanel } from \"./BasemapPanel\";\nimport { MapLayerActionButtons } from \"./MapLayerActionButtons\";\nimport { MapLayerDroppable } from \"./MapLayerDroppable\";\nimport { MapLayerSettingsPopupButton } from \"./MapLayerSettingsPopupButton\";\nimport { MapManagerLayersHeader } from \"./MapManagerMapLayersHeader\";\n\nimport type { DropResult } from \"react-beautiful-dnd\";\nimport type { MapImagerySettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\nimport type { MapLayerImageryProvider, MapLayerScaleRangeVisibility, MapLayerSource, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport type { MapLayerOptions, StyleMapLayerSettings } from \"../Interfaces\";\n/** @internal */\nexport interface SourceMapContextProps {\n readonly sources: MapLayerSource[];\n readonly loadingSources: boolean;\n readonly bases: BaseMapLayerSettings[];\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 defaultBaseMapLayers = [\n BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON({ name: \"BingProvider\", type: BackgroundMapType.Aerial })),\n BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON({ name: \"BingProvider\", type: BackgroundMapType.Hybrid })),\n BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON({ name: \"BingProvider\", type: BackgroundMapType.Street })),\n];\n\n/** @internal */\nexport const SourceMapContext = React.createContext<SourceMapContextProps>({\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\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\nexport function MapLayerManager(props: MapLayerManagerProps) {\n const [mapSources, setMapSources] = React.useState<MapLayerSource[] | undefined>();\n const [loadingSources, setLoadingSources] = React.useState(false);\n // const [bgProviders] = React.useState<BaseMapLayerSettings[]>(props.mapLayerOptions?.baseMapLayers ?? defaultBaseMapLayers);\n const [bgProviders] = React.useState<BaseMapLayerSettings[]>(()=> {\n // Base layers were provided, used it exclusively.\n if (props.mapLayerOptions?.baseMapLayers) {\n return props.mapLayerOptions?.baseMapLayers;\n }\n\n const bases = [...defaultBaseMapLayers];\n\n // Add Google Maps layers if the format is registered\n if (IModelApp.mapLayerFormatRegistry.isRegistered(\"GoogleMaps\")) {\n bases.push(GoogleMaps.createBaseLayerSettings({mapType: \"satellite\", language: \"en\", region: \"US\"}));\n bases.push(GoogleMaps.createBaseLayerSettings({mapType: \"satellite\", layerTypes: [\"layerRoadmap\"], language: \"en\", region: \"US\"}));\n bases.push(GoogleMaps.createBaseLayerSettings({mapType: \"roadmap\", language: \"en\", region: \"US\"}));\n }\n return bases;\n });\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>(\n getMapLayerSettingsFromViewport(activeViewport, true),\n );\n const [overlayMapLayers, setOverlayMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, false));\n\n const loadMapLayerSettingsFromViewport = React.useCallback(\n (viewport: Viewport) => {\n setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));\n setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));\n },\n [setBackgroundMapLayers, setOverlayMapLayers],\n );\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 React.useEffect(() => {\n const handleScaleRangeVisibilityChanged = (layerIndexes: MapLayerScaleRangeVisibility[]) => {\n const updateLayers = (array: StyleMapLayerSettings[] | undefined) => {\n if (array === undefined) {\n return undefined;\n }\n\n return array.map((curStyledLayer) => {\n const foundScaleRangeVisibility = layerIndexes.find(\n (layerIdx) => layerIdx.index === curStyledLayer.layerIndex && layerIdx.isOverlay === curStyledLayer.isOverlay,\n );\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 return activeViewport.onMapLayerScaleRangeVisibilityChanged.addListener(handleScaleRangeVisibilityChanged);\n }, [activeViewport, backgroundMapLayers, overlayMapLayers]);\n\n // Setup onMapImageryChanged events listening.\n\n React.useEffect(() => {\n const handleMapImageryChanged = (args: Readonly<MapImagerySettings>) => {\n if (\n args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0) ||\n args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)\n ) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n };\n return activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\n\n React.useEffect(() => {\n IModelApp.toolAdmin.dispatchUiSyncEvent(MapLayersSyncUiEventId.MapImageryChanged);\n }, [backgroundMapLayers, overlayMapLayers]);\n\n const handleProviderStatusChanged = React.useCallback(\n (_args: MapLayerImageryProvider) => {\n loadMapLayerSettingsFromViewport(activeViewport);\n },\n [loadMapLayerSettingsFromViewport, activeViewport],\n );\n\n // Triggered whenever a provider status change\n React.useEffect(() => {\n backgroundMapLayers?.forEach((layer) => {\n layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged);\n });\n overlayMapLayers?.forEach((layer) => {\n layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged);\n });\n\n return () => {\n backgroundMapLayers?.forEach((layer) => {\n layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged);\n });\n overlayMapLayers?.forEach((layer) => {\n 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 }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n React.useEffect(() => {\n async function fetchSources() {\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(\n new NotifyMessageDetails(\n OutputMessagePriority.Error,\n IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorLoadingLayers\"),\n BentleyError.getErrorMessage(err),\n ),\n );\n }\n\n if (!isMounted.current) {\n return;\n }\n\n // This is where the list of sources first gets populated...\n const sources: MapLayerSource[] = [];\n const addSource = (source: MapLayerSource) => !source.baseMap && sources.push(source); // No longer let MapLayerSources drive bg maps.\n sourceLayers?.allSource.forEach(addSource);\n const cpMappingStorage = new CustomParamsMappingStorage();\n preferenceSources.forEach((source) => {\n // Find existing entries to avoid adding duplicated sources\n if (!sources.find((curSource) => source.name === curSource.name)) {\n const cpMapping = cpMappingStorage.get(source.url.toLowerCase());\n if (cpMapping && !Array.isArray(cpMapping)) {\n CustomParamUtils.setSourceCustomParams(source, cpMapping.customParamNames);\n }\n addSource(source);\n }\n });\n sources.sort((a: MapLayerSource, b: MapLayerSource) => compareStrings(a.name.toLowerCase(), b.name.toLowerCase()));\n\n setMapSources(sources);\n }\n\n setLoadingSources(true);\n\n fetchSources()\n .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\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 }, [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(\n (action: string, mapLayerSettings: StyleMapLayerSettings) => {\n if (!activeViewport || !activeViewport.displayStyle) {\n return;\n }\n\n const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndSource(\n mapLayerSettings.name,\n mapLayerSettings.source,\n mapLayerSettings.isOverlay,\n );\n if (indexInDisplayStyle < 0) {\n return;\n }\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\n .viewMapLayerRange({ index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay }, activeViewport)\n .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 })\n .catch((_error) => {});\n break;\n }\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n },\n [activeViewport, loadMapLayerSettingsFromViewport],\n );\n\n const handleLayerVisibilityChange = React.useCallback(\n (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 },\n [activeViewport, loadMapLayerSettingsFromViewport],\n );\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 IModelApp.toolAdmin.dispatchUiSyncEvent(MapLayersSyncUiEventId.MapImageryChanged);\n }\n }, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);\n\n const handleOnMapLayerDragEnd = React.useCallback(\n (result: DropResult /* , _provided: ResponderProvided*/) => {\n const { destination, source } = result;\n\n if (!destination) {\n // dropped outside of list\n return;\n }\n\n // item was not moved\n if (destination.droppableId === source.droppableId && destination.index === source.index) {\n return;\n }\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\n if (!fromMapLayer || !activeViewport) {\n return;\n }\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 }\n if (toMapLayer) {\n toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(toMapLayer.name, toMapLayer.source, toMapLayer.isOverlay);\n }\n }\n\n const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(fromMapLayer.name, fromMapLayer.source, fromMapLayer.isOverlay);\n if (fromIndexInDisplayStyle < 0) {\n return;\n }\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 }\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 },\n [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers],\n );\n\n const handleRefreshFromStyle = React.useCallback(() => {\n if (activeViewport) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleItemSelected = React.useCallback(\n (isOverlay: boolean, _index: number) => {\n if (isOverlay) {\n if (overlayMapLayers) {\n setOverlayMapLayers([...overlayMapLayers]);\n }\n } else {\n if (backgroundMapLayers) {\n setBackgroundMapLayers([...backgroundMapLayers]);\n }\n }\n },\n [backgroundMapLayers, overlayMapLayers],\n );\n\n const hasItemSelected = React.useCallback(\n (isOverlay: boolean) => {\n const layerList = isOverlay ? overlayMapLayers : backgroundMapLayers;\n if (!layerList) {\n return false;\n }\n return undefined !== layerList?.find((value) => value.selected === true);\n },\n [backgroundMapLayers, overlayMapLayers],\n );\n\n const changeLayerVisibility = React.useCallback(\n (visible: boolean, index: number, isOverlay: boolean) => {\n activeViewport.displayStyle.changeMapLayerProps({ visible }, { index, isOverlay });\n },\n [activeViewport],\n );\n\n const changeAllLayerVisibility = React.useCallback(\n async (visible: boolean, isOverlay?: boolean) => {\n if (isOverlay === undefined || !isOverlay) {\n backgroundMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));\n }\n\n if (isOverlay === undefined || isOverlay) {\n overlayMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));\n }\n },\n [backgroundMapLayers, overlayMapLayers, changeLayerVisibility],\n );\n\n const invertAllLayerVisibility = React.useCallback(\n async (isOverlay?: boolean) => {\n if (isOverlay === undefined || !isOverlay) {\n backgroundMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));\n }\n\n if (isOverlay === undefined || isOverlay) {\n overlayMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));\n }\n },\n [backgroundMapLayers, overlayMapLayers, changeLayerVisibility],\n );\n\n const detachSelectedLayers = React.useCallback(\n async (isOverlay: boolean) => {\n const layerList = isOverlay ? overlayMapLayers : backgroundMapLayers;\n if (!layerList || layerList.length === 0) {\n return;\n }\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\n const selectAllLayers = React.useCallback(\n async (isOverlay: boolean) => {\n if (!overlayMapLayers || !backgroundMapLayers) {\n return;\n }\n\n const layerList = isOverlay ? [...overlayMapLayers] : [...backgroundMapLayers];\n const hasCheckedLayer = undefined !== layerList?.find((value) => value.selected === true);\n layerList.forEach((layer) => {\n layer.selected = !hasCheckedLayer;\n });\n\n if (isOverlay) {\n setOverlayMapLayers(layerList);\n } else {\n setBackgroundMapLayers(layerList);\n }\n },\n [overlayMapLayers, backgroundMapLayers],\n );\n\n const renderMapLayersList = React.useCallback(\n (options: { isOverlay: boolean }): React.ReactElement<HTMLElement> => {\n if (!overlayMapLayers || !backgroundMapLayers) {\n return <></>;\n }\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 label={label} isOverlay={isOverlay} disabled={!backgroundMapVisible} />\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 mapLayerOptions={props.mapLayerOptions}\n getContainerForClone={props.getContainerForClone as any}\n activeViewport={props.activeViewport}\n onMenuItemSelected={handleOnMenuItemSelection}\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\n onItemSelected={handleItemSelected}\n onItemEdited={handleRefreshFromStyle}\n />\n </div>\n );\n },\n [\n backgroundMapLayers,\n backgroundMapVisible,\n changeAllLayerVisibility,\n detachSelectedLayers,\n handleItemSelected,\n handleLayerVisibilityChange,\n handleOnMenuItemSelection,\n handleRefreshFromStyle,\n hasItemSelected,\n invertAllLayerVisibility,\n overlayMapLayers,\n overlaysLabel,\n props.activeViewport,\n props.getContainerForClone,\n props.mapLayerOptions,\n selectAllLayers,\n underlaysLabel,\n ],\n );\n\n return (\n <SourceMapContext.Provider\n value={{\n activeViewport,\n loadingSources,\n sources: mapSources ? mapSources : [],\n bases: bgProviders,\n refreshFromStyle: handleRefreshFromStyle,\n backgroundLayers: backgroundMapLayers,\n overlayLayers: overlayMapLayers,\n mapLayerOptions,\n }}\n >\n {/* Header*/}\n <div className=\"map-manager-top-header\">\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 {/* 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"]}
|
|
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\nimport \"./MapLayerManager.scss\";\nimport * as React from \"react\";\nimport { DragDropContext } from \"react-beautiful-dnd\";\nimport { BentleyError, compareStrings } from \"@itwin/core-bentley\";\nimport { BackgroundMapProvider, BackgroundMapType, BaseMapLayerSettings, ImageMapLayerSettings } from \"@itwin/core-common\";\nimport { IModelApp, MapLayerSources, NotifyMessageDetails, OutputMessagePriority } from \"@itwin/core-frontend\";\nimport { ToggleSwitch } from \"@itwin/itwinui-react\";\nimport { GoogleMaps } from \"@itwin/map-layers-formats\";\nimport { CustomParamsMappingStorage } from \"../../CustomParamsMappingStorage\";\nimport { CustomParamUtils } from \"../../CustomParamUtils\";\nimport { MapLayerPreferences, MapLayerSourceChangeType } from \"../../MapLayerPreferences\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { MapLayersSyncUiEventId } from \"../../MapLayersActionIds\";\nimport { BasemapPanel } from \"./BasemapPanel\";\nimport { MapLayerActionButtons } from \"./MapLayerActionButtons\";\nimport { MapLayerDroppable } from \"./MapLayerDroppable\";\nimport { MapLayerSettingsPopupButton } from \"./MapLayerSettingsPopupButton\";\nimport { MapManagerLayersHeader } from \"./MapManagerMapLayersHeader\";\n\nimport type { DropResult } from \"react-beautiful-dnd\";\nimport type { MapImagerySettings, MapSubLayerProps, MapSubLayerSettings } from \"@itwin/core-common\";\nimport type { MapLayerImageryProvider, MapLayerScaleRangeVisibility, MapLayerSource, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport type { MapLayerOptions, StyleMapLayerSettings } from \"../Interfaces\";\n/** @internal */\nexport interface SourceMapContextProps {\n readonly sources: MapLayerSource[];\n readonly loadingSources: boolean;\n readonly bases: BaseMapLayerSettings[];\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 defaultBaseMapLayers = [\n BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON({ name: \"BingProvider\", type: BackgroundMapType.Aerial })),\n BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON({ name: \"BingProvider\", type: BackgroundMapType.Hybrid })),\n BaseMapLayerSettings.fromProvider(BackgroundMapProvider.fromJSON({ name: \"BingProvider\", type: BackgroundMapType.Street })),\n];\n\n/** @internal */\nexport const SourceMapContext = React.createContext<SourceMapContextProps>({\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\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\nexport function MapLayerManager(props: MapLayerManagerProps) {\n const [mapSources, setMapSources] = React.useState<MapLayerSource[] | undefined>();\n const [loadingSources, setLoadingSources] = React.useState(false);\n // const [bgProviders] = React.useState<BaseMapLayerSettings[]>(props.mapLayerOptions?.baseMapLayers ?? defaultBaseMapLayers);\n const [bgProviders] = React.useState<BaseMapLayerSettings[]>(()=> {\n // Base layers were provided, used it exclusively.\n if (props.mapLayerOptions?.baseMapLayers) {\n return props.mapLayerOptions?.baseMapLayers;\n }\n\n const bases = [...defaultBaseMapLayers];\n\n // Add Google Maps layers if the format is registered\n if (IModelApp.mapLayerFormatRegistry.isRegistered(\"GoogleMaps\")) {\n bases.push(GoogleMaps.createBaseLayerSettings({mapType: \"satellite\", language: \"en\", region: \"US\"}));\n bases.push(GoogleMaps.createBaseLayerSettings({mapType: \"satellite\", layerTypes: [\"layerRoadmap\"], language: \"en\", region: \"US\"}));\n bases.push(GoogleMaps.createBaseLayerSettings({mapType: \"roadmap\", language: \"en\", region: \"US\"}));\n }\n return bases;\n });\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>(\n getMapLayerSettingsFromViewport(activeViewport, true),\n );\n const [overlayMapLayers, setOverlayMapLayers] = React.useState<StyleMapLayerSettings[] | undefined>(getMapLayerSettingsFromViewport(activeViewport, false));\n\n const loadMapLayerSettingsFromViewport = React.useCallback(\n (viewport: Viewport) => {\n setBackgroundMapLayers(getMapLayerSettingsFromViewport(viewport, true));\n setOverlayMapLayers(getMapLayerSettingsFromViewport(viewport, false));\n },\n [setBackgroundMapLayers, setOverlayMapLayers],\n );\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 React.useEffect(() => {\n const handleScaleRangeVisibilityChanged = (layerIndexes: MapLayerScaleRangeVisibility[]) => {\n const updateLayers = (array: StyleMapLayerSettings[] | undefined) => {\n if (array === undefined) {\n return undefined;\n }\n\n return array.map((curStyledLayer) => {\n const foundScaleRangeVisibility = layerIndexes.find(\n (layerIdx) => layerIdx.index === curStyledLayer.layerIndex && layerIdx.isOverlay === curStyledLayer.isOverlay,\n );\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 return activeViewport.onMapLayerScaleRangeVisibilityChanged.addListener(handleScaleRangeVisibilityChanged);\n }, [activeViewport, backgroundMapLayers, overlayMapLayers]);\n\n // Setup onMapImageryChanged events listening.\n\n React.useEffect(() => {\n const handleMapImageryChanged = (args: Readonly<MapImagerySettings>) => {\n if (\n args.backgroundLayers.length !== (backgroundMapLayers ? backgroundMapLayers.length : 0) ||\n args.overlayLayers.length !== (overlayMapLayers ? overlayMapLayers.length : 0)\n ) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n };\n return activeViewport?.displayStyle.settings.onMapImageryChanged.addListener(handleMapImageryChanged);\n }, [activeViewport, backgroundMapLayers, loadMapLayerSettingsFromViewport, overlayMapLayers]);\n\n React.useEffect(() => {\n IModelApp.toolAdmin.dispatchUiSyncEvent(MapLayersSyncUiEventId.MapImageryChanged);\n }, [backgroundMapLayers, overlayMapLayers]);\n\n const handleProviderStatusChanged = React.useCallback(\n (_args: MapLayerImageryProvider) => {\n loadMapLayerSettingsFromViewport(activeViewport);\n },\n [loadMapLayerSettingsFromViewport, activeViewport],\n );\n\n // Triggered whenever a provider status change\n React.useEffect(() => {\n backgroundMapLayers?.forEach((layer) => {\n layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged);\n });\n overlayMapLayers?.forEach((layer) => {\n layer.provider?.onStatusChanged.addListener(handleProviderStatusChanged);\n });\n\n return () => {\n backgroundMapLayers?.forEach((layer) => {\n layer.provider?.onStatusChanged.removeListener(handleProviderStatusChanged);\n });\n overlayMapLayers?.forEach((layer) => {\n 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 }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n React.useEffect(() => {\n async function fetchSources() {\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(\n new NotifyMessageDetails(\n OutputMessagePriority.Error,\n IModelApp.localization.getLocalizedString(\"mapLayers:CustomAttach.ErrorLoadingLayers\"),\n BentleyError.getErrorMessage(err),\n ),\n );\n }\n\n if (!isMounted.current) {\n return;\n }\n\n // This is where the list of sources first gets populated...\n const sources: MapLayerSource[] = [];\n const addSource = (source: MapLayerSource) => !source.baseMap && sources.push(source); // No longer let MapLayerSources drive bg maps.\n sourceLayers?.allSource.forEach(addSource);\n const cpMappingStorage = new CustomParamsMappingStorage();\n preferenceSources.forEach((source) => {\n // Find existing entries to avoid adding duplicated sources\n if (!sources.find((curSource) => source.name === curSource.name)) {\n const cpMapping = cpMappingStorage.get(source.url.toLowerCase());\n if (cpMapping && !Array.isArray(cpMapping)) {\n CustomParamUtils.setSourceCustomParams(source, cpMapping.customParamNames);\n }\n addSource(source);\n }\n });\n sources.sort((a: MapLayerSource, b: MapLayerSource) => compareStrings(a.name.toLowerCase(), b.name.toLowerCase()));\n\n setMapSources(sources);\n }\n\n setLoadingSources(true);\n\n fetchSources()\n .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\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 }, [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(\n (action: string, mapLayerSettings: StyleMapLayerSettings) => {\n if (!activeViewport || !activeViewport.displayStyle) {\n return;\n }\n\n const indexInDisplayStyle = activeViewport.displayStyle.findMapLayerIndexByNameAndSource(\n mapLayerSettings.name,\n mapLayerSettings.source,\n mapLayerSettings.isOverlay,\n );\n if (indexInDisplayStyle < 0) {\n return;\n }\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\n .viewMapLayerRange({ index: indexInDisplayStyle, isOverlay: mapLayerSettings.isOverlay }, activeViewport)\n .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 })\n .catch((_error) => {});\n break;\n }\n\n // force UI to update\n loadMapLayerSettingsFromViewport(activeViewport);\n },\n [activeViewport, loadMapLayerSettingsFromViewport],\n );\n\n const handleLayerVisibilityChange = React.useCallback(\n (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 },\n [activeViewport, loadMapLayerSettingsFromViewport],\n );\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 IModelApp.toolAdmin.dispatchUiSyncEvent(MapLayersSyncUiEventId.MapImageryChanged);\n }\n }, [backgroundMapVisible, setBackgroundMapVisible, activeViewport]);\n\n const handleOnMapLayerDragEnd = React.useCallback(\n (result: DropResult /* , _provided: ResponderProvided*/) => {\n const { destination, source } = result;\n\n if (!destination) {\n // dropped outside of list\n return;\n }\n\n // item was not moved\n if (destination.droppableId === source.droppableId && destination.index === source.index) {\n return;\n }\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\n if (!fromMapLayer || !activeViewport) {\n return;\n }\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 }\n if (toMapLayer) {\n toIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(toMapLayer.name, toMapLayer.source, toMapLayer.isOverlay);\n }\n }\n\n const fromIndexInDisplayStyle = displayStyle.findMapLayerIndexByNameAndSource(fromMapLayer.name, fromMapLayer.source, fromMapLayer.isOverlay);\n if (fromIndexInDisplayStyle < 0) {\n return;\n }\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 }\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 },\n [loadMapLayerSettingsFromViewport, activeViewport, overlayMapLayers, backgroundMapLayers],\n );\n\n const handleRefreshFromStyle = React.useCallback(() => {\n if (activeViewport) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n const handleItemSelected = React.useCallback(\n (isOverlay: boolean, _index: number) => {\n if (isOverlay) {\n if (overlayMapLayers) {\n setOverlayMapLayers([...overlayMapLayers]);\n }\n } else {\n if (backgroundMapLayers) {\n setBackgroundMapLayers([...backgroundMapLayers]);\n }\n }\n },\n [backgroundMapLayers, overlayMapLayers],\n );\n\n const hasItemSelected = React.useCallback(\n (isOverlay: boolean) => {\n const layerList = isOverlay ? overlayMapLayers : backgroundMapLayers;\n if (!layerList) {\n return false;\n }\n return undefined !== layerList?.find((value) => value.selected === true);\n },\n [backgroundMapLayers, overlayMapLayers],\n );\n\n const changeLayerVisibility = React.useCallback(\n (visible: boolean, index: number, isOverlay: boolean) => {\n activeViewport.displayStyle.changeMapLayerProps({ visible }, { index, isOverlay });\n },\n [activeViewport],\n );\n\n const changeAllLayerVisibility = React.useCallback(\n async (visible: boolean, isOverlay?: boolean) => {\n if (isOverlay === undefined || !isOverlay) {\n backgroundMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));\n }\n\n if (isOverlay === undefined || isOverlay) {\n overlayMapLayers?.forEach((layer) => changeLayerVisibility(visible, layer.layerIndex, layer.isOverlay));\n }\n },\n [backgroundMapLayers, overlayMapLayers, changeLayerVisibility],\n );\n\n const invertAllLayerVisibility = React.useCallback(\n async (isOverlay?: boolean) => {\n if (isOverlay === undefined || !isOverlay) {\n backgroundMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));\n }\n\n if (isOverlay === undefined || isOverlay) {\n overlayMapLayers?.forEach((layer) => changeLayerVisibility(!layer.visible, layer.layerIndex, layer.isOverlay));\n }\n },\n [backgroundMapLayers, overlayMapLayers, changeLayerVisibility],\n );\n\n const detachSelectedLayers = React.useCallback(\n async (isOverlay: boolean) => {\n const layerList = isOverlay ? overlayMapLayers : backgroundMapLayers;\n if (!layerList || layerList.length === 0) {\n return;\n }\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\n const selectAllLayers = React.useCallback(\n async (isOverlay: boolean) => {\n if (!overlayMapLayers || !backgroundMapLayers) {\n return;\n }\n\n const layerList = isOverlay ? [...overlayMapLayers] : [...backgroundMapLayers];\n const hasCheckedLayer = undefined !== layerList?.find((value) => value.selected === true);\n layerList.forEach((layer) => {\n layer.selected = !hasCheckedLayer;\n });\n\n if (isOverlay) {\n setOverlayMapLayers(layerList);\n } else {\n setBackgroundMapLayers(layerList);\n }\n },\n [overlayMapLayers, backgroundMapLayers],\n );\n\n const renderMapLayersList = React.useCallback(\n (options: { isOverlay: boolean }): React.ReactElement<HTMLElement> => {\n if (!overlayMapLayers || !backgroundMapLayers) {\n return <></>;\n }\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 label={label} isOverlay={isOverlay} disabled={!backgroundMapVisible} />\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 mapLayerOptions={props.mapLayerOptions}\n getContainerForClone={props.getContainerForClone as any}\n activeViewport={props.activeViewport}\n onMenuItemSelected={handleOnMenuItemSelection}\n onItemVisibilityToggleClicked={handleLayerVisibilityChange}\n onItemSelected={handleItemSelected}\n onItemEdited={handleRefreshFromStyle}\n />\n </div>\n );\n },\n [\n backgroundMapLayers,\n backgroundMapVisible,\n changeAllLayerVisibility,\n detachSelectedLayers,\n handleItemSelected,\n handleLayerVisibilityChange,\n handleOnMenuItemSelection,\n handleRefreshFromStyle,\n hasItemSelected,\n invertAllLayerVisibility,\n overlayMapLayers,\n overlaysLabel,\n props.activeViewport,\n props.getContainerForClone,\n props.mapLayerOptions,\n selectAllLayers,\n underlaysLabel,\n ],\n );\n\n const [baseMapPanelLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:Basemap.BaseMapPanelTitle\"));\n\n return (\n <SourceMapContext.Provider\n value={{\n activeViewport,\n loadingSources,\n sources: mapSources ? mapSources : [],\n bases: bgProviders,\n refreshFromStyle: handleRefreshFromStyle,\n backgroundLayers: backgroundMapLayers,\n overlayLayers: overlayMapLayers,\n mapLayerOptions,\n }}\n >\n {/* Header*/}\n <div className=\"map-manager-top-header\">\n {!props.mapLayerOptions?.hideHeaderLabel &&\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 {/* 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"]}
|