qwc2 2025.7.2 → 2025.7.6
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/actions/map.js +1 -1
- package/components/AttributeForm.js +1 -1
- package/components/IdentifyViewer.js +4 -4
- package/components/QtDesignerForm.js +1 -1
- package/components/SearchBox.js +1 -1
- package/components/map3d/Compare3D.js +2 -2
- package/components/map3d/EditDataset3D.js +8 -0
- package/components/map3d/ExportObjects3D.js +2 -1
- package/components/map3d/Identify3D.js +1 -1
- package/components/map3d/ImportObjects3D.js +1 -1
- package/components/map3d/LayerTree3D.js +1 -1
- package/components/map3d/Map3D.js +14 -11
- package/components/map3d/Map3DLight.js +5 -5
- package/components/map3d/MapControls3D.js +4 -2
- package/components/map3d/SearchField3D.js +5 -5
- package/components/map3d/drawtool/EditTool3D.js +5 -7
- package/components/map3d/drawtool/NumericInput3D.js +3 -2
- package/components/map3d/drawtool/style/NumericInput3D.css +12 -0
- package/components/map3d/style/Map3D.css +10 -0
- package/components/map3d/utils/FirstPersonControls3D.js +3 -3
- package/components/map3d/utils/MiscUtils3D.js +7 -6
- package/components/map3d/utils/OrbitControls3D.js +1 -1
- package/components/style/SideBar.css +2 -0
- package/components/widgets/NumberInput.js +1 -1
- package/components/widgets/SearchWidget.js +1 -1
- package/icons/above.svg +81 -0
- package/icons/below.svg +81 -0
- package/icons/middle_h.svg +83 -0
- package/icons/middle_v.svg +83 -0
- package/package.json +1 -1
- package/plugins/API.js +49 -13
- package/plugins/FeatureForm.js +1 -1
- package/plugins/LayerTree.js +1 -1
- package/plugins/MapLegend.js +1 -1
- package/plugins/NewsPopup.js +2 -2
- package/plugins/TopBar.js +1 -1
- package/plugins/View3D.js +7 -6
- package/plugins/style/MapLegend.css +4 -2
- package/reducers/map.js +3 -3
- package/static/translations/bg-BG.json +0 -1
- package/static/translations/ca-ES.json +265 -266
- package/static/translations/cs-CZ.json +0 -1
- package/static/translations/de-CH.json +1 -2
- package/static/translations/de-DE.json +1 -2
- package/static/translations/en-US.json +1 -2
- package/static/translations/es-ES.json +264 -265
- package/static/translations/fi-FI.json +0 -1
- package/static/translations/fr-FR.json +1 -2
- package/static/translations/hu-HU.json +0 -1
- package/static/translations/it-IT.json +1 -2
- package/static/translations/ja-JP.json +26 -27
- package/static/translations/nl-NL.json +0 -1
- package/static/translations/no-NO.json +0 -1
- package/static/translations/pl-PL.json +0 -1
- package/static/translations/pt-BR.json +0 -1
- package/static/translations/pt-PT.json +0 -1
- package/static/translations/ro-RO.json +0 -1
- package/static/translations/ru-RU.json +0 -1
- package/static/translations/sv-SE.json +0 -1
- package/static/translations/tr-TR.json +0 -1
- package/static/translations/tsconfig.json +0 -1
- package/utils/ConfigUtils.js +2 -2
- package/utils/MapUtils.js +3 -3
- package/utils/img/person.png +0 -0
- package/components/map3d/drawtool/TransformControls.js +0 -259
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
version="1.1"
|
|
4
|
+
width="24"
|
|
5
|
+
height="24"
|
|
6
|
+
viewBox="0 0 24 24"
|
|
7
|
+
id="svg6"
|
|
8
|
+
sodipodi:docname="both.svg"
|
|
9
|
+
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
|
10
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
11
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
12
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
13
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
|
14
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
15
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
|
16
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
17
|
+
<metadata
|
|
18
|
+
id="metadata12">
|
|
19
|
+
<rdf:RDF>
|
|
20
|
+
<cc:Work
|
|
21
|
+
rdf:about="">
|
|
22
|
+
<dc:format>image/svg+xml</dc:format>
|
|
23
|
+
<dc:type
|
|
24
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
25
|
+
<dc:title>uniE080</dc:title>
|
|
26
|
+
</cc:Work>
|
|
27
|
+
</rdf:RDF>
|
|
28
|
+
</metadata>
|
|
29
|
+
<defs
|
|
30
|
+
id="defs10" />
|
|
31
|
+
<sodipodi:namedview
|
|
32
|
+
pagecolor="#ffffff"
|
|
33
|
+
bordercolor="#666666"
|
|
34
|
+
borderopacity="1"
|
|
35
|
+
objecttolerance="10"
|
|
36
|
+
gridtolerance="10"
|
|
37
|
+
guidetolerance="10"
|
|
38
|
+
inkscape:pageopacity="0"
|
|
39
|
+
inkscape:pageshadow="2"
|
|
40
|
+
inkscape:window-width="1920"
|
|
41
|
+
inkscape:window-height="1172"
|
|
42
|
+
id="namedview8"
|
|
43
|
+
showgrid="true"
|
|
44
|
+
inkscape:zoom="14.75"
|
|
45
|
+
inkscape:cx="4.6101695"
|
|
46
|
+
inkscape:cy="5.3898305"
|
|
47
|
+
inkscape:window-x="0"
|
|
48
|
+
inkscape:window-y="0"
|
|
49
|
+
inkscape:window-maximized="1"
|
|
50
|
+
inkscape:current-layer="g1132"
|
|
51
|
+
inkscape:document-rotation="0"
|
|
52
|
+
inkscape:pagecheckerboard="0"
|
|
53
|
+
inkscape:showpageshadow="2"
|
|
54
|
+
inkscape:deskcolor="#d1d1d1">
|
|
55
|
+
<inkscape:grid
|
|
56
|
+
type="xygrid"
|
|
57
|
+
id="grid908"
|
|
58
|
+
originx="0"
|
|
59
|
+
originy="0"
|
|
60
|
+
spacingy="1"
|
|
61
|
+
spacingx="1"
|
|
62
|
+
units="px" />
|
|
63
|
+
</sodipodi:namedview>
|
|
64
|
+
<title
|
|
65
|
+
id="title2">uniE080</title>
|
|
66
|
+
<g
|
|
67
|
+
id="g3356"
|
|
68
|
+
transform="translate(4.2175145,-1.0000001)">
|
|
69
|
+
<g
|
|
70
|
+
id="g1132">
|
|
71
|
+
<path
|
|
72
|
+
id="rect847"
|
|
73
|
+
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stop-color:#000000"
|
|
74
|
+
d="M 5.7824855 3.0000001 L 5.7824855 11 L 2.7824855 11 L 2.7824855 7.0000001 L -3.2175145 13 L 2.7824855 19 L 2.7824855 15 L 5.7824855 15 L 5.7824855 23 L 9.7824855 23 L 9.7824855 15 L 12.782485 15 L 12.782485 19 L 18.782485 13 L 12.782485 7.0000001 L 12.782485 11 L 9.7824855 11 L 9.7824855 3.0000001 L 5.7824855 3.0000001 z " />
|
|
75
|
+
<g
|
|
76
|
+
id="g1126"
|
|
77
|
+
transform="rotate(135,0.59619369,-3.6213202)" />
|
|
78
|
+
<g
|
|
79
|
+
id="g1126-7"
|
|
80
|
+
transform="matrix(0.70710678,0.70710678,0.70710678,-0.70710678,9.1078645,-6.603553)" />
|
|
81
|
+
</g>
|
|
82
|
+
</g>
|
|
83
|
+
</svg>
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
version="1.1"
|
|
4
|
+
width="24"
|
|
5
|
+
height="24"
|
|
6
|
+
viewBox="0 0 24 24"
|
|
7
|
+
id="svg6"
|
|
8
|
+
sodipodi:docname="middle_v.svg"
|
|
9
|
+
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
|
10
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
11
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
12
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
13
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
|
14
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
15
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
|
16
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
17
|
+
<metadata
|
|
18
|
+
id="metadata12">
|
|
19
|
+
<rdf:RDF>
|
|
20
|
+
<cc:Work
|
|
21
|
+
rdf:about="">
|
|
22
|
+
<dc:format>image/svg+xml</dc:format>
|
|
23
|
+
<dc:type
|
|
24
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
25
|
+
<dc:title>uniE080</dc:title>
|
|
26
|
+
</cc:Work>
|
|
27
|
+
</rdf:RDF>
|
|
28
|
+
</metadata>
|
|
29
|
+
<defs
|
|
30
|
+
id="defs10" />
|
|
31
|
+
<sodipodi:namedview
|
|
32
|
+
pagecolor="#ffffff"
|
|
33
|
+
bordercolor="#666666"
|
|
34
|
+
borderopacity="1"
|
|
35
|
+
objecttolerance="10"
|
|
36
|
+
gridtolerance="10"
|
|
37
|
+
guidetolerance="10"
|
|
38
|
+
inkscape:pageopacity="0"
|
|
39
|
+
inkscape:pageshadow="2"
|
|
40
|
+
inkscape:window-width="1920"
|
|
41
|
+
inkscape:window-height="1172"
|
|
42
|
+
id="namedview8"
|
|
43
|
+
showgrid="true"
|
|
44
|
+
inkscape:zoom="14.75"
|
|
45
|
+
inkscape:cx="4.6101695"
|
|
46
|
+
inkscape:cy="5.3898305"
|
|
47
|
+
inkscape:window-x="0"
|
|
48
|
+
inkscape:window-y="0"
|
|
49
|
+
inkscape:window-maximized="1"
|
|
50
|
+
inkscape:current-layer="g1132"
|
|
51
|
+
inkscape:document-rotation="0"
|
|
52
|
+
inkscape:pagecheckerboard="0"
|
|
53
|
+
inkscape:showpageshadow="2"
|
|
54
|
+
inkscape:deskcolor="#d1d1d1">
|
|
55
|
+
<inkscape:grid
|
|
56
|
+
type="xygrid"
|
|
57
|
+
id="grid908"
|
|
58
|
+
originx="0"
|
|
59
|
+
originy="0"
|
|
60
|
+
spacingy="1"
|
|
61
|
+
spacingx="1"
|
|
62
|
+
units="px" />
|
|
63
|
+
</sodipodi:namedview>
|
|
64
|
+
<title
|
|
65
|
+
id="title2">uniE080</title>
|
|
66
|
+
<g
|
|
67
|
+
id="g3356"
|
|
68
|
+
transform="translate(4.2175145,-1.0000001)">
|
|
69
|
+
<g
|
|
70
|
+
id="g1132">
|
|
71
|
+
<path
|
|
72
|
+
id="rect847"
|
|
73
|
+
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;stop-color:#000000"
|
|
74
|
+
d="M 17.782485,11 H 9.7824853 V 8.0000003 h 3.9999997 l -5.9999997,-6 -6,6 h 4 V 11 h -8 v 4 h 8 v 3 h -4 l 6,6 5.9999997,-6 H 9.7824853 v -3 h 7.9999997 z" />
|
|
75
|
+
<g
|
|
76
|
+
id="g1126"
|
|
77
|
+
transform="rotate(135,0.59619369,-3.6213202)" />
|
|
78
|
+
<g
|
|
79
|
+
id="g1126-7"
|
|
80
|
+
transform="matrix(0.70710678,0.70710678,0.70710678,-0.70710678,9.1078645,-6.603553)" />
|
|
81
|
+
</g>
|
|
82
|
+
</g>
|
|
83
|
+
</svg>
|
package/package.json
CHANGED
package/plugins/API.js
CHANGED
|
@@ -4,30 +4,55 @@ function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import ol from"openlayers";import PropTypes from"prop-types";import*as uuid from"uuid";import*as displayActions from"../actions/display";import*as editingActions from"../actions/editing";import{LayerRole}from"../actions/layers";import*as layerActions from"../actions/layers";import{registerCustomPlugin,unregisterCustomPlugin}from"../actions/localConfig";import*as localeActions from"../actions/locale";import*as locateActions from"../actions/locate";import*as mapActions from"../actions/map";import*as taskActions from"../actions/task";import*as themeActions from"../actions/theme";import*as windowsActions from"../actions/windows";import AppMenu from"../components/AppMenu";import AttributeForm from"../components/AttributeForm";import AttributeTableWidget from"../components/AttributeTableWidget";import AutoEditForm from"../components/AutoEditForm";import CoordinateDisplayer from"../components/CoordinateDisplayer";import EditComboField from"../components/EditComboField";import EditUploadField from"../components/EditUploadField";import FullscreenSwitcher from"../components/FullscreenSwitcher";import Icon from"../components/Icon";import IdentifyViewer from"../components/IdentifyViewer";import ImportLayer from"../components/ImportLayer";import LayerInfoWindow from"../components/LayerInfoWindow";import LinkFeatureForm from"../components/LinkFeatureForm";import MapSelection from"../components/MapSelection";import NumericInputWindow from"../components/NumericInputWindow";import PickFeature from"../components/PickFeature";import PluginsContainer from"../components/PluginsContainer";import PrintSelection from"../components/PrintSelection";import QtDesignerForm from"../components/QtDesignerForm";import ResizeableWindow from"../components/ResizeableWindow";import SearchBox from"../components/SearchBox";import ServiceInfoWindow from"../components/ServiceInfoWindow";import SideBar from"../components/SideBar";import{Swipeable}from"../components/Swipeable";import TaskBar from"../components/TaskBar";import ThemeLayersListWindow from"../components/ThemeLayersListWindow";import ThemeList from"../components/ThemeList";import Toolbar from"../components/Toolbar";import ShareLink from"../components/share/ShareLink";import ShareQRCode from"../components/share/ShareQRCode";import ShareSocials from"../components/share/ShareSocials";import FixedTimeline from"../components/timeline/FixedTimeline";import InfiniteTimeline from"../components/timeline/InfiniteTimeline";import TimelineFeaturesSlider from"../components/timeline/TimelineFeaturesSlider";import AccordeonWidget from"../components/widgets/AccordeonWidget";import ButtonBar from"../components/widgets/ButtonBar";import ColorButton from"../components/widgets/ColorButton";import ComboBox from"../components/widgets/ComboBox";import CopyButton from"../components/widgets/CopyButton";import DateTimeInput from"../components/widgets/DateTimeInput";import EditableSelect from"../components/widgets/EditableSelect";import FileSelector from"../components/widgets/FileSelector";import Input from"../components/widgets/Input";import InputContainer from"../components/widgets/InputContainer";import LayerCatalogWidget from"../components/widgets/LayerCatalogWidget";import MenuButton from"../components/widgets/MenuButton";import ModalDialog from"../components/widgets/ModalDialog";import NavBar from"../components/widgets/NavBar";import NumberInput from"../components/widgets/NumberInput";import PopupMenu from"../components/widgets/PopupMenu";import{Image}from"../components/widgets/Primitives";import SearchWidget from"../components/widgets/SearchWidget";import Spinner from"../components/widgets/Spinner";import SuggestionInput from"../components/widgets/SuggestionInput";import TextInput from"../components/widgets/TextInput";import ToggleSwitch from"../components/widgets/ToggleSwitch";import VectorLayerPicker from"../components/widgets/VectorLayerPicker";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import EditingInterface from"../utils/EditingInterface";import*as EditingUtils from"../utils/EditingUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import*as PermaLinkUtils from"../utils/PermaLinkUtils";import{SearchResultType}from"../utils/SearchProviders";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";/**
|
|
7
|
+
*/import React from"react";import ReactDOM from"react-dom";import{connect}from"react-redux";import axios from"axios";import ol from"openlayers";import PropTypes from"prop-types";import url from"url";import*as uuid from"uuid";import*as displayActions from"../actions/display";import*as editingActions from"../actions/editing";import{LayerRole}from"../actions/layers";import*as layerActions from"../actions/layers";import{registerCustomPlugin,unregisterCustomPlugin}from"../actions/localConfig";import*as localeActions from"../actions/locale";import*as locateActions from"../actions/locate";import*as mapActions from"../actions/map";import*as taskActions from"../actions/task";import*as themeActions from"../actions/theme";import*as windowsActions from"../actions/windows";import AppMenu from"../components/AppMenu";import AttributeForm from"../components/AttributeForm";import AttributeTableWidget from"../components/AttributeTableWidget";import AutoEditForm from"../components/AutoEditForm";import CoordinateDisplayer from"../components/CoordinateDisplayer";import EditComboField from"../components/EditComboField";import EditUploadField from"../components/EditUploadField";import FullscreenSwitcher from"../components/FullscreenSwitcher";import Icon from"../components/Icon";import IdentifyViewer from"../components/IdentifyViewer";import ImportLayer from"../components/ImportLayer";import LayerInfoWindow from"../components/LayerInfoWindow";import LinkFeatureForm from"../components/LinkFeatureForm";import MapSelection from"../components/MapSelection";import NumericInputWindow from"../components/NumericInputWindow";import PickFeature from"../components/PickFeature";import PluginsContainer from"../components/PluginsContainer";import PrintSelection from"../components/PrintSelection";import QtDesignerForm from"../components/QtDesignerForm";import ResizeableWindow from"../components/ResizeableWindow";import SearchBox from"../components/SearchBox";import ServiceInfoWindow from"../components/ServiceInfoWindow";import SideBar from"../components/SideBar";import{Swipeable}from"../components/Swipeable";import TaskBar from"../components/TaskBar";import ThemeLayersListWindow from"../components/ThemeLayersListWindow";import ThemeList from"../components/ThemeList";import Toolbar from"../components/Toolbar";import ShareLink from"../components/share/ShareLink";import ShareQRCode from"../components/share/ShareQRCode";import ShareSocials from"../components/share/ShareSocials";import FixedTimeline from"../components/timeline/FixedTimeline";import InfiniteTimeline from"../components/timeline/InfiniteTimeline";import TimelineFeaturesSlider from"../components/timeline/TimelineFeaturesSlider";import AccordeonWidget from"../components/widgets/AccordeonWidget";import ButtonBar from"../components/widgets/ButtonBar";import ColorButton from"../components/widgets/ColorButton";import ComboBox from"../components/widgets/ComboBox";import CopyButton from"../components/widgets/CopyButton";import DateTimeInput from"../components/widgets/DateTimeInput";import EditableSelect from"../components/widgets/EditableSelect";import FileSelector from"../components/widgets/FileSelector";import Input from"../components/widgets/Input";import InputContainer from"../components/widgets/InputContainer";import LayerCatalogWidget from"../components/widgets/LayerCatalogWidget";import MenuButton from"../components/widgets/MenuButton";import ModalDialog from"../components/widgets/ModalDialog";import NavBar from"../components/widgets/NavBar";import NumberInput from"../components/widgets/NumberInput";import PopupMenu from"../components/widgets/PopupMenu";import{Image}from"../components/widgets/Primitives";import SearchWidget from"../components/widgets/SearchWidget";import Spinner from"../components/widgets/Spinner";import SuggestionInput from"../components/widgets/SuggestionInput";import TextInput from"../components/widgets/TextInput";import ToggleSwitch from"../components/widgets/ToggleSwitch";import VectorLayerPicker from"../components/widgets/VectorLayerPicker";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import EditingInterface from"../utils/EditingInterface";import*as EditingUtils from"../utils/EditingUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import*as PermaLinkUtils from"../utils/PermaLinkUtils";import{SearchResultType}from"../utils/SearchProviders";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";/**
|
|
8
8
|
* Exposes an API for interacting with QWC2 via `window.qwc2`.
|
|
9
9
|
*
|
|
10
10
|
* You can interact with the API as soon as the `QWC2ApiReady` event is dispatched.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
12
|
+
* Here is an example of a custom plugin:
|
|
13
13
|
*
|
|
14
14
|
* ```
|
|
15
15
|
* window.addEventListener("QWC2ApiReady", () => {
|
|
16
|
-
*
|
|
16
|
+
* const {React, PropTypes, connect} = window.qwc2.libs;
|
|
17
|
+
* const {TaskBar} = window.qwc2.components;
|
|
17
18
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
19
|
+
* class CurrentTheme extends React.Component {
|
|
20
|
+
* static propTypes = {
|
|
21
|
+
* theme: PropTypes.object
|
|
22
|
+
* };
|
|
23
|
+
* render() {
|
|
24
|
+
* return React.createElement(TaskBar, {task: "CurrentTheme"},
|
|
25
|
+
* React.createElement(
|
|
26
|
+
* 'span', {role: 'body'},
|
|
27
|
+
* `Current theme: ${this.props.theme?.title}`
|
|
28
|
+
* )
|
|
29
|
+
* );
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
23
32
|
*
|
|
24
|
-
*
|
|
33
|
+
* const CurrentThemePlugin = connect(state => ({
|
|
34
|
+
* theme: state.theme.current
|
|
35
|
+
* }))(CurrentTheme);
|
|
36
|
+
*
|
|
37
|
+
* window.qwc2.addPlugin("CurrentThemePlugin", CurrentThemePlugin);
|
|
25
38
|
* });
|
|
26
39
|
* ```
|
|
27
40
|
*
|
|
28
|
-
* Note
|
|
41
|
+
* *Note*: You can also write the plugin in JSX syntax, and transpile to plain JS using babel.
|
|
42
|
+
*
|
|
43
|
+
* To load custom plugins in QWC:
|
|
44
|
+
*
|
|
45
|
+
* - Include the custom plugin code in `index.html`, i.e.
|
|
46
|
+
*
|
|
47
|
+
* <script type="text/javascript" src="assets/js/currenttheme.js" ></script>
|
|
29
48
|
*
|
|
30
|
-
*
|
|
49
|
+
* - Enable the plugin in the plugins block of `config.json`
|
|
50
|
+
*
|
|
51
|
+
* {
|
|
52
|
+
* "name": "CurrentTheme"
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
55
|
+
* The following action functions are exposed in the API:
|
|
31
56
|
*
|
|
32
57
|
* - [display](https://github.com/qgis/qwc2/blob/master/actions/display.js)
|
|
33
58
|
* - [editing](https://github.com/qgis/qwc2/blob/master/actions/editing.js)
|
|
@@ -40,7 +65,18 @@ function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var
|
|
|
40
65
|
*
|
|
41
66
|
* I.e. `setCurrentTask` is available via `window.qwc2.setCurrentTask`.
|
|
42
67
|
*
|
|
43
|
-
*
|
|
68
|
+
* The following core libraries are accessible via `window.qwc2.libs`:
|
|
69
|
+
*
|
|
70
|
+
* - `axios`
|
|
71
|
+
* - `React`
|
|
72
|
+
* - `ReactDOM`
|
|
73
|
+
* - `PropTypes`
|
|
74
|
+
* - `connect`
|
|
75
|
+
* - `ol`
|
|
76
|
+
* - `uuid`
|
|
77
|
+
* - `url`
|
|
78
|
+
*
|
|
79
|
+
* The QWC shared components are acessible via `window.qwc2.components`, i.e. `window.qwc2.components.SideBar`.
|
|
44
80
|
*
|
|
45
81
|
* In addition, the following methods are available on `window.qwc2`:
|
|
46
82
|
*/var API=/*#__PURE__*/function(_React$Component){function API(){var _this;_classCallCheck(this,API);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,API,[].concat(args));/**
|
|
@@ -115,4 +151,4 @@ function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var
|
|
|
115
151
|
* Return the current application state.
|
|
116
152
|
*/_defineProperty(_this,"getState",function(){return _this.props.state});return _this}_inherits(API,_React$Component);return _createClass(API,[{key:"componentDidMount",value:function componentDidMount(){window.qwc2={__customPlugins:{},__attributeCalculators:{},__identifyExportes:{}};// Auto-binded functions
|
|
117
153
|
for(var _i=0,_Object$keys=Object.keys(this.props);_i<_Object$keys.length;_i++){var prop=_Object$keys[_i];window.qwc2[prop]=this.props[prop]}// Additional exports
|
|
118
|
-
window.qwc2.LayerRole=LayerRole;window.qwc2.addPlugin=this.addPlugin;window.qwc2.removePlugin=this.removePlugin;window.qwc2.addIdentifyAttributeCalculator=this.addIdentifyAttributeCalculator;window.qwc2.removeIdentifyAttributeCalculator=this.removeIdentifyAttributeCalculator;window.qwc2.addIdentifyExporter=this.addIdentifyExporter;window.qwc2.removeIdentifyExporter=this.removeIdentifyExporter;window.qwc2.addExternalLayer=this.addExternalLayer;window.qwc2.drawScratch=this.drawScratch;window.qwc2.drawGeometry=this.drawGeometry;window.qwc2.getState=this.getState;window.qwc2.ConfigUtils=ConfigUtils;window.qwc2.CoordinatesUtils=CoordinatesUtils;window.qwc2.EditingInterface=EditingInterface;window.qwc2.EditingUtils=EditingUtils;window.qwc2.LocaleUtils=LocaleUtils;window.qwc2.MapUtils=MapUtils;window.qwc2.PermaLinkUtils=PermaLinkUtils;window.qwc2.SearchResultType=SearchResultType;window.qwc2.VectorLayerUtils=VectorLayerUtils;window.qwc2.libs={};window.qwc2.libs.axios=axios;window.qwc2.libs.React=React;window.qwc2.libs.PropTypes=PropTypes;window.qwc2.libs.connect=connect;window.qwc2.libs.ol=ol;window.qwc2.libs.uuid=uuid;window.qwc2.components={};window.qwc2.components.AppMenu=AppMenu;window.qwc2.components.AttributeForm=AttributeForm;window.qwc2.components.AttributeTableWidget=AttributeTableWidget;window.qwc2.components.AutoEditForm=AutoEditForm;window.qwc2.components.CoordinateDisplayer=CoordinateDisplayer;window.qwc2.components.EditComboField=EditComboField;window.qwc2.components.EditUploadField=EditUploadField;window.qwc2.components.FullscreenSwitcher=FullscreenSwitcher;window.qwc2.components.Icon=Icon;window.qwc2.components.IdentifyViewer=IdentifyViewer;window.qwc2.components.ImportLayer=ImportLayer;window.qwc2.components.InputContainer=InputContainer;window.qwc2.components.LayerInfoWindow=LayerInfoWindow;window.qwc2.components.LinkFeatureForm=LinkFeatureForm;window.qwc2.components.MapSelection=MapSelection;window.qwc2.components.ModalDialog=ModalDialog;window.qwc2.components.NumericInputWindow=NumericInputWindow;window.qwc2.components.PickFeature=PickFeature;window.qwc2.components.PluginsContainer=PluginsContainer;window.qwc2.components.PopupMenu=PopupMenu;window.qwc2.components.PrintSelection=PrintSelection;window.qwc2.components.QtDesignerForm=QtDesignerForm;window.qwc2.components.ResizeableWindow=ResizeableWindow;window.qwc2.components.SearchBox=SearchBox;window.qwc2.components.ServiceInfoWindow=ServiceInfoWindow;window.qwc2.components.ShareLink=ShareLink;window.qwc2.components.ShareQRCode=ShareQRCode;window.qwc2.components.ShareSocials=ShareSocials;window.qwc2.components.SideBar=SideBar;window.qwc2.components.Spinner=Spinner;window.qwc2.components.Swipeable=Swipeable;window.qwc2.components.TaskBar=TaskBar;window.qwc2.components.ThemeLayersListWindow=ThemeLayersListWindow;window.qwc2.components.ThemeList=ThemeList;window.qwc2.components.FixedTimeline=FixedTimeline;window.qwc2.components.InfiniteTimeline=InfiniteTimeline;window.qwc2.components.TimelineFeaturesSlider=TimelineFeaturesSlider;window.qwc2.components.Toolbar=Toolbar;window.qwc2.components.AccordeonWidget=AccordeonWidget;window.qwc2.components.ButtonBar=ButtonBar;window.qwc2.components.ColorButton=ColorButton;window.qwc2.components.ComboBox=ComboBox;window.qwc2.components.CopyButton=CopyButton;window.qwc2.components.DateTimeInput=DateTimeInput;window.qwc2.components.EditableSelect=EditableSelect;window.qwc2.components.FileSelector=FileSelector;window.qwc2.components.Input=Input;window.qwc2.components.LayerCatalogWidget=LayerCatalogWidget;window.qwc2.components.MenuButton=MenuButton;window.qwc2.components.NavBar=NavBar;window.qwc2.components.NumberInput=NumberInput;window.qwc2.components.Image=Image;window.qwc2.components.SearchWidget=SearchWidget;window.qwc2.components.SuggestionInput=SuggestionInput;window.qwc2.components.TextInput=TextInput;window.qwc2.components.ToggleSwitch=ToggleSwitch;window.qwc2.components.VectorLayerPicker=VectorLayerPicker;window.dispatchEvent(new Event("QWC2ApiReady"))}},{key:"render",value:function render(){return null}}])}(React.Component);_defineProperty(API,"propTypes",{addLayer:PropTypes.func,mapCrs:PropTypes.string,registerCustomPlugin:PropTypes.func,setCurrentTask:PropTypes.func,state:PropTypes.object,unregisterCustomPlugin:PropTypes.func});function extractFunctions(obj){return Object.entries(obj).reduce(function(result,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];if(typeof value==="function"){result[key]=value}return result},{})}export default connect(function(state){return{mapCrs:state.map.projection,state:state}},_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({registerCustomPlugin:registerCustomPlugin,unregisterCustomPlugin:unregisterCustomPlugin},extractFunctions(displayActions)),extractFunctions(editingActions)),extractFunctions(layerActions)),extractFunctions(localeActions)),extractFunctions(locateActions)),extractFunctions(mapActions)),extractFunctions(taskActions)),extractFunctions(themeActions)),extractFunctions(windowsActions)))(API);
|
|
154
|
+
window.qwc2.LayerRole=LayerRole;window.qwc2.addPlugin=this.addPlugin;window.qwc2.removePlugin=this.removePlugin;window.qwc2.addIdentifyAttributeCalculator=this.addIdentifyAttributeCalculator;window.qwc2.removeIdentifyAttributeCalculator=this.removeIdentifyAttributeCalculator;window.qwc2.addIdentifyExporter=this.addIdentifyExporter;window.qwc2.removeIdentifyExporter=this.removeIdentifyExporter;window.qwc2.addExternalLayer=this.addExternalLayer;window.qwc2.drawScratch=this.drawScratch;window.qwc2.drawGeometry=this.drawGeometry;window.qwc2.getState=this.getState;window.qwc2.ConfigUtils=ConfigUtils;window.qwc2.CoordinatesUtils=CoordinatesUtils;window.qwc2.EditingInterface=EditingInterface;window.qwc2.EditingUtils=EditingUtils;window.qwc2.LocaleUtils=LocaleUtils;window.qwc2.MapUtils=MapUtils;window.qwc2.PermaLinkUtils=PermaLinkUtils;window.qwc2.SearchResultType=SearchResultType;window.qwc2.VectorLayerUtils=VectorLayerUtils;window.qwc2.libs={};window.qwc2.libs.axios=axios;window.qwc2.libs.React=React;window.qwc2.libs.ReactDOM=ReactDOM;window.qwc2.libs.PropTypes=PropTypes;window.qwc2.libs.connect=connect;window.qwc2.libs.ol=ol;window.qwc2.libs.url=url;window.qwc2.libs.uuid=uuid;window.qwc2.components={};window.qwc2.components.AppMenu=AppMenu;window.qwc2.components.AttributeForm=AttributeForm;window.qwc2.components.AttributeTableWidget=AttributeTableWidget;window.qwc2.components.AutoEditForm=AutoEditForm;window.qwc2.components.CoordinateDisplayer=CoordinateDisplayer;window.qwc2.components.EditComboField=EditComboField;window.qwc2.components.EditUploadField=EditUploadField;window.qwc2.components.FullscreenSwitcher=FullscreenSwitcher;window.qwc2.components.Icon=Icon;window.qwc2.components.IdentifyViewer=IdentifyViewer;window.qwc2.components.ImportLayer=ImportLayer;window.qwc2.components.InputContainer=InputContainer;window.qwc2.components.LayerInfoWindow=LayerInfoWindow;window.qwc2.components.LinkFeatureForm=LinkFeatureForm;window.qwc2.components.MapSelection=MapSelection;window.qwc2.components.ModalDialog=ModalDialog;window.qwc2.components.NumericInputWindow=NumericInputWindow;window.qwc2.components.PickFeature=PickFeature;window.qwc2.components.PluginsContainer=PluginsContainer;window.qwc2.components.PopupMenu=PopupMenu;window.qwc2.components.PrintSelection=PrintSelection;window.qwc2.components.QtDesignerForm=QtDesignerForm;window.qwc2.components.ResizeableWindow=ResizeableWindow;window.qwc2.components.SearchBox=SearchBox;window.qwc2.components.ServiceInfoWindow=ServiceInfoWindow;window.qwc2.components.ShareLink=ShareLink;window.qwc2.components.ShareQRCode=ShareQRCode;window.qwc2.components.ShareSocials=ShareSocials;window.qwc2.components.SideBar=SideBar;window.qwc2.components.Spinner=Spinner;window.qwc2.components.Swipeable=Swipeable;window.qwc2.components.TaskBar=TaskBar;window.qwc2.components.ThemeLayersListWindow=ThemeLayersListWindow;window.qwc2.components.ThemeList=ThemeList;window.qwc2.components.FixedTimeline=FixedTimeline;window.qwc2.components.InfiniteTimeline=InfiniteTimeline;window.qwc2.components.TimelineFeaturesSlider=TimelineFeaturesSlider;window.qwc2.components.Toolbar=Toolbar;window.qwc2.components.AccordeonWidget=AccordeonWidget;window.qwc2.components.ButtonBar=ButtonBar;window.qwc2.components.ColorButton=ColorButton;window.qwc2.components.ComboBox=ComboBox;window.qwc2.components.CopyButton=CopyButton;window.qwc2.components.DateTimeInput=DateTimeInput;window.qwc2.components.EditableSelect=EditableSelect;window.qwc2.components.FileSelector=FileSelector;window.qwc2.components.Input=Input;window.qwc2.components.LayerCatalogWidget=LayerCatalogWidget;window.qwc2.components.MenuButton=MenuButton;window.qwc2.components.NavBar=NavBar;window.qwc2.components.NumberInput=NumberInput;window.qwc2.components.Image=Image;window.qwc2.components.SearchWidget=SearchWidget;window.qwc2.components.SuggestionInput=SuggestionInput;window.qwc2.components.TextInput=TextInput;window.qwc2.components.ToggleSwitch=ToggleSwitch;window.qwc2.components.VectorLayerPicker=VectorLayerPicker;window.dispatchEvent(new Event("QWC2ApiReady"))}},{key:"render",value:function render(){return null}}])}(React.Component);_defineProperty(API,"propTypes",{addLayer:PropTypes.func,mapCrs:PropTypes.string,registerCustomPlugin:PropTypes.func,setCurrentTask:PropTypes.func,state:PropTypes.object,unregisterCustomPlugin:PropTypes.func});function extractFunctions(obj){return Object.entries(obj).reduce(function(result,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];if(typeof value==="function"){result[key]=value}return result},{})}export default connect(function(state){return{mapCrs:state.map.projection,state:state}},_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({registerCustomPlugin:registerCustomPlugin,unregisterCustomPlugin:unregisterCustomPlugin},extractFunctions(displayActions)),extractFunctions(editingActions)),extractFunctions(layerActions)),extractFunctions(localeActions)),extractFunctions(locateActions)),extractFunctions(mapActions)),extractFunctions(taskActions)),extractFunctions(themeActions)),extractFunctions(windowsActions)))(API);
|
package/plugins/FeatureForm.js
CHANGED
|
@@ -18,4 +18,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
18
18
|
*
|
|
19
19
|
* Can be used as default identify tool by setting `"identifyTool": "FeatureForm"` in `config.json`.
|
|
20
20
|
*/var FeatureForm=/*#__PURE__*/function(_React$Component){function FeatureForm(props){var _this;_classCallCheck(this,FeatureForm);_this=_callSuper(this,FeatureForm,[props]);_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click.button!==0||_this.props.click===prevProps.click||(_this.props.click.features||[]).find(function(feature){return feature.id==="startupposmarker"})){return null}var searchMarker=(_this.props.click.features||[]).find(function(feature){return feature.id==="searchmarker"});if(searchMarker&&searchMarker.geometry.type==="Point"){return searchMarker.geometry.coordinates}return _this.props.click.coordinate});_defineProperty(_this,"queryFeatures",function(pos){var pendingRequests=0;Object.entries(_this.props.theme.editConfig||{}).forEach(function(_ref){var _this$props$filter$fi;var _ref2=_slicedToArray(_ref,2),layerId=_ref2[0],editConfig=_ref2[1];if(!editConfig.geomType){// Skip geometryless datasets
|
|
21
|
-
return}var path=[];var sublayer=null;var mapScale=MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom);var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",layerId,path))});if(!layer||!sublayer||!LayerUtils.sublayerVisible(layer,path)||!LayerUtils.layerScaleInRange(sublayer,mapScale)){return}var layerOrder=layer.params.LAYERS.split(",");++pendingRequests;var editDataset=editConfig.editDataset||layerId;var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom));_this.props.iface.getFeature(editDataset,pos,_this.props.map.projection,scale,96,function(featureCollection){if(featureCollection&&!isEmpty(featureCollection.features)){_this.setState(function(state){var newPickedFeatures=Object.fromEntries(Object.entries(_objectSpread(_objectSpread({},state.pickedFeatures),featureCollection.features.reduce(function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId+"::"+feature.id,feature))},{}))).sort(function(a,b){var partsA=a[0].split("::");var partsB=b[0].split("::");var diff=layerOrder.indexOf(partsB[0])-layerOrder.indexOf(partsA[0]);return diff===0?partsA[1].localeCompare(partsB[1]):diff}));var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?Object.keys(newPickedFeatures)[0]:"";return{pickedFeatures:newPickedFeatures,pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}else{_this.setState(function(state){var _Object$keys$;var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?(_Object$keys$=Object.keys(state.pickedFeatures)[0])!==null&&_Object$keys$!==void 0?_Object$keys$:"":"";return{pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}},(_this$props$filter$fi=_this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[sublayer.name],_this.props.filter.filterGeom)});_this.setState({pendingRequests:pendingRequests,pickedFeatures:{},selectedFeature:""})});_defineProperty(_this,"setSelectedFeature",function(ev){_this.setState({selectedFeature:ev.target.value})});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){if(!_this.props.editContext.changed){_this.setState(FeatureForm.defaultState)}});_defineProperty(_this,"updatePickedFeatures",function(newfeature){_this.setState(function(state){return{pickedFeatures:Object.entries(state.pickedFeatures).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],feature=_ref4[1];res[key]=feature.id===newfeature.id?newfeature:feature;return res},{})}})});_this.state=FeatureForm.defaultState;return _this}_inherits(FeatureForm,_React$Component);return _createClass(FeatureForm,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.enabled&&!prevProps.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&!this.props.editContext.changed&&this.state.pendingRequests===0){var clickPoint=this.queryPoint(prevProps);if(clickPoint){this.queryFeatures(clickPoint)}}if(this.props.enabled&&this.state.selectedFeature!==prevState.selectedFeature){var feature=this.state.pickedFeatures?this.state.pickedFeatures[this.state.selectedFeature]:null;var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId]||{};var canEditGeometry=["Point","LineString","Polygon"].includes((curConfig.geomType||"").replace(/^Multi/,"").replace(/Z$/,""));var editPermissions=curConfig.permissions||{};this.props.setEditContext("FeatureForm",{action:"Pick",feature:feature,changed:false,geomType:curConfig.geomType||null,geomReadOnly:editPermissions.updatable===false||!canEditGeometry})}if(!this.props.enabled&&prevProps.enabled){this.props.clearEditContext("FeatureForm");this.setState(FeatureForm.defaultState)}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pickedFeatures!==null){var body=null;if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.querying")))}else if(isEmpty(this.state.pickedFeatures)){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.noresults")))}else{var featureText=LocaleUtils.tr("featureform.feature");var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId];body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},Object.keys(this.state.pickedFeatures).length>1?/*#__PURE__*/React.createElement("div",{className:"feature-query-selection"},/*#__PURE__*/React.createElement("select",{onChange:this.setSelectedFeature,value:this.state.selectedFeature},Object.entries(this.state.pickedFeatures).map(function(_ref5){var _match$sublayer$title,_match$sublayer;var _ref6=_slicedToArray(_ref5,2),id=_ref6[0],feature=_ref6[1];var _id$split=id.split("::"),_id$split2=_slicedToArray(_id$split,2),layerId=_id$split2[0],featureId=_id$split2[1];var editConfig=_this2.props.theme.editConfig[layerId];var match=LayerUtils.searchLayer(_this2.props.layers,_this2.props.theme.url,editConfig.layerName);var layerName=(_match$sublayer$title=match===null||match===void 0||(_match$sublayer=match.sublayer)===null||_match$sublayer===void 0?void 0:_match$sublayer.title)!==null&&_match$sublayer$title!==void 0?_match$sublayer$title:editConfig.layerName;var featureName=editConfig.displayField?feature.properties[editConfig.displayField]:featureText+" "+featureId;return/*#__PURE__*/React.createElement("option",{key:id,value:id},layerName+": "+featureName)}))):null,this.props.editContext.feature?/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:this.props.editContext,iface:this.props.iface,onCommit:this.updatePickedFeatures}):null)}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"featureform",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"FeatureForm",onClose:this.onWindowClose,title:LocaleUtils.tr("featureform.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"FeatureFormTaskBar",task:"FeatureForm"},function(){return{body:LocaleUtils.tr("infotool.clickhelpPoint")}})]}}])}(React.Component);_defineProperty(FeatureForm,"propTypes",{clearEditContext:PropTypes.func,click:PropTypes.object,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,setCurrentTask:PropTypes.func,setEditContext:PropTypes.func,theme:PropTypes.object});_defineProperty(FeatureForm,"defaultProps",{geometry:{initialWidth:320,initialHeight:480,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});_defineProperty(FeatureForm,"defaultState",{pendingRequests:0,pickedFeatures:null,selectedFeature:""});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){var enabled=state.task.id==="FeatureForm"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="FeatureForm";return{click:state.map.click||{modifiers:{}},enabled:enabled,editContext:state.editing.contexts.FeatureForm||{},currentEditContext:state.editing.currentContext,iface:iface,layers:state.layers.flat,filter:state.layers.filter,map:state.map,theme:state.theme.current}},{setCurrentTask:setCurrentTask,clearEditContext:clearEditContext,setEditContext:setEditContext})(FeatureForm)});
|
|
21
|
+
return}var path=[];var sublayer=null;var mapScale=MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom);var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",layerId,path))});if(!layer||!sublayer||!LayerUtils.sublayerVisible(layer,path)||!LayerUtils.layerScaleInRange(sublayer,mapScale)){return}var layerOrder=layer.params.LAYERS.split(",");++pendingRequests;var editDataset=editConfig.editDataset||layerId;var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom));_this.props.iface.getFeature(editDataset,pos,_this.props.map.projection,scale,96,function(featureCollection){if(featureCollection&&!isEmpty(featureCollection.features)){_this.setState(function(state){var newPickedFeatures=Object.fromEntries(Object.entries(_objectSpread(_objectSpread({},state.pickedFeatures),featureCollection.features.reduce(function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId+"::"+feature.id,feature))},{}))).sort(function(a,b){var partsA=a[0].split("::");var partsB=b[0].split("::");var diff=layerOrder.indexOf(partsB[0])-layerOrder.indexOf(partsA[0]);return diff===0?partsA[1].localeCompare(partsB[1]):diff}));var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?Object.keys(newPickedFeatures)[0]:"";return{pickedFeatures:newPickedFeatures,pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}else{_this.setState(function(state){var _Object$keys$;var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?(_Object$keys$=Object.keys(state.pickedFeatures)[0])!==null&&_Object$keys$!==void 0?_Object$keys$:"":"";return{pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}},(_this$props$filter$fi=_this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[sublayer.name],_this.props.filter.filterGeom)});_this.setState({pendingRequests:pendingRequests,pickedFeatures:{},selectedFeature:""})});_defineProperty(_this,"setSelectedFeature",function(ev){_this.setState({selectedFeature:ev.target.value})});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){if(!_this.props.editContext.changed){_this.setState(FeatureForm.defaultState)}});_defineProperty(_this,"updatePickedFeatures",function(newfeature){_this.setState(function(state){return{pickedFeatures:Object.entries(state.pickedFeatures).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],feature=_ref4[1];res[key]=feature.id===newfeature.id?newfeature:feature;return res},{})}})});_this.state=FeatureForm.defaultState;return _this}_inherits(FeatureForm,_React$Component);return _createClass(FeatureForm,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.enabled&&!prevProps.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&!this.props.editContext.changed&&this.state.pendingRequests===0){var clickPoint=this.queryPoint(prevProps);if(clickPoint){this.queryFeatures(clickPoint)}}if(this.props.enabled&&this.state.selectedFeature!==prevState.selectedFeature){var feature=this.state.pickedFeatures?this.state.pickedFeatures[this.state.selectedFeature]:null;var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId]||{};var canEditGeometry=["Point","LineString","Polygon"].includes((curConfig.geomType||"").replace(/^Multi/,"").replace(/Z$/,""));var editPermissions=curConfig.permissions||{};this.props.setEditContext("FeatureForm",{action:"Pick",feature:feature,changed:false,geomType:curConfig.geomType||null,geomReadOnly:editPermissions.updatable===false||!canEditGeometry})}if(!this.props.enabled&&prevProps.enabled){this.props.clearEditContext("FeatureForm");this.setState(FeatureForm.defaultState)}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pickedFeatures!==null){var body=null;if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.querying")))}else if(isEmpty(this.state.pickedFeatures)){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.noresults")))}else{var featureText=LocaleUtils.tr("featureform.feature");var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId];body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},Object.keys(this.state.pickedFeatures).length>1?/*#__PURE__*/React.createElement("div",{className:"feature-query-selection"},/*#__PURE__*/React.createElement("select",{onChange:this.setSelectedFeature,value:this.state.selectedFeature},Object.entries(this.state.pickedFeatures).map(function(_ref5){var _match$sublayer$title,_match$sublayer;var _ref6=_slicedToArray(_ref5,2),id=_ref6[0],feature=_ref6[1];var _id$split=id.split("::"),_id$split2=_slicedToArray(_id$split,2),layerId=_id$split2[0],featureId=_id$split2[1];var editConfig=_this2.props.theme.editConfig[layerId];var match=LayerUtils.searchLayer(_this2.props.layers,_this2.props.theme.url,editConfig.layerName);var layerName=(_match$sublayer$title=match===null||match===void 0||(_match$sublayer=match.sublayer)===null||_match$sublayer===void 0?void 0:_match$sublayer.title)!==null&&_match$sublayer$title!==void 0?_match$sublayer$title:editConfig.layerName;var featureName=editConfig.displayField?feature.properties[editConfig.displayField]:featureText+" "+featureId;return/*#__PURE__*/React.createElement("option",{key:id,value:id},layerName+": "+featureName)}))):null,this.props.editContext.feature?/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:this.props.editContext,iface:this.props.iface,onCommit:this.updatePickedFeatures}):null)}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"featureform",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"FeatureForm",onClose:this.onWindowClose,title:LocaleUtils.tr("featureform.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"FeatureFormTaskBar",task:"FeatureForm"},function(){return{body:LocaleUtils.tr("infotool.clickhelpPoint")}})]}}])}(React.Component);_defineProperty(FeatureForm,"propTypes",{clearEditContext:PropTypes.func,click:PropTypes.object,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,setCurrentTask:PropTypes.func,setEditContext:PropTypes.func,theme:PropTypes.object});_defineProperty(FeatureForm,"defaultProps",{geometry:{initialWidth:320,initialHeight:480,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});_defineProperty(FeatureForm,"defaultState",{pendingRequests:0,pickedFeatures:null,selectedFeature:""});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){var enabled=state.task.id==="FeatureForm"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="FeatureForm";return{click:state.map.click||{modifiers:{}},enabled:enabled,editContext:state.editing.contexts.FeatureForm||{},currentEditContext:state.editing.currentContext,iface:iface,layers:state.layers.flat,filter:state.layers.filter,map:state.map,theme:state.theme.current}},{setCurrentTask:setCurrentTask,clearEditContext:clearEditContext,setEditContext:setEditContext})(FeatureForm)});
|
package/plugins/LayerTree.js
CHANGED
|
@@ -12,4 +12,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
12
12
|
*/var LayerTree=/*#__PURE__*/function(_React$Component){function LayerTree(props){var _this;_classCallCheck(this,LayerTree);_this=_callSuper(this,LayerTree,[props]);_defineProperty(_this,"state",{activemenu:null,activestylemenu:null,legendTooltip:null,sidebarwidth:null,importvisible:false,filterinvisiblelayers:false,legendPrintVisible:false,visibilityMenu:false,activePreset:null});_defineProperty(_this,"renderSubLayers",function(layer,group,path,enabled){var inMutuallyExclusiveGroup=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;return(group.sublayers||[]).map(function(sublayer,idx){var subpath=[].concat(_toConsumableArray(path),[idx]);if(sublayer.sublayers){return _this.renderLayerGroup(layer,sublayer,subpath,enabled,inMutuallyExclusiveGroup)}else{return _this.renderLayer(layer,sublayer,subpath,enabled,inMutuallyExclusiveGroup)}})});_defineProperty(_this,"renderLayerGroup",function(layer,group,path,enabled){var inMutuallyExclusiveGroup=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var flattenGroups=ConfigUtils.getConfigProp("flattenLayerTreeGroups",_this.props.theme)||_this.props.flattenGroups;if(flattenGroups){return _this.renderSubLayers(layer,group,path,enabled,false)}var subtreevisibility=LayerUtils.computeLayerVisibility(group);if(subtreevisibility===0&&_this.state.filterinvisiblelayers){return null}var groupId=layer.id+":"+group.name;var visibility=true;var checkboxstate="";if(_this.props.groupTogglesSublayers&&!inMutuallyExclusiveGroup){visibility=subtreevisibility>0;if(subtreevisibility===1){checkboxstate="checked"}else if(subtreevisibility===0){checkboxstate="unchecked"}else{checkboxstate="tristate"}}else{visibility=group.visibility===undefined?subtreevisibility>0:group.visibility;if(visibility){checkboxstate=subtreevisibility===1?"checked":"tristate"}else{checkboxstate="unchecked"}}var omitqueryable;var identifyableClassName="";var subtreequeryable=LayerUtils.computeLayerQueryable(group);if(subtreequeryable===1){identifyableClassName="layertree-item-identifyable-checked";omitqueryable=false}else if(subtreequeryable===0){identifyableClassName="layertree-item-identifyable-unchecked";omitqueryable=true}else{identifyableClassName="layertree-item-identifyable-tristate";omitqueryable=true}if(inMutuallyExclusiveGroup){checkboxstate="radio_"+checkboxstate}var expanderstate=group.expanded?"tree_minus":"tree_plus";var showExpander=!_this.props.onlyGroups||(group.sublayers||[]).some(function(sublayer){return sublayer.sublayers});var itemclasses={"layertree-item":true,"layertree-item-disabled":!_this.props.groupTogglesSublayers&&!enabled||_this.props.grayUnchecked&&!visibility};var sublayersContent=null;if(group.expanded){sublayersContent=_this.renderSubLayers(layer,group,path,enabled&&visibility,group.mutuallyExclusive===true)}var optMenuClasses=classnames({"layertree-item-menubutton":true,"layertree-item-menubutton-active":_this.state.activemenu===groupId});var styleMenuClasses=classnames({"layertree-item-menubutton":true,"layertree-item-menubutton-active":_this.state.activestylemenu===groupId});var allowRemove=ConfigUtils.getConfigProp("allowRemovingThemeLayers",_this.props.theme)===true||layer.role!==LayerRole.THEME;var allowReordering=ConfigUtils.getConfigProp("allowReorderingLayers",_this.props.theme)===true&&!_this.state.filterinvisiblelayers;var sortable=allowReordering&&ConfigUtils.getConfigProp("preventSplittingGroupsWhenReordering",_this.props.theme)===true;var styles=layer.type==="wms"&&path.length===0?_this.getLayerStyles(layer):null;return/*#__PURE__*/React.createElement("div",{className:"layertree-item-container","data-id":JSON.stringify({layer:layer.id,path:path}),key:groupId},/*#__PURE__*/React.createElement("div",{className:classnames(itemclasses)},showExpander?/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-expander",icon:expanderstate,onClick:function onClick(){return _this.groupExpandedToggled(layer,path,group.expanded)}}):/*#__PURE__*/React.createElement("span",{className:"layertree-item-expander"}),/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-checkbox",icon:checkboxstate,onClick:function onClick(){return _this.itemVisibilityToggled(layer,path,visibility)}}),/*#__PURE__*/React.createElement("span",{className:"layertree-item-title",onClick:function onClick(){return _this.itemVisibilityToggled(layer,path,visibility)},title:group.title},group.title),LayerUtils.hasQueryableSublayers(group)&&_this.props.allowSelectIdentifyableLayers?/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-identifyable "+identifyableClassName,icon:"info-sign",onClick:function onClick(){return _this.itemOmitQueryableToggled(layer,path,omitqueryable)}}):null,/*#__PURE__*/React.createElement("span",{className:"layertree-item-spacer"}),!isEmpty(styles)?/*#__PURE__*/React.createElement(Icon,{className:styleMenuClasses,icon:"paint",onClick:function onClick(){return _this.layerStyleMenuToggled(groupId)}}):null,/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(groupId)}}),allowRemove?/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-remove",icon:"trash",onClick:function onClick(){return _this.props.removeLayer(layer.id,path)}}):null),_this.state.activemenu===groupId?_this.renderOptionsMenu(layer,group,path,allowRemove):null,_this.state.activestylemenu===groupId?_this.renderStyleMenu(styles,_this.getSelectedStyles(layer),function(style){return _this.applyLayerStyle(style,layer)}):null,/*#__PURE__*/React.createElement(Sortable,{onChange:_this.onSortChange,options:{disabled:sortable===false,ghostClass:"drop-ghost",delay:200,forceFallback:_this.props.fallbackDrag}},sublayersContent))});_defineProperty(_this,"renderLayer",function(layer,sublayer,path){var enabled=arguments.length>3&&arguments[3]!==undefined?arguments[3]:true;var inMutuallyExclusiveGroup=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var skipExpanderPlaceholder=arguments.length>5&&arguments[5]!==undefined?arguments[5]:false;if(_this.props.onlyGroups){return null}if(_this.state.filterinvisiblelayers&&!sublayer.visibility){return null}if(Array.isArray(layer.layerTreeHiddenSublayers)&&layer.layerTreeHiddenSublayers.includes(sublayer.name)){return null}var sublayerId=layer.id+":"+sublayer.name;var allowRemove=ConfigUtils.getConfigProp("allowRemovingThemeLayers",_this.props.theme)===true||layer.role!==LayerRole.THEME;var allowReordering=ConfigUtils.getConfigProp("allowReorderingLayers",_this.props.theme)===true;var checkboxstate=sublayer.visibility===true?"checked":"unchecked";if(inMutuallyExclusiveGroup){checkboxstate="radio_"+checkboxstate}var optMenuClasses=classnames({"layertree-item-menubutton":true,"layertree-item-menubutton-active":_this.state.activemenu===sublayerId});var styleMenuClasses=classnames({"layertree-item-menubutton":true,"layertree-item-menubutton-active":_this.state.activestylemenu===sublayerId});var itemclasses={"layertree-item":true,"layertree-item-disabled":layer.type!=="separator"&&(!_this.props.groupTogglesSublayers&&!enabled||_this.props.grayUnchecked&&!sublayer.visibility),"layertree-item-separator":layer.type==="separator","layertree-item-outsidescalerange":sublayer.minScale!==undefined&&_this.props.mapScale<sublayer.minScale||sublayer.maxScale!==undefined&&_this.props.mapScale>sublayer.maxScale};var infoButton=null;if(layer.type==="wms"||layer.type==="wfs"||layer.type==="wmts"){infoButton=/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-metadata",icon:"info-sign",onClick:function onClick(){return _this.props.setActiveLayerInfo(layer,sublayer)}})}var legendicon=null;if(_this.props.showLegendIcons){var legendUrl=LayerUtils.getLegendUrl(layer,sublayer,_this.props.mapScale,_this.props.map,_this.props.bboxDependentLegend,_this.props.scaleDependentLegend,_this.props.extraLegendParameters);if(legendUrl){legendicon=/*#__PURE__*/React.createElement(Image,{className:"layertree-item-legend-thumbnail",onMouseOut:_this.hideLegendTooltip,onMouseOver:function onMouseOver(ev){return _this.showLegendTooltip(ev,legendUrl)},onTouchStart:function onTouchStart(ev){return _this.showLegendTooltip(ev,legendUrl)},src:legendUrl+"&TYPE=thumbnail"})}else if(layer.color){legendicon=/*#__PURE__*/React.createElement("span",{className:"layertree-item-legend-coloricon",style:{backgroundColor:layer.color}})}}var checkbox=null;if(layer.type==="placeholder"){checkbox=/*#__PURE__*/React.createElement(Spinner,null)}else if(layer.type==="separator"){checkbox=null}else{checkbox=/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-checkbox",icon:checkboxstate,onClick:function onClick(){return _this.itemVisibilityToggled(layer,path,sublayer.visibility)}})}var title=null;if(layer.type==="separator"){title=/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this.props.changeLayerProperty(layer.id,"title",ev.target.value)},value:sublayer.title})}else{title=/*#__PURE__*/React.createElement("span",{className:"layertree-item-title",onClick:function onClick(){return _this.itemVisibilityToggled(layer,path,sublayer.visibility)},title:sublayer.title},sublayer.title)}var queryableicon=null;if(_this.props.allowSelectIdentifyableLayers){var identifyableClassName=!sublayer.omitFromQueryLayers?"layertree-item-identifyable-checked":"layertree-item-identifyable-unchecked";queryableicon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-identifyable "+identifyableClassName,icon:"info-sign",onClick:function onClick(){return _this.itemOmitQueryableToggled(layer,path,sublayer.omitFromQueryLayers)}})}else{queryableicon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-queryable",icon:"info-sign"})}var allowOptions=layer.type!=="placeholder"&&layer.type!=="separator";var flattenGroups=ConfigUtils.getConfigProp("flattenLayerTreeGroups",_this.props.theme)||_this.props.flattenGroups;var allowSeparators=flattenGroups&&allowReordering&&ConfigUtils.getConfigProp("allowLayerTreeSeparators",_this.props.theme);var separatorTitle=LocaleUtils.tr("layertree.separator");var separatorTooltip=LocaleUtils.tr("layertree.separatortooltip");return/*#__PURE__*/React.createElement("div",{className:"layertree-item-container","data-id":JSON.stringify({layer:layer.id,path:path}),key:sublayerId},allowSeparators?/*#__PURE__*/React.createElement("div",{className:"layertree-item-addsep",onClick:function onClick(){return _this.props.addLayerSeparator(separatorTitle,layer.id,path)},title:separatorTooltip}):null,/*#__PURE__*/React.createElement("div",{className:classnames(itemclasses)},flattenGroups||skipExpanderPlaceholder?null:/*#__PURE__*/React.createElement("span",{className:"layertree-item-expander"}),checkbox,legendicon,title,sublayer.queryable&&_this.props.showQueryableIcon?queryableicon:null,sublayer.name in(_this.props.filter.filterParams||{})||_this.props.filter.filterGeom?/*#__PURE__*/React.createElement(Icon,{icon:"filter"}):null,_this.props.loadingLayers.includes(layer.id)?/*#__PURE__*/React.createElement(Spinner,null):null,/*#__PURE__*/React.createElement("span",{className:"layertree-item-spacer"}),allowOptions&&!_this.props.infoInSettings?infoButton:null,Object.keys(sublayer.styles||{}).length>1?/*#__PURE__*/React.createElement(Icon,{className:styleMenuClasses,icon:"paint",onClick:function onClick(){return _this.layerStyleMenuToggled(sublayerId)}}):null,allowOptions?/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(sublayerId)}}):null,allowRemove?/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-remove",icon:"trash",onClick:function onClick(){return _this.props.removeLayer(layer.id,path)}}):null),_this.state.activemenu===sublayerId?_this.renderOptionsMenu(layer,sublayer,path,allowRemove):null,_this.state.activestylemenu===sublayerId?_this.renderStyleMenu(sublayer.styles,[sublayer.style],function(style){return _this.layerStyleChanged(layer,path,style)}):null)});_defineProperty(_this,"renderOptionsMenu",function(layer,sublayer,path){var marginRight=arguments.length>3&&arguments[3]!==undefined?arguments[3]:0;var allowReordering=ConfigUtils.getConfigProp("allowReorderingLayers",_this.props.theme)===true;var reorderButtons=null;if(allowReordering&&!_this.state.filterinvisiblelayers){reorderButtons=[/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-move",icon:"arrow-down",key:"layertree-item-move-down",onClick:function onClick(){return _this.props.reorderLayer(layer,path,+1)}}),/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-move",icon:"arrow-up",key:"layertree-item-move-up",onClick:function onClick(){return _this.props.reorderLayer(layer,path,-1)}})]}var zoomToLayerButton=null;if(sublayer.bbox&&sublayer.bbox.bounds){var zoomToLayerTooltip=LocaleUtils.tr("layertree.zoomtolayer");var crs=sublayer.bbox.crs||_this.props.map.projection;zoomToLayerButton=/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.props.zoomToExtent(sublayer.bbox.bounds,crs)},title:zoomToLayerTooltip})}var infoButton=null;if(_this.props.infoInSettings&&(layer.type==="wms"||layer.type==="wfs"||layer.type==="wmts")){infoButton=/*#__PURE__*/React.createElement(Icon,{className:"layertree-item-metadata",icon:"info-sign",onClick:function onClick(){return _this.props.setActiveLayerInfo(layer,sublayer)}})}var attrTableButton=null;if(_this.props.showAttributeTableLink&&ConfigUtils.havePlugin("AttributeTable")&&layer.role===LayerRole.THEME&&_this.props.theme.editConfig[sublayer.name]){attrTableButton=/*#__PURE__*/React.createElement(Icon,{icon:"editing",onClick:function onClick(){return _this.props.setCurrentTask("AttributeTable",null,null,{layer:sublayer.name})}})}return/*#__PURE__*/React.createElement("div",{className:"layertree-item-optionsmenu",onPointerDown:_this.preventLayerTreeItemDrag,style:{marginRight:marginRight*1.75+"em"}},zoomToLayerButton,_this.props.transparencyIcon?/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}):LocaleUtils.tr("layertree.transparency"),/*#__PURE__*/React.createElement("input",{className:"layertree-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return _this.layerTransparencyChanged(layer,path,ev.target.value,!isEmpty(sublayer.sublayers)?"children":null)},step:"1",type:"range",value:255-LayerUtils.computeLayerOpacity(sublayer)}),reorderButtons,infoButton,attrTableButton,layer.type==="vector"?/*#__PURE__*/React.createElement(Icon,{icon:"export",onClick:function onClick(){return _this.exportRedliningLayer(layer)}}):null)});_defineProperty(_this,"renderStyleMenu",function(styles,selectedStyles,onStyleChange){var marginRight=arguments.length>3&&arguments[3]!==undefined?arguments[3]:0;var checkedIcon=selectedStyles.length===1?"radio_checked":"radio_tristate";return/*#__PURE__*/React.createElement("div",{className:"layertree-item-stylemenu",style:{marginRight:marginRight*1.75+"em"}},Object.entries(styles).map(function(_ref){var _ref2=_slicedToArray(_ref,2),name=_ref2[0],title=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:name,onClick:function onClick(){return onStyleChange(name)}},/*#__PURE__*/React.createElement(Icon,{icon:selectedStyles.includes(name)?checkedIcon:"radio_unchecked"}),/*#__PURE__*/React.createElement("div",null,title))}))});_defineProperty(_this,"preventLayerTreeItemDrag",function(ev){var draggableEl=ev.currentTarget.parentNode;if(draggableEl.draggable){draggableEl.draggable=false;document.addEventListener("pointerup",function(){draggableEl.draggable=true},{once:true})}});_defineProperty(_this,"renderLayerTree",function(layers){var flattenGroups=ConfigUtils.getConfigProp("flattenLayerTreeGroups",_this.props.theme)||_this.props.flattenGroups;var haveGroups=!flattenGroups&&layers.find(function(layer){if(layer.role===LayerRole.THEME&&!_this.props.showRootEntry){return(layer.sublayers||[]).find(function(sublayer){return!isEmpty(sublayer.sublayers)})}else{return!isEmpty(layer.sublayers)}});return layers.map(function(layer){if(isEmpty(layer.sublayers)&&layer.role!==LayerRole.THEME){return _this.renderLayer(layer,layer,[],layer.visibility,false,!haveGroups)}else if(_this.props.showRootEntry||layer.role!==LayerRole.THEME){return _this.renderLayerGroup(layer,layer,[],layer.visibility)}else{return layer.sublayers.map(function(sublayer,idx){var subpath=[idx];if(sublayer.sublayers){return _this.renderLayerGroup(layer,sublayer,subpath,layer.visibility)}else{return _this.renderLayer(layer,sublayer,subpath,layer.visibility,false,!haveGroups)}})}})});_defineProperty(_this,"renderBody",function(){var maptipcheckboxstate=_this.props.mapTipsEnabled===true?"checked":"unchecked";var maptipCheckbox=null;var maptipsEnabled=false;if(_this.props.theme.mapTips!==undefined){maptipsEnabled=_this.props.theme.mapTips!==null&&_this.props.allowMapTips}else{maptipsEnabled=_this.props.allowMapTips}if(!ConfigUtils.isMobile()&&maptipsEnabled){maptipCheckbox=/*#__PURE__*/React.createElement("div",{className:"layertree-option"},/*#__PURE__*/React.createElement(Icon,{icon:maptipcheckboxstate,onClick:_this.toggleMapTips}),/*#__PURE__*/React.createElement("span",{onClick:_this.toggleMapTips},LocaleUtils.tr("layertree.maptip")))}var allowReordering=ConfigUtils.getConfigProp("allowReorderingLayers",_this.props.theme)===true&&!_this.state.filterinvisiblelayers;var haveMapCompare=ConfigUtils.havePlugin("MapCompare");var compareCheckbox=null;if(haveMapCompare&&_this.props.allowCompare&&allowReordering){var swipecheckboxstate=_this.props.swipe||_this.props.swipe===0?"checked":"unchecked";compareCheckbox=/*#__PURE__*/React.createElement("div",{className:"layertree-option"},/*#__PURE__*/React.createElement(Icon,{icon:swipecheckboxstate,onClick:_this.toggleSwipe}),/*#__PURE__*/React.createElement("span",{onClick:_this.toggleSwipe},LocaleUtils.tr("layertree.compare")))}var layerImportExpander=null;if(_this.props.allowImport){layerImportExpander=/*#__PURE__*/React.createElement("div",{className:"layertree-option",onClick:_this.toggleImportLayers},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.importvisible?"collapse":"expand"})," ",LocaleUtils.tr("layertree.importlayer"))}var flattenGroups=ConfigUtils.getConfigProp("flattenLayerTreeGroups",_this.props.theme)||_this.props.flattenGroups;var sortable=allowReordering&&(ConfigUtils.getConfigProp("preventSplittingGroupsWhenReordering",_this.props.theme)===true||flattenGroups===true);var treelayers=_this.props.layers.filter(function(layer){return layer.role!==LayerRole.BACKGROUND&&!layer.layertreehidden});return/*#__PURE__*/React.createElement("div",{className:"layertree-container-wrapper",role:"body"},/*#__PURE__*/React.createElement("div",{className:"layertree-container"},/*#__PURE__*/React.createElement("div",{className:"layertree-tree",onContextMenuCapture:function onContextMenuCapture(ev){// Prevent context menu on drag-sort
|
|
13
13
|
ev.stopPropagation();ev.preventDefault();return false},onTouchEnd:function onTouchEnd(ev){var target=ev.currentTarget;clearTimeout(target.preventScrollTimeout);target.preventScrollTimeout=null;target.removeEventListener("touchmove",MiscUtils.killEvent)},onTouchStart:function onTouchStart(ev){// Prevent touch-scroll after sortable trigger delay
|
|
14
14
|
var target=ev.currentTarget;target.preventScrollTimeout=setTimeout(function(){target.addEventListener("touchmove",MiscUtils.killEvent,{passive:false})},200)},ref:MiscUtils.setupKillTouchEvents},/*#__PURE__*/React.createElement(Sortable,{onChange:_this.onSortChange,options:{disabled:sortable===false,ghostClass:"drop-ghost",delay:200,forceFallback:_this.props.fallbackDrag}},_this.renderLayerTree(treelayers))),maptipCheckbox,compareCheckbox,layerImportExpander,_this.state.importvisible?/*#__PURE__*/React.createElement(ImportLayer,{theme:_this.props.theme}):null))});_defineProperty(_this,"renderVisibilityButton",function(){if(!_this.props.showToggleAllLayersCheckbox&&!_this.props.enableVisibleFilter&&isEmpty(_this.props.theme.visibilityPresets)){return null}var vis=0;var count=0;var _iterator=_createForOfIteratorHelper(_this.props.layers),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var layer=_step.value;if(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER){count+=1;vis+=layer.visibility}}}catch(err){_iterator.e(err)}finally{_iterator.f()}vis/=Math.min(1,count);var buttonClasses=classnames({"layertree-visibility-button":true,"layertree-visibility-button-active":_this.state.visibilityMenu});var style={};if(_this.props.side==="left"){style.left=0}else{style.right=0}return/*#__PURE__*/React.createElement("span",{className:buttonClasses,onClick:function onClick(){return _this.setState(function(state){return{visibilityMenu:!state.visibilityMenu}})}},/*#__PURE__*/React.createElement(Icon,{icon:"eye"}),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down"}),_this.state.visibilityMenu?/*#__PURE__*/React.createElement("div",{className:"layertree-visibility-menu",style:style},_this.props.showToggleAllLayersCheckbox?/*#__PURE__*/React.createElement("div",{onClick:function onClick(){return _this.toggleLayerTreeVisibility(vis===0)}},/*#__PURE__*/React.createElement(Icon,{icon:vis===0?"checked":"unchecked"})," ",LocaleUtils.tr("layertree.hidealllayers")):null,_this.props.enableVisibleFilter?/*#__PURE__*/React.createElement("div",{onClick:function onClick(){return _this.setState(function(state){return{filterinvisiblelayers:!state.filterinvisiblelayers}})}},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.filterinvisiblelayers?"checked":"unchecked"})," ",LocaleUtils.tr("layertree.visiblefilter")):null,Object.entries(_this.props.theme.visibilityPresets||{}).map(function(_ref3,idx){var _ref4=_slicedToArray(_ref3,2),name=_ref4[0],preset=_ref4[1];return/*#__PURE__*/React.createElement("div",{className:idx===0?"layertree-visibility-menu-sep":"",key:name,onClick:function onClick(){return _this.props.setThemeLayersVisibilityPreset(preset)}},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.activePreset===name?"radio_checked":"radio_unchecked"})," ",name)})):null)});_defineProperty(_this,"renderLegendPrintWindow",function(){if(!_this.state.legendPrintVisible){return null}var setLegendPrintContents=function setLegendPrintContents(el){if(!el){return}el.addEventListener("load",function(){var container=el.contentWindow.document.getElementById("legendcontainer");if(container){var body="<p id=\"legendcontainerbody\">";body+=_this.props.layers.map(function(layer){if(!layer.visibility){return""}else if(layer.legendUrl){return _this.printLayerLegend(layer,layer)}else if(layer.color){return"<div class=\"legend-entry\"><span style=\"display: inline-block; width: 1em; height: 1em; box-shadow: inset 0 0 0 1000px "+layer.color+"; margin: 0.25em; border: 1px solid black;\"> </span>"+(layer.title||layer.name)+"</div>"}else{return""}}).join("");body+="</p>";container.innerHTML=body}else{_this.legendPrintWindow.document.body.innerHTML="Broken template. An element with id=legendcontainer must exist."}})};var printLegend=function printLegend(ev){ev.target.parentElement.parentElement.getElementsByTagName("iframe")[0].contentWindow.print()};return/*#__PURE__*/React.createElement(ResizeableWindow,{icon:"print",initialHeight:0.75*window.innerHeight,initialWidth:0.5*window.innerWidth,onClose:function onClose(){return _this.setState({legendPrintVisible:false})},title:LocaleUtils.tr("layertree.printlegend")},/*#__PURE__*/React.createElement("div",{className:"layertree-legend-print-body",role:"body"},/*#__PURE__*/React.createElement("iframe",{ref:setLegendPrintContents,src:MiscUtils.resolveAssetsPath(_this.props.templatePath)}),/*#__PURE__*/React.createElement("div",{className:"layertree-legend-print-body-buttonbar"},/*#__PURE__*/React.createElement("button",{onClick:printLegend},LocaleUtils.tr("layertree.printlegend")))))});_defineProperty(_this,"legendTooltipLoaded",function(ev){if(ev.target.naturalWidth>1){ev.target.style.visibility="visible"}});_defineProperty(_this,"onSortChange",function(order,sortable,ev){var moved=JSON.parse(order[ev.newIndex]);var layer=_this.props.layers.find(function(l){return l.id===moved.layer});if(layer){_this.props.reorderLayer(layer,moved.path,ev.newIndex-ev.oldIndex)}});_defineProperty(_this,"toggleImportLayers",function(){_this.setState(function(state){var visible=!state.importvisible;return{importvisible:visible,sidebarwidth:visible?"40em":null}})});_defineProperty(_this,"propagateOptions",function(layer,options){var path=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;if(layer.sublayers){layer.sublayers=layer.sublayers.map(function(sublayer,idx){if(path===null||!isEmpty(path)&&path[0]===idx){var newsublayer=_objectSpread(_objectSpread({},sublayer),options);_this.propagateOptions(newsublayer,options,path?path.slice(1):null);return newsublayer}else{return sublayer}})}});_defineProperty(_this,"groupExpandedToggled",function(layer,grouppath,oldexpanded){_this.props.changeLayerProperty(layer.id,"expanded",!oldexpanded,grouppath)});_defineProperty(_this,"itemVisibilityToggled",function(layer,grouppath,oldvisibility){var recurseDirection=null;// If item becomes visible, also make parents visible
|
|
15
|
-
if(_this.props.groupTogglesSublayers){recurseDirection=!oldvisibility?"both":"children"}else{recurseDirection=!oldvisibility?"parents":null}_this.props.changeLayerProperty(layer.id,"visibility",!oldvisibility,grouppath,recurseDirection)});_defineProperty(_this,"itemOmitQueryableToggled",function(layer,grouppath,oldomitqueryable){_this.props.changeLayerProperty(layer.id,"omitFromQueryLayers",!oldomitqueryable,grouppath,"children")});_defineProperty(_this,"layerTransparencyChanged",function(layer,sublayerpath,value){var recurse=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;_this.props.changeLayerProperty(layer.id,"opacity",Math.max(1,255-value),sublayerpath,recurse)});_defineProperty(_this,"layerStyleChanged",function(layer,sublayerpath,value){var recurseDirection=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;_this.props.changeLayerProperty(layer.id,"style",value,sublayerpath,recurseDirection)});_defineProperty(_this,"layerMenuToggled",function(sublayerid){_this.setState(function(state){return{activemenu:state.activemenu===sublayerid?null:sublayerid,activestylemenu:null}})});_defineProperty(_this,"layerStyleMenuToggled",function(sublayerid){_this.setState(function(state){return{activestylemenu:state.activestylemenu===sublayerid?null:sublayerid,activemenu:null}})});_defineProperty(_this,"showLegendTooltip",function(ev,request){_this.setState({legendTooltip:{x:ev.target.getBoundingClientRect().right,y:ev.target.getBoundingClientRect().top,img:request+"&TYPE=tooltip"}})});_defineProperty(_this,"onHide",function(){_this.setState({legendTooltip:undefined,visibilityMenu:false})});_defineProperty(_this,"hideLegendTooltip",function(){_this.setState({legendTooltip:undefined})});_defineProperty(_this,"toggleMapTips",function(){_this.props.toggleMapTips(!_this.props.mapTipsEnabled)});_defineProperty(_this,"toggleSwipe",function(){_this.props.setSwipe(_this.props.swipe!==null?null:50)});_defineProperty(_this,"printLayerLegend",function(layer,sublayer){var body="";if(sublayer.sublayers){if(sublayer.visibility){body="<div class=\"legend-group\">"+"<h3 class=\"legend-group-title\">"+(sublayer.title||sublayer.name)+"</h3>"+"<div class=\"legend-group-body\">"+sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer)}).join("\n")+"</div>"+"</div>"}}else{if(sublayer.visibility&&LayerUtils.layerScaleInRange(sublayer,_this.props.mapScale)){var request=LayerUtils.getLegendUrl(layer,{name:sublayer.name},_this.props.mapScale,_this.props.map,_this.props.bboxDependentLegend,_this.props.scaleDependentLegend,_this.props.extraLegendParameters);body=request?"<div class=\"legend-entry\"><img src=\""+request+"\" /></div>":""}}return body});_defineProperty(_this,"deleteAllLayers",function(){var _iterator2=_createForOfIteratorHelper(_this.props.layers),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var layer=_step2.value;if(layer.role===LayerRole.THEME){var sublayers=layer.sublayers||[];for(var i=sublayers.length-1;i>=0;--i){_this.props.removeLayer(layer.id,[i])}}else if(layer.role===LayerRole.USERLAYER){_this.props.removeLayer(layer.id)}}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}});_defineProperty(_this,"toggleLayerTreeVisibility",function(visibile){var _iterator3=_createForOfIteratorHelper(_this.props.layers),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var layer=_step3.value;if(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER){_this.props.changeLayerProperty(layer.id,"visibility",visibile,[],null)}}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}});_defineProperty(_this,"exportRedliningLayer",function(layer){var data=JSON.stringify({type:"FeatureCollection",features:layer.features.map(function(feature){var newFeature=_objectSpread(_objectSpread({},feature),{},{geometry:VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs||_this.props.map.projection,"EPSG:4326")});delete newFeature.crs;return newFeature})},null," ");FileSaver.saveAs(new Blob([data],{type:"text/plain;charset=utf-8"}),layer.title+".json")});_defineProperty(_this,"getSelectedStyles",function(layer){var _layer$params;return _toConsumableArray(new Set((((_layer$params=layer.params)===null||_layer$params===void 0?void 0:_layer$params.STYLES)||"").split(",").filter(Boolean)))});_defineProperty(_this,"getLayerStyles",function(layer){var _layer$sublayers;return layer===null||layer===void 0||(_layer$sublayers=layer.sublayers)===null||_layer$sublayers===void 0?void 0:_layer$sublayers.reduce(function(styleList,sublayer){Object.assign(styleList,_this.getLayerStyles(sublayer.sublayers));return Object.assign(styleList,sublayer.styles)},{})});_defineProperty(_this,"applyLayerStyle",function(style,layer){var path=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];var layerId=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;layerId=layerId!==null&&layerId!==void 0?layerId:layer.id;(layer.sublayers||[]).forEach(function(sublayer,idx){_this.applyLayerStyle(style,sublayer,[].concat(_toConsumableArray(path),[idx]),layerId);if(style in(sublayer.styles||{})){_this.props.changeLayerProperty(layerId,"style",style,[].concat(_toConsumableArray(path),[idx]))}})});_this.legendPrintWindow=null;window.addEventListener("beforeunload",function(){if(_this.legendPrintWindow&&!_this.legendPrintWindow.closed){_this.legendPrintWindow.close()}});return _this}_inherits(LayerTree,_React$Component);return _createClass(LayerTree,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.theme.mapTips!==undefined&&this.props.theme.mapTips!==prevProps.theme.mapTips){this.props.toggleMapTips(this.props.theme.mapTips&&!ConfigUtils.isMobile())}if(this.props.layers!==prevProps.layers){this.setState({activePreset:LayerUtils.getActiveVisibilityPreset(this.props.layers,this.props.theme.visibilityPresets)})}}},{key:"render",value:function render(){var _this2=this;var legendTooltip=null;if(this.state.legendTooltip){var style={left:this.state.legendTooltip.x,top:this.state.legendTooltip.y,maxWidth:window.innerWidth-this.state.legendTooltip.x-2,maxHeight:window.innerHeight-this.state.legendTooltip.y-2,visibility:"hidden"};legendTooltip=/*#__PURE__*/React.createElement(Image,{className:"layertree-item-legend-tooltip",onLoad:this.legendTooltipLoaded,onTouchStart:this.hideLegendTooltip,src:this.state.legendTooltip.img,style:style})}var legendPrintIcon=null;if(this.props.enableLegendPrint){legendPrintIcon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-print-legend",icon:"print",onClick:function onClick(){return _this2.setState({legendPrintVisible:true})},title:LocaleUtils.tr("layertree.printlegend")})}var deleteAllLayersIcon=null;if(ConfigUtils.getConfigProp("allowRemovingThemeLayers")===true){var deleteAllLayersTooltip=LocaleUtils.tr("layertree.deletealllayers");deleteAllLayersIcon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-delete-legend",icon:"trash",onClick:this.deleteAllLayers,title:deleteAllLayersTooltip})}var serviceInfoIcon=null;if(this.props.enableServiceInfo){var serviceInfoTooltip=LocaleUtils.tr("serviceinfo.title");serviceInfoIcon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-theme-metadata",icon:"info-sign",onClick:function onClick(){return _this2.props.setActiveServiceInfo(_this2.props.theme)},title:serviceInfoTooltip})}var extraTitlebarContent=/*#__PURE__*/React.createElement("span",null,this.renderVisibilityButton(),legendPrintIcon,deleteAllLayersIcon,serviceInfoIcon);return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(SideBar,{extraTitlebarContent:extraTitlebarContent,icon:"layers",id:"LayerTree",onHide:this.onHide,side:this.props.side,title:LocaleUtils.tr("appmenu.items.LayerTree"),width:this.state.sidebarwidth||this.props.width},function(){return{body:_this2.renderBody()}}),legendTooltip,this.renderLegendPrintWindow(),/*#__PURE__*/React.createElement(LayerInfoWindow,{bboxDependentLegend:this.props.bboxDependentLegend,layerInfoGeometry:this.props.layerInfoGeometry,scaleDependentLegend:this.props.scaleDependentLegend}),/*#__PURE__*/React.createElement(ServiceInfoWindow,{layerInfoGeometry:this.props.layerInfoGeometry}))}}])}(React.Component);_defineProperty(LayerTree,"propTypes",{/** Whether to allow adding separator entries in the layer tree, useful for organizing the tree. */addLayerSeparator:PropTypes.func,/** Whether to enable the compare function. Requires the `MapCompare` plugin. */allowCompare:PropTypes.bool,/** Whether to allow importing external layers. */allowImport:PropTypes.bool,/** Whether to allow enabling map tips. */allowMapTips:PropTypes.bool,/** Whether to allow selection of identifyable layers. The `showQueryableIcon` property should be `true` to be able to select identifyable layers. */allowSelectIdentifyableLayers:PropTypes.bool,/** Whether to display a BBOX dependent legend. Can be `true|false|"theme"`, latter means only for theme layers. */bboxDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),changeLayerProperty:PropTypes.func,/** Whether to enable the legend print functionality. */enableLegendPrint:PropTypes.bool,/** Whether to display a service info button to display the WMS service metadata. */enableServiceInfo:PropTypes.bool,/** Whether to display a button to filter invisible layers from the layertree. */enableVisibleFilter:PropTypes.bool,/** Additional parameters to pass to the GetLegendGraphics request. */extraLegendParameters:PropTypes.string,/** Whether to use the fallback logic for drag-and-drop. */fallbackDrag:PropTypes.bool,filter:PropTypes.object,/** Whether to display a flat layer tree, omitting any groups. */flattenGroups:PropTypes.bool,/** Whether to display unchecked layers gray in the layertree. */grayUnchecked:PropTypes.bool,/** Whether toggling a group also toggles all sublayers. */groupTogglesSublayers:PropTypes.bool,/** Whether to display the layer info button inside the layer settings menu rather than next to the layer title. */infoInSettings:PropTypes.bool,/** Default layer info window geometry with size, position and docking status. */layerInfoGeometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layers:PropTypes.array,loadingLayers:PropTypes.array,map:PropTypes.object,mapScale:PropTypes.number,mapTipsEnabled:PropTypes.bool,mobile:PropTypes.bool,/** Whether to only display layer groups but not individual layers in layertree. */onlyGroups:PropTypes.bool,removeLayer:PropTypes.func,reorderLayer:PropTypes.func,/** Whether to display a scale dependent legend. Can be `true|false|"theme"`, latter means only for theme layers. */scaleDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),setActiveLayerInfo:PropTypes.func,setActiveServiceInfo:PropTypes.func,setCurrentTask:PropTypes.func,setSwipe:PropTypes.func,setThemeLayersVisibilityPreset:PropTypes.func,/** Whether to display an icon linking to the layer attribute table in the layer options menu. */showAttributeTableLink:PropTypes.bool,/** Whether to display legend icons. */showLegendIcons:PropTypes.bool,/** Whether to display the queryable icon to indicate that a layer is identifyable. */showQueryableIcon:PropTypes.bool,/** Whether to display the root entry of the layertree. */showRootEntry:PropTypes.bool,/** Whether to display a checkbox to toggle all layers. */showToggleAllLayersCheckbox:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,swipe:PropTypes.number,/** Template location for the legend print functionality */templatePath:PropTypes.string,theme:PropTypes.object,toggleMapTips:PropTypes.func,transparencyIcon:PropTypes.bool,/** The initial width of the layertree, as a CSS width string. */width:PropTypes.string,zoomToExtent:PropTypes.func});_defineProperty(LayerTree,"defaultProps",{layers:[],showLegendIcons:true,showRootEntry:true,showQueryableIcon:true,allowMapTips:true,allowCompare:true,allowImport:true,allowSelectIdentifyableLayers:false,groupTogglesSublayers:false,grayUnchecked:true,layerInfoGeometry:{initialWidth:480,initialHeight:480,initialX:null,initialY:null,initiallyDocked:false},bboxDependentLegend:false,flattenGroups:false,onlyGroups:false,width:"25em",enableLegendPrint:true,enableVisibleFilter:true,enableServiceInfo:true,infoInSettings:true,showToggleAllLayersCheckbox:true,transparencyIcon:true,side:"right",templatePath:":/templates/legendprint.html"});var selector=function selector(state){return{layers:state.layers.flat,filter:state.layers.filter,loadingLayers:state.layers.loading,map:state.map,mapScale:MapUtils.computeForZoom(state.map.scales,state.map.zoom),swipe:state.layers.swipe,theme:state.theme.current||{},mapTipsEnabled:state.map.maptips}};export default connect(selector,{addLayerSeparator:addLayerSeparator,changeLayerProperty:changeLayerProperty,removeLayer:removeLayer,reorderLayer:reorderLayer,toggleMapTips:toggleMapTips,setSwipe:setSwipe,setActiveLayerInfo:setActiveLayerInfo,setActiveServiceInfo:setActiveServiceInfo,setCurrentTask:setCurrentTask,setThemeLayersVisibilityPreset:setThemeLayersVisibilityPreset,zoomToExtent:zoomToExtent})(LayerTree);
|
|
15
|
+
if(_this.props.groupTogglesSublayers){recurseDirection=!oldvisibility?"both":"children"}else{recurseDirection=!oldvisibility?"parents":null}_this.props.changeLayerProperty(layer.id,"visibility",!oldvisibility,grouppath,recurseDirection)});_defineProperty(_this,"itemOmitQueryableToggled",function(layer,grouppath,oldomitqueryable){_this.props.changeLayerProperty(layer.id,"omitFromQueryLayers",!oldomitqueryable,grouppath,"children")});_defineProperty(_this,"layerTransparencyChanged",function(layer,sublayerpath,value){var recurse=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;_this.props.changeLayerProperty(layer.id,"opacity",Math.max(1,255-value),sublayerpath,recurse)});_defineProperty(_this,"layerStyleChanged",function(layer,sublayerpath,value){var recurseDirection=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;_this.props.changeLayerProperty(layer.id,"style",value,sublayerpath,recurseDirection)});_defineProperty(_this,"layerMenuToggled",function(sublayerid){_this.setState(function(state){return{activemenu:state.activemenu===sublayerid?null:sublayerid,activestylemenu:null}})});_defineProperty(_this,"layerStyleMenuToggled",function(sublayerid){_this.setState(function(state){return{activestylemenu:state.activestylemenu===sublayerid?null:sublayerid,activemenu:null}})});_defineProperty(_this,"showLegendTooltip",function(ev,request){_this.setState({legendTooltip:{x:ev.target.getBoundingClientRect().right,y:ev.target.getBoundingClientRect().top,img:request+"&TYPE=tooltip"}})});_defineProperty(_this,"onHide",function(){_this.setState({legendTooltip:undefined,visibilityMenu:false})});_defineProperty(_this,"hideLegendTooltip",function(){_this.setState({legendTooltip:undefined})});_defineProperty(_this,"toggleMapTips",function(){_this.props.toggleMapTips(!_this.props.mapTipsEnabled)});_defineProperty(_this,"toggleSwipe",function(){_this.props.setSwipe(_this.props.swipe!==null?null:50)});_defineProperty(_this,"printLayerLegend",function(layer,sublayer){var body="";if(sublayer.sublayers){if(sublayer.visibility){body="<div class=\"legend-group\">"+"<h3 class=\"legend-group-title\">"+(sublayer.title||sublayer.name)+"</h3>"+"<div class=\"legend-group-body\">"+sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer)}).join("\n")+"</div>"+"</div>"}}else{if(sublayer.visibility&&LayerUtils.layerScaleInRange(sublayer,_this.props.mapScale)){var request=LayerUtils.getLegendUrl(layer,{name:sublayer.name},_this.props.mapScale,_this.props.map,_this.props.bboxDependentLegend,_this.props.scaleDependentLegend,_this.props.extraLegendParameters);body=request?"<div class=\"legend-entry\"><img src=\""+request+"\" style=\"max-width: 100%\"/></div>":""}}return body});_defineProperty(_this,"deleteAllLayers",function(){var _iterator2=_createForOfIteratorHelper(_this.props.layers),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var layer=_step2.value;if(layer.role===LayerRole.THEME){var sublayers=layer.sublayers||[];for(var i=sublayers.length-1;i>=0;--i){_this.props.removeLayer(layer.id,[i])}}else if(layer.role===LayerRole.USERLAYER){_this.props.removeLayer(layer.id)}}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}});_defineProperty(_this,"toggleLayerTreeVisibility",function(visibile){var _iterator3=_createForOfIteratorHelper(_this.props.layers),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var layer=_step3.value;if(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER){_this.props.changeLayerProperty(layer.id,"visibility",visibile,[],null)}}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}});_defineProperty(_this,"exportRedliningLayer",function(layer){var data=JSON.stringify({type:"FeatureCollection",features:layer.features.map(function(feature){var newFeature=_objectSpread(_objectSpread({},feature),{},{geometry:VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs||_this.props.map.projection,"EPSG:4326")});delete newFeature.crs;return newFeature})},null," ");FileSaver.saveAs(new Blob([data],{type:"text/plain;charset=utf-8"}),layer.title+".json")});_defineProperty(_this,"getSelectedStyles",function(layer){var _layer$params;return _toConsumableArray(new Set((((_layer$params=layer.params)===null||_layer$params===void 0?void 0:_layer$params.STYLES)||"").split(",").filter(Boolean)))});_defineProperty(_this,"getLayerStyles",function(layer){var _layer$sublayers;return layer===null||layer===void 0||(_layer$sublayers=layer.sublayers)===null||_layer$sublayers===void 0?void 0:_layer$sublayers.reduce(function(styleList,sublayer){Object.assign(styleList,_this.getLayerStyles(sublayer.sublayers));return Object.assign(styleList,sublayer.styles)},{})});_defineProperty(_this,"applyLayerStyle",function(style,layer){var path=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];var layerId=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;layerId=layerId!==null&&layerId!==void 0?layerId:layer.id;(layer.sublayers||[]).forEach(function(sublayer,idx){_this.applyLayerStyle(style,sublayer,[].concat(_toConsumableArray(path),[idx]),layerId);if(style in(sublayer.styles||{})){_this.props.changeLayerProperty(layerId,"style",style,[].concat(_toConsumableArray(path),[idx]))}})});_this.legendPrintWindow=null;window.addEventListener("beforeunload",function(){if(_this.legendPrintWindow&&!_this.legendPrintWindow.closed){_this.legendPrintWindow.close()}});return _this}_inherits(LayerTree,_React$Component);return _createClass(LayerTree,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.theme.mapTips!==undefined&&this.props.theme.mapTips!==prevProps.theme.mapTips){this.props.toggleMapTips(this.props.theme.mapTips&&!ConfigUtils.isMobile())}if(this.props.layers!==prevProps.layers){this.setState({activePreset:LayerUtils.getActiveVisibilityPreset(this.props.layers,this.props.theme.visibilityPresets)})}}},{key:"render",value:function render(){var _this2=this;var legendTooltip=null;if(this.state.legendTooltip){var style={left:this.state.legendTooltip.x,top:this.state.legendTooltip.y,maxWidth:window.innerWidth-this.state.legendTooltip.x-2,maxHeight:window.innerHeight-this.state.legendTooltip.y-2,visibility:"hidden"};legendTooltip=/*#__PURE__*/React.createElement(Image,{className:"layertree-item-legend-tooltip",onLoad:this.legendTooltipLoaded,onTouchStart:this.hideLegendTooltip,src:this.state.legendTooltip.img,style:style})}var legendPrintIcon=null;if(this.props.enableLegendPrint){legendPrintIcon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-print-legend",icon:"print",onClick:function onClick(){return _this2.setState({legendPrintVisible:true})},title:LocaleUtils.tr("layertree.printlegend")})}var deleteAllLayersIcon=null;if(ConfigUtils.getConfigProp("allowRemovingThemeLayers")===true){var deleteAllLayersTooltip=LocaleUtils.tr("layertree.deletealllayers");deleteAllLayersIcon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-delete-legend",icon:"trash",onClick:this.deleteAllLayers,title:deleteAllLayersTooltip})}var serviceInfoIcon=null;if(this.props.enableServiceInfo){var serviceInfoTooltip=LocaleUtils.tr("serviceinfo.title");serviceInfoIcon=/*#__PURE__*/React.createElement(Icon,{className:"layertree-theme-metadata",icon:"info-sign",onClick:function onClick(){return _this2.props.setActiveServiceInfo(_this2.props.theme)},title:serviceInfoTooltip})}var extraTitlebarContent=/*#__PURE__*/React.createElement("span",null,this.renderVisibilityButton(),legendPrintIcon,deleteAllLayersIcon,serviceInfoIcon);return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(SideBar,{extraTitlebarContent:extraTitlebarContent,icon:"layers",id:"LayerTree",onHide:this.onHide,side:this.props.side,title:LocaleUtils.tr("appmenu.items.LayerTree"),width:this.state.sidebarwidth||this.props.width},function(){return{body:_this2.renderBody()}}),legendTooltip,this.renderLegendPrintWindow(),/*#__PURE__*/React.createElement(LayerInfoWindow,{bboxDependentLegend:this.props.bboxDependentLegend,layerInfoGeometry:this.props.layerInfoGeometry,scaleDependentLegend:this.props.scaleDependentLegend}),/*#__PURE__*/React.createElement(ServiceInfoWindow,{layerInfoGeometry:this.props.layerInfoGeometry}))}}])}(React.Component);_defineProperty(LayerTree,"propTypes",{/** Whether to allow adding separator entries in the layer tree, useful for organizing the tree. */addLayerSeparator:PropTypes.func,/** Whether to enable the compare function. Requires the `MapCompare` plugin. */allowCompare:PropTypes.bool,/** Whether to allow importing external layers. */allowImport:PropTypes.bool,/** Whether to allow enabling map tips. */allowMapTips:PropTypes.bool,/** Whether to allow selection of identifyable layers. The `showQueryableIcon` property should be `true` to be able to select identifyable layers. */allowSelectIdentifyableLayers:PropTypes.bool,/** Whether to display a BBOX dependent legend. Can be `true|false|"theme"`, latter means only for theme layers. */bboxDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),changeLayerProperty:PropTypes.func,/** Whether to enable the legend print functionality. */enableLegendPrint:PropTypes.bool,/** Whether to display a service info button to display the WMS service metadata. */enableServiceInfo:PropTypes.bool,/** Whether to display a button to filter invisible layers from the layertree. */enableVisibleFilter:PropTypes.bool,/** Additional parameters to pass to the GetLegendGraphics request. */extraLegendParameters:PropTypes.string,/** Whether to use the fallback logic for drag-and-drop. */fallbackDrag:PropTypes.bool,filter:PropTypes.object,/** Whether to display a flat layer tree, omitting any groups. */flattenGroups:PropTypes.bool,/** Whether to display unchecked layers gray in the layertree. */grayUnchecked:PropTypes.bool,/** Whether toggling a group also toggles all sublayers. */groupTogglesSublayers:PropTypes.bool,/** Whether to display the layer info button inside the layer settings menu rather than next to the layer title. */infoInSettings:PropTypes.bool,/** Default layer info window geometry with size, position and docking status. */layerInfoGeometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layers:PropTypes.array,loadingLayers:PropTypes.array,map:PropTypes.object,mapScale:PropTypes.number,mapTipsEnabled:PropTypes.bool,mobile:PropTypes.bool,/** Whether to only display layer groups but not individual layers in layertree. */onlyGroups:PropTypes.bool,removeLayer:PropTypes.func,reorderLayer:PropTypes.func,/** Whether to display a scale dependent legend. Can be `true|false|"theme"`, latter means only for theme layers. */scaleDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),setActiveLayerInfo:PropTypes.func,setActiveServiceInfo:PropTypes.func,setCurrentTask:PropTypes.func,setSwipe:PropTypes.func,setThemeLayersVisibilityPreset:PropTypes.func,/** Whether to display an icon linking to the layer attribute table in the layer options menu. */showAttributeTableLink:PropTypes.bool,/** Whether to display legend icons. */showLegendIcons:PropTypes.bool,/** Whether to display the queryable icon to indicate that a layer is identifyable. */showQueryableIcon:PropTypes.bool,/** Whether to display the root entry of the layertree. */showRootEntry:PropTypes.bool,/** Whether to display a checkbox to toggle all layers. */showToggleAllLayersCheckbox:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,swipe:PropTypes.number,/** Template location for the legend print functionality */templatePath:PropTypes.string,theme:PropTypes.object,toggleMapTips:PropTypes.func,transparencyIcon:PropTypes.bool,/** The initial width of the layertree, as a CSS width string. */width:PropTypes.string,zoomToExtent:PropTypes.func});_defineProperty(LayerTree,"defaultProps",{layers:[],showLegendIcons:true,showRootEntry:true,showQueryableIcon:true,allowMapTips:true,allowCompare:true,allowImport:true,allowSelectIdentifyableLayers:false,groupTogglesSublayers:false,grayUnchecked:true,layerInfoGeometry:{initialWidth:480,initialHeight:480,initialX:null,initialY:null,initiallyDocked:false},bboxDependentLegend:false,flattenGroups:false,onlyGroups:false,width:"25em",enableLegendPrint:true,enableVisibleFilter:true,enableServiceInfo:true,infoInSettings:true,showToggleAllLayersCheckbox:true,transparencyIcon:true,side:"right",templatePath:":/templates/legendprint.html"});var selector=function selector(state){return{layers:state.layers.flat,filter:state.layers.filter,loadingLayers:state.layers.loading,map:state.map,mapScale:MapUtils.computeForZoom(state.map.scales,state.map.zoom),swipe:state.layers.swipe,theme:state.theme.current||{},mapTipsEnabled:state.map.maptips}};export default connect(selector,{addLayerSeparator:addLayerSeparator,changeLayerProperty:changeLayerProperty,removeLayer:removeLayer,reorderLayer:reorderLayer,toggleMapTips:toggleMapTips,setSwipe:setSwipe,setActiveLayerInfo:setActiveLayerInfo,setActiveServiceInfo:setActiveServiceInfo,setCurrentTask:setCurrentTask,setThemeLayersVisibilityPreset:setThemeLayersVisibilityPreset,zoomToExtent:zoomToExtent})(LayerTree);
|
package/plugins/MapLegend.js
CHANGED
|
@@ -10,5 +10,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
10
10
|
* The user can toggle whether to display only layers which are enabled, visible in the current extent and/or visible at the current scale.
|
|
11
11
|
*
|
|
12
12
|
* See https://docs.qgis.org/3.28/en/docs/server_manual/services/wms.html#wms-getlegendgraphic for supported extra legend params.
|
|
13
|
-
*/var MapLegend=/*#__PURE__*/function(_React$Component){function MapLegend(props){var _this;_classCallCheck(this,MapLegend);_this=_callSuper(this,MapLegend,[props]);_defineProperty(_this,"state",{onlyVisibleLegend:false,bboxDependentLegend:false,scaleDependentLegend:false,visible:false});_defineProperty(_this,"onClose",function(){_this.setState({visible:false})});_defineProperty(_this,"printLayerLegend",function(layer,sublayer,mapScale){var isCategorized=(sublayer.sublayers||[]).find(function(entry){return entry.category_sublayer===true});if(_this.props.excludeLayers.includes(sublayer.name)){return null}else if(sublayer.sublayers&&!isCategorized&&(!_this.state.onlyVisibleLegend||sublayer.visibility)){if(_this.props.addGroupTitles){var children=sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer,mapScale)}).filter(function(x){return x});if(isEmpty(children)){return null}else{return/*#__PURE__*/React.createElement("div",{className:"map-legend-group",key:sublayer.name},/*#__PURE__*/React.createElement("div",{className:"map-legend-group-title"},sublayer.title||sublayer.name),/*#__PURE__*/React.createElement("div",{className:"map-legend-group-entries"},sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer,mapScale)})))}}else{return sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer,mapScale)})}}else{if(_this.state.onlyVisibleLegend&&!sublayer.visibility){return null}if((_this.state.onlyVisibleLegend||_this.state.scaleDependentLegend)&&!LayerUtils.layerScaleInRange(sublayer,mapScale)){return null}var request=LayerUtils.getLegendUrl(layer,{name:sublayer.name},mapScale,_this.props.map,_this.state.bboxDependentLegend,_this.state.scaleDependentLegend,_this.props.extraLegendParameters);return request?/*#__PURE__*/React.createElement("div",{className:"map-legend-legend-entry",key:sublayer.name},/*#__PURE__*/React.createElement("div",null,_this.props.addLayerTitles&&!sublayer.category_sublayer?/*#__PURE__*/React.createElement("div",{className:"map-legend-entry-title"},sublayer.title||sublayer.name):null,/*#__PURE__*/React.createElement("div",
|
|
13
|
+
*/var MapLegend=/*#__PURE__*/function(_React$Component){function MapLegend(props){var _this;_classCallCheck(this,MapLegend);_this=_callSuper(this,MapLegend,[props]);_defineProperty(_this,"state",{onlyVisibleLegend:false,bboxDependentLegend:false,scaleDependentLegend:false,visible:false});_defineProperty(_this,"onClose",function(){_this.setState({visible:false})});_defineProperty(_this,"printLayerLegend",function(layer,sublayer,mapScale){var isCategorized=(sublayer.sublayers||[]).find(function(entry){return entry.category_sublayer===true});if(_this.props.excludeLayers.includes(sublayer.name)){return null}else if(sublayer.sublayers&&!isCategorized&&(!_this.state.onlyVisibleLegend||sublayer.visibility)){if(_this.props.addGroupTitles){var children=sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer,mapScale)}).filter(function(x){return x});if(isEmpty(children)){return null}else{return/*#__PURE__*/React.createElement("div",{className:"map-legend-group",key:sublayer.name},/*#__PURE__*/React.createElement("div",{className:"map-legend-group-title"},sublayer.title||sublayer.name),/*#__PURE__*/React.createElement("div",{className:"map-legend-group-entries"},sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer,mapScale)})))}}else{return sublayer.sublayers.map(function(subsublayer){return _this.printLayerLegend(layer,subsublayer,mapScale)})}}else{if(_this.state.onlyVisibleLegend&&!sublayer.visibility){return null}if((_this.state.onlyVisibleLegend||_this.state.scaleDependentLegend)&&!LayerUtils.layerScaleInRange(sublayer,mapScale)){return null}var request=LayerUtils.getLegendUrl(layer,{name:sublayer.name},mapScale,_this.props.map,_this.state.bboxDependentLegend,_this.state.scaleDependentLegend,_this.props.extraLegendParameters);return request?/*#__PURE__*/React.createElement("div",{className:"map-legend-legend-entry",key:sublayer.name},/*#__PURE__*/React.createElement("div",null,_this.props.addLayerTitles&&!sublayer.category_sublayer?/*#__PURE__*/React.createElement("div",{className:"map-legend-entry-title"},sublayer.title||sublayer.name):null,/*#__PURE__*/React.createElement("div",{className:"map-legend-entry-image"},/*#__PURE__*/React.createElement(Image,{src:request})))):null}});_this.state.onlyVisibleLegend=props.onlyVisibleLegend;_this.state.bboxDependentLegend=props.bboxDependentLegend;_this.state.scaleDependentLegend=props.scaleDependentLegend;return _this}_inherits(MapLegend,_React$Component);return _createClass(MapLegend,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.active&&!prevProps.active){this.setState({visible:true});// Clear task immediately, visibility is stored as state
|
|
14
14
|
this.props.setCurrentTask(null)}}},{key:"render",value:function render(){var _this2=this;if(!this.state.visible&&!this.props.lockedWindow){return null}var mapScale=MapUtils.computeForZoom(this.props.map.scales,this.props.map.zoom);var extraControls=[{icon:"eye",callback:function callback(){return _this2.setState(function(state){return{onlyVisibleLegend:!state.onlyVisibleLegend}})},active:this.state.onlyVisibleLegend,title:LocaleUtils.tr("maplegend.onlyvisible")},{icon:"box",callback:function callback(){return _this2.setState(function(state){return{bboxDependentLegend:!state.bboxDependentLegend}})},active:this.state.bboxDependentLegend,title:LocaleUtils.tr("maplegend.bboxdependent")},{icon:"scale",callback:function callback(){return _this2.setState(function(state){return{scaleDependentLegend:!state.scaleDependentLegend}})},active:this.state.scaleDependentLegend,title:LocaleUtils.tr("maplegend.scaledependent")}];return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.lockedWindow?false:this.props.geometry.side,extraControls:extraControls,icon:"list-alt",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,maximizeable:false,onClose:this.props.lockedWindow?null:this.onClose,title:LocaleUtils.tr("maplegend.windowtitle")},/*#__PURE__*/React.createElement("div",{className:"map-legend",role:"body"},this.props.layers.map(function(layer){if(_this2.state.onlyVisibleLegend&&!layer.visibility){return null}else if(layer.legendUrl){return _this2.printLayerLegend(layer,layer,mapScale)}else if(layer.color){return/*#__PURE__*/React.createElement("div",{className:"map-legend-legend-entry",key:layer.name},/*#__PURE__*/React.createElement("span",{className:"map-legend-color-box",style:{backgroundColor:layer.color}}),/*#__PURE__*/React.createElement("span",{className:"map-legend-entry-title"},layer.title||layer.name))}else{return null}})))}}])}(React.Component);_defineProperty(MapLegend,"propTypes",{active:PropTypes.bool,/** Whether to add group titles to the legend. */addGroupTitles:PropTypes.bool,/** Whether to add layer titles to the legend. Note that often the legend image itself already contains the layer title. */addLayerTitles:PropTypes.bool,/** Whether to display a BBOX-dependent legend by default. */bboxDependentLegend:PropTypes.bool,/** List of layernames to exclude from the legend. */excludeLayers:PropTypes.array,/** Extra parameters to add to the GetLegendGraphics request. */extraLegendParameters:PropTypes.string,/** Default window geometry with size, position and docking status. A locked window is not closeable and not resizeable. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),layers:PropTypes.array,/** Whether the legend window is locked (always visible, not moveable or closeable). Set position and size via `geometry`. */lockedWindow:PropTypes.bool,map:PropTypes.object,/** Whether to only include enabled layers in the legend by default. */onlyVisibleLegend:PropTypes.bool,/** Whether to display a scale-dependent legend by default. */scaleDependentLegend:PropTypes.bool,setCurrentTask:PropTypes.func});_defineProperty(MapLegend,"defaultProps",{addGroupTitles:false,addLayerTitles:false,bboxDependentLegend:false,excludeLayers:[],onlyVisibleLegend:false,scaleDependentLegend:false,geometry:{initialWidth:320,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});export default connect(function(state){return{active:state.task.id==="MapLegend",layers:state.layers.flat,map:state.map}},{setCurrentTask:setCurrentTask})(MapLegend);
|
package/plugins/NewsPopup.js
CHANGED
|
@@ -4,9 +4,9 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{setCurrentTask}from"../actions/task";import Icon from"../components/Icon";import SideBar from"../components/SideBar";import LocaleUtils from"../utils/LocaleUtils";import"./style/NewsPopup.css";/**
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{setCurrentTask}from"../actions/task";import Icon from"../components/Icon";import SideBar from"../components/SideBar";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import"./style/NewsPopup.css";/**
|
|
8
8
|
* Displays a newsletter in a popup dialog.
|
|
9
9
|
*
|
|
10
10
|
* The popup won't be dispayed anymore, if the user chooses so, until a newer
|
|
11
11
|
* revision is published (specified via newsRev prop).
|
|
12
|
-
*/var NewsPopup=/*#__PURE__*/function(_React$Component){function NewsPopup(props){var _this;_classCallCheck(this,NewsPopup);_this=_callSuper(this,NewsPopup,[props]);_defineProperty(_this,"state",{dontShowAgain:false,showPopup:false,side:"right",sidebarWidth:"20em"});_defineProperty(_this,"renderBody",function(){return/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup-body",role:"body"},/*#__PURE__*/React.createElement("iframe",{src:_this.props.newsDocument}),/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup-buttonbar"},/*#__PURE__*/React.createElement("button",{onClick:_this.closeDialog},LocaleUtils.tr("newspopup.dialogclose")),/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this.setState({dontShowAgain:ev.target.checked})},type:"checkbox",value:_this.state.dontShowAgain})," ",LocaleUtils.tr("newspopup.dontshowagain"))))});_defineProperty(_this,"closeDialog",function(){if(_this.state.dontShowAgain){var days=365;var d=new Date;d.setTime(d.getTime()+days*24*60*60*1000);document.cookie="newsrev="+_this.props.newsRev+"; SameSite=Lax; expires="+d.toUTCString()}if(_this.props.showInSidebar){_this.props.setCurrentTask(null)}else{_this.setState({showPopup:false})}});var show=props.newsDocument&&!!props.newsRev&&!document.cookie.split(";").some(function(item){return item.includes("newsrev="+props.newsRev)});if(show){if(props.showInSidebar){props.setCurrentTask("NewsPopup")}else{_this.state.showPopup=show}}return _this}_inherits(NewsPopup,_React$Component);return _createClass(NewsPopup,[{key:"render",value:function render(){if(this.props.showInSidebar){return/*#__PURE__*/React.createElement(SideBar,{heightResizeable:true,icon:"new",id:"NewsPopup",side:this.props.side,title:LocaleUtils.tr("newspopup.title"),width:this.props.sidebarWidth},this.renderBody())}else if(this.state.showPopup){return/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-container"},/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup"},/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup-title"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("newspopup.title")),/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:this.closeDialog})),this.renderBody()))}else{return null}}}])}(React.Component);_defineProperty(NewsPopup,"availableIn3D",true);_defineProperty(NewsPopup,"propTypes",{/** URL to the news HTML document to display in the popup. */newsDocument:PropTypes.string,/** Revision of the document. */newsRev:PropTypes.string,setCurrentTask:PropTypes.func,/** Whether to show the news in a sidebar instead of a popup. */showInSidebar:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,/** The default width of the sidebar, as a CSS width string. */sidebarWidth:PropTypes.string});export default connect(function(){return{}},{setCurrentTask:setCurrentTask})(NewsPopup);
|
|
12
|
+
*/var NewsPopup=/*#__PURE__*/function(_React$Component){function NewsPopup(props){var _this;_classCallCheck(this,NewsPopup);_this=_callSuper(this,NewsPopup,[props]);_defineProperty(_this,"state",{dontShowAgain:false,showPopup:false,side:"right",sidebarWidth:"20em"});_defineProperty(_this,"renderBody",function(){return/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup-body",role:"body"},/*#__PURE__*/React.createElement("iframe",{src:_this.props.newsDocument}),/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup-buttonbar"},/*#__PURE__*/React.createElement("button",{onClick:_this.closeDialog},LocaleUtils.tr("newspopup.dialogclose")),/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this.setState({dontShowAgain:ev.target.checked})},type:"checkbox",value:_this.state.dontShowAgain})," ",LocaleUtils.tr("newspopup.dontshowagain"))))});_defineProperty(_this,"closeDialog",function(){ConfigUtils.setSessionConfig("newsPopupShown",true);if(_this.state.dontShowAgain){var days=365;var d=new Date;d.setTime(d.getTime()+days*24*60*60*1000);document.cookie="newsrev="+_this.props.newsRev+"; SameSite=Lax; expires="+d.toUTCString()}if(_this.props.showInSidebar){_this.props.setCurrentTask(null)}else{_this.setState({showPopup:false})}});var show=props.newsDocument&&!!props.newsRev&&!document.cookie.split(";").some(function(item){return item.includes("newsrev="+props.newsRev)});if(show&&!ConfigUtils.getSessionConfig("newsPopupShown")){if(props.showInSidebar){props.setCurrentTask("NewsPopup")}else{_this.state.showPopup=show}}return _this}_inherits(NewsPopup,_React$Component);return _createClass(NewsPopup,[{key:"render",value:function render(){if(this.props.showInSidebar){return/*#__PURE__*/React.createElement(SideBar,{heightResizeable:true,icon:"new",id:"NewsPopup",side:this.props.side,title:LocaleUtils.tr("newspopup.title"),width:this.props.sidebarWidth},this.renderBody())}else if(this.state.showPopup){return/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-container"},/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup"},/*#__PURE__*/React.createElement("div",{className:"newspopup-dialog-popup-title"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("newspopup.title")),/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:this.closeDialog})),this.renderBody()))}else{return null}}}])}(React.Component);_defineProperty(NewsPopup,"availableIn3D",true);_defineProperty(NewsPopup,"propTypes",{/** URL to the news HTML document to display in the popup. */newsDocument:PropTypes.string,/** Revision of the document. */newsRev:PropTypes.string,setCurrentTask:PropTypes.func,/** Whether to show the news in a sidebar instead of a popup. */showInSidebar:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,/** The default width of the sidebar, as a CSS width string. */sidebarWidth:PropTypes.string});export default connect(function(){return{}},{setCurrentTask:setCurrentTask})(NewsPopup);
|
package/plugins/TopBar.js
CHANGED
|
@@ -10,4 +10,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
10
10
|
var searchOptions=_objectSpread(_objectSpread({},TopBar.defaultProps.searchOptions),this.props.searchOptions);searchOptions.minScaleDenom=searchOptions.minScaleDenom||searchOptions.minScale;delete searchOptions.minScale;// Menu compact only available for desktop client
|
|
11
11
|
var menuCompact=!isMobile?this.props.appMenuCompact:false;// Keep menu open when appMenu is in compact mode (Visible on Hover)
|
|
12
12
|
var keepMenuOpen=menuCompact;// Menu should be visible on startup when appMenu is in compact mode (Visible on Hover)
|
|
13
|
-
var showOnStartup=this.props.appMenuVisibleOnStartup||menuCompact;var style=this.props.windowMargins.splitTopAndBottomBar?{marginLeft:this.props.windowMargins.left+"px",marginRight:this.props.windowMargins.right+"px"}:{};return/*#__PURE__*/React.createElement(Swipeable,{onSwipedDown:function onSwipedDown(){return _this2.props.toggleFullscreen(false)},onSwipedUp:function onSwipedUp(){return _this2.props.toggleFullscreen(true)}},/*#__PURE__*/React.createElement("div",{className:classes,ref:this.storeHeight,style:style},logoEl,/*#__PURE__*/React.createElement("div",{className:"topbar-center-span"},this.props.components.Search?/*#__PURE__*/React.createElement("div",{className:"topbar-search-container"},/*#__PURE__*/React.createElement(this.props.components.Search,{searchOptions:searchOptions})):null,this.props.components.Toolbar?/*#__PURE__*/React.createElement(this.props.components.Toolbar,{openExternalUrl:this.openUrl,toolbarItems:this.state.allowedToolbarItems,toolbarItemsShortcutPrefix:this.props.toolbarItemsShortcutPrefix}):null),this.props.components.AppMenu&&!this.props.appMenuHidden?/*#__PURE__*/React.createElement(this.props.components.AppMenu,{appMenuClearsTask:this.props.appMenuClearsTask,appMenuShortcut:this.props.appMenuShortcut,buttonLabel:LocaleUtils.tr("appmenu.menulabel"),keepMenuOpen:keepMenuOpen,menuCompact:menuCompact,menuItems:this.state.allowedMenuItems,openExternalUrl:this.openUrl,showFilterField:this.props.appMenuFilterField,showOnStartup:showOnStartup}):null,this.props.components.FullscreenSwitcher?/*#__PURE__*/React.createElement(this.props.components.FullscreenSwitcher,null):null))}}])}(React.Component);_defineProperty(TopBar,"propTypes",{/** Whether opening the app menu clears the active task. */appMenuClearsTask:PropTypes.bool,/** Whether show an appMenu compact (menu visible on icons hover) - Only available for desktop client. */appMenuCompact:PropTypes.bool,/** Whether to display the filter field in the app menu. */appMenuFilterField:PropTypes.bool,/** Whether to hide the app menu (useful primarely as a theme specific setting). */appMenuHidden:PropTypes.bool,/** The shortcut for tiggering the app menu, i.e. alt+shift+m. */appMenuShortcut:PropTypes.string,/** Whether to open the app menu on application startup. */appMenuVisibleOnStartup:PropTypes.bool,components:PropTypes.object,currentTheme:PropTypes.object,fullscreen:PropTypes.bool,/** The logo file format. */logoFormat:PropTypes.string,/** The logo image URL if a different source than the default `assets/img/logo.<ext>` and `assets/img/logo-mobile.<ext>` is desired. */logoSrc:PropTypes.string,/** The hyperlink to open when the logo is clicked. */logoUrl:PropTypes.string,/** The menu items. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */menuItems:PropTypes.array,openExternalUrl:PropTypes.func,/** Options passed down to the search component. */searchOptions:PropTypes.shape({/** Whether to show the search filter widget. */allowSearchFilters:PropTypes.bool,/** Whether to hide the result labels on the map. */hideResultLabels:PropTypes.bool,/** The style used for highlighting search result geometries. */highlightStyle:PropTypes.shape({/* Stroke color rgba array, i.e. [255, 0, 0, 0.5] */strokeColor:PropTypes.array,/* Stroke width */strokeWidth:PropTypes.number,/* Stroke dash/gap pattern array. Empty for solid line. */strokeDash:PropTypes.array,/* Fill color rgba array, i.e. [255, 0, 0, 0.33] */fillColor:PropTypes.array}),/** Minimum scale denominator when zooming to search result. */minScaleDenom:PropTypes.number,/** Result count limit which is passed to the search provider. */resultLimit:PropTypes.number,/** Whether to collapse search sections by default. */sectionsDefaultCollapsed:PropTypes.bool,/** Whether to show a highlight marker in the center of the search result geometry. */showHighlightMarker:PropTypes.bool,/** Whether to show the layer tree after selecting a theme result. */showLayerAfterChangeTheme:PropTypes.bool,/** Whether to show layer results before pkaces in the result menu. */showLayerResultsBeforePlaces:PropTypes.bool,/** Whether to replace the search text with the selected search result text. */showResultInSearchText:PropTypes.bool,/** Whether to zoom to layer search results. */zoomToLayers:PropTypes.bool}),setTopbarHeight:PropTypes.func,toggleFullscreen:PropTypes.func,/** The toolbar. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */toolbarItems:PropTypes.array,/** The keyboard shortcut prefix for triggering toolbar tasks. I.e. alt+shift. The task are then triggered by <prefix>+{1,2,3,...} for the 1st, 2nd, 3rd... toolbar icon. */toolbarItemsShortcutPrefix:PropTypes.string,windowMargins:PropTypes.object});_defineProperty(TopBar,"defaultProps",{searchOptions:{showHighlightMarker:true,showResultInSearchText:true},menuItems:[],toolbarItems:[],logoFormat:"svg"});export default(function(components){return connect(function(state){return{fullscreen:state.display.fullscreen,components:components,currentTheme:state.theme.current,windowMargins:state.windows.windowMargins}},{toggleFullscreen:toggleFullscreen,openExternalUrl:openExternalUrl,setTopbarHeight:setTopbarHeight})(TopBar)});
|
|
13
|
+
var showOnStartup=this.props.appMenuVisibleOnStartup||menuCompact;var style=this.props.windowMargins.splitTopAndBottomBar?{marginLeft:this.props.windowMargins.left+"px",marginRight:this.props.windowMargins.right+"px"}:{};return/*#__PURE__*/React.createElement(Swipeable,{onSwipedDown:function onSwipedDown(){return _this2.props.toggleFullscreen(false)},onSwipedUp:function onSwipedUp(){return _this2.props.toggleFullscreen(true)}},/*#__PURE__*/React.createElement("div",{className:classes,ref:this.storeHeight,style:style},logoEl,/*#__PURE__*/React.createElement("div",{className:"topbar-center-span"},this.props.components.Search?/*#__PURE__*/React.createElement("div",{className:"topbar-search-container"},/*#__PURE__*/React.createElement(this.props.components.Search,{searchOptions:searchOptions})):null,this.props.components.Toolbar?/*#__PURE__*/React.createElement(this.props.components.Toolbar,{openExternalUrl:this.openUrl,toolbarItems:this.state.allowedToolbarItems,toolbarItemsShortcutPrefix:this.props.toolbarItemsShortcutPrefix}):null),this.props.components.AppMenu&&!this.props.appMenuHidden?/*#__PURE__*/React.createElement(this.props.components.AppMenu,{appMenuClearsTask:this.props.appMenuClearsTask,appMenuShortcut:this.props.appMenuShortcut,buttonLabel:LocaleUtils.tr("appmenu.menulabel"),keepMenuOpen:keepMenuOpen,menuCompact:menuCompact,menuItems:this.state.allowedMenuItems,openExternalUrl:this.openUrl,showFilterField:this.props.appMenuFilterField,showOnStartup:showOnStartup}):null,this.props.components.FullscreenSwitcher?/*#__PURE__*/React.createElement(this.props.components.FullscreenSwitcher,null):null))}}])}(React.Component);_defineProperty(TopBar,"propTypes",{/** Whether opening the app menu clears the active task. */appMenuClearsTask:PropTypes.bool,/** Whether show an appMenu compact (menu visible on icons hover) - Only available for desktop client. */appMenuCompact:PropTypes.bool,/** Whether to display the filter field in the app menu. */appMenuFilterField:PropTypes.bool,/** Whether to hide the app menu (useful primarely as a theme specific setting). */appMenuHidden:PropTypes.bool,/** The shortcut for tiggering the app menu, i.e. alt+shift+m. */appMenuShortcut:PropTypes.string,/** Whether to open the app menu on application startup. */appMenuVisibleOnStartup:PropTypes.bool,components:PropTypes.object,currentTheme:PropTypes.object,fullscreen:PropTypes.bool,/** The logo file format. */logoFormat:PropTypes.string,/** The logo image URL if a different source than the default `assets/img/logo.<ext>` and `assets/img/logo-mobile.<ext>` is desired. */logoSrc:PropTypes.string,/** The hyperlink to open when the logo is clicked. */logoUrl:PropTypes.string,/** The menu items. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */menuItems:PropTypes.array,openExternalUrl:PropTypes.func,/** Options passed down to the search component. */searchOptions:PropTypes.shape({/** Whether to show the search filter widget. */allowSearchFilters:PropTypes.bool,/** Whether to hide the result labels on the map. */hideResultLabels:PropTypes.bool,/** The style used for highlighting search result geometries. */highlightStyle:PropTypes.shape({/* Stroke color rgba array, i.e. [255, 0, 0, 0.5] */strokeColor:PropTypes.array,/* Stroke width */strokeWidth:PropTypes.number,/* Stroke dash/gap pattern array. Empty for solid line. */strokeDash:PropTypes.array,/* Fill color rgba array, i.e. [255, 0, 0, 0.33] */fillColor:PropTypes.array}),/** Minimum scale denominator when zooming to search result. */minScaleDenom:PropTypes.number,/** Result count limit which is passed to the search provider. */resultLimit:PropTypes.number,/** Whether to collapse search sections by default. */sectionsDefaultCollapsed:PropTypes.bool,/** Whether to show a highlight marker in the center of the search result geometry. */showHighlightMarker:PropTypes.bool,/** Whether to show the layer tree after selecting a theme result. */showLayerAfterChangeTheme:PropTypes.bool,/** Whether to show layer results before pkaces in the result menu. */showLayerResultsBeforePlaces:PropTypes.bool,/** Whether to replace the search text with the selected search result text. */showResultInSearchText:PropTypes.bool,/** Whether to zoom to layer search results. */zoomToLayers:PropTypes.bool}),setTopbarHeight:PropTypes.func,toggleFullscreen:PropTypes.func,/** The toolbar. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */toolbarItems:PropTypes.array,/** The keyboard shortcut prefix for triggering toolbar tasks. I.e. alt+shift. The task are then triggered by <prefix>+{1,2,3,...} for the 1st, 2nd, 3rd... toolbar icon. */toolbarItemsShortcutPrefix:PropTypes.string,windowMargins:PropTypes.object});_defineProperty(TopBar,"defaultProps",{searchOptions:{showHighlightMarker:true,showResultInSearchText:true,minScaleDenom:1000},menuItems:[],toolbarItems:[],logoFormat:"svg"});export default(function(components){return connect(function(state){return{fullscreen:state.display.fullscreen,components:components,currentTheme:state.theme.current,windowMargins:state.windows.windowMargins}},{toggleFullscreen:toggleFullscreen,openExternalUrl:openExternalUrl,setTopbarHeight:setTopbarHeight})(TopBar)});
|