@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 +82 -71
- package/package.json +16 -12
- package/ui/LayerList/LayerItem.js.map +1 -1
- package/ui/Toc.js +4 -0
- package/ui/Toc.js.map +1 -1
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
123
|
+
The easiest way to do that is to wrap icons into chakra's `<Icon />` component, for example:
|
|
113
124
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
125
|
+
```tsx
|
|
126
|
+
import { Icon } from "@chakra-ui/react";
|
|
127
|
+
import { FiX } from "react-icons/fi";
|
|
117
128
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
143
|
+
Example:
|
|
133
144
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
145
|
+
```tsx
|
|
146
|
+
// Default map for entire component tree
|
|
147
|
+
<DefaultMapProvider map={mapModel}>
|
|
148
|
+
<Toc />
|
|
149
|
+
</DefaultMapProvider>
|
|
139
150
|
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
161
|
-
|
|
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
|
-
|
|
164
|
-
|
|
174
|
+
```jsx
|
|
175
|
+
import { Toc } from "@open-pioneer/toc";
|
|
165
176
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
198
|
+
This can be disabled by configuring `autoShowParents={false}` on the `TOC` component.
|
|
188
199
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
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
|
+
"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.
|
|
18
|
-
"@conterra/reactivity-core": "^0.8.
|
|
19
|
-
"@open-pioneer/
|
|
20
|
-
"@open-pioneer/
|
|
21
|
-
"@open-pioneer/
|
|
22
|
-
"@open-pioneer/
|
|
23
|
-
"@open-pioneer/
|
|
24
|
-
"
|
|
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
|
-
|
|
28
|
-
|
|
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":";;;;;;;;;;;;;;;;;AAsCO,MAAM,SAAA,GAAY,IAAA,CAAK,SAASA,UAAAA,CAAU,KAAA,EAAuC;AACpF,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAElB,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,mBAAA,CAAoB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC7E,EAAA,MAAM,CAAC,SAAS,SAAA,EAAW,UAAA,EAAY,cAAc,CAAA,GAAI,UAAA,CAAW,OAAO,OAAO,CAAA;AAClF,EAAA,MAAM,WAAW,mBAAA,CAAoB,MAAM,QAAQ,UAAA,EAAY,CAAC,OAAO,CAAC,CAAA;AACxE,EAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,UAAA,CAAW,iBAAA,GAAoB,KAAA;AAElE,EAAA,MAAM,eAAe,KAAA,EAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAK,CAAA,EAAG,QAAA;AACrC,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,iBAAA,EAAkB,GAAI,oBAAoB,MAAM;AACnF,IAAA,OAAO;AAAA,MACH,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,WAAW,KAAA,CAAM,OAAA;AAAA,MACjB,iBAAA,EAAmB,CAAC,gBAAA,CAAiB,KAAK;AAAA;AAAA,KAC9C;AAAA,EACJ,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,EAAE,gBAAA,EAAkB,YAAA,EAAc,QAAA,EAAU,SAAQ,GAAI,cAAA;AAAA,IAC1D,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,YAAA,EAAc,KAAA,EAAO,OAAO,IAAI,CAAA;AAEzE,EAAA,IAAI,iBAAA,GAAoB,CAAC,CAAC,cAAA;AAC1B,EAAA,IAAI,iBAAA,IAAqB,aAAa,eAAA,EAAiB;AACnD,IAAA,iBAAA,GAAoB,KAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,uBACI,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,EAAA,EAAG,IAAA;AAAA,MACH,SAAA,EAAW,UAAA,CAAW,gBAAA,EAAkB,oBAAA,CAAqB,KAAK,CAAC,CAAA;AAAA,MACnE,GAAA,EAAK,cAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAU,wBAAA;AAAA,YACV,KAAA,EAAM,MAAA;AAAA,YACN,aAAA,EAAc,KAAA;AAAA,YACd,KAAA,EAAM,QAAA;AAAA,YACN,cAAA,EAAe,eAAA;AAAA,YAEf,GAAA,EAAK,CAAA;AAAA,YAEL,SAAA,EAAW,EAAA;AAAA,YAEV,QAAA,EAAA;AAAA,cAAA,aAAA,oBACG,GAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACG,UAAA,EAAY,KAAA;AAAA,kBACZ,YAAA;AAAA,kBACA,QAAA;AAAA,kBACA,OAAA,EAAS,MAAM,OAAA,CAAQ,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,kBAC5C;AAAA;AAAA,eACJ;AAAA,8BAGJ,IAAA;AAAA,gBAAC,QAAA,CAAS,IAAA;AAAA,gBAAT;AAAA,kBACG,OAAA,EAAS,SAAA;AAAA,kBACT,QAAA;AAAA,kBACA,eAAA,EAAiB,CAAC,KAAA,KACd,qBAAA;AAAA,oBACI,KAAA;AAAA,oBACA,MAAM,OAAA,KAAY,IAAA;AAAA,oBAClB,UAAA,CAAW;AAAA,mBACf;AAAA,kBAGJ,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,QAAA,CAAS,aAAT,EAAqB,CAAA;AAAA,oCACtB,GAAA,CAAC,SAAS,OAAA,EAAT,EACG,8BAAC,QAAA,CAAS,SAAA,EAAT,EAAmB,CAAA,EACxB,CAAA;AAAA,oCACA,IAAA,CAAC,QAAA,CAAS,KAAA,EAAT,EACG,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,OAAA,EACX,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,sCAEA,GAAA,CAAC,cAAA,EAAA,EAAe,EAAA,EAAG,KAAA,EAAO,QAAA,EAAA,YAAA,EAAa;AAAA,qBAAA,EAC3C;AAAA;AAAA;AAAA,eACJ;AAAA,cACC,gBAAA;AAAA,kCACA,MAAA,EAAA,EAAO,CAAA;AAAA,8BACR,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,KAAA,EAAc,aAA0B,IAAA,EAAY;AAAA;AAAA;AAAA,SACrF;AAAA,QACC,iBAAA,oBACG,GAAA,CAAC,WAAA,CAAY,IAAA,EAAZ,EAAiB,IAAA,EAAM,QAAA,EAAU,SAAA,EAAU,sBAAA,EACxC,QAAA,kBAAA,GAAA,CAAC,kBAAA,EAAA,EAAoB,QAAA,EAAA,cAAA,EAAe,CAAA,EACxC;AAAA;AAAA;AAAA,GAER;AAER,CAAC;AAED,SAAS,eAAe,KAAA,EAMrB;AACC,EAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAc,QAAA,EAAU,OAAA,EAAS,mBAAkB,GAAI,KAAA;AAC3E,EAAA,MAAM,OAAO,QAAA,mBAAW,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA,uBAAM,cAAA,EAAA,EAAe,CAAA;AAC5D,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,uBACI,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAQ,OAAA;AAAA,MACR,YAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAU,gCAAA;AAAA,MACV,OAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,eAAA,EAAgB,MAAA;AAAA,MAChB,YAAA,EACI,WACM,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,gBAAA,EAAiB,EAAG,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,GAClE,IAAA,CAAK,cAAc,EAAE,EAAA,EAAI,gBAAe,EAAG,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,MAE1E,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,YAAA;AAAA,MAEf,UAAA,EAAY,oBAAoB,SAAA,GAAY,QAAA;AAAA,MAC5C,GAAA,EAAK;AAAA;AAAA,QAED,0CAAA,EAA4C;AAAA,UACxC,UAAA,EAAY;AAAA;AAChB,OACJ;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,QAAM,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,GAChB;AAER;AAEA,SAAS,iBAAiB,KAAA,EAA+D;AACrF,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAAC,KAAAA,EAAM,OAAM,GAAI,KAAA;AACjC,EAAA,uBACI,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAS,OAAA;AAAA,MACT,WAAA,EAAa,EAAE,SAAA,EAAW,OAAA,EAAQ;AAAA,MAClC,YAAA,EAAc,EAAE,SAAA,EAAW,0CAAA,EAA2C;AAAA,MAEtE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAEZ,QAAA,kBAAA,GAAA,CAACA,OAAA,EAAK,aAAA,EAAa,IAAA,EAAM,KAAA,EAAc,CAAA,EAC3C;AAAA;AAAA,GACJ;AAER;AAGA,SAAS,UAAA,CAAW,OAAiB,OAAA,EAAkB;AACnD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAU,mBAAA,CAAoB,MAAM,SAAS,OAAA,EAAS,CAAC,QAAQ,CAAC,CAAA;AACtE,EAAA,MAAM,cAAA,GAAiB,OAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAmB;AACvC,IAAA,OAAO,IAAI,WAAA,CAAY,KAAA,EAAO,QAAA,EAAU,CAAC,QAAQ,kBAAkB,CAAA;AAAA,EACvE,GAAG,CAAC,KAAA,EAAO,OAAA,CAAQ,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAGhD,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA;AAAA,IACJ;AACA,IAAA,OAAA,CAAQ,cAAA,CAAe,cAAA,CAAe,OAAA,IAAW,MAAS,CAAA;AAC1D,IAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAC7B,IAAA,OAAO,MAAM;AACT,MAAA,OAAA,CAAQ,eAAe,MAAS,CAAA;AAChC,MAAA,QAAA,CAAS,eAAe,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/B,EAAA,OAAO,CAAC,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AACtD;AAEA,SAAS,cAAA,CAAe,KAAA,EAAiB,IAAA,EAAmB,QAAA,EAAgC;AACxF,EAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,iBAAiB,KAAK,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAiB,kBAAkB,KAAK,CAAA;AAC9C,EAAA,MAAM,aAAa,SAAA,KAAc,OAAA;AACjC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,aAAA;AAExB,EAAA,OAAO,QAAQ,MAAM;AACjB,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,cAAc,aAAA,EAAe;AAC7B,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,UAAU,aAAa,CAAA;AACvE,MAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,GAAQ,QAAA;AACnC,MAAA,gBAAA,uBACK,gBAAA,EAAA,EAAiB,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,iBAAiB,KAAA,EAAc,CAAA;AAE3E,MAAA,YAAA,GAAe,KAAA;AAGf,MAAA,QAAA,GAAW,UAAA;AAAA,IACf,CAAA,MAAA,IAAW,CAAC,cAAA,EAAgB;AACxB,MAAA,MAAM,QAAQ,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,mBAAmB,CAAA;AAC1D,MAAA,gBAAA,mBAAmB,GAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,KAAA,EAAO,MAAM,MAAA,EAAQ,CAAA;AACnE,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,OAAA,GAAU,GAAA;AAAA,IACd;AACA,IAAA,OAAO,EAAE,gBAAA,EAAkB,YAAA,EAAc,OAAA,EAAS,QAAA,EAAS;AAAA,EAC/D,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,gBAAgB,IAAA,EAAM,QAAA,EAAU,aAAa,CAAC,CAAA;AACjF;AASA,SAAS,eAAA,CACL,IAAA,EACA,UAAA,EACA,QAAA,EACA,aAAA,EACS;AACT,EAAA,IAAI,UAAA,EAAY;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,qBAAqB,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,QAAA,KAAa,mBAAmB,aAAA,EAAe;AAC/C,IAAA,uBACI,IAAA,CAAA,QAAA,EAAA,EACI,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAM,QAAA,EAAA,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,+BAAA,EAAiC,CAAA,EAAE,CAAA;AAAA,sBACnE,GAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,EAAA,EAAI,GACV,QAAA,EAAA,aAAA,CAAc,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAc,KAAA;AAAA;AAAA,4BAEpC,IAAA,CAAK,IAAA,EAAL,EAAuB,QAAA,EAAA,KAAA,CAAM,WAAd,KAAsB;AAAA,OACzC,CAAA,EACL;AAAA,KAAA,EACJ,CAAA;AAAA,EAER;AACA,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,0BAA0B,CAAA;AAC9D;AAEA,SAAS,YAAY,KAAA,EAAiD;AAClE,EAAA,OAAO,mBAAA;AAAA,IACH,MAAM,MAAM,UAAA,CAAW,GAAA;AAAA,IACvB,CAAC,KAAK;AAAA,GACV;AACJ;AAEA,SAAS,iBAAA,CACL,YAAA,EACA,KAAA,EACA,KAAA,EACA,IAAA,EACF;AACE,EAAA,MAAM,WAAA,GAAc,eAAe,KAAK,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM;AAC3B,IAAA,IAAI,aAAa,MAAA,EAAQ;AACrB,MAAA,uBACI,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACG,EAAA,EAAI,YAAA;AAAA,UACJ,MAAA,EAAQ,WAAA;AAAA,UACR,EAAA,EAAI,CAAA;AAAA,UACJ,YAAA,EAAY,KAAK,aAAA,CAAc,EAAE,IAAI,iBAAA,EAAkB,EAAG,EAAE,KAAA,EAAc;AAAA;AAAA,OAC9E;AAAA,IAER;AACA,IAAA,OAAO,MAAA;AAAA,EACX,GAAG,CAAC,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,WAAW,CAAC,CAAA;AAC3C,EAAA,OAAO,QAAA;AACX;AAEA,SAAS,qBAAA,CAAsB,KAAA,EAAiB,OAAA,EAAkB,eAAA,EAA0B;AACxF,EAAA,KAAA,CAAM,WAAW,OAAO,CAAA;AACxB,EAAA,IAAI,OAAA,IAAW,eAAA,IAAmB,KAAA,CAAM,MAAA,EAAQ;AAC5C,IAAA,qBAAA,CAAsB,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,EAClD;AACJ;AAEA,SAAS,qBAAqB,KAAA,EAAiB;AAC3C,EAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAClC;AAMA,SAAS,iBAAiB,KAAA,EAA0B;AAChD,EAAA,IAAI,CAAC,MAAM,QAAA,IAAY,KAAA,CAAM,SAAS,QAAA,EAAS,CAAE,WAAW,CAAA,EAAG;AAC3D,IAAA,OAAO,KAAA;AAAA,EACX,CAAA,MAAO;AACH,IAAA,OAAO,MAAM,QAAA,CAAS,QAAA,EAAS,CAAE,IAAA,CAAK,CAAC,UAAA,KAAe;AAClD,MAAA,MAAM,WAAA,GAAc,oBAAoB,UAAU,CAAA;AAClD,MAAA,OAAO,WAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AACJ;;;;"}
|
|
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":";;;;;;;;;;;;;;;;;AAsCO,MAAM,SAAA,GAAY,IAAA,CAAK,SAASA,UAAAA,CAAU,KAAA,EAAuC;AACpF,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAElB,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,mBAAA,CAAoB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC7E,EAAA,MAAM,CAAC,SAAS,SAAA,EAAW,UAAA,EAAY,cAAc,CAAA,GAAI,UAAA,CAAW,OAAO,OAAO,CAAA;AAClF,EAAA,MAAM,WAAW,mBAAA,CAAoB,MAAM,QAAQ,UAAA,EAAY,CAAC,OAAO,CAAC,CAAA;AACxE,EAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,UAAA,CAAW,iBAAA,GAAoB,KAAA;AAElE,EAAA,MAAM,eAAe,KAAA,EAAM;AAC3B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAK,CAAA,EAAG,QAAA;AACrC,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,iBAAA,EAAkB,GAAI,oBAAoB,MAAM;AACnF,IAAA,OAAO;AAAA,MACH,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,WAAW,KAAA,CAAM,OAAA;AAAA,MACjB,iBAAA,EAAmB,CAAC,gBAAA,CAAiB,KAAK;AAAA;AAAA,KAC9C;AAAA,EACJ,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,EAAE,gBAAA,EAAkB,YAAA,EAAc,QAAA,EAAU,SAAQ,GAAI,cAAA;AAAA,IAC1D,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,YAAA,EAAc,KAAA,EAAO,OAAO,IAAI,CAAA;AAEzE,EAAA,IAAI,iBAAA,GAAoB,CAAC,CAAC,cAAA;AAC1B,EAAA,IAAI,iBAAA,IAAqB,aAAa,eAAA,EAAiB;AACnD,IAAA,iBAAA,GAAoB,KAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,uBACI,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,EAAA,EAAG,IAAA;AAAA,MACH,SAAA,EAAW,UAAA,CAAW,gBAAA,EAAkB,oBAAA,CAAqB,KAAK,CAAC,CAAA;AAAA,MACnE,GAAA,EAAK,cAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAU,wBAAA;AAAA,YACV,KAAA,EAAM,MAAA;AAAA,YACN,aAAA,EAAc,KAAA;AAAA,YACd,KAAA,EAAM,QAAA;AAAA,YACN,cAAA,EAAe,eAAA;AAAA,YAEf,GAAA,EAAK,CAAA;AAAA,YAEL,SAAA,EAAW,EAAA;AAAA,YAEV,QAAA,EAAA;AAAA,cAAA,aAAA,oBACG,GAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACG,UAAA,EAAY,KAAA;AAAA,kBACZ,YAAA;AAAA,kBACA,QAAA;AAAA,kBACA,OAAA,EAAS,MAAM,OAAA,CAAQ,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,kBAC5C;AAAA;AAAA,eACJ;AAAA,8BAGJ,IAAA;AAAA,gBAAC,QAAA,CAAS,IAAA;AAAA,gBAAT;AAAA,kBACG,OAAA,EAAS,SAAA;AAAA,kBACT,QAAA;AAAA,kBACA,eAAA,EAAiB,CAAC,KAAA,KACd,qBAAA;AAAA,oBACI,KAAA;AAAA,oBACA,MAAM,OAAA,KAAY,IAAA;AAAA,oBAClB,UAAA,CAAW;AAAA,mBACf;AAAA,kBAGJ,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,QAAA,CAAS,aAAT,EAAqB,CAAA;AAAA,oCACtB,GAAA,CAAC,SAAS,OAAA,EAAT,EACG,8BAAC,QAAA,CAAS,SAAA,EAAT,EAAmB,CAAA,EACxB,CAAA;AAAA,oCACA,IAAA,CAAC,QAAA,CAAS,KAAA,EAAT,EACG,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,OAAA,EACX,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,sCAEA,GAAA,CAAC,cAAA,EAAA,EAAe,EAAA,EAAG,KAAA,EAAO,QAAA,EAAA,YAAA,EAAa;AAAA,qBAAA,EAC3C;AAAA;AAAA;AAAA,eACJ;AAAA,cACC,gBAAA;AAAA,kCACA,MAAA,EAAA,EAAO,CAAA;AAAA,8BACR,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,KAAA,EAAc,aAA0B,IAAA,EAAY;AAAA;AAAA;AAAA,SACrF;AAAA,QACC,iBAAA,oBACG,GAAA,CAAC,WAAA,CAAY,IAAA,EAAZ,EAAiB,IAAA,EAAM,QAAA,EAAU,SAAA,EAAU,sBAAA,EACxC,QAAA,kBAAA,GAAA,CAAC,kBAAA,EAAA,EAAoB,QAAA,EAAA,cAAA,EAAe,CAAA,EACxC;AAAA;AAAA;AAAA,GAER;AAER,CAAC;AAED,SAAS,eAAe,KAAA,EAMrB;AACC,EAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAc,QAAA,EAAU,OAAA,EAAS,mBAAkB,GAAI,KAAA;AAC3E,EAAA,MAAM,OAAO,QAAA,mBAAW,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA,uBAAM,cAAA,EAAA,EAAe,CAAA;AAC5D,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,uBACI,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAQ,OAAA;AAAA,MACR,YAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAU,gCAAA;AAAA,MACV,OAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MACL,eAAA,EAAgB,MAAA;AAAA,MAChB,YAAA,EACI,WACM,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,gBAAA,EAAiB,EAAG,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,GAClE,IAAA,CAAK,cAAc,EAAE,EAAA,EAAI,gBAAe,EAAG,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,MAE1E,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,YAAA;AAAA,MAEf,UAAA,EAAY,oBAAoB,SAAA,GAAY,QAAA;AAAA,MAC5C,GAAA,EAAK;AAAA;AAAA,QAED,0CAAA,EAA4C;AAAA,UACxC,UAAA,EAAY;AAAA;AAChB,OACJ;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,QAAM,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,GAChB;AAER;AAEA,SAAS,iBAAiB,KAAA,EAA+D;AACrF,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAAC,KAAAA,EAAM,OAAM,GAAI,KAAA;AACjC,EAAA,uBACI,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAS,OAAA;AAAA,MACT,WAAA,EAAa,EAAE,SAAA,EAAW,OAAA,EAAQ;AAAA,MAClC,YAAA,EAAc,EAAE,SAAA,EAAW,0CAAA,EAA2C;AAAA,MAEtE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAEZ,QAAA,kBAAA,GAAA,CAACA,OAAA,EAAK,aAAA,EAAa,IAAA,EAAM,KAAA,EAAc,CAAA,EAC3C;AAAA;AAAA,GACJ;AAER;AAGA,SAAS,UAAA,CAAW,OAAiB,OAAA,EAAkB;AACnD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAU,mBAAA,CAAoB,MAAM,SAAS,OAAA,EAAS,CAAC,QAAQ,CAAC,CAAA;AACtE,EAAA,MAAM,cAAA,GAAiB,OAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAmB;AACvC,IAAA,OAAO,IAAI,WAAA,CAAY,KAAA,EAAO,QAAA,EAAU,CAAC,QAAQ,kBAAkB,CAAA;AAAA,EACvE,GAAG,CAAC,KAAA,EAAO,OAAA,CAAQ,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAGhD,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA;AAAA,IACJ;AACA,IAAA,OAAA,CAAQ,cAAA,CAAe,cAAA,CAAe,OAAA,IAAW,MAAS,CAAA;AAC1D,IAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAC7B,IAAA,OAAO,MAAM;AACT,MAAA,OAAA,CAAQ,eAAe,MAAS,CAAA;AAChC,MAAA,QAAA,CAAS,eAAe,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/B,EAAA,OAAO,CAAC,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AACtD;AAEA,SAAS,cAAA,CAAe,KAAA,EAAiB,IAAA,EAAmB,QAAA,EAAgC;AACxF,EAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,iBAAiB,KAAK,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAiB,kBAAkB,KAAK,CAAA;AAC9C,EAAA,MAAM,aAAa,SAAA,KAAc,OAAA;AACjC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,aAAA;AAExB,EAAA,OAAO,QAAQ,MAAM;AACjB,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,cAAc,aAAA,EAAe;AAC7B,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,UAAU,aAAa,CAAA;AACvE,MAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,GAAQ,QAAA;AACnC,MAAA,gBAAA,uBACK,gBAAA,EAAA,EAAiB,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,iBAAiB,KAAA,EAAc,CAAA;AAE3E,MAAA,YAAA,GAAe,KAAA;AAGf,MAAA,QAAA,GAAW,UAAA;AAAA,IACf,CAAA,MAAA,IAAW,CAAC,cAAA,EAAgB;AACxB,MAAA,MAAM,QAAQ,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,mBAAmB,CAAA;AAC1D,MAAA,gBAAA,mBAAmB,GAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,KAAA,EAAO,MAAM,MAAA,EAAQ,CAAA;AACnE,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,OAAA,GAAU,GAAA;AAAA,IACd;AACA,IAAA,OAAO,EAAE,gBAAA,EAAkB,YAAA,EAAc,OAAA,EAAS,QAAA,EAAS;AAAA,EAC/D,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,gBAAgB,IAAA,EAAM,QAAA,EAAU,aAAa,CAAC,CAAA;AACjF;AASA,SAAS,eAAA,CACL,IAAA,EACA,UAAA,EACA,QAAA,EACA,aAAA,EACS;AACT,EAAA,IAAI,UAAA,EAAY;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,qBAAqB,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,QAAA,KAAa,mBAAmB,aAAA,EAAe;AAC/C,IAAA,uBACI,IAAA,CAAA,QAAA,EAAA,EACI,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAM,QAAA,EAAA,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,+BAAA,EAAiC,CAAA,EAAE,CAAA;AAAA,sBACnE,GAAA,CAAC,IAAA,CAAK,IAAA,EAAL,EAAU,EAAA,EAAI,GACV,QAAA,EAAA,aAAA,CAAc,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAc,KAAA;AAAA;AAAA,4BAEpC,IAAA,CAAK,IAAA,EAAL,EAAuB,QAAA,EAAA,KAAA,CAAM,WAAd,KAAsB;AAAA,OACzC,CAAA,EACL;AAAA,KAAA,EACJ,CAAA;AAAA,EAER;AACA,EAAA,OAAO,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,0BAA0B,CAAA;AAC9D;AAEA,SAAS,YAAY,KAAA,EAAiD;AAClE,EAAA,OAAO,mBAAA;AAAA,IACH,MAAM,MAAM,UAAA,CAAW,GAAA;AAAA,IACvB,CAAC,KAAK;AAAA,GACV;AACJ;AAEA,SAAS,iBAAA,CACL,YAAA,EACA,KAAA,EACA,KAAA,EACA,IAAA,EACF;AACE,EAAA,MAAM,WAAA,GAAc,eAAe,KAAK,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM;AAC3B,IAAA,IAAI,aAAa,MAAA,EAAQ;AACrB,MAAA,uBACI,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACG,EAAA,EAAI,YAAA;AAAA,UACJ,MAAA,EAAQ,WAAA;AAAA,UACR,EAAA,EAAI,CAAA;AAAA,UACJ,YAAA,EAAY,KAAK,aAAA,CAAc,EAAE,IAAI,iBAAA,EAAkB,EAAG,EAAE,KAAA,EAAc;AAAA;AAAA,OAC9E;AAAA,IAER;AACA,IAAA,OAAO,MAAA;AAAA,EACX,GAAG,CAAC,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,WAAW,CAAC,CAAA;AAC3C,EAAA,OAAO,QAAA;AACX;AAEA,SAAS,qBAAA,CAAsB,KAAA,EAAiB,OAAA,EAAkB,eAAA,EAA0B;AACxF,EAAA,KAAA,CAAM,WAAW,OAAO,CAAA;AACxB,EAAA,IAAI,OAAA,IAAW,eAAA,IAAmB,KAAA,CAAM,MAAA,EAAQ;AAC5C,IAAA,qBAAA,CAAsB,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,EAClD;AACJ;AAEA,SAAS,qBAAqB,KAAA,EAAiB;AAC3C,EAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAClC;AAMA,SAAS,iBAAiB,KAAA,EAA0B;AAChD,EAAA,IAAI,CAAC,MAAM,QAAA,IAAY,KAAA,CAAM,SAAS,QAAA,EAAS,CAAE,WAAW,CAAA,EAAG;AAC3D,IAAA,OAAO,KAAA;AAAA,EACX,CAAA,MAAO;AACH,IAAA,OAAO,MAAM,QAAA,CAAS,QAAA,EAAS,CAAE,IAAA,CAAK,CAAC,UAAA,KAAe;AAClD,MAAA,MAAM,WAAA,GAAc,oBAAoB,UAAU,CAAA;AAClD,MAAA,OAAO,WAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AACJ;;;;"}
|
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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"}
|