@open-pioneer/toc 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +4 -2
- package/i18n/de.yaml +1 -0
- package/i18n/en.yaml +1 -0
- package/package.json +10 -10
- package/ui/LayerList/LayerItem.js +70 -46
- package/ui/LayerList/LayerItem.js.map +1 -1
- package/ui/LayerList/hooks.d.ts +2 -0
- package/ui/LayerList/hooks.js +7 -1
- package/ui/LayerList/hooks.js.map +1 -1
- package/ui/Toc.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @open-pioneer/toc
|
|
2
2
|
|
|
3
|
+
## 1.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 10338fa: Update OpenLayers to 10.7.0
|
|
8
|
+
- c38b619: Layers that are not visible in the current resolution of the map are indicated with an icon and disabled text (but are still selectable by the user).
|
|
9
|
+
- a8b8a36: Update trails core packages to 4.3.0
|
|
10
|
+
- 10338fa: Update Chakra to 3.29.0
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- fce7fa9: Implement stricter null safety checks.
|
|
15
|
+
- Updated dependencies [fce7fa9]
|
|
16
|
+
- Updated dependencies [c38b619]
|
|
17
|
+
- Updated dependencies [10338fa]
|
|
18
|
+
- Updated dependencies [c38b619]
|
|
19
|
+
- Updated dependencies [a8b8a36]
|
|
20
|
+
- Updated dependencies [10338fa]
|
|
21
|
+
- Updated dependencies [c38b619]
|
|
22
|
+
- @open-pioneer/map@1.1.0
|
|
23
|
+
- @open-pioneer/basemap-switcher@1.1.0
|
|
24
|
+
|
|
3
25
|
## 1.0.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -98,7 +98,8 @@ Layers that are marked as `internal` are not considered by the Toc.
|
|
|
98
98
|
|
|
99
99
|
```typescript
|
|
100
100
|
//internal layer will not be displayed in the Toc
|
|
101
|
-
const internalLayer =
|
|
101
|
+
const internalLayer = layerFactory.create({
|
|
102
|
+
type: SimpleLayer,
|
|
102
103
|
id: "layer1",
|
|
103
104
|
title: "layer 1",
|
|
104
105
|
olLayer: myOlLayer,
|
|
@@ -110,7 +111,8 @@ The layer's `internal` state also affects other UI widgets (e.g. Legend). If the
|
|
|
110
111
|
|
|
111
112
|
```typescript
|
|
112
113
|
//use listMode to hide the layer specifically in Toc
|
|
113
|
-
const hiddenLayer =
|
|
114
|
+
const hiddenLayer = layerFactory.create({
|
|
115
|
+
type: SimpleLayer,
|
|
114
116
|
id: "layer1",
|
|
115
117
|
title: "layer 1",
|
|
116
118
|
olLayer: myOlLayer,
|
package/i18n/de.yaml
CHANGED
package/i18n/en.yaml
CHANGED
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.1.0",
|
|
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,18 @@
|
|
|
14
14
|
"directory": "src/packages/toc"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@chakra-ui/react": "^3.
|
|
18
|
-
"@open-pioneer/react-utils": "^4.
|
|
19
|
-
"@open-pioneer/runtime": "^4.
|
|
17
|
+
"@chakra-ui/react": "^3.29.0",
|
|
18
|
+
"@open-pioneer/react-utils": "^4.3.0",
|
|
19
|
+
"@open-pioneer/runtime": "^4.3.0",
|
|
20
20
|
"classnames": "^2.5.1",
|
|
21
|
-
"ol": "^10.
|
|
21
|
+
"ol": "^10.7.0",
|
|
22
22
|
"react": "^19.2.0",
|
|
23
23
|
"react-icons": "^5.5.0",
|
|
24
|
-
"@open-pioneer/reactivity": "^4.
|
|
25
|
-
"@conterra/reactivity-core": "^0.8.
|
|
26
|
-
"@open-pioneer/chakra-snippets": "^4.
|
|
27
|
-
"@open-pioneer/basemap-switcher": "^1.
|
|
28
|
-
"@open-pioneer/map": "^1.
|
|
24
|
+
"@open-pioneer/reactivity": "^4.3.0",
|
|
25
|
+
"@conterra/reactivity-core": "^0.8.1",
|
|
26
|
+
"@open-pioneer/chakra-snippets": "^4.3.0",
|
|
27
|
+
"@open-pioneer/basemap-switcher": "^1.1.0",
|
|
28
|
+
"@open-pioneer/map": "^1.1.0"
|
|
29
29
|
},
|
|
30
30
|
"exports": {
|
|
31
31
|
"./package.json": "./package.json",
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Box, Flex, Spacer, Collapsible, CollapsibleContent, IconButton, Icon } from '@chakra-ui/react';
|
|
2
|
+
import { Box, Flex, Text, Spacer, Collapsible, CollapsibleContent, IconButton, Icon } from '@chakra-ui/react';
|
|
3
3
|
import { Checkbox } from '@open-pioneer/chakra-snippets/checkbox';
|
|
4
4
|
import { Tooltip } from '@open-pioneer/chakra-snippets/tooltip';
|
|
5
5
|
import { useReactiveSnapshot } from '@open-pioneer/reactivity';
|
|
6
6
|
import classNames from 'classnames';
|
|
7
7
|
import { useIntl } from '../../_virtual/_virtual-pioneer-module_react-hooks.js';
|
|
8
8
|
import { memo, useId, useMemo, useRef, useEffect } from 'react';
|
|
9
|
-
import { LuTriangleAlert, LuChevronDown, LuChevronRight } from 'react-icons/lu';
|
|
9
|
+
import { LuTriangleAlert, LuInfo, LuChevronDown, LuChevronRight } from 'react-icons/lu';
|
|
10
10
|
import { useTocModel } from '../../model/context.js';
|
|
11
11
|
import { TocItemImpl } from '../../model/TocItemImpl.js';
|
|
12
12
|
import '@conterra/reactivity-core';
|
|
13
13
|
import { slug } from '../../utils/slug.js';
|
|
14
|
-
import { useLoadState, useChildLayers } from './hooks.js';
|
|
14
|
+
import { useLoadState, useVisibleInScale, useChildLayers } from './hooks.js';
|
|
15
15
|
import { LayerItemMenu } from './LayerItemMenu.js';
|
|
16
16
|
import { LayerList } from './LayerList.js';
|
|
17
17
|
import { displayItemForLayer } from '../../utils/displayLayer.js';
|
|
@@ -24,9 +24,7 @@ const LayerItem = memo(function LayerItem2(props) {
|
|
|
24
24
|
const expanded = useReactiveSnapshot(() => tocItem.isExpanded, [tocItem]);
|
|
25
25
|
const isCollapsible = tocOptions ? tocOptions.collapsibleGroups : false;
|
|
26
26
|
const layerGroupId = useId();
|
|
27
|
-
const isAvailable = useLoadState(layer) !== "error";
|
|
28
27
|
const listMode = useListMode(layer)?.listMode;
|
|
29
|
-
const notAvailableLabel = intl.formatMessage({ id: "layerNotAvailable" });
|
|
30
28
|
const { title, description, isVisible, allChildrenHidden } = useReactiveSnapshot(() => {
|
|
31
29
|
return {
|
|
32
30
|
title: layer.title,
|
|
@@ -36,14 +34,22 @@ const LayerItem = memo(function LayerItem2(props) {
|
|
|
36
34
|
//re-evaluates if a child layer's list mode or internal state changes
|
|
37
35
|
};
|
|
38
36
|
}, [layer]);
|
|
37
|
+
const { problemIndicator, problemLabel, disabled, opacity } = useItemProblem(layer, intl);
|
|
38
|
+
const ariaLabel = useMemo(() => {
|
|
39
|
+
let label = title;
|
|
40
|
+
if (problemLabel) {
|
|
41
|
+
label += " " + problemLabel;
|
|
42
|
+
}
|
|
43
|
+
return label;
|
|
44
|
+
}, [title, problemLabel]);
|
|
39
45
|
const nestedChildren = useNestedChildren(layerGroupId, title, layer, intl);
|
|
40
46
|
let hasNestedChildren = !!nestedChildren;
|
|
41
|
-
if (!display) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
47
|
if (allChildrenHidden || listMode === "hide-children") {
|
|
45
48
|
hasNestedChildren = false;
|
|
46
49
|
}
|
|
50
|
+
if (!display) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
47
53
|
return /* @__PURE__ */ jsxs(
|
|
48
54
|
Box,
|
|
49
55
|
{
|
|
@@ -75,34 +81,18 @@ const LayerItem = memo(function LayerItem2(props) {
|
|
|
75
81
|
/* @__PURE__ */ jsx(
|
|
76
82
|
Checkbox,
|
|
77
83
|
{
|
|
78
|
-
"aria-label":
|
|
84
|
+
"aria-label": ariaLabel,
|
|
79
85
|
checked: isVisible,
|
|
80
|
-
disabled
|
|
86
|
+
disabled,
|
|
81
87
|
onCheckedChange: (event) => updateLayerVisibility(
|
|
82
88
|
layer,
|
|
83
89
|
event.checked === true,
|
|
84
90
|
tocOptions.autoShowParents
|
|
85
91
|
),
|
|
86
|
-
children: title
|
|
87
|
-
}
|
|
88
|
-
),
|
|
89
|
-
!isAvailable && /* @__PURE__ */ jsx(
|
|
90
|
-
Tooltip,
|
|
91
|
-
{
|
|
92
|
-
content: notAvailableLabel,
|
|
93
|
-
positioning: { placement: "right" },
|
|
94
|
-
openDelay: 500,
|
|
95
|
-
contentProps: { className: "toc-layer-item-content-tooltip" },
|
|
96
|
-
children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
97
|
-
LuTriangleAlert,
|
|
98
|
-
{
|
|
99
|
-
className: "toc-layer-item-content-icon",
|
|
100
|
-
color: "red",
|
|
101
|
-
"aria-label": notAvailableLabel
|
|
102
|
-
}
|
|
103
|
-
) })
|
|
92
|
+
children: /* @__PURE__ */ jsx(Text, { as: "span", opacity, children: title })
|
|
104
93
|
}
|
|
105
94
|
),
|
|
95
|
+
problemIndicator,
|
|
106
96
|
/* @__PURE__ */ jsx(Spacer, {}),
|
|
107
97
|
/* @__PURE__ */ jsx(LayerItemMenu, { layer, title, description, intl })
|
|
108
98
|
]
|
|
@@ -113,24 +103,6 @@ const LayerItem = memo(function LayerItem2(props) {
|
|
|
113
103
|
}
|
|
114
104
|
);
|
|
115
105
|
});
|
|
116
|
-
function useNestedChildren(layerGroupId, title, layer, intl) {
|
|
117
|
-
const childLayers = useChildLayers(layer);
|
|
118
|
-
const children = useMemo(() => {
|
|
119
|
-
if (childLayers?.length) {
|
|
120
|
-
return /* @__PURE__ */ jsx(
|
|
121
|
-
LayerList,
|
|
122
|
-
{
|
|
123
|
-
id: layerGroupId,
|
|
124
|
-
layers: childLayers,
|
|
125
|
-
ml: 4,
|
|
126
|
-
"aria-label": intl.formatMessage({ id: "childgroupLabel" }, { title })
|
|
127
|
-
}
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
return void 0;
|
|
131
|
-
}, [layerGroupId, intl, title, childLayers]);
|
|
132
|
-
return children;
|
|
133
|
-
}
|
|
134
106
|
function CollapseButton(props) {
|
|
135
107
|
const { layerTitle, layerGroupId, expanded, onClick, hasNestedChildren } = props;
|
|
136
108
|
const icon = expanded ? /* @__PURE__ */ jsx(LuChevronDown, {}) : /* @__PURE__ */ jsx(LuChevronRight, {});
|
|
@@ -159,6 +131,18 @@ function CollapseButton(props) {
|
|
|
159
131
|
}
|
|
160
132
|
);
|
|
161
133
|
}
|
|
134
|
+
function ProblemIndicator(props) {
|
|
135
|
+
const { message, Icon: Icon2, color } = props;
|
|
136
|
+
return /* @__PURE__ */ jsx(
|
|
137
|
+
Tooltip,
|
|
138
|
+
{
|
|
139
|
+
content: message,
|
|
140
|
+
positioning: { placement: "right" },
|
|
141
|
+
contentProps: { className: "toc-layer-item-problem-indicator-tooltip" },
|
|
142
|
+
children: /* @__PURE__ */ jsx("span", { className: "toc-layer-item-problem-indicator", children: /* @__PURE__ */ jsx(Icon2, { "aria-label": message, color }) })
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
}
|
|
162
146
|
function useTocItem(layer, display) {
|
|
163
147
|
const tocModel = useTocModel();
|
|
164
148
|
const options = useReactiveSnapshot(() => tocModel.options, [tocModel]);
|
|
@@ -179,12 +163,52 @@ function useTocItem(layer, display) {
|
|
|
179
163
|
}, [tocModel, tocItem, display]);
|
|
180
164
|
return [tocItem, tocModel, options, tocItemElemRef];
|
|
181
165
|
}
|
|
166
|
+
function useItemProblem(layer, intl) {
|
|
167
|
+
const isAvailable = useLoadState(layer) !== "error";
|
|
168
|
+
const visibleInScale = useVisibleInScale(layer);
|
|
169
|
+
return useMemo(() => {
|
|
170
|
+
let problemIndicator;
|
|
171
|
+
let problemLabel;
|
|
172
|
+
let opacity;
|
|
173
|
+
let disabled;
|
|
174
|
+
if (!isAvailable) {
|
|
175
|
+
const label = intl.formatMessage({ id: "layerNotAvailable" });
|
|
176
|
+
problemIndicator = /* @__PURE__ */ jsx(ProblemIndicator, { message: label, Icon: LuTriangleAlert, color: "red" });
|
|
177
|
+
problemLabel = label;
|
|
178
|
+
disabled = true;
|
|
179
|
+
} else if (!visibleInScale) {
|
|
180
|
+
const label = intl.formatMessage({ id: "layerNotVisible" });
|
|
181
|
+
problemIndicator = /* @__PURE__ */ jsx(ProblemIndicator, { message: label, Icon: LuInfo });
|
|
182
|
+
problemLabel = label;
|
|
183
|
+
opacity = 0.5;
|
|
184
|
+
}
|
|
185
|
+
return { problemIndicator, problemLabel, opacity, disabled };
|
|
186
|
+
}, [isAvailable, visibleInScale, intl]);
|
|
187
|
+
}
|
|
182
188
|
function useListMode(layer) {
|
|
183
189
|
return useReactiveSnapshot(
|
|
184
190
|
() => layer.attributes.toc,
|
|
185
191
|
[layer]
|
|
186
192
|
);
|
|
187
193
|
}
|
|
194
|
+
function useNestedChildren(layerGroupId, title, layer, intl) {
|
|
195
|
+
const childLayers = useChildLayers(layer);
|
|
196
|
+
const children = useMemo(() => {
|
|
197
|
+
if (childLayers?.length) {
|
|
198
|
+
return /* @__PURE__ */ jsx(
|
|
199
|
+
LayerList,
|
|
200
|
+
{
|
|
201
|
+
id: layerGroupId,
|
|
202
|
+
layers: childLayers,
|
|
203
|
+
ml: 4,
|
|
204
|
+
"aria-label": intl.formatMessage({ id: "childgroupLabel" }, { title })
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
return void 0;
|
|
209
|
+
}, [layerGroupId, intl, title, childLayers]);
|
|
210
|
+
return children;
|
|
211
|
+
}
|
|
188
212
|
function updateLayerVisibility(layer, visible, autoShowParents) {
|
|
189
213
|
layer.setVisible(visible);
|
|
190
214
|
if (visible && autoShowParents && layer.parent) {
|
|
@@ -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\nimport {\n Box,\n Collapsible,\n CollapsibleContent,\n Flex,\n Icon,\n IconButton,\n Spacer\n} from \"@chakra-ui/react\";\nimport { Checkbox } from \"@open-pioneer/chakra-snippets/checkbox\";\nimport { Tooltip } from \"@open-pioneer/chakra-snippets/tooltip\";\nimport { AnyLayer } from \"@open-pioneer/map\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport classNames from \"classnames\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { memo, ReactNode, useEffect, useId, useMemo, useRef } from \"react\";\nimport { LuTriangleAlert, LuChevronDown, LuChevronRight } from \"react-icons/lu\";\nimport { TocItemImpl, useTocModel } from \"../../model/\";\nimport { slug } from \"../../utils/slug\";\nimport { useChildLayers, useLoadState } from \"./hooks\";\nimport { LayerItemMenu } from \"./LayerItemMenu\";\nimport { LayerList } from \"./LayerList\";\nimport { LayerTocAttributes } from \"../Toc\";\nimport { displayItemForLayer } from \"../../utils/displayLayer\";\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 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 isAvailable = useLoadState(layer) !== \"error\";\n const listMode = useListMode(layer)?.listMode;\n const notAvailableLabel = intl.formatMessage({ id: \"layerNotAvailable\" });\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 nestedChildren = useNestedChildren(layerGroupId, title, layer, intl);\n let hasNestedChildren = !!nestedChildren;\n\n\n if (!display) {\n return null;\n } \n //all children hidden => do not render collapse button and child entries\n if (allChildrenHidden || listMode === \"hide-children\") {\n hasNestedChildren = false;\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 <Checkbox\n // Keyboard navigation jumps only to Checkboxes and uses the texts inside this DOM node.\n // The aria-labels of Tooltip and Icon is ignored by screen reader because they are no child element of the checkbox.\n // To consider the notAvailableLabel, an aria-label at the checkbox is necessary.\n aria-label={title + (!isAvailable ? \" \" + notAvailableLabel : \"\")}\n checked={isVisible}\n disabled={!isAvailable}\n onCheckedChange={(event) =>\n updateLayerVisibility(\n layer,\n event.checked === true,\n tocOptions.autoShowParents\n )\n }\n >\n {title}\n </Checkbox>\n {!isAvailable && (\n <Tooltip\n content={notAvailableLabel}\n positioning={{ placement: \"right\" }}\n openDelay={500}\n contentProps={{ className: \"toc-layer-item-content-tooltip\" }}\n >\n <span>\n <LuTriangleAlert\n className=\"toc-layer-item-content-icon\"\n color={\"red\"}\n aria-label={notAvailableLabel}\n />\n </span>\n </Tooltip>\n )}\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 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 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\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 useListMode(layer: AnyLayer): LayerTocAttributes | undefined {\n return useReactiveSnapshot(\n () => layer.attributes.toc as LayerTocAttributes | undefined,\n [layer]\n );\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 * @param layer\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\n\n"],"names":["LayerItem"],"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\nimport {\n Box,\n Collapsible,\n CollapsibleContent,\n Flex,\n Icon,\n IconButton,\n Spacer,\n Text\n} from \"@chakra-ui/react\";\nimport { Checkbox } from \"@open-pioneer/chakra-snippets/checkbox\";\nimport { Tooltip } from \"@open-pioneer/chakra-snippets/tooltip\";\nimport { AnyLayer } from \"@open-pioneer/map\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport classNames from \"classnames\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { memo, ReactNode, useEffect, useId, useMemo, useRef } from \"react\";\nimport { LuTriangleAlert, LuChevronDown, LuChevronRight, LuInfo } from \"react-icons/lu\";\nimport { TocItemImpl, useTocModel } from \"../../model/\";\nimport { slug } from \"../../utils/slug\";\nimport { useChildLayers, useLoadState, useVisibleInScale } from \"./hooks\";\nimport { LayerItemMenu } from \"./LayerItemMenu\";\nimport { LayerList } from \"./LayerList\";\nimport { LayerTocAttributes } from \"../Toc\";\nimport { displayItemForLayer } from \"../../utils/displayLayer\";\nimport type { IconType } from \"react-icons/lib\";\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(layer, intl);\n const ariaLabel = useMemo(() => {\n let label = title;\n if (problemLabel) {\n label += \" \" + problemLabel;\n }\n return label;\n }, [title, problemLabel]);\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 <Checkbox\n // Keyboard navigation jumps only to Checkboxes and uses the texts inside this DOM node.\n // The aria-labels of Tooltip and Icon is ignored by screen reader because they are no child element of the checkbox.\n // To consider the notAvailableLabel, an aria-label at the checkbox is necessary.\n aria-label={ariaLabel}\n checked={isVisible}\n disabled={disabled}\n onCheckedChange={(event) =>\n updateLayerVisibility(\n layer,\n event.checked === true,\n tocOptions.autoShowParents\n )\n }\n >\n <Text as=\"span\" opacity={opacity}>\n {title}\n </Text>\n </Checkbox>\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: string; 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 <Icon aria-label={message} 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) {\n const isAvailable = useLoadState(layer) !== \"error\";\n const visibleInScale = useVisibleInScale(layer);\n\n return useMemo(() => {\n let problemIndicator;\n let problemLabel;\n let opacity;\n let disabled;\n if (!isAvailable) {\n const label = intl.formatMessage({ id: \"layerNotAvailable\" });\n problemIndicator = (\n <ProblemIndicator message={label} Icon={LuTriangleAlert} color=\"red\" />\n );\n problemLabel = label;\n disabled = true;\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 }, [isAvailable, visibleInScale, intl]);\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/LayerList/hooks.d.ts
CHANGED
|
@@ -8,3 +8,5 @@ export declare function useLayers(map: MapModel): Layer[];
|
|
|
8
8
|
export declare function useChildLayers(layer: AnyLayer): AnyLayer[] | undefined;
|
|
9
9
|
/** Returns the layers current state. */
|
|
10
10
|
export declare function useLoadState(layer: AnyLayer): string;
|
|
11
|
+
/** Returns the layers current visibility. */
|
|
12
|
+
export declare function useVisibleInScale(layer: AnyLayer): boolean;
|
package/ui/LayerList/hooks.js
CHANGED
|
@@ -29,6 +29,12 @@ function useLoadState(layer) {
|
|
|
29
29
|
return target.loadState;
|
|
30
30
|
}, [layer]);
|
|
31
31
|
}
|
|
32
|
+
function useVisibleInScale(layer) {
|
|
33
|
+
return useReactiveSnapshot(() => {
|
|
34
|
+
const target = isSublayer(layer) ? layer.parentLayer : layer;
|
|
35
|
+
return target.visibleInScale;
|
|
36
|
+
}, [layer]);
|
|
37
|
+
}
|
|
32
38
|
|
|
33
|
-
export { useChildLayers, useLayers, useLoadState };
|
|
39
|
+
export { useChildLayers, useLayers, useLoadState, useVisibleInScale };
|
|
34
40
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["hooks.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { AnyLayer, isSublayer, Layer, MapModel } from \"@open-pioneer/map\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\n\n/** Returns the top level operational layers in render order (topmost layer first). */\nexport function useLayers(map: MapModel): Layer[] {\n return useReactiveSnapshot(() => {\n const layers =\n map.layers.getOperationalLayers({\n sortByDisplayOrder: true,\n includeInternalLayers: true //internal status is handled by LayerItems\n }) ?? [];\n layers.reverse(); // render topmost layer first\n return layers;\n }, [map]);\n}\n\n/**\n * Returns the child layers (sublayers or layers contained in a group layer) of a layer.\n * Layers are returned in render order (topmost sublayer first).\n */\nexport function useChildLayers(layer: AnyLayer): AnyLayer[] | undefined {\n return useReactiveSnapshot(() => {\n const children = layer.children?.getItems({\n sortByDisplayOrder: true,\n includeInternalLayers: true //internal status is handled by LayerItems\n });\n children?.reverse(); // render topmost layer first\n return children;\n }, [layer]);\n}\n\n/** Returns the layers current state. */\nexport function useLoadState(layer: AnyLayer): string {\n return useReactiveSnapshot(() => {\n // for sublayers, use the state of the parent\n const target = isSublayer(layer) ? layer.parentLayer : layer;\n return target.loadState;\n }, [layer]);\n}\n"],"names":[],"mappings":";;;AAMO,SAAS,UAAU,GAAA,EAAwB;AAC9C,EAAA,OAAO,oBAAoB,MAAM;AAC7B,IAAA,MAAM,MAAA,GACF,GAAA,CAAI,MAAA,CAAO,oBAAA,CAAqB;AAAA,MAC5B,kBAAA,EAAoB,IAAA;AAAA,MACpB,qBAAA,EAAuB;AAAA;AAAA,KAC1B,KAAK,EAAC;AACX,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,OAAO,MAAA;AAAA,EACX,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACZ;AAMO,SAAS,eAAe,KAAA,EAAyC;AACpE,EAAA,OAAO,oBAAoB,MAAM;AAC7B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,QAAA,CAAS;AAAA,MACtC,kBAAA,EAAoB,IAAA;AAAA,MACpB,qBAAA,EAAuB;AAAA;AAAA,KAC1B,CAAA;AACD,IAAA,QAAA,EAAU,OAAA,EAAQ;AAClB,IAAA,OAAO,QAAA;AAAA,EACX,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACd;AAGO,SAAS,aAAa,KAAA,EAAyB;AAClD,EAAA,OAAO,oBAAoB,MAAM;AAE7B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAK,CAAA,GAAI,MAAM,WAAA,GAAc,KAAA;AACvD,IAAA,OAAO,MAAA,CAAO,SAAA;AAAA,EAClB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACd;;;;"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["hooks.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { AnyLayer, isSublayer, Layer, MapModel } from \"@open-pioneer/map\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\n\n/** Returns the top level operational layers in render order (topmost layer first). */\nexport function useLayers(map: MapModel): Layer[] {\n return useReactiveSnapshot(() => {\n const layers =\n map.layers.getOperationalLayers({\n sortByDisplayOrder: true,\n includeInternalLayers: true //internal status is handled by LayerItems\n }) ?? [];\n layers.reverse(); // render topmost layer first\n return layers;\n }, [map]);\n}\n\n/**\n * Returns the child layers (sublayers or layers contained in a group layer) of a layer.\n * Layers are returned in render order (topmost sublayer first).\n */\nexport function useChildLayers(layer: AnyLayer): AnyLayer[] | undefined {\n return useReactiveSnapshot(() => {\n const children = layer.children?.getItems({\n sortByDisplayOrder: true,\n includeInternalLayers: true //internal status is handled by LayerItems\n });\n children?.reverse(); // render topmost layer first\n return children;\n }, [layer]);\n}\n\n/** Returns the layers current state. */\nexport function useLoadState(layer: AnyLayer): string {\n return useReactiveSnapshot(() => {\n // for sublayers, use the state of the parent\n const target = isSublayer(layer) ? layer.parentLayer : layer;\n return target.loadState;\n }, [layer]);\n}\n\n/** Returns the layers current visibility. */\nexport function useVisibleInScale(layer: AnyLayer): boolean {\n return useReactiveSnapshot(() => {\n // for sublayers, use the state of the parent\n const target = isSublayer(layer) ? layer.parentLayer : layer;\n\n return target.visibleInScale;\n }, [layer]);\n}\n"],"names":[],"mappings":";;;AAMO,SAAS,UAAU,GAAA,EAAwB;AAC9C,EAAA,OAAO,oBAAoB,MAAM;AAC7B,IAAA,MAAM,MAAA,GACF,GAAA,CAAI,MAAA,CAAO,oBAAA,CAAqB;AAAA,MAC5B,kBAAA,EAAoB,IAAA;AAAA,MACpB,qBAAA,EAAuB;AAAA;AAAA,KAC1B,KAAK,EAAC;AACX,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,OAAO,MAAA;AAAA,EACX,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACZ;AAMO,SAAS,eAAe,KAAA,EAAyC;AACpE,EAAA,OAAO,oBAAoB,MAAM;AAC7B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,EAAU,QAAA,CAAS;AAAA,MACtC,kBAAA,EAAoB,IAAA;AAAA,MACpB,qBAAA,EAAuB;AAAA;AAAA,KAC1B,CAAA;AACD,IAAA,QAAA,EAAU,OAAA,EAAQ;AAClB,IAAA,OAAO,QAAA;AAAA,EACX,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACd;AAGO,SAAS,aAAa,KAAA,EAAyB;AAClD,EAAA,OAAO,oBAAoB,MAAM;AAE7B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAK,CAAA,GAAI,MAAM,WAAA,GAAc,KAAA;AACvD,IAAA,OAAO,MAAA,CAAO,SAAA;AAAA,EAClB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACd;AAGO,SAAS,kBAAkB,KAAA,EAA0B;AACxD,EAAA,OAAO,oBAAoB,MAAM;AAE7B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAK,CAAA,GAAI,MAAM,WAAA,GAAc,KAAA;AAEvD,IAAA,OAAO,MAAA,CAAO,cAAA;AAAA,EAClB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACd;;;;"}
|
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\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 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\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 // eslint-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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"}
|