@itwin/map-layers 6.0.0-dev.7 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -1
- package/lib/cjs/BaseMapPresets.d.ts +5 -0
- package/lib/cjs/BaseMapPresets.d.ts.map +1 -0
- package/lib/cjs/BaseMapPresets.js +18 -0
- package/lib/cjs/BaseMapPresets.js.map +1 -0
- package/lib/cjs/map-layers.d.ts +1 -0
- package/lib/cjs/map-layers.d.ts.map +1 -1
- package/lib/cjs/map-layers.js +1 -0
- package/lib/cjs/map-layers.js.map +1 -1
- package/lib/cjs/ui/widget/BasemapPanel.d.ts.map +1 -1
- package/lib/cjs/ui/widget/BasemapPanel.js +8 -4
- package/lib/cjs/ui/widget/BasemapPanel.js.map +1 -1
- package/lib/cjs/ui/widget/MapLayerManager.d.ts.map +1 -1
- package/lib/cjs/ui/widget/MapLayerManager.js +0 -12
- package/lib/cjs/ui/widget/MapLayerManager.js.map +1 -1
- package/lib/cjs/ui/widget/SubLayersTree.js +2 -2
- package/lib/cjs/ui/widget/SubLayersTree.js.map +1 -1
- package/lib/esm/BaseMapPresets.d.ts +5 -0
- package/lib/esm/BaseMapPresets.d.ts.map +1 -0
- package/lib/esm/BaseMapPresets.js +14 -0
- package/lib/esm/BaseMapPresets.js.map +1 -0
- package/lib/esm/map-layers.d.ts +1 -0
- package/lib/esm/map-layers.d.ts.map +1 -1
- package/lib/esm/map-layers.js +1 -0
- package/lib/esm/map-layers.js.map +1 -1
- package/lib/esm/ui/widget/BasemapPanel.d.ts.map +1 -1
- package/lib/esm/ui/widget/BasemapPanel.js +8 -4
- package/lib/esm/ui/widget/BasemapPanel.js.map +1 -1
- package/lib/esm/ui/widget/MapLayerManager.d.ts.map +1 -1
- package/lib/esm/ui/widget/MapLayerManager.js +1 -13
- package/lib/esm/ui/widget/MapLayerManager.js.map +1 -1
- package/lib/esm/ui/widget/SubLayersTree.js +2 -2
- package/lib/esm/ui/widget/SubLayersTree.js.map +1 -1
- package/package.json +27 -28
|
@@ -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 { ImageryMapTileTree, 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, TileTreeOwner, 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 // Setup onTileTreeLoad events listening.\n // This is needed because we need to know when the imagery provider\n // is created, and be able to monitor to status change.\n React.useEffect(() => {\n const handleTileTreeLoad = (args: TileTreeOwner) => {\n // Ignore non-map tile trees\n if (args.tileTree instanceof ImageryMapTileTree) {\n loadMapLayerSettingsFromViewport(activeViewport);\n }\n };\n\n return IModelApp.tileAdmin.onTileTreeLoad.addListener(handleTileTreeLoad);\n }, [activeViewport, loadMapLayerSettingsFromViewport]);\n\n React.useEffect(() => {\n const handleScaleRangeVisibilityChanged = (layerIndexes: MapLayerScaleRangeVisibility[]) => {\n const updateLayers = (array: StyleMapLayerSettings[] | undefined) => {\n if (array === undefined) {\n return undefined;\n }\n\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 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"]}
|
|
@@ -54,7 +54,7 @@ export function SubLayersTree(props) {
|
|
|
54
54
|
const handler = new SubLayerCheckboxHandler(subLayers, props.singleVisibleSubLayer ?? false, nodeLoader, props.onSubLayerStateChange);
|
|
55
55
|
setEventHandler(handler);
|
|
56
56
|
return () => {
|
|
57
|
-
handler.dispose();
|
|
57
|
+
handler[Symbol.dispose]();
|
|
58
58
|
};
|
|
59
59
|
}, [nodeLoader, subLayers, props.onSubLayerStateChange, props.singleVisibleSubLayer]);
|
|
60
60
|
// Get an immutable tree model from the model source. The model is regenerated every time the model source
|
|
@@ -97,7 +97,7 @@ class SubLayerCheckboxHandler extends TreeEventHandler {
|
|
|
97
97
|
}
|
|
98
98
|
dispose() {
|
|
99
99
|
this._removeModelChangedListener();
|
|
100
|
-
super.dispose();
|
|
100
|
+
super[Symbol.dispose]();
|
|
101
101
|
}
|
|
102
102
|
// Cascade state
|
|
103
103
|
// Children on unnamed groups must get disabled in the tree view, because
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubLayersTree.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"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","sourcesContent":["\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\nimport \"./SubLayersTree.scss\";\nimport * as React from \"react\";\nimport {\n CheckBoxState,\n ControlledTree,\n SelectionMode,\n TreeEventHandler,\n TreeImageLoader,\n TreeModelSource,\n TreeNodeLoader,\n TreeNodeRenderer,\n TreeRenderer,\n useTreeModel,\n} from \"@itwin/components-react\";\nimport { SvgCheckboxDeselect, SvgCheckboxSelect, SvgVisibilityHide, SvgVisibilityShow } from \"@itwin/itwinui-icons-react\";\nimport { Checkbox, IconButton, Input } from \"@itwin/itwinui-react\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { SubLayersDataProvider } from \"./SubLayersDataProvider\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\n\nimport type {\n AbstractTreeNodeLoaderWithProvider,\n DelayLoadedTreeNodeItem,\n HighlightableTreeProps,\n ITreeDataProvider,\n MutableTreeModel,\n MutableTreeModelNode,\n TreeCheckboxStateChangeEventArgs,\n TreeDataProvider,\n TreeModel,\n TreeModelChanges,\n TreeNodeItem,\n TreeNodeRendererProps,\n TreeRendererProps,\n} from \"@itwin/components-react\";\nimport type { MapSubLayerProps, SubLayerId } from \"@itwin/core-common\";\nimport type { SubLayersTreeExpandMode } from \"./SubLayersDataProvider\";\n\ntype CheckboxProps = React.ComponentPropsWithoutRef<typeof Checkbox>;\ntype CheckboxRendererProps = Omit<CheckboxProps, \"onChange\" | \"onClick\"> & {\n onChange: (checked: boolean) => void;\n onClick: (e: React.MouseEvent) => void;\n};\n\ninterface ToolbarProps {\n searchField?: React.ReactNode;\n children?: React.ReactNode[];\n}\n\nfunction Toolbar(props: ToolbarProps) {\n return (\n <div className=\"map-manager-sublayer-tree-toolbar\">\n <div className=\"tree-toolbar-action-buttons\">{props.children}</div>\n {props.searchField && <div className=\"tree-toolbar-searchbox\">{props.searchField}</div>}\n </div>\n );\n}\n\nexport type OnSubLayerStateChangeType = (subLayerId: SubLayerId, isSelected: boolean) => void;\nexport interface SubLayersPanelProps extends Omit<SubLayersTreeProps, \"subLayers\"> {\n subLayers?: MapSubLayerProps[];\n}\n\nexport function SubLayersPanel(props: SubLayersPanelProps) {\n const [noneAvailableLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoSubLayers\"));\n if (undefined === props.subLayers || 0 === props.subLayers.length) {\n return (\n <div className=\"map-manager-sublayer-panel\">\n <div>{noneAvailableLabel}</div>\n </div>\n );\n } else {\n return <SubLayersTree subLayers={props.subLayers} {...props} />;\n }\n}\n\nexport interface SubLayersTreeProps {\n checkboxStyle: \"standard\" | \"eye\";\n expandMode: SubLayersTreeExpandMode;\n subLayers: MapSubLayerProps[];\n singleVisibleSubLayer?: boolean;\n onSubLayerStateChange?: OnSubLayerStateChangeType;\n height?: number;\n width?: number;\n}\n\n/**\n * Tree Control that displays sub-layer hierarchy\n * @internal\n */\nexport function SubLayersTree(props: SubLayersTreeProps) {\n const [width, setWidth] = React.useState<number | undefined>(props.width);\n const [height, setHeight] = React.useState<number | undefined>(props.height);\n\n const [placeholderLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.SearchPlaceholder\"));\n const [noResults] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoResults\"));\n const [subLayers, setSubLayers] = React.useState(props.subLayers);\n const [layerFilterString, setLayerFilterString] = React.useState<string>(\"\");\n\n // create data provider to get some nodes to show in tree\n // `React.useMemo' is used avoid creating new object on each render cycle\n // We DO want a dependency on 'layerFilterString' (event though eslint doesn't like it)..\n // each time the filter is updated the provider must be refreshed otherwise the state of model is out of synch.\n const dataProvider = React.useMemo(\n () => new SubLayersDataProvider(subLayers, props.expandMode),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [subLayers, props.expandMode, layerFilterString],\n );\n\n const { modelSource, nodeLoader, nodeHighlightingProps } = useTreeFiltering(dataProvider, layerFilterString);\n\n // create custom event handler. It handles all tree event same as `TreeEventHandler` but additionally\n // it selects/deselects node when checkbox is checked/unchecked and vice versa.\n const [eventHandler, setEventHandler] = React.useState<SubLayerCheckboxHandler | undefined>(undefined);\n\n const [elementRef] = useResizeObserver<HTMLDivElement>((size) => {\n setWidth(size.width);\n setHeight(size.height);\n });\n\n React.useEffect(() => {\n const handler = new SubLayerCheckboxHandler(subLayers, props.singleVisibleSubLayer ?? false, nodeLoader, props.onSubLayerStateChange);\n setEventHandler(handler);\n return () => {\n handler.dispose();\n };\n }, [nodeLoader, subLayers, props.onSubLayerStateChange, props.singleVisibleSubLayer]);\n\n // Get an immutable tree model from the model source. The model is regenerated every time the model source\n // emits the `onModelChanged` event.\n const treeModel = useTreeModel(modelSource);\n const changeAll = React.useCallback(\n async (visible: boolean) => {\n const tmpSubLayers = [...subLayers]; // deep copy to trigger state change\n if (tmpSubLayers) {\n tmpSubLayers?.forEach((subLayer: MapSubLayerProps) => {\n subLayer.visible = visible;\n });\n\n setSubLayers(tmpSubLayers);\n }\n\n if (props.onSubLayerStateChange) {\n props.onSubLayerStateChange(-1, visible);\n }\n },\n [subLayers, props],\n );\n\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setLayerFilterString(event.target.value);\n }, []);\n\n return (\n <>\n <div className=\"map-manager-sublayer-tree\">\n <Toolbar\n searchField={\n <Input\n type=\"text\"\n className=\"map-manager-sublayer-tree-searchbox\"\n placeholder={placeholderLabel}\n value={layerFilterString}\n onChange={handleFilterTextChanged}\n size=\"small\"\n />\n }\n >\n {props.singleVisibleSubLayer\n ? undefined\n : [\n <IconButton\n key=\"show-all-btn\"\n size=\"small\"\n label={props.checkboxStyle === \"eye\" ? MapLayersUI.translate(\"SubLayers.AllOn\") : MapLayersUI.translate(\"SelectFeaturesDialog.AllOn\")}\n onClick={async () => changeAll(true)}\n >\n {props.checkboxStyle === \"eye\" ? <SvgVisibilityShow /> : <SvgCheckboxSelect />}\n </IconButton>,\n <IconButton\n style={{ marginLeft: \"5px\" }}\n key=\"hide-all-btn\"\n size=\"small\"\n label={props.checkboxStyle === \"eye\" ? MapLayersUI.translate(\"SubLayers.AllOff\") : MapLayersUI.translate(\"SelectFeaturesDialog.AllOff\")}\n onClick={async () => changeAll(false)}\n >\n {props.checkboxStyle === \"eye\" ? <SvgVisibilityHide /> : <SvgCheckboxDeselect />}\n </IconButton>,\n ]}\n </Toolbar>\n <div className=\"map-manager-sublayer-tree-content\" ref={elementRef}>\n {width !== undefined && height !== undefined && (\n <ControlledTree\n nodeLoader={nodeLoader}\n selectionMode={SelectionMode.None}\n eventsHandler={eventHandler!}\n model={treeModel}\n treeRenderer={props.checkboxStyle === \"eye\" ? nodeWithEyeCheckboxTreeRenderer : undefined}\n nodeHighlightingProps={nodeHighlightingProps}\n width={width}\n height={height}\n noDataRenderer={() => <p className=\"components-controlledTree-errorMessage\">{noResults}</p>}\n />\n )}\n </div>\n </div>\n </>\n );\n}\n\n/** TreeEventHandler derived class that handler processing changes to subLayer visibility */\nclass SubLayerCheckboxHandler extends TreeEventHandler {\n private _removeModelChangedListener: () => void;\n private _onSubLayerStateChange?: OnSubLayerStateChangeType;\n private _subLayers: MapSubLayerProps[];\n private _singleVisibleSubLayer?: boolean;\n\n constructor(\n subLayers: MapSubLayerProps[],\n singleVisibleSubLayer: boolean,\n nodeLoader: AbstractTreeNodeLoaderWithProvider<TreeDataProvider>,\n onSubLayerStateChange?: OnSubLayerStateChangeType,\n ) {\n super({ modelSource: nodeLoader.modelSource, nodeLoader, collapsedChildrenDisposalEnabled: true });\n this._subLayers = subLayers;\n this._singleVisibleSubLayer = singleVisibleSubLayer;\n this._onSubLayerStateChange = onSubLayerStateChange;\n this._removeModelChangedListener = this.modelSource.onModelChanged.addListener(this.onModelChanged);\n }\n\n public override dispose() {\n this._removeModelChangedListener();\n super.dispose();\n }\n\n // Cascade state\n // Children on unnamed groups must get disabled in the tree view, because\n // they get rendered anyway.\n private cascadeStateToAllChildren(model: MutableTreeModel, parentId?: string) {\n const children = model.getChildren(parentId);\n if (children === undefined) {\n return;\n }\n\n for (const childID of children) {\n const childNode = childID ? model.getNode(childID) : undefined;\n\n if (childNode) {\n this.syncNodeStateWithParent(model, childNode);\n }\n\n // Drill down the tree.\n this.cascadeStateToAllChildren(model, childID);\n }\n }\n\n private applyMutualExclusiveState(model: MutableTreeModel, nodeId: string) {\n const changedNode = model.getNode(nodeId);\n if (changedNode?.checkbox.state === CheckBoxState.Off) {\n return;\n }\n\n for (const node of model.iterateTreeModelNodes()) {\n if (node.id === changedNode?.id) {\n continue;\n }\n\n if (node && node.checkbox.state === CheckBoxState.On) {\n node.checkbox.state = CheckBoxState.Off;\n }\n }\n }\n\n //-----------------------------------------------------------------------\n // Listen to model changes\n //------------------------------------------------------------------------\n // This is required because nodes are delay loaded in the model until\n // they are made visible (i.e. parent node is expanded). So even though\n // you might have created nodes in the data provided with a proper\n // initial state, by the time it gets loaded, their state might have became\n // out of date in the TreeView's active model. So whenever a node\n // is added, when must confirm its state matches the current model\n // (i.e. state of their parent.)\n public onModelChanged = (args: [TreeModel, TreeModelChanges]) => {\n this.modelSource.modifyModel((model) => {\n const addedNodes = args[1].addedNodeIds.map((id) => model.getNode(id));\n addedNodes.forEach((node) => {\n if (!node) {\n return;\n }\n\n this.syncNodeStateWithParent(model, node);\n });\n });\n };\n\n private static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\n if (!subLayer) {\n return false;\n }\n\n return (!subLayer.name || subLayer.name.length === 0) && subLayer.children !== undefined && subLayer.children.length > 0;\n }\n\n // Ensure the state of changed node matches the state of its parent.\n private syncNodeStateWithParent(model: MutableTreeModel, changedNode: MutableTreeModelNode) {\n // Lookup node parent. If non exists, I assume thats the root node,\n // and it must have a proper initial state.\n const parentNode = changedNode.parentId ? model.getNode(changedNode.parentId) : undefined;\n if (!parentNode) {\n return;\n }\n\n if (!changedNode.checkbox) {\n return;\n } // don't see why this would happen, but if there is no checkbox, we cant do much here.\n\n const parentLayerId = undefined !== parentNode.item.extendedData?.subLayerId ? parentNode.item.extendedData?.subLayerId : parentNode.item.id;\n const parentSubLayer = this._subLayers?.find((subLayer) => subLayer.id === parentLayerId);\n\n // If parent is disabled, then children must be too.\n // Also, Non-visible unnamed group must have their children disabled (unamed groups have visibility inherence)\n if (parentNode.checkbox.isDisabled || (SubLayerCheckboxHandler.isUnnamedGroup(parentSubLayer) && parentNode.checkbox.state === CheckBoxState.Off)) {\n changedNode.checkbox.isDisabled = true;\n changedNode.checkbox.state = CheckBoxState.Off;\n } else {\n // Visibility state from StyleMapLayerSettings applies\n const subLayerId = undefined !== changedNode.item.extendedData?.subLayerId ? changedNode.item.extendedData?.subLayerId : changedNode.item.id;\n const foundSubLayer = this._subLayers?.find((subLayer) => subLayer.id === subLayerId);\n changedNode.checkbox.isDisabled = false;\n changedNode.checkbox.state = foundSubLayer?.visible ? CheckBoxState.On : CheckBoxState.Off;\n }\n }\n\n /** Changes nodes checkboxes states until event is handled or handler is disposed */\n public override onCheckboxStateChanged({ stateChanges }: TreeCheckboxStateChangeEventArgs) {\n // call base checkbox handling\n const baseHandling = super.onCheckboxStateChanged({ stateChanges });\n\n // subscribe to checkbox state changes to new checkbox states and do some additional work with them\n const selectionHandling = stateChanges.subscribe({\n next: (changes) => {\n changes.forEach((change) => {\n const isSelected = change.newState === CheckBoxState.On;\n const subLayerId = undefined !== change.nodeItem.extendedData?.subLayerId ? change.nodeItem.extendedData?.subLayerId : change.nodeItem.id;\n\n // Get the previously visible node if we are in 'singleVisibleSubLayer' node\n let prevVisibleSubLayers: SubLayerId[] = [];\n if (this._singleVisibleSubLayer) {\n prevVisibleSubLayers = this._subLayers.reduce((filtered: SubLayerId[], subLayer) => {\n if (subLayer.visible && subLayer.id !== undefined) {\n filtered.push(subLayer.id);\n }\n return filtered;\n }, []);\n }\n\n // Inform caller that subLayer state is going to change (i.e. update display style state)\n if (this._onSubLayerStateChange) {\n for (const slId of prevVisibleSubLayers) {\n this._onSubLayerStateChange(slId, false);\n }\n\n this._onSubLayerStateChange(subLayerId, isSelected);\n }\n\n // Update sublayer object, otherwise state would get out of sync with DisplayStyle each time the TreeView is re-rendered\n this._subLayers?.forEach((curSubLayer) => {\n if (curSubLayer.id !== undefined) {\n if (curSubLayer.id === subLayerId) {\n curSubLayer.visible = isSelected;\n } else if (prevVisibleSubLayers.includes(curSubLayer.id)) {\n curSubLayer.visible = false;\n }\n }\n });\n\n // Cascade state\n this.modelSource.modifyModel((model) => {\n if (this._singleVisibleSubLayer) {\n this.applyMutualExclusiveState(model, change.nodeItem.id);\n }\n this.cascadeStateToAllChildren(model, change.nodeItem.id);\n });\n });\n },\n });\n // stop handling selection when checkboxes handling is stopped\n baseHandling?.add(selectionHandling);\n return baseHandling;\n }\n}\n\n/** Custom checkbox renderer that renders checkbox as an eye */\nconst eyeCheckboxRenderer = (props: CheckboxRendererProps) => (\n <Checkbox\n className=\"core-image-checkbox\"\n variant=\"eyeball\"\n checked={props.checked}\n disabled={props.disabled}\n onChange={(e) => {\n props.onChange(e.target.checked);\n }}\n />\n);\n\n/** Custom node renderer. It uses default 'TreeNodeRenderer' but overrides default checkbox renderer to render checkbox as an eye */\nconst imageLoader = new TreeImageLoader();\nconst nodeWithEyeCheckboxRenderer = (props: TreeNodeRendererProps) => (\n <TreeNodeRenderer {...props} checkboxRenderer={eyeCheckboxRenderer} imageLoader={imageLoader} />\n);\n\n/** Custom tree renderer. It uses default `TreeRenderer` but overrides default node renderer to render node with custom checkbox */\nconst nodeWithEyeCheckboxTreeRenderer = (props: TreeRendererProps) => <TreeRenderer {...props} nodeRenderer={nodeWithEyeCheckboxRenderer} />;\n\nfunction useTreeFiltering(dataProvider: ITreeDataProvider, filter: string) {\n const nodeLoader = useFilteredProvider(dataProvider, filter);\n const nodeHighlightingProps = useNodeHighlightingProps(filter);\n return {\n nodeLoader,\n modelSource: nodeLoader.modelSource,\n nodeHighlightingProps,\n };\n}\n\nfunction useFilteredProvider(dataProvider: ITreeDataProvider, filter: string) {\n const filteredProvider = React.useMemo(() => {\n return new FilteredTreeDataProvider(dataProvider, filter);\n }, [dataProvider, filter]);\n\n const nodeLoader = React.useMemo(() => {\n return new TreeNodeLoader(filteredProvider, new TreeModelSource());\n }, [filteredProvider]);\n\n return nodeLoader;\n}\n\nfunction useNodeHighlightingProps(filter: string) {\n const [nodeHighlightingProps, setNodeHighlightingProps] = React.useState<HighlightableTreeProps>();\n\n React.useEffect(() => {\n if (filter === \"\") {\n setNodeHighlightingProps(undefined);\n return;\n }\n setNodeHighlightingProps({\n searchText: filter,\n activeMatch: undefined,\n });\n }, [filter]);\n\n return nodeHighlightingProps;\n}\n\nclass FullTreeHierarchy {\n private _dataProvider: ITreeDataProvider;\n private _hierarchy = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider) {\n this._dataProvider = dataProvider;\n\n this._init = (async () => {\n await this.initNode();\n })();\n }\n\n private async initNode(parent?: TreeNodeItem) {\n const nodes = await this._dataProvider.getNodes(parent);\n this._hierarchy.set(parent?.id, nodes);\n for (const node of nodes) {\n await this.initNode(node);\n }\n }\n\n public async getHierarchy() {\n await this._init;\n return this._hierarchy;\n }\n}\n\nclass FilteredTreeHierarchy {\n private _fullHierarchy: FullTreeHierarchy;\n private _filter: string;\n private _filtered = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider, filter: string) {\n this._fullHierarchy = new FullTreeHierarchy(dataProvider);\n this._filter = filter;\n\n this._init = (async () => {\n await this.init();\n })();\n }\n\n private async init() {\n const hierarchy = await this._fullHierarchy.getHierarchy();\n if (this._filter === \"\") {\n this._filtered = hierarchy;\n return;\n }\n this.filterNodes(hierarchy);\n }\n\n /** Initializes `this._filtered` field. Returns a node if it matches a filter. */\n private filterNodes(hierarchy: Map<string | undefined, DelayLoadedTreeNodeItem[]>, current?: DelayLoadedTreeNodeItem): DelayLoadedTreeNodeItem | undefined {\n const matches = current ? this.matchesFilter(current) : false;\n const children = hierarchy.get(current?.id);\n if (!children) {\n return matches ? current : undefined;\n }\n\n const matchedChildren = new Array<DelayLoadedTreeNodeItem>();\n for (const child of children) {\n const matchedChild = this.filterNodes(hierarchy, child);\n matchedChild && matchedChildren.push(matchedChild);\n }\n\n const hasChildren = matchedChildren.length > 0;\n const included = matches || hasChildren;\n let filtered: DelayLoadedTreeNodeItem | undefined;\n if (included) {\n this._filtered.set(current?.id, matchedChildren);\n\n // Return a modified copy of current node (to persist initial hierarchy when filter is cleared).\n if (current) {\n filtered = {\n ...current,\n hasChildren,\n autoExpand: hasChildren ? true : current.autoExpand,\n };\n }\n }\n return filtered;\n }\n\n private matchesFilter(node: TreeNodeItem) {\n if (node.label.value.valueFormat !== PropertyValueFormat.Primitive) {\n return false;\n }\n\n const value = node.label.value.displayValue?.toLowerCase();\n if (!value) {\n return false;\n }\n return value.includes(this._filter.toLowerCase());\n }\n\n public async getHierarchy() {\n await this._init;\n return this._filtered;\n }\n}\n\nclass FilteredTreeDataProvider implements ITreeDataProvider {\n private _hierarchy: FilteredTreeHierarchy;\n\n public constructor(parentDataProvider: ITreeDataProvider, filter: string) {\n this._hierarchy = new FilteredTreeHierarchy(parentDataProvider, filter);\n }\n\n public async getNodes(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes || [];\n }\n\n public async getNodesCount(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes?.length || 0;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SubLayersTree.js","sourceRoot":"","sources":["../../../../src/ui/widget/SubLayersTree.tsx"],"names":[],"mappings":"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","sourcesContent":["\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\nimport \"./SubLayersTree.scss\";\nimport * as React from \"react\";\nimport {\n CheckBoxState,\n ControlledTree,\n SelectionMode,\n TreeEventHandler,\n TreeImageLoader,\n TreeModelSource,\n TreeNodeLoader,\n TreeNodeRenderer,\n TreeRenderer,\n useTreeModel,\n} from \"@itwin/components-react\";\nimport { SvgCheckboxDeselect, SvgCheckboxSelect, SvgVisibilityHide, SvgVisibilityShow } from \"@itwin/itwinui-icons-react\";\nimport { Checkbox, IconButton, Input } from \"@itwin/itwinui-react\";\nimport { MapLayersUI } from \"../../mapLayers\";\nimport { SubLayersDataProvider } from \"./SubLayersDataProvider\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\n\nimport type {\n AbstractTreeNodeLoaderWithProvider,\n DelayLoadedTreeNodeItem,\n HighlightableTreeProps,\n ITreeDataProvider,\n MutableTreeModel,\n MutableTreeModelNode,\n TreeCheckboxStateChangeEventArgs,\n TreeDataProvider,\n TreeModel,\n TreeModelChanges,\n TreeNodeItem,\n TreeNodeRendererProps,\n TreeRendererProps,\n} from \"@itwin/components-react\";\nimport type { MapSubLayerProps, SubLayerId } from \"@itwin/core-common\";\nimport type { SubLayersTreeExpandMode } from \"./SubLayersDataProvider\";\n\ntype CheckboxProps = React.ComponentPropsWithoutRef<typeof Checkbox>;\ntype CheckboxRendererProps = Omit<CheckboxProps, \"onChange\" | \"onClick\"> & {\n onChange: (checked: boolean) => void;\n onClick: (e: React.MouseEvent) => void;\n};\n\ninterface ToolbarProps {\n searchField?: React.ReactNode;\n children?: React.ReactNode[];\n}\n\nfunction Toolbar(props: ToolbarProps) {\n return (\n <div className=\"map-manager-sublayer-tree-toolbar\">\n <div className=\"tree-toolbar-action-buttons\">{props.children}</div>\n {props.searchField && <div className=\"tree-toolbar-searchbox\">{props.searchField}</div>}\n </div>\n );\n}\n\nexport type OnSubLayerStateChangeType = (subLayerId: SubLayerId, isSelected: boolean) => void;\nexport interface SubLayersPanelProps extends Omit<SubLayersTreeProps, \"subLayers\"> {\n subLayers?: MapSubLayerProps[];\n}\n\nexport function SubLayersPanel(props: SubLayersPanelProps) {\n const [noneAvailableLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoSubLayers\"));\n if (undefined === props.subLayers || 0 === props.subLayers.length) {\n return (\n <div className=\"map-manager-sublayer-panel\">\n <div>{noneAvailableLabel}</div>\n </div>\n );\n } else {\n return <SubLayersTree subLayers={props.subLayers} {...props} />;\n }\n}\n\nexport interface SubLayersTreeProps {\n checkboxStyle: \"standard\" | \"eye\";\n expandMode: SubLayersTreeExpandMode;\n subLayers: MapSubLayerProps[];\n singleVisibleSubLayer?: boolean;\n onSubLayerStateChange?: OnSubLayerStateChangeType;\n height?: number;\n width?: number;\n}\n\n/**\n * Tree Control that displays sub-layer hierarchy\n * @internal\n */\nexport function SubLayersTree(props: SubLayersTreeProps) {\n const [width, setWidth] = React.useState<number | undefined>(props.width);\n const [height, setHeight] = React.useState<number | undefined>(props.height);\n\n const [placeholderLabel] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.SearchPlaceholder\"));\n const [noResults] = React.useState(MapLayersUI.localization.getLocalizedString(\"mapLayers:SubLayers.NoResults\"));\n const [subLayers, setSubLayers] = React.useState(props.subLayers);\n const [layerFilterString, setLayerFilterString] = React.useState<string>(\"\");\n\n // create data provider to get some nodes to show in tree\n // `React.useMemo' is used avoid creating new object on each render cycle\n // We DO want a dependency on 'layerFilterString' (event though eslint doesn't like it)..\n // each time the filter is updated the provider must be refreshed otherwise the state of model is out of synch.\n const dataProvider = React.useMemo(\n () => new SubLayersDataProvider(subLayers, props.expandMode),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [subLayers, props.expandMode, layerFilterString],\n );\n\n const { modelSource, nodeLoader, nodeHighlightingProps } = useTreeFiltering(dataProvider, layerFilterString);\n\n // create custom event handler. It handles all tree event same as `TreeEventHandler` but additionally\n // it selects/deselects node when checkbox is checked/unchecked and vice versa.\n const [eventHandler, setEventHandler] = React.useState<SubLayerCheckboxHandler | undefined>(undefined);\n\n const [elementRef] = useResizeObserver<HTMLDivElement>((size) => {\n setWidth(size.width);\n setHeight(size.height);\n });\n\n React.useEffect(() => {\n const handler = new SubLayerCheckboxHandler(subLayers, props.singleVisibleSubLayer ?? false, nodeLoader, props.onSubLayerStateChange);\n setEventHandler(handler);\n return () => {\n handler[Symbol.dispose]();\n };\n }, [nodeLoader, subLayers, props.onSubLayerStateChange, props.singleVisibleSubLayer]);\n\n // Get an immutable tree model from the model source. The model is regenerated every time the model source\n // emits the `onModelChanged` event.\n const treeModel = useTreeModel(modelSource);\n const changeAll = React.useCallback(\n async (visible: boolean) => {\n const tmpSubLayers = [...subLayers]; // deep copy to trigger state change\n if (tmpSubLayers) {\n tmpSubLayers?.forEach((subLayer: MapSubLayerProps) => {\n subLayer.visible = visible;\n });\n\n setSubLayers(tmpSubLayers);\n }\n\n if (props.onSubLayerStateChange) {\n props.onSubLayerStateChange(-1, visible);\n }\n },\n [subLayers, props],\n );\n\n const handleFilterTextChanged = React.useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setLayerFilterString(event.target.value);\n }, []);\n\n return (\n <>\n <div className=\"map-manager-sublayer-tree\">\n <Toolbar\n searchField={\n <Input\n type=\"text\"\n className=\"map-manager-sublayer-tree-searchbox\"\n placeholder={placeholderLabel}\n value={layerFilterString}\n onChange={handleFilterTextChanged}\n size=\"small\"\n />\n }\n >\n {props.singleVisibleSubLayer\n ? undefined\n : [\n <IconButton\n key=\"show-all-btn\"\n size=\"small\"\n label={props.checkboxStyle === \"eye\" ? MapLayersUI.translate(\"SubLayers.AllOn\") : MapLayersUI.translate(\"SelectFeaturesDialog.AllOn\")}\n onClick={async () => changeAll(true)}\n >\n {props.checkboxStyle === \"eye\" ? <SvgVisibilityShow /> : <SvgCheckboxSelect />}\n </IconButton>,\n <IconButton\n style={{ marginLeft: \"5px\" }}\n key=\"hide-all-btn\"\n size=\"small\"\n label={props.checkboxStyle === \"eye\" ? MapLayersUI.translate(\"SubLayers.AllOff\") : MapLayersUI.translate(\"SelectFeaturesDialog.AllOff\")}\n onClick={async () => changeAll(false)}\n >\n {props.checkboxStyle === \"eye\" ? <SvgVisibilityHide /> : <SvgCheckboxDeselect />}\n </IconButton>,\n ]}\n </Toolbar>\n <div className=\"map-manager-sublayer-tree-content\" ref={elementRef}>\n {width !== undefined && height !== undefined && (\n <ControlledTree\n nodeLoader={nodeLoader}\n selectionMode={SelectionMode.None}\n eventsHandler={eventHandler!}\n model={treeModel}\n treeRenderer={props.checkboxStyle === \"eye\" ? nodeWithEyeCheckboxTreeRenderer : undefined}\n nodeHighlightingProps={nodeHighlightingProps}\n width={width}\n height={height}\n noDataRenderer={() => <p className=\"components-controlledTree-errorMessage\">{noResults}</p>}\n />\n )}\n </div>\n </div>\n </>\n );\n}\n\n/** TreeEventHandler derived class that handler processing changes to subLayer visibility */\nclass SubLayerCheckboxHandler extends TreeEventHandler {\n private _removeModelChangedListener: () => void;\n private _onSubLayerStateChange?: OnSubLayerStateChangeType;\n private _subLayers: MapSubLayerProps[];\n private _singleVisibleSubLayer?: boolean;\n\n constructor(\n subLayers: MapSubLayerProps[],\n singleVisibleSubLayer: boolean,\n nodeLoader: AbstractTreeNodeLoaderWithProvider<TreeDataProvider>,\n onSubLayerStateChange?: OnSubLayerStateChangeType,\n ) {\n super({ modelSource: nodeLoader.modelSource, nodeLoader, collapsedChildrenDisposalEnabled: true });\n this._subLayers = subLayers;\n this._singleVisibleSubLayer = singleVisibleSubLayer;\n this._onSubLayerStateChange = onSubLayerStateChange;\n this._removeModelChangedListener = this.modelSource.onModelChanged.addListener(this.onModelChanged);\n }\n\n public override dispose() {\n this._removeModelChangedListener();\n super[Symbol.dispose]();\n }\n\n // Cascade state\n // Children on unnamed groups must get disabled in the tree view, because\n // they get rendered anyway.\n private cascadeStateToAllChildren(model: MutableTreeModel, parentId?: string) {\n const children = model.getChildren(parentId);\n if (children === undefined) {\n return;\n }\n\n for (const childID of children) {\n const childNode = childID ? model.getNode(childID) : undefined;\n\n if (childNode) {\n this.syncNodeStateWithParent(model, childNode);\n }\n\n // Drill down the tree.\n this.cascadeStateToAllChildren(model, childID);\n }\n }\n\n private applyMutualExclusiveState(model: MutableTreeModel, nodeId: string) {\n const changedNode = model.getNode(nodeId);\n if (changedNode?.checkbox.state === CheckBoxState.Off) {\n return;\n }\n\n for (const node of model.iterateTreeModelNodes()) {\n if (node.id === changedNode?.id) {\n continue;\n }\n\n if (node && node.checkbox.state === CheckBoxState.On) {\n node.checkbox.state = CheckBoxState.Off;\n }\n }\n }\n\n //-----------------------------------------------------------------------\n // Listen to model changes\n //------------------------------------------------------------------------\n // This is required because nodes are delay loaded in the model until\n // they are made visible (i.e. parent node is expanded). So even though\n // you might have created nodes in the data provided with a proper\n // initial state, by the time it gets loaded, their state might have became\n // out of date in the TreeView's active model. So whenever a node\n // is added, when must confirm its state matches the current model\n // (i.e. state of their parent.)\n public onModelChanged = (args: [TreeModel, TreeModelChanges]) => {\n this.modelSource.modifyModel((model) => {\n const addedNodes = args[1].addedNodeIds.map((id) => model.getNode(id));\n addedNodes.forEach((node) => {\n if (!node) {\n return;\n }\n\n this.syncNodeStateWithParent(model, node);\n });\n });\n };\n\n private static isUnnamedGroup(subLayer: MapSubLayerProps | undefined): boolean {\n if (!subLayer) {\n return false;\n }\n\n return (!subLayer.name || subLayer.name.length === 0) && subLayer.children !== undefined && subLayer.children.length > 0;\n }\n\n // Ensure the state of changed node matches the state of its parent.\n private syncNodeStateWithParent(model: MutableTreeModel, changedNode: MutableTreeModelNode) {\n // Lookup node parent. If non exists, I assume thats the root node,\n // and it must have a proper initial state.\n const parentNode = changedNode.parentId ? model.getNode(changedNode.parentId) : undefined;\n if (!parentNode) {\n return;\n }\n\n if (!changedNode.checkbox) {\n return;\n } // don't see why this would happen, but if there is no checkbox, we cant do much here.\n\n const parentLayerId = undefined !== parentNode.item.extendedData?.subLayerId ? parentNode.item.extendedData?.subLayerId : parentNode.item.id;\n const parentSubLayer = this._subLayers?.find((subLayer) => subLayer.id === parentLayerId);\n\n // If parent is disabled, then children must be too.\n // Also, Non-visible unnamed group must have their children disabled (unamed groups have visibility inherence)\n if (parentNode.checkbox.isDisabled || (SubLayerCheckboxHandler.isUnnamedGroup(parentSubLayer) && parentNode.checkbox.state === CheckBoxState.Off)) {\n changedNode.checkbox.isDisabled = true;\n changedNode.checkbox.state = CheckBoxState.Off;\n } else {\n // Visibility state from StyleMapLayerSettings applies\n const subLayerId = undefined !== changedNode.item.extendedData?.subLayerId ? changedNode.item.extendedData?.subLayerId : changedNode.item.id;\n const foundSubLayer = this._subLayers?.find((subLayer) => subLayer.id === subLayerId);\n changedNode.checkbox.isDisabled = false;\n changedNode.checkbox.state = foundSubLayer?.visible ? CheckBoxState.On : CheckBoxState.Off;\n }\n }\n\n /** Changes nodes checkboxes states until event is handled or handler is disposed */\n public override onCheckboxStateChanged({ stateChanges }: TreeCheckboxStateChangeEventArgs) {\n // call base checkbox handling\n const baseHandling = super.onCheckboxStateChanged({ stateChanges });\n\n // subscribe to checkbox state changes to new checkbox states and do some additional work with them\n const selectionHandling = stateChanges.subscribe({\n next: (changes) => {\n changes.forEach((change) => {\n const isSelected = change.newState === CheckBoxState.On;\n const subLayerId = undefined !== change.nodeItem.extendedData?.subLayerId ? change.nodeItem.extendedData?.subLayerId : change.nodeItem.id;\n\n // Get the previously visible node if we are in 'singleVisibleSubLayer' node\n let prevVisibleSubLayers: SubLayerId[] = [];\n if (this._singleVisibleSubLayer) {\n prevVisibleSubLayers = this._subLayers.reduce((filtered: SubLayerId[], subLayer) => {\n if (subLayer.visible && subLayer.id !== undefined) {\n filtered.push(subLayer.id);\n }\n return filtered;\n }, []);\n }\n\n // Inform caller that subLayer state is going to change (i.e. update display style state)\n if (this._onSubLayerStateChange) {\n for (const slId of prevVisibleSubLayers) {\n this._onSubLayerStateChange(slId, false);\n }\n\n this._onSubLayerStateChange(subLayerId, isSelected);\n }\n\n // Update sublayer object, otherwise state would get out of sync with DisplayStyle each time the TreeView is re-rendered\n this._subLayers?.forEach((curSubLayer) => {\n if (curSubLayer.id !== undefined) {\n if (curSubLayer.id === subLayerId) {\n curSubLayer.visible = isSelected;\n } else if (prevVisibleSubLayers.includes(curSubLayer.id)) {\n curSubLayer.visible = false;\n }\n }\n });\n\n // Cascade state\n this.modelSource.modifyModel((model) => {\n if (this._singleVisibleSubLayer) {\n this.applyMutualExclusiveState(model, change.nodeItem.id);\n }\n this.cascadeStateToAllChildren(model, change.nodeItem.id);\n });\n });\n },\n });\n // stop handling selection when checkboxes handling is stopped\n baseHandling?.add(selectionHandling);\n return baseHandling;\n }\n}\n\n/** Custom checkbox renderer that renders checkbox as an eye */\nconst eyeCheckboxRenderer = (props: CheckboxRendererProps) => (\n <Checkbox\n className=\"core-image-checkbox\"\n variant=\"eyeball\"\n checked={props.checked}\n disabled={props.disabled}\n onChange={(e) => {\n props.onChange(e.target.checked);\n }}\n />\n);\n\n/** Custom node renderer. It uses default 'TreeNodeRenderer' but overrides default checkbox renderer to render checkbox as an eye */\nconst imageLoader = new TreeImageLoader();\nconst nodeWithEyeCheckboxRenderer = (props: TreeNodeRendererProps) => (\n <TreeNodeRenderer {...props} checkboxRenderer={eyeCheckboxRenderer} imageLoader={imageLoader} />\n);\n\n/** Custom tree renderer. It uses default `TreeRenderer` but overrides default node renderer to render node with custom checkbox */\nconst nodeWithEyeCheckboxTreeRenderer = (props: TreeRendererProps) => <TreeRenderer {...props} nodeRenderer={nodeWithEyeCheckboxRenderer} />;\n\nfunction useTreeFiltering(dataProvider: ITreeDataProvider, filter: string) {\n const nodeLoader = useFilteredProvider(dataProvider, filter);\n const nodeHighlightingProps = useNodeHighlightingProps(filter);\n return {\n nodeLoader,\n modelSource: nodeLoader.modelSource,\n nodeHighlightingProps,\n };\n}\n\nfunction useFilteredProvider(dataProvider: ITreeDataProvider, filter: string) {\n const filteredProvider = React.useMemo(() => {\n return new FilteredTreeDataProvider(dataProvider, filter);\n }, [dataProvider, filter]);\n\n const nodeLoader = React.useMemo(() => {\n return new TreeNodeLoader(filteredProvider, new TreeModelSource());\n }, [filteredProvider]);\n\n return nodeLoader;\n}\n\nfunction useNodeHighlightingProps(filter: string) {\n const [nodeHighlightingProps, setNodeHighlightingProps] = React.useState<HighlightableTreeProps>();\n\n React.useEffect(() => {\n if (filter === \"\") {\n setNodeHighlightingProps(undefined);\n return;\n }\n setNodeHighlightingProps({\n searchText: filter,\n activeMatch: undefined,\n });\n }, [filter]);\n\n return nodeHighlightingProps;\n}\n\nclass FullTreeHierarchy {\n private _dataProvider: ITreeDataProvider;\n private _hierarchy = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider) {\n this._dataProvider = dataProvider;\n\n this._init = (async () => {\n await this.initNode();\n })();\n }\n\n private async initNode(parent?: TreeNodeItem) {\n const nodes = await this._dataProvider.getNodes(parent);\n this._hierarchy.set(parent?.id, nodes);\n for (const node of nodes) {\n await this.initNode(node);\n }\n }\n\n public async getHierarchy() {\n await this._init;\n return this._hierarchy;\n }\n}\n\nclass FilteredTreeHierarchy {\n private _fullHierarchy: FullTreeHierarchy;\n private _filter: string;\n private _filtered = new Map<string | undefined, DelayLoadedTreeNodeItem[]>();\n private _init: Promise<void>;\n\n public constructor(dataProvider: ITreeDataProvider, filter: string) {\n this._fullHierarchy = new FullTreeHierarchy(dataProvider);\n this._filter = filter;\n\n this._init = (async () => {\n await this.init();\n })();\n }\n\n private async init() {\n const hierarchy = await this._fullHierarchy.getHierarchy();\n if (this._filter === \"\") {\n this._filtered = hierarchy;\n return;\n }\n this.filterNodes(hierarchy);\n }\n\n /** Initializes `this._filtered` field. Returns a node if it matches a filter. */\n private filterNodes(hierarchy: Map<string | undefined, DelayLoadedTreeNodeItem[]>, current?: DelayLoadedTreeNodeItem): DelayLoadedTreeNodeItem | undefined {\n const matches = current ? this.matchesFilter(current) : false;\n const children = hierarchy.get(current?.id);\n if (!children) {\n return matches ? current : undefined;\n }\n\n const matchedChildren = new Array<DelayLoadedTreeNodeItem>();\n for (const child of children) {\n const matchedChild = this.filterNodes(hierarchy, child);\n matchedChild && matchedChildren.push(matchedChild);\n }\n\n const hasChildren = matchedChildren.length > 0;\n const included = matches || hasChildren;\n let filtered: DelayLoadedTreeNodeItem | undefined;\n if (included) {\n this._filtered.set(current?.id, matchedChildren);\n\n // Return a modified copy of current node (to persist initial hierarchy when filter is cleared).\n if (current) {\n filtered = {\n ...current,\n hasChildren,\n autoExpand: hasChildren ? true : current.autoExpand,\n };\n }\n }\n return filtered;\n }\n\n private matchesFilter(node: TreeNodeItem) {\n if (node.label.value.valueFormat !== PropertyValueFormat.Primitive) {\n return false;\n }\n\n const value = node.label.value.displayValue?.toLowerCase();\n if (!value) {\n return false;\n }\n return value.includes(this._filter.toLowerCase());\n }\n\n public async getHierarchy() {\n await this._init;\n return this._filtered;\n }\n}\n\nclass FilteredTreeDataProvider implements ITreeDataProvider {\n private _hierarchy: FilteredTreeHierarchy;\n\n public constructor(parentDataProvider: ITreeDataProvider, filter: string) {\n this._hierarchy = new FilteredTreeHierarchy(parentDataProvider, filter);\n }\n\n public async getNodes(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes || [];\n }\n\n public async getNodesCount(parent?: TreeNodeItem) {\n const hierarchy = await this._hierarchy.getHierarchy();\n const nodes = hierarchy.get(parent?.id);\n return nodes?.length || 0;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/map-layers",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.1",
|
|
4
4
|
"description": "Extension that adds a Map Layers Widget",
|
|
5
5
|
"main": "lib/cjs/map-layers.js",
|
|
6
6
|
"module": "lib/esm/map-layers.js",
|
|
@@ -42,25 +42,24 @@
|
|
|
42
42
|
"react-beautiful-dnd": "^13.1.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@itwin/appui-abstract": "
|
|
46
|
-
"@itwin/appui-react": "^5.
|
|
47
|
-
"@itwin/build-tools": "
|
|
48
|
-
"@itwin/components-react": "^5.
|
|
49
|
-
"@itwin/core-bentley": "
|
|
50
|
-
"@itwin/core-common": "
|
|
51
|
-
"@itwin/core-frontend": "
|
|
52
|
-
"@itwin/core-geometry": "
|
|
53
|
-
"@itwin/core-orbitgt": "
|
|
54
|
-
"@itwin/core-quantity": "
|
|
55
|
-
"@itwin/core-react": "^5.
|
|
56
|
-
"@itwin/
|
|
57
|
-
"@itwin/ecschema-
|
|
58
|
-
"@itwin/
|
|
59
|
-
"@itwin/
|
|
60
|
-
"@itwin/imodel-components-react": "^5.4.0",
|
|
45
|
+
"@itwin/appui-abstract": "^5.0.0",
|
|
46
|
+
"@itwin/appui-react": "^5.5.0",
|
|
47
|
+
"@itwin/build-tools": "^5.0.0",
|
|
48
|
+
"@itwin/components-react": "^5.5.0",
|
|
49
|
+
"@itwin/core-bentley": "^5.0.0",
|
|
50
|
+
"@itwin/core-common": "^5.0.0",
|
|
51
|
+
"@itwin/core-frontend": "^5.0.0",
|
|
52
|
+
"@itwin/core-geometry": "^5.0.0",
|
|
53
|
+
"@itwin/core-orbitgt": "^5.0.0",
|
|
54
|
+
"@itwin/core-quantity": "^5.0.0",
|
|
55
|
+
"@itwin/core-react": "^5.5.0",
|
|
56
|
+
"@itwin/ecschema-metadata": "^5.0.0",
|
|
57
|
+
"@itwin/ecschema-rpcinterface-common": "^5.0.0",
|
|
58
|
+
"@itwin/eslint-plugin": "^5.2.1",
|
|
59
|
+
"@itwin/imodel-components-react": "^5.5.0",
|
|
61
60
|
"@itwin/itwinui-react": "^3.18.1",
|
|
62
|
-
"@itwin/map-layers-formats": "
|
|
63
|
-
"@itwin/webgl-compatibility": "
|
|
61
|
+
"@itwin/map-layers-formats": "^5.0.0",
|
|
62
|
+
"@itwin/webgl-compatibility": "^5.0.0",
|
|
64
63
|
"@testing-library/dom": "^10.4.0",
|
|
65
64
|
"@testing-library/react": "^16.3.0",
|
|
66
65
|
"@testing-library/react-hooks": "^8.0.1",
|
|
@@ -95,16 +94,16 @@
|
|
|
95
94
|
"vitest": "^2.1.9"
|
|
96
95
|
},
|
|
97
96
|
"peerDependencies": {
|
|
98
|
-
"@itwin/appui-abstract": "5.0.0
|
|
99
|
-
"@itwin/appui-react": "^
|
|
100
|
-
"@itwin/components-react": "^
|
|
101
|
-
"@itwin/core-bentley": "5.0.0
|
|
102
|
-
"@itwin/core-common": "5.0.0
|
|
103
|
-
"@itwin/core-frontend": "5.0.0
|
|
104
|
-
"@itwin/core-react": "^
|
|
105
|
-
"@itwin/imodel-components-react": "^
|
|
97
|
+
"@itwin/appui-abstract": "^5.0.0",
|
|
98
|
+
"@itwin/appui-react": "^5.5.0",
|
|
99
|
+
"@itwin/components-react": "^5.5.0",
|
|
100
|
+
"@itwin/core-bentley": "^5.0.0",
|
|
101
|
+
"@itwin/core-common": "^5.0.0",
|
|
102
|
+
"@itwin/core-frontend": "^5.0.0",
|
|
103
|
+
"@itwin/core-react": "^5.5.0",
|
|
104
|
+
"@itwin/imodel-components-react": "^5.5.0",
|
|
106
105
|
"@itwin/itwinui-react": "^3.16.5",
|
|
107
|
-
"@itwin/map-layers-formats": "5.0.0
|
|
106
|
+
"@itwin/map-layers-formats": "^5.0.0",
|
|
108
107
|
"react": "^17.0.0 || ^18.0.0",
|
|
109
108
|
"react-dom": "^17.0.0 || ^18.0.0"
|
|
110
109
|
}
|