@open-pioneer/toc 1.4.0 → 1.5.0-dev.20260910103330

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 CHANGED
@@ -1,5 +1,16 @@
1
1
  # @open-pioneer/toc
2
2
 
3
+ ## 1.5.0-dev.20260910103330
4
+
5
+ ### Minor Changes
6
+
7
+ - f790fda: Update to Chakra 3.37.0
8
+
9
+ ### Patch Changes
10
+
11
+ - 3203815: Update code to match new react linting rules from oxlint.
12
+ - 09ec7c7: Updated dependencies
13
+
3
14
  ## 1.4.0
4
15
 
5
16
  ### Minor Changes
@@ -52,39 +63,39 @@
52
63
 
53
64
  - 2702df4: Layers that are marked as `internal` are not considered by the Toc.
54
65
 
55
- ```typescript
56
- //internal layer will not be displayed in the Toc
57
- const internalLayer = new SimpleLayer({
58
- id: "layer1",
59
- title: "layer 1",
60
- olLayer: myOlLayer,
61
- internal: true
62
- });
63
- ```
64
-
65
- The layer's `internal` state also affects other UI widgets (e.g. Legend). If the layer should be hidden specifically in the toc (but not in other widgets) the `listMode` attribute can be used to hide the layer item.
66
-
67
- ```typescript
68
- //use listMode to hide the layer specifically in Toc
69
- const hiddenLayer = new SimpleLayer({
70
- id: "layer1",
71
- title: "layer 1",
72
- olLayer: myOlLayer,
73
- attributes: {
74
- toc: {
75
- listMode: "hide"
76
- }
77
- }
78
- });
79
- ```
80
-
81
- Valid values for `listMode` are:
82
-
83
- - `"show"` layer item is displayed in Toc
84
- - `"hide"` layer item is not rendered in Toc
85
- - `"hide-children"` layer item for the layer itself is displayed in Toc but no layer items for child layers (e.g. sublayers of a group) are rendered
86
-
87
- The `listMode` does always have precedence over the layer's `internal` property. For example, if the `listMode` is `"show"` the layer item is displayed even if `internal` is `true`.
66
+ ```typescript
67
+ //internal layer will not be displayed in the Toc
68
+ const internalLayer = new SimpleLayer({
69
+ id: "layer1",
70
+ title: "layer 1",
71
+ olLayer: myOlLayer,
72
+ internal: true,
73
+ });
74
+ ```
75
+
76
+ The layer's `internal` state also affects other UI widgets (e.g. Legend). If the layer should be hidden specifically in the toc (but not in other widgets) the `listMode` attribute can be used to hide the layer item.
77
+
78
+ ```typescript
79
+ //use listMode to hide the layer specifically in Toc
80
+ const hiddenLayer = new SimpleLayer({
81
+ id: "layer1",
82
+ title: "layer 1",
83
+ olLayer: myOlLayer,
84
+ attributes: {
85
+ toc: {
86
+ listMode: "hide",
87
+ },
88
+ },
89
+ });
90
+ ```
91
+
92
+ Valid values for `listMode` are:
93
+
94
+ - `"show"` layer item is displayed in Toc
95
+ - `"hide"` layer item is not rendered in Toc
96
+ - `"hide-children"` layer item for the layer itself is displayed in Toc but no layer items for child layers (e.g. sublayers of a group) are rendered
97
+
98
+ The `listMode` does always have precedence over the layer's `internal` property. For example, if the `listMode` is `"show"` the layer item is displayed even if `internal` is `true`.
88
99
 
89
100
  - cb5368f: Introduce Toc API for programmatic control of toc items, see [PR](https://github.com/open-pioneer/trails-openlayers-base-packages/pull/420).
90
101
  - 2732052: Icons have been changed to unify the appearance of the components. Preferably, Lucide react-icons are used.
@@ -109,16 +120,16 @@
109
120
 
110
121
  - 9376a74: Ensure that icons and other decorative elements are hidden from the screen reader using the `aria-hidden="true"` attribute.
111
122
 
112
- The easiest way to do that is to wrap icons into chakra's `<Icon />` component, for example:
123
+ The easiest way to do that is to wrap icons into chakra's `<Icon />` component, for example:
113
124
 
114
- ```tsx
115
- import { Icon } from "@chakra-ui/react";
116
- import { FiX } from "react-icons/fi";
125
+ ```tsx
126
+ import { Icon } from "@chakra-ui/react";
127
+ import { FiX } from "react-icons/fi";
117
128
 
118
- <Icon>
119
- <FiX />
120
- </Icon>;
121
- ```
129
+ <Icon>
130
+ <FiX />
131
+ </Icon>;
132
+ ```
122
133
 
123
134
  - e00186b: Add a tooltip around the menu trigger buttons (map tools and layer tools).
124
135
 
@@ -129,17 +140,17 @@
129
140
  - 193068a: Deprecate the `mapId` property on React components.
130
141
  Use the `MapModel` directly instead to pass a reference to the map.
131
142
 
132
- Example:
143
+ Example:
133
144
 
134
- ```tsx
135
- // Default map for entire component tree
136
- <DefaultMapProvider map={mapModel}>
137
- <Toc />
138
- </DefaultMapProvider>
145
+ ```tsx
146
+ // Default map for entire component tree
147
+ <DefaultMapProvider map={mapModel}>
148
+ <Toc />
149
+ </DefaultMapProvider>
139
150
 
140
- // Map for specific component
141
- <Toc map={mapModel} />
142
- ```
151
+ // Map for specific component
152
+ <Toc map={mapModel} />
153
+ ```
143
154
 
144
155
  ### Patch Changes
145
156
 
@@ -157,20 +168,20 @@
157
168
  If the property `initiallyCollapsed` is `true` all groups are collapsed by default when the TOC is rendered.
158
169
  This is helpful if the app has a large layer tree.
159
170
 
160
- Additionally, a menu item to collapse all groups can be added to the tools section by setting `toolsConfig.showCollapseAllGroups` to `true` (default is `true`).
161
- This is only applicable if `collapsibleGroups` and `showTools` are both `true`.
171
+ Additionally, a menu item to collapse all groups can be added to the tools section by setting `toolsConfig.showCollapseAllGroups` to `true` (default is `true`).
172
+ This is only applicable if `collapsibleGroups` and `showTools` are both `true`.
162
173
 
163
- ```jsx
164
- import { Toc } from "@open-pioneer/toc";
174
+ ```jsx
175
+ import { Toc } from "@open-pioneer/toc";
165
176
 
166
- <Toc
167
- mapId={MAP_ID}
168
- showTools={true}
169
- collapsibleGroups={true} //groups are collapsible in TOC
170
- initiallyCollapsed={true} //groups are collapsed initially
171
- toolsConfig={{ showCollapseAllGroups: true }} //show 'collapse all' menu item in Tools
172
- />;
173
- ```
177
+ <Toc
178
+ mapId={MAP_ID}
179
+ showTools={true}
180
+ collapsibleGroups={true} //groups are collapsible in TOC
181
+ initiallyCollapsed={true} //groups are collapsed initially
182
+ toolsConfig={{ showCollapseAllGroups: true }} //show 'collapse all' menu item in Tools
183
+ />;
184
+ ```
174
185
 
175
186
  ## 0.8.0
176
187
 
@@ -178,18 +189,18 @@
178
189
 
179
190
  - 2fa8020: Update trails core package dependencies.
180
191
 
181
- - Also updates Chakra UI to the latest 2.x version and Chakra React Select to version 5.
182
- - Removes any obsolete references to `@chakra-ui/system`.
183
- This dependency seems to be no longer required and may lead to duplicate packages in your dependency tree.
192
+ - Also updates Chakra UI to the latest 2.x version and Chakra React Select to version 5.
193
+ - Removes any obsolete references to `@chakra-ui/system`.
194
+ This dependency seems to be no longer required and may lead to duplicate packages in your dependency tree.
184
195
 
185
196
  - 7ae9f90: When showing a layer via the toc, all parent layers of that layer will also be made visible.
186
197
 
187
- This can be disabled by configuring `autoShowParents={false}` on the `TOC` component.
198
+ This can be disabled by configuring `autoShowParents={false}` on the `TOC` component.
188
199
 
189
- ```jsx
190
- // Default: true
191
- <Toc autoShowParents={false} />
192
- ```
200
+ ```jsx
201
+ // Default: true
202
+ <Toc autoShowParents={false} />
203
+ ```
193
204
 
194
205
  ### Patch Changes
195
206
 
@@ -210,7 +221,7 @@
210
221
  - 583f1d6: The `mapId` or `map` properties are now optional on individual components.
211
222
  You can use the `DefaultMapProvider` to configure an implicit default value.
212
223
 
213
- Note that configuring _neither_ a default _nor_ an explicit `map` or `mapId` will trigger a runtime error.
224
+ Note that configuring _neither_ a default _nor_ an explicit `map` or `mapId` will trigger a runtime error.
214
225
 
215
226
  - 583f1d6: All UI components in this project now accept the `mapId` (a `string`) _or_ the `map` (a `MapModel`) directly.
216
227
  - a8b3449: Switch to a new versioning strategy.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@open-pioneer/toc",
4
- "version": "1.4.0",
4
+ "version": "1.5.0-dev.20260910103330",
5
5
  "description": "This package provides a UI component that displays the map content to the user and allows them to control it.",
6
6
  "keywords": [
7
7
  "open-pioneer-trails"
@@ -14,18 +14,22 @@
14
14
  "directory": "src/packages/toc"
15
15
  },
16
16
  "dependencies": {
17
- "@chakra-ui/react": "^3.36.1",
18
- "@conterra/reactivity-core": "^0.8.6",
19
- "@open-pioneer/chakra-snippets": "^4.7.0",
20
- "@open-pioneer/core": "^4.7.0",
21
- "@open-pioneer/react-utils": "^4.7.0",
22
- "@open-pioneer/reactivity": "^4.7.0",
23
- "@open-pioneer/runtime": "^4.7.0",
24
- "ol": "^10.9.0",
17
+ "@chakra-ui/react": "^3.37.0",
18
+ "@conterra/reactivity-core": "^0.8.8",
19
+ "@open-pioneer/basemap-switcher": "1.5.0-dev.20260910103330",
20
+ "@open-pioneer/chakra-snippets": "4.8.0-dev.20260910101405",
21
+ "@open-pioneer/core": "4.8.0-dev.20260910101405",
22
+ "@open-pioneer/map": "1.5.0-dev.20260910103330",
23
+ "@open-pioneer/react-utils": "4.8.0-dev.20260910101405",
24
+ "@open-pioneer/reactivity": "4.8.0-dev.20260910101405",
25
+ "@open-pioneer/runtime": "4.8.0-dev.20260910101405",
26
+ "ol": "^10.10.0",
25
27
  "react": "^19.2.8",
26
- "react-icons": "^5.7.0",
27
- "@open-pioneer/basemap-switcher": "1.4.0",
28
- "@open-pioneer/map": "1.4.0"
28
+ "react-icons": "^5.7.0"
29
+ },
30
+ "publishConfig": {
31
+ "directory": "dist",
32
+ "linkDirectory": false
29
33
  },
30
34
  "exports": {
31
35
  "./package.json": "./package.json",
@@ -1 +1 @@
1
- {"version":3,"file":"LayerItem.js","sources":["LayerItem.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Box,\n Checkbox,\n Collapsible,\n CollapsibleContent,\n Flex,\n Icon,\n IconButton,\n List,\n Spacer,\n Text,\n VisuallyHidden,\n} from \"@chakra-ui/react\";\nimport { Tooltip } from \"@open-pioneer/chakra-snippets/tooltip\";\nimport { AnyLayer } from \"@open-pioneer/map\";\nimport { classNames } from \"@open-pioneer/react-utils\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { memo, ReactNode, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { IconType } from \"react-icons/lib\";\nimport { LuChevronDown, LuChevronRight, LuInfo, LuTriangleAlert } from \"react-icons/lu\";\nimport { TocItemImpl, useTocModel } from \"../../model/\";\nimport { displayItemForLayer } from \"../../utils/displayLayer\";\nimport { slug } from \"../../utils/slug\";\nimport { LayerTocAttributes, ListMode } from \"../Toc\";\nimport { useChildLayers, useLoadState, useSublayerError, useVisibleInScale } from \"./hooks\";\nimport { LayerItemMenu } from \"./LayerItemMenu\";\nimport { LayerList } from \"./LayerList\";\n\n/**\n * Renders a single layer as a list item.\n *\n * The item may have further nested list items if there are sublayers present.\n */\nexport const LayerItem = memo(function LayerItem(props: { layer: AnyLayer }): ReactNode {\n const { layer } = props;\n\n const intl = useIntl();\n const display = useReactiveSnapshot(() => displayItemForLayer(layer), [layer]);\n const [tocItem, _tocModel, tocOptions, tocItemElemRef] = useTocItem(layer, display);\n const expanded = useReactiveSnapshot(() => tocItem.isExpanded, [tocItem]);\n const isCollapsible = tocOptions ? tocOptions.collapsibleGroups : false;\n\n const layerGroupId = useId();\n const listMode = useListMode(layer)?.listMode;\n const { title, description, isVisible, allChildrenHidden } = useReactiveSnapshot(() => {\n return {\n title: layer.title,\n description: layer.description,\n isVisible: layer.visible,\n allChildrenHidden: !hasShownChildren(layer), //re-evaluates if a child layer's list mode or internal state changes\n };\n }, [layer]);\n\n const { problemIndicator, problemLabel, disabled, opacity } = useItemProblem(\n layer,\n intl,\n listMode,\n );\n\n const nestedChildren = useNestedChildren(layerGroupId, title, layer, intl);\n //all children hidden => do not render collapse button and child entries\n let hasNestedChildren = !!nestedChildren;\n if (allChildrenHidden || listMode === \"hide-children\") {\n hasNestedChildren = false;\n }\n\n if (!display) {\n return null;\n }\n\n return (\n <Box\n as=\"li\"\n className={classNames(\"toc-layer-item\", getClassNameForLayer(layer))}\n ref={tocItemElemRef}\n >\n <Flex\n className=\"toc-layer-item-content\"\n width=\"100%\"\n flexDirection=\"row\"\n align=\"center\"\n justifyContent=\"space-between\"\n /** Gap to prevent bleeding of the buttons hover style into the layer title */\n gap={2}\n /** Aligned to the size of the (potential) menu button in LayerItemDescriptor */\n minHeight={10}\n >\n {isCollapsible && (\n <CollapseButton\n layerTitle={title}\n layerGroupId={layerGroupId}\n expanded={expanded}\n onClick={() => tocItem.setExpanded(!expanded)}\n hasNestedChildren={hasNestedChildren}\n />\n )}\n\n <Checkbox.Root\n checked={isVisible}\n disabled={disabled}\n onCheckedChange={(event) =>\n updateLayerVisibility(\n layer,\n event.checked === true,\n tocOptions.autoShowParents,\n )\n }\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control>\n <Checkbox.Indicator />\n </Checkbox.Control>\n <Checkbox.Label>\n <Text as=\"span\" opacity={opacity}>\n {title}\n </Text>\n {/* Same content as tooltip */}\n <VisuallyHidden as=\"div\">{problemLabel}</VisuallyHidden>\n </Checkbox.Label>\n </Checkbox.Root>\n {problemIndicator}\n <Spacer />\n <LayerItemMenu layer={layer} title={title} description={description} intl={intl} />\n </Flex>\n {hasNestedChildren && (\n <Collapsible.Root open={expanded} className=\"toc-collapsible-item\">\n <CollapsibleContent>{nestedChildren}</CollapsibleContent>\n </Collapsible.Root>\n )}\n </Box>\n );\n});\n\nfunction CollapseButton(props: {\n layerTitle: string;\n layerGroupId: string;\n expanded: boolean;\n onClick: () => void;\n hasNestedChildren: boolean;\n}) {\n const { layerTitle, layerGroupId, expanded, onClick, hasNestedChildren } = props;\n const icon = expanded ? <LuChevronDown /> : <LuChevronRight />;\n const intl = useIntl();\n return (\n <IconButton\n variant=\"ghost\"\n borderRadius=\"full\"\n padding={0}\n className=\"toc-layer-item-collapse-button\"\n onClick={onClick}\n size=\"sm\"\n focusRingOffset=\"-2px\"\n aria-label={\n expanded\n ? intl.formatMessage({ id: \"group.collapse\" }, { title: layerTitle })\n : intl.formatMessage({ id: \"group.expand\" }, { title: layerTitle })\n }\n aria-expanded={expanded}\n aria-controls={layerGroupId}\n //use visible:hidden for layers without children for correct indent\n visibility={hasNestedChildren ? \"visible\" : \"hidden\"}\n css={{\n // Chakra theme adds a background to components with \"aria-expanded\" by default.\n \"&:is([aria-expanded='true']):not(:hover)\": {\n background: \"none\",\n },\n }}\n >\n <Icon>{icon}</Icon>\n </IconButton>\n );\n}\n\nfunction ProblemIndicator(props: { message: ReactNode; Icon: IconType; color?: string }) {\n const { message, Icon, color } = props;\n return (\n <Tooltip\n content={message}\n positioning={{ placement: \"right\" }}\n contentProps={{ className: \"toc-layer-item-problem-indicator-tooltip\" }}\n >\n <span className=\"toc-layer-item-problem-indicator\">\n {/* aria-hidden: layer item has an aria label that includes the problem as well */}\n <Icon aria-hidden={true} color={color} />\n </span>\n </Tooltip>\n );\n}\n\n// Creates a toc item and registers it with the shared toc model.\nfunction useTocItem(layer: AnyLayer, display: boolean) {\n const tocModel = useTocModel();\n const options = useReactiveSnapshot(() => tocModel.options, [tocModel]);\n const tocItemElemRef = useRef<HTMLDivElement>(null);\n const tocItem = useMemo((): TocItemImpl => {\n return new TocItemImpl(layer, tocModel, !options.initiallyCollapsed);\n }, [layer, options.initiallyCollapsed, tocModel]);\n\n // Register the item on the shared toc model\n useEffect(() => {\n if (!display) {\n return; //prevent registering if item is not displayed\n }\n tocItem.setHtmlElement(tocItemElemRef.current ?? undefined);\n tocModel.registerItem(tocItem);\n return () => {\n tocItem.setHtmlElement(undefined);\n tocModel.unregisterItem(tocItem);\n };\n }, [tocModel, tocItem, display]);\n\n return [tocItem, tocModel, options, tocItemElemRef] as const;\n}\n\nfunction useItemProblem(layer: AnyLayer, intl: PackageIntl, listMode: ListMode | undefined) {\n const loadState = useLoadState(layer);\n const sublayerError = useSublayerError(layer);\n const visibleInScale = useVisibleInScale(layer);\n const isOwnError = loadState === \"error\";\n const hasChildError = !!sublayerError;\n\n return useMemo(() => {\n let problemIndicator;\n let problemLabel;\n let opacity;\n let disabled;\n if (isOwnError || hasChildError) {\n const label = getProblemLabel(intl, isOwnError, listMode, sublayerError);\n const color = isOwnError ? \"red\" : \"orange\";\n problemIndicator = (\n <ProblemIndicator message={label} Icon={LuTriangleAlert} color={color} />\n );\n problemLabel = label;\n // Only disable the checkbox for the layer that is the actual source\n // of the error, so a group with a broken child can still be toggled.\n disabled = isOwnError;\n } else if (!visibleInScale) {\n const label = intl.formatMessage({ id: \"layerNotVisible\" });\n problemIndicator = <ProblemIndicator message={label} Icon={LuInfo} />;\n problemLabel = label;\n opacity = 0.5;\n }\n return { problemIndicator, problemLabel, opacity, disabled };\n }, [isOwnError, hasChildError, visibleInScale, intl, listMode, sublayerError]);\n}\n\n/**\n * Builds the message shown in the problem indicator.\n *\n * When the layer's own load state is in error, a generic message is used.\n * If the list mode is \"hide-children\" the aggregated sublayer errors are listed so the user can\n * still see which children failed, since their own indicators are not rendered.\n */\nfunction getProblemLabel(\n intl: PackageIntl,\n isOwnError: boolean,\n listMode: ListMode | undefined,\n sublayerError: AggregateError | undefined,\n): ReactNode {\n if (isOwnError) {\n return intl.formatMessage({ id: \"layerNotAvailable\" });\n }\n if (listMode === \"hide-children\" && sublayerError) {\n return (\n <>\n <Text>{intl.formatMessage({ id: \"childLayerNotAvailableDetails\" })}</Text>\n <List.Root ml={2}>\n {sublayerError.errors.map((error: Error, index) => (\n // oxlint-disable-next-line react/no-array-index-key\n <List.Item key={index}>{error.message}</List.Item>\n ))}\n </List.Root>\n </>\n );\n }\n return intl.formatMessage({ id: \"childLayerNotAvailable\" });\n}\n\nfunction useListMode(layer: AnyLayer): LayerTocAttributes | undefined {\n return useReactiveSnapshot(\n () => layer.attributes.toc as LayerTocAttributes | undefined,\n [layer],\n );\n}\n\nfunction useNestedChildren(\n layerGroupId: string,\n title: string,\n layer: AnyLayer,\n intl: PackageIntl,\n) {\n const childLayers = useChildLayers(layer);\n const children = useMemo(() => {\n if (childLayers?.length) {\n return (\n <LayerList\n id={layerGroupId}\n layers={childLayers}\n ml={4}\n aria-label={intl.formatMessage({ id: \"childgroupLabel\" }, { title: title })}\n />\n );\n }\n return undefined;\n }, [layerGroupId, intl, title, childLayers]);\n return children;\n}\n\nfunction updateLayerVisibility(layer: AnyLayer, visible: boolean, autoShowParents: boolean) {\n layer.setVisible(visible);\n if (visible && autoShowParents && layer.parent) {\n updateLayerVisibility(layer.parent, true, true);\n }\n}\n\nfunction getClassNameForLayer(layer: AnyLayer) {\n return `layer-${slug(layer.id)}`;\n}\n\n/**\n * Checks if at least on child layer of the given layer exists and should be displayed.\n * @returns true if at least one child layer's display mode is not `hide`\n */\nfunction hasShownChildren(layer: AnyLayer): boolean {\n if (!layer.children || layer.children.getItems().length === 0) {\n return false;\n } else {\n return layer.children.getItems().some((childLayer) => {\n const isDisplayed = displayItemForLayer(childLayer);\n return isDisplayed;\n });\n }\n}\n"],"names":["LayerItem","Icon"],"mappings":"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"}
1
+ {"version":3,"file":"LayerItem.js","sources":["LayerItem.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Box,\n Checkbox,\n Collapsible,\n CollapsibleContent,\n Flex,\n Icon,\n IconButton,\n List,\n Spacer,\n Text,\n VisuallyHidden\n} from \"@chakra-ui/react\";\nimport { Tooltip } from \"@open-pioneer/chakra-snippets/tooltip\";\nimport { AnyLayer } from \"@open-pioneer/map\";\nimport { classNames } from \"@open-pioneer/react-utils\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { memo, ReactNode, useEffect, useId, useMemo, useRef } from \"react\";\nimport type { IconType } from \"react-icons/lib\";\nimport { LuChevronDown, LuChevronRight, LuInfo, LuTriangleAlert } from \"react-icons/lu\";\nimport { TocItemImpl, useTocModel } from \"../../model/\";\nimport { displayItemForLayer } from \"../../utils/displayLayer\";\nimport { slug } from \"../../utils/slug\";\nimport { LayerTocAttributes, ListMode } from \"../Toc\";\nimport { useChildLayers, useLoadState, useSublayerError, useVisibleInScale } from \"./hooks\";\nimport { LayerItemMenu } from \"./LayerItemMenu\";\nimport { LayerList } from \"./LayerList\";\n\n/**\n * Renders a single layer as a list item.\n *\n * The item may have further nested list items if there are sublayers present.\n */\nexport const LayerItem = memo(function LayerItem(props: { layer: AnyLayer }): ReactNode {\n const { layer } = props;\n\n const intl = useIntl();\n const display = useReactiveSnapshot(() => displayItemForLayer(layer), [layer]);\n const [tocItem, _tocModel, tocOptions, tocItemElemRef] = useTocItem(layer, display);\n const expanded = useReactiveSnapshot(() => tocItem.isExpanded, [tocItem]);\n const isCollapsible = tocOptions ? tocOptions.collapsibleGroups : false;\n\n const layerGroupId = useId();\n const listMode = useListMode(layer)?.listMode;\n const { title, description, isVisible, allChildrenHidden } = useReactiveSnapshot(() => {\n return {\n title: layer.title,\n description: layer.description,\n isVisible: layer.visible,\n allChildrenHidden: !hasShownChildren(layer) //re-evaluates if a child layer's list mode or internal state changes\n };\n }, [layer]);\n\n const { problemIndicator, problemLabel, disabled, opacity } = useItemProblem(\n layer,\n intl,\n listMode\n );\n\n const nestedChildren = useNestedChildren(layerGroupId, title, layer, intl);\n //all children hidden => do not render collapse button and child entries\n let hasNestedChildren = !!nestedChildren;\n if (allChildrenHidden || listMode === \"hide-children\") {\n hasNestedChildren = false;\n }\n\n if (!display) {\n return null;\n }\n\n return (\n <Box\n as=\"li\"\n className={classNames(\"toc-layer-item\", getClassNameForLayer(layer))}\n ref={tocItemElemRef}\n >\n <Flex\n className=\"toc-layer-item-content\"\n width=\"100%\"\n flexDirection=\"row\"\n align=\"center\"\n justifyContent=\"space-between\"\n /** Gap to prevent bleeding of the buttons hover style into the layer title */\n gap={2}\n /** Aligned to the size of the (potential) menu button in LayerItemDescriptor */\n minHeight={10}\n >\n {isCollapsible && (\n <CollapseButton\n layerTitle={title}\n layerGroupId={layerGroupId}\n expanded={expanded}\n onClick={() => tocItem.setExpanded(!expanded)}\n hasNestedChildren={hasNestedChildren}\n />\n )}\n\n <Checkbox.Root\n checked={isVisible}\n disabled={disabled}\n onCheckedChange={(event) =>\n updateLayerVisibility(\n layer,\n event.checked === true,\n tocOptions.autoShowParents\n )\n }\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control>\n <Checkbox.Indicator />\n </Checkbox.Control>\n <Checkbox.Label>\n <Text as=\"span\" opacity={opacity}>\n {title}\n </Text>\n {/* Same content as tooltip */}\n <VisuallyHidden as=\"div\">{problemLabel}</VisuallyHidden>\n </Checkbox.Label>\n </Checkbox.Root>\n {problemIndicator}\n <Spacer />\n <LayerItemMenu layer={layer} title={title} description={description} intl={intl} />\n </Flex>\n {hasNestedChildren && (\n <Collapsible.Root open={expanded} className=\"toc-collapsible-item\">\n <CollapsibleContent>{nestedChildren}</CollapsibleContent>\n </Collapsible.Root>\n )}\n </Box>\n );\n});\n\nfunction CollapseButton(props: {\n layerTitle: string;\n layerGroupId: string;\n expanded: boolean;\n onClick: () => void;\n hasNestedChildren: boolean;\n}) {\n const { layerTitle, layerGroupId, expanded, onClick, hasNestedChildren } = props;\n const icon = expanded ? <LuChevronDown /> : <LuChevronRight />;\n const intl = useIntl();\n return (\n <IconButton\n variant=\"ghost\"\n borderRadius=\"full\"\n padding={0}\n className=\"toc-layer-item-collapse-button\"\n onClick={onClick}\n size=\"sm\"\n focusRingOffset=\"-2px\"\n aria-label={\n expanded\n ? intl.formatMessage({ id: \"group.collapse\" }, { title: layerTitle })\n : intl.formatMessage({ id: \"group.expand\" }, { title: layerTitle })\n }\n aria-expanded={expanded}\n aria-controls={layerGroupId}\n //use visible:hidden for layers without children for correct indent\n visibility={hasNestedChildren ? \"visible\" : \"hidden\"}\n css={{\n // Chakra theme adds a background to components with \"aria-expanded\" by default.\n \"&:is([aria-expanded='true']):not(:hover)\": {\n background: \"none\"\n }\n }}\n >\n <Icon>{icon}</Icon>\n </IconButton>\n );\n}\n\nfunction ProblemIndicator(props: { message: ReactNode; Icon: IconType; color?: string }) {\n const { message, Icon, color } = props;\n return (\n <Tooltip\n content={message}\n positioning={{ placement: \"right\" }}\n contentProps={{ className: \"toc-layer-item-problem-indicator-tooltip\" }}\n >\n <span className=\"toc-layer-item-problem-indicator\">\n {/* aria-hidden: layer item has an aria label that includes the problem as well */}\n <Icon aria-hidden={true} color={color} />\n </span>\n </Tooltip>\n );\n}\n\n// Creates a toc item and registers it with the shared toc model.\nfunction useTocItem(layer: AnyLayer, display: boolean) {\n const tocModel = useTocModel();\n const options = useReactiveSnapshot(() => tocModel.options, [tocModel]);\n const tocItemElemRef = useRef<HTMLDivElement>(null);\n const tocItem = useMemo((): TocItemImpl => {\n return new TocItemImpl(layer, tocModel, !options.initiallyCollapsed);\n }, [layer, options.initiallyCollapsed, tocModel]);\n\n // Register the item on the shared toc model\n useEffect(() => {\n if (!display) {\n return; //prevent registering if item is not displayed\n }\n tocItem.setHtmlElement(tocItemElemRef.current ?? undefined);\n tocModel.registerItem(tocItem);\n return () => {\n tocItem.setHtmlElement(undefined);\n tocModel.unregisterItem(tocItem);\n };\n }, [tocModel, tocItem, display]);\n\n return [tocItem, tocModel, options, tocItemElemRef] as const;\n}\n\nfunction useItemProblem(layer: AnyLayer, intl: PackageIntl, listMode: ListMode | undefined) {\n const loadState = useLoadState(layer);\n const sublayerError = useSublayerError(layer);\n const visibleInScale = useVisibleInScale(layer);\n const isOwnError = loadState === \"error\";\n const hasChildError = !!sublayerError;\n\n return useMemo(() => {\n let problemIndicator;\n let problemLabel;\n let opacity;\n let disabled;\n if (isOwnError || hasChildError) {\n const label = getProblemLabel(intl, isOwnError, listMode, sublayerError);\n const color = isOwnError ? \"red\" : \"orange\";\n problemIndicator = (\n <ProblemIndicator message={label} Icon={LuTriangleAlert} color={color} />\n );\n problemLabel = label;\n // Only disable the checkbox for the layer that is the actual source\n // of the error, so a group with a broken child can still be toggled.\n disabled = isOwnError;\n } else if (!visibleInScale) {\n const label = intl.formatMessage({ id: \"layerNotVisible\" });\n problemIndicator = <ProblemIndicator message={label} Icon={LuInfo} />;\n problemLabel = label;\n opacity = 0.5;\n }\n return { problemIndicator, problemLabel, opacity, disabled };\n }, [isOwnError, hasChildError, visibleInScale, intl, listMode, sublayerError]);\n}\n\n/**\n * Builds the message shown in the problem indicator.\n *\n * When the layer's own load state is in error, a generic message is used.\n * If the list mode is \"hide-children\" the aggregated sublayer errors are listed so the user can\n * still see which children failed, since their own indicators are not rendered.\n */\nfunction getProblemLabel(\n intl: PackageIntl,\n isOwnError: boolean,\n listMode: ListMode | undefined,\n sublayerError: AggregateError | undefined\n): ReactNode {\n if (isOwnError) {\n return intl.formatMessage({ id: \"layerNotAvailable\" });\n }\n if (listMode === \"hide-children\" && sublayerError) {\n return (\n <>\n <Text>{intl.formatMessage({ id: \"childLayerNotAvailableDetails\" })}</Text>\n <List.Root ml={2}>\n {sublayerError.errors.map((error: Error, index) => (\n // oxlint-disable-next-line react/no-array-index-key\n <List.Item key={index}>{error.message}</List.Item>\n ))}\n </List.Root>\n </>\n );\n }\n return intl.formatMessage({ id: \"childLayerNotAvailable\" });\n}\n\nfunction useListMode(layer: AnyLayer): LayerTocAttributes | undefined {\n return useReactiveSnapshot(\n () => layer.attributes.toc as LayerTocAttributes | undefined,\n [layer]\n );\n}\n\nfunction useNestedChildren(\n layerGroupId: string,\n title: string,\n layer: AnyLayer,\n intl: PackageIntl\n) {\n const childLayers = useChildLayers(layer);\n const children = useMemo(() => {\n if (childLayers?.length) {\n return (\n <LayerList\n id={layerGroupId}\n layers={childLayers}\n ml={4}\n aria-label={intl.formatMessage({ id: \"childgroupLabel\" }, { title: title })}\n />\n );\n }\n return undefined;\n }, [layerGroupId, intl, title, childLayers]);\n return children;\n}\n\nfunction updateLayerVisibility(layer: AnyLayer, visible: boolean, autoShowParents: boolean) {\n layer.setVisible(visible);\n if (visible && autoShowParents && layer.parent) {\n updateLayerVisibility(layer.parent, true, true);\n }\n}\n\nfunction getClassNameForLayer(layer: AnyLayer) {\n return `layer-${slug(layer.id)}`;\n}\n\n/**\n * Checks if at least on child layer of the given layer exists and should be displayed.\n * @returns true if at least one child layer's display mode is not `hide`\n */\nfunction hasShownChildren(layer: AnyLayer): boolean {\n if (!layer.children || layer.children.getItems().length === 0) {\n return false;\n } else {\n return layer.children.getItems().some((childLayer) => {\n const isDisplayed = displayItemForLayer(childLayer);\n return isDisplayed;\n });\n }\n}\n"],"names":["LayerItem","Icon"],"mappings":"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"}
package/ui/Toc.js CHANGED
@@ -76,8 +76,11 @@ function useTocModel(props) {
76
76
  if (!tocModelRef.current) {
77
77
  tocModelRef.current = new TocModel(
78
78
  createOptions(
79
+ // oxlint-disable-next-line react/refs
79
80
  initialProps.current.autoShowParents,
81
+ // oxlint-disable-next-line react/refs
80
82
  initialProps.current.collapsibleGroups,
83
+ // oxlint-disable-next-line react/refs,
81
84
  initialProps.current.initiallyCollapsed
82
85
  )
83
86
  );
@@ -90,6 +93,7 @@ function useTocModel(props) {
90
93
  props.autoShowParents,
91
94
  props.collapsibleGroups,
92
95
  props.initiallyCollapsed,
96
+ // oxlint-disable-next-line react/refs
93
97
  tocModelRef.current.options
94
98
  ]);
95
99
  return tocModelRef.current;
package/ui/Toc.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Toc.js","sources":["Toc.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Box, Flex, Spacer, Text } from \"@chakra-ui/react\";\nimport { BasemapSwitcher, BasemapSwitcherProps } from \"@open-pioneer/basemap-switcher\";\nimport { MapModel, MapModelProps, useMapModelValue } from \"@open-pioneer/map\";\nimport {\n CommonComponentProps,\n SectionHeading,\n TitledSection,\n useCommonComponentProps,\n useEvent\n} from \"@open-pioneer/react-utils\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { FC, useEffect, useId, useRef } from \"react\";\nimport {\n createOptions,\n TocApi,\n TocApiImpl,\n TocDisposedEvent,\n TocModel,\n TocModelProvider,\n TocReadyEvent\n} from \"../model\";\nimport { TopLevelLayerList } from \"./LayerList/LayerList\";\nimport { Tools } from \"./Tools\";\n\n/**\n * Props supported by the {@link Toc} component.\n */\nexport interface TocProps extends CommonComponentProps, MapModelProps {\n /**\n * Defines whether the tool component is shown in the toc.\n *\n * Defaults to `false`.\n */\n showTools?: boolean;\n\n /**\n * Properties for the embedded tool component.\n */\n toolsConfig?: ToolsConfig;\n\n /**\n * Defines whether the basemap switcher is shown in the toc.\n *\n * Defaults to `true`.\n */\n showBasemapSwitcher?: boolean;\n\n /**\n * Properties for the embedded basemap switcher.\n *\n * Property `mapId` is not applied (the basemap switcher uses the same map as the toc).\n */\n basemapSwitcherProps?: Omit<BasemapSwitcherProps, \"mapId\">;\n\n /**\n * If `true`, groups in the toc can be collapsed and expanded.\n * This property should only be `true` if the map actually contains layer groups.\n *\n * Defaults to `false`.\n */\n collapsibleGroups?: boolean;\n\n /**\n * If `true` groups in the toc are collapsed initially.\n *\n * Defaults to `false`. If {@link collapsibleGroups} is `false` this property should also be `false`. Otherwise, only the top level layers will appear in the toc.\n */\n initiallyCollapsed?: boolean;\n\n /**\n * Show the parent layers when a child layer is made visible.\n *\n * Defaults to `true`.\n */\n autoShowParents?: boolean;\n\n /**\n * Callback that is triggered once when the Toc is initialized.\n * The Toc API can be accessed by the `api` property of the {@link TocReadyEvent}.\n */\n onReady?: (event: TocReadyEvent) => void;\n\n /**\n * Callback that is triggered once when the Toc is disposed and unmounted.\n */\n onDisposed?: (event: TocDisposedEvent) => void;\n}\n\n/**\n * Props supported by the {@link Tools} component.\n */\nexport interface ToolsConfig {\n /**\n * Optional property to show the `hide all layers` entry.\n *\n * Defaults to `true`.\n */\n showHideAllLayers?: boolean;\n\n /**\n * Optional property to show the `collapse all groups` entry.\n *\n * Defaults to `true`. Only applicable if {@link TocProps.collapsibleGroups} is `true`.\n */\n showCollapseAllGroups?: boolean;\n}\n\n/**\n * Layer attributes to specifically configure how a layer is displayed in the Toc.\n */\nexport interface LayerTocAttributes {\n /**\n * The {@link ListMode} is used to hide the layer (or it's children) in the Toc.\n */\n listMode?: ListMode;\n}\n\n/**\n * ListMode determines if a layer item is displayed in the Toc for the layer.\n * The option `\"hide-children\"` provides a shortcut to hide all child layers (e.g. sublayers of group) of the layer in the Toc.\n * It has the same effect as manually setting the `listMode` to `\"hide\"` on all child layers.\n *\n * ListMode has precedence over the layer's `internal` attribute but specifically configures the layer's display in the Toc.\n */\nexport type ListMode = \"show\" | \"hide\" | \"hide-children\";\n\nconst PADDING = 2;\n\n/**\n * Displays the layers of the configured map.\n */\nexport const Toc: FC<TocProps> = (props: TocProps) => {\n const { containerProps } = useCommonComponentProps(\"toc\", props);\n const map = useMapModelValue(props);\n\n return (\n <Flex {...containerProps} direction=\"column\" gap={PADDING}>\n <TocContent {...props} map={map} />\n </Flex>\n );\n};\n\n/** This component is rendered once we have a reference to the loaded map model. */\nfunction TocContent(props: TocProps & { map: MapModel }) {\n const {\n map,\n showTools = false,\n toolsConfig,\n showBasemapSwitcher = true,\n basemapSwitcherProps,\n onReady,\n onDisposed\n } = props;\n const intl = useIntl();\n const model = useTocModel(props);\n useTocAPI(model, onReady, onDisposed);\n\n const basemapsHeadingId = useId();\n const basemapSwitcher = showBasemapSwitcher && (\n <Box className=\"toc-basemap-switcher\" mb={PADDING}>\n <TitledSection\n title={\n <SectionHeading id={basemapsHeadingId} size={\"sm\"} mb={PADDING}>\n {intl.formatMessage({ id: \"basemapsLabel\" })}\n </SectionHeading>\n }\n >\n <BasemapSwitcher\n map={map}\n aria-labelledby={basemapsHeadingId}\n {...basemapSwitcherProps}\n />\n </TitledSection>\n </Box>\n );\n\n const layerList = (\n <Box className=\"toc-operational-layers\">\n <TitledSection\n title={\n <SectionHeading size=\"sm\">\n <Flex>\n <Text>\n {intl.formatMessage({\n id: \"operationalLayerLabel\"\n })}\n </Text>\n <Spacer />\n {showTools && <Tools map={map} {...toolsConfig} />}\n </Flex>\n </SectionHeading>\n }\n >\n <TopLevelLayerList\n map={map}\n aria-label={intl.formatMessage({ id: \"operationalLayerLabel\" })}\n />\n </TitledSection>\n </Box>\n );\n\n return (\n <TocModelProvider value={model}>\n {basemapSwitcher}\n {layerList}\n </TocModelProvider>\n );\n}\n\nfunction useTocModel(props: TocProps): TocModel {\n const initialProps = useRef(props);\n const tocModelRef = useRef<TocModel>(null);\n if (!tocModelRef.current) {\n tocModelRef.current = new TocModel(\n createOptions(\n initialProps.current.autoShowParents,\n initialProps.current.collapsibleGroups,\n initialProps.current.initiallyCollapsed\n )\n );\n }\n\n // Sync props to model\n useEffect(() => {\n // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion\n tocModelRef.current!.updateOptions(\n createOptions(props.autoShowParents, props.collapsibleGroups, props.initiallyCollapsed)\n );\n }, [\n props.autoShowParents,\n props.collapsibleGroups,\n props.initiallyCollapsed,\n tocModelRef.current.options\n ]);\n return tocModelRef.current;\n}\n\nfunction useTocAPI(\n model: TocModel,\n onReady: TocProps[\"onReady\"] | undefined,\n onDisposed: TocProps[\"onDisposed\"] | undefined\n) {\n const apiRef = useRef<TocApi>(null);\n if (!apiRef.current) {\n apiRef.current = new TocApiImpl(model);\n }\n\n const api = apiRef.current;\n\n const readyTrigger = useEvent(() => {\n onReady?.({\n api\n });\n });\n\n const disposeTrigger = useEvent(() => {\n onDisposed?.({});\n });\n\n // Trigger ready / dispose on mount / unmount, but if the callbacks change.\n // useEvent() returns a stable function reference.\n useEffect(() => {\n readyTrigger();\n return disposeTrigger;\n }, [readyTrigger, disposeTrigger]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Toc.js","sources":["Toc.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Box, Flex, Spacer, Text } from \"@chakra-ui/react\";\nimport { BasemapSwitcher, BasemapSwitcherProps } from \"@open-pioneer/basemap-switcher\";\nimport { MapModel, MapModelProps, useMapModelValue } from \"@open-pioneer/map\";\nimport {\n CommonComponentProps,\n SectionHeading,\n TitledSection,\n useCommonComponentProps,\n useEvent\n} from \"@open-pioneer/react-utils\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { FC, useEffect, useId, useRef } from \"react\";\nimport {\n createOptions,\n TocApi,\n TocApiImpl,\n TocDisposedEvent,\n TocModel,\n TocModelProvider,\n TocReadyEvent\n} from \"../model\";\nimport { TopLevelLayerList } from \"./LayerList/LayerList\";\nimport { Tools } from \"./Tools\";\n\n/**\n * Props supported by the {@link Toc} component.\n */\nexport interface TocProps extends CommonComponentProps, MapModelProps {\n /**\n * Defines whether the tool component is shown in the toc.\n *\n * Defaults to `false`.\n */\n showTools?: boolean;\n\n /**\n * Properties for the embedded tool component.\n */\n toolsConfig?: ToolsConfig;\n\n /**\n * Defines whether the basemap switcher is shown in the toc.\n *\n * Defaults to `true`.\n */\n showBasemapSwitcher?: boolean;\n\n /**\n * Properties for the embedded basemap switcher.\n *\n * Property `mapId` is not applied (the basemap switcher uses the same map as the toc).\n */\n basemapSwitcherProps?: Omit<BasemapSwitcherProps, \"mapId\">;\n\n /**\n * If `true`, groups in the toc can be collapsed and expanded.\n * This property should only be `true` if the map actually contains layer groups.\n *\n * Defaults to `false`.\n */\n collapsibleGroups?: boolean;\n\n /**\n * If `true` groups in the toc are collapsed initially.\n *\n * Defaults to `false`. If {@link collapsibleGroups} is `false` this property should also be `false`. Otherwise, only the top level layers will appear in the toc.\n */\n initiallyCollapsed?: boolean;\n\n /**\n * Show the parent layers when a child layer is made visible.\n *\n * Defaults to `true`.\n */\n autoShowParents?: boolean;\n\n /**\n * Callback that is triggered once when the Toc is initialized.\n * The Toc API can be accessed by the `api` property of the {@link TocReadyEvent}.\n */\n onReady?: (event: TocReadyEvent) => void;\n\n /**\n * Callback that is triggered once when the Toc is disposed and unmounted.\n */\n onDisposed?: (event: TocDisposedEvent) => void;\n}\n\n/**\n * Props supported by the {@link Tools} component.\n */\nexport interface ToolsConfig {\n /**\n * Optional property to show the `hide all layers` entry.\n *\n * Defaults to `true`.\n */\n showHideAllLayers?: boolean;\n\n /**\n * Optional property to show the `collapse all groups` entry.\n *\n * Defaults to `true`. Only applicable if {@link TocProps.collapsibleGroups} is `true`.\n */\n showCollapseAllGroups?: boolean;\n}\n\n/**\n * Layer attributes to specifically configure how a layer is displayed in the Toc.\n */\nexport interface LayerTocAttributes {\n /**\n * The {@link ListMode} is used to hide the layer (or it's children) in the Toc.\n */\n listMode?: ListMode;\n}\n\n/**\n * ListMode determines if a layer item is displayed in the Toc for the layer.\n * The option `\"hide-children\"` provides a shortcut to hide all child layers (e.g. sublayers of group) of the layer in the Toc.\n * It has the same effect as manually setting the `listMode` to `\"hide\"` on all child layers.\n *\n * ListMode has precedence over the layer's `internal` attribute but specifically configures the layer's display in the Toc.\n */\nexport type ListMode = \"show\" | \"hide\" | \"hide-children\";\n\nconst PADDING = 2;\n\n/**\n * Displays the layers of the configured map.\n */\nexport const Toc: FC<TocProps> = (props: TocProps) => {\n const { containerProps } = useCommonComponentProps(\"toc\", props);\n const map = useMapModelValue(props);\n\n return (\n <Flex {...containerProps} direction=\"column\" gap={PADDING}>\n <TocContent {...props} map={map} />\n </Flex>\n );\n};\n\n/** This component is rendered once we have a reference to the loaded map model. */\nfunction TocContent(props: TocProps & { map: MapModel }) {\n const {\n map,\n showTools = false,\n toolsConfig,\n showBasemapSwitcher = true,\n basemapSwitcherProps,\n onReady,\n onDisposed\n } = props;\n const intl = useIntl();\n const model = useTocModel(props);\n useTocAPI(model, onReady, onDisposed);\n\n const basemapsHeadingId = useId();\n const basemapSwitcher = showBasemapSwitcher && (\n <Box className=\"toc-basemap-switcher\" mb={PADDING}>\n <TitledSection\n title={\n <SectionHeading id={basemapsHeadingId} size={\"sm\"} mb={PADDING}>\n {intl.formatMessage({ id: \"basemapsLabel\" })}\n </SectionHeading>\n }\n >\n <BasemapSwitcher\n map={map}\n aria-labelledby={basemapsHeadingId}\n {...basemapSwitcherProps}\n />\n </TitledSection>\n </Box>\n );\n\n const layerList = (\n <Box className=\"toc-operational-layers\">\n <TitledSection\n title={\n <SectionHeading size=\"sm\">\n <Flex>\n <Text>\n {intl.formatMessage({\n id: \"operationalLayerLabel\"\n })}\n </Text>\n <Spacer />\n {showTools && <Tools map={map} {...toolsConfig} />}\n </Flex>\n </SectionHeading>\n }\n >\n <TopLevelLayerList\n map={map}\n aria-label={intl.formatMessage({ id: \"operationalLayerLabel\" })}\n />\n </TitledSection>\n </Box>\n );\n\n return (\n <TocModelProvider value={model}>\n {basemapSwitcher}\n {layerList}\n </TocModelProvider>\n );\n}\n\nfunction useTocModel(props: TocProps): TocModel {\n const initialProps = useRef(props);\n const tocModelRef = useRef<TocModel>(null);\n // oxlint-disable-next-line react/refs\n if (!tocModelRef.current) {\n tocModelRef.current = new TocModel(\n createOptions(\n // oxlint-disable-next-line react/refs\n initialProps.current.autoShowParents,\n // oxlint-disable-next-line react/refs\n initialProps.current.collapsibleGroups,\n // oxlint-disable-next-line react/refs,\n initialProps.current.initiallyCollapsed\n )\n );\n }\n\n // Sync props to model\n useEffect(() => {\n // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion\n tocModelRef.current!.updateOptions(\n createOptions(props.autoShowParents, props.collapsibleGroups, props.initiallyCollapsed)\n );\n // oxlint-disable-next-line react/refs\n }, [\n props.autoShowParents,\n props.collapsibleGroups,\n props.initiallyCollapsed,\n // oxlint-disable-next-line react/refs\n tocModelRef.current.options\n ]);\n // oxlint-disable-next-line react/refs\n return tocModelRef.current;\n}\n\nfunction useTocAPI(\n model: TocModel,\n onReady: TocProps[\"onReady\"] | undefined,\n onDisposed: TocProps[\"onDisposed\"] | undefined\n) {\n const apiRef = useRef<TocApi>(null);\n // oxlint-disable-next-line react/refs\n if (!apiRef.current) {\n apiRef.current = new TocApiImpl(model);\n }\n\n const api = apiRef.current;\n\n const readyTrigger = useEvent(() => {\n onReady?.({\n api\n });\n });\n\n const disposeTrigger = useEvent(() => {\n onDisposed?.({});\n });\n\n // Trigger ready / dispose on mount / unmount, but if the callbacks change.\n // useEvent() returns a stable function reference.\n useEffect(() => {\n readyTrigger();\n return disposeTrigger;\n }, [readyTrigger, disposeTrigger]);\n}\n"],"names":[],"mappings":"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"}