qwc2 2025.12.18 → 2025.12.24

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.
Files changed (71) hide show
  1. package/actions/display.js +6 -6
  2. package/actions/theme.js +4 -19
  3. package/components/AppMenu.js +1 -1
  4. package/components/AttributeForm.js +7 -7
  5. package/components/AttributeTableWidget.js +2 -2
  6. package/components/AutoEditForm.js +6 -3
  7. package/components/EditComboField.js +1 -4
  8. package/components/IdentifyViewer.js +33 -34
  9. package/components/ImportLayer.js +78 -79
  10. package/components/OverviewMapButton.js +147 -0
  11. package/components/PluginsContainer.js +2 -2
  12. package/components/ResizeableWindow.js +8 -1
  13. package/components/SearchBox.js +2 -2
  14. package/components/SideBar.js +1 -0
  15. package/components/StandardApp.js +1 -2
  16. package/components/ThemeLayersListWindow.js +10 -1
  17. package/components/{map3d/View3DSwitcher.js → ViewSwitcher.js} +74 -29
  18. package/components/map/OlMap.js +1 -1
  19. package/components/map3d/Map3D.js +50 -48
  20. package/components/map3d/MapControls3D.js +4 -1
  21. package/components/map3d/drawtool/EditTool3D.js +1 -1
  22. package/components/map3d/layers/WFSLayer3D.js +1 -1
  23. package/components/share/ShareQRCode.js +1 -1
  24. package/{plugins/map3d/style/OverviewMap3D.css → components/style/OverviewMapButton.css} +4 -4
  25. package/components/style/ViewSwitcher.css +36 -0
  26. package/components/widgets/ColorButton.js +2 -2
  27. package/components/widgets/CopyButton.js +1 -1
  28. package/components/widgets/LayerCatalogWidget.js +4 -4
  29. package/libs/openlayers.js +11 -11
  30. package/package.json +54 -55
  31. package/plugins/API.js +4 -4
  32. package/plugins/FeatureForm.js +2 -2
  33. package/plugins/FeatureSearch.js +12 -12
  34. package/plugins/GeometryDigitizer.js +12 -13
  35. package/plugins/Map.js +11 -4
  36. package/plugins/MapFilter.js +12 -12
  37. package/plugins/MapTip.js +1 -1
  38. package/plugins/ObliqueView.js +115 -51
  39. package/plugins/Print.js +79 -91
  40. package/plugins/Routing.js +1 -1
  41. package/plugins/Share.js +5 -5
  42. package/plugins/TimeManager.js +1 -2
  43. package/plugins/View3D.js +135 -123
  44. package/plugins/map/RedliningSupport.js +3 -3
  45. package/plugins/map3d/Draw3D.js +4 -4
  46. package/plugins/map3d/ExportObjects3D.js +1 -1
  47. package/plugins/map3d/HideObjects3D.js +7 -7
  48. package/plugins/map3d/Identify3D.js +1 -1
  49. package/plugins/map3d/LayerTree3D.js +1 -1
  50. package/plugins/map3d/MapExport3D.js +25 -25
  51. package/plugins/map3d/Measure3D.js +1 -1
  52. package/plugins/map3d/OverviewMap3D.js +27 -102
  53. package/plugins/map3d/TopBar3D.js +7 -7
  54. package/plugins/style/ObliqueView.css +27 -11
  55. package/reducers/display.js +2 -2
  56. package/reducers/layers.js +11 -11
  57. package/scripts/gen-plugin-docs.js +11 -4
  58. package/scripts/makeIconkit.js +2 -2
  59. package/scripts/themesConfig.js +5 -5
  60. package/scripts/updateTranslations.js +2 -2
  61. package/utils/CoordinatesUtils.js +1 -1
  62. package/utils/EditingUtils.js +6 -6
  63. package/utils/FeatureStyles.js +1 -1
  64. package/utils/LayerUtils.js +73 -74
  65. package/utils/MiscUtils.js +10 -3
  66. package/utils/PermaLinkUtils.js +68 -71
  67. package/utils/SearchProviders.js +2 -2
  68. package/utils/ServiceLayerUtils.js +12 -12
  69. package/utils/ThemeUtils.js +1 -1
  70. package/utils/VectorLayerUtils.js +3 -3
  71. package/components/map3d/style/View3DSwitcher.css +0 -19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.12.18",
3
+ "version": "2025.12.24",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -16,75 +16,74 @@
16
16
  "geospatial"
17
17
  ],
18
18
  "dependencies": {
19
- "@furkot/webfonts-generator": "^2.0.2",
20
- "@kayahr/text-encoding": "^2.0.0",
21
- "@loaders.gl/core": "^4.3.3",
22
- "@loaders.gl/shapefile": "^4.3.3",
23
- "@loaders.gl/zip": "^4.3.3",
19
+ "@furkot/webfonts-generator": "^2.0.3",
20
+ "@kayahr/text-encoding": "^2.1.0",
21
+ "@loaders.gl/core": "^4.3.4",
22
+ "@loaders.gl/shapefile": "^4.3.4",
23
+ "@loaders.gl/zip": "^4.3.4",
24
24
  "@mapbox/shp-write": "^0.4.3",
25
25
  "@norbulcz/num-parse": "^0.1.0",
26
- "@panoramax/web-viewer": "^4.0.1",
27
- "@reduxjs/toolkit": "^2.4.0",
26
+ "@panoramax/web-viewer": "^4.2.0",
27
+ "@reduxjs/toolkit": "^2.11.2",
28
28
  "@sourcepole/qwc-giro3d": "^0.44.0-dev",
29
- "@turf/buffer": "^6.5.0",
29
+ "@turf/buffer": "^7.3.1",
30
30
  "@turf/clean-coords": "^7.3.1",
31
- "@turf/helpers": "^6.5.0",
31
+ "@turf/helpers": "^7.3.1",
32
32
  "@vtaits/react-color-picker": "^2.0.0",
33
33
  "any-date-parser": "^1.5.4",
34
- "axios": "^1.11.0",
35
- "chart.js": "^4.4.7",
34
+ "axios": "^1.13.2",
35
+ "chart.js": "^4.5.1",
36
36
  "classnames": "^2.5.1",
37
37
  "clone": "^2.1.2",
38
- "dayjs": "^1.11.13",
38
+ "dayjs": "^1.11.19",
39
39
  "deepmerge": "^4.3.1",
40
40
  "diacritics": "^1.3.0",
41
- "dompurify": "^3.2.6",
42
- "driver.js": "^1.3.6",
41
+ "dompurify": "^3.3.1",
42
+ "driver.js": "^1.4.0",
43
43
  "expr-eval": "^2.0.2",
44
- "fast-xml-parser": "^4.5.0",
44
+ "fast-xml-parser": "^5.3.3",
45
45
  "file-saver": "^2.0.5",
46
46
  "flat": "^6.0.1",
47
47
  "formdata-json": "^1.0.0",
48
48
  "geojson-bounding-box": "^0.2.0",
49
- "html-react-parser": "^5.2.0",
49
+ "html-react-parser": "^5.2.11",
50
50
  "ismobilejs": "^1.1.1",
51
- "js-yaml": "^4.1.0",
51
+ "js-yaml": "^4.1.1",
52
52
  "jszip": "^3.10.1",
53
53
  "lodash.isempty": "^4.4.0",
54
54
  "lodash.isequal": "^4.5.0",
55
- "lodash.omit": "^4.5.0",
56
55
  "mime-to-extensions": "^1.0.2",
57
56
  "mkdirp": "^3.0.1",
58
57
  "mousetrap": "^1.6.5",
59
58
  "nearley": "^2.20.1",
60
59
  "object-path": "^0.11.8",
61
- "ol": "^10.3.1",
62
- "ol-ext": "^4.0.24",
63
- "ol-mapbox-style": "^12.3.5",
64
- "painterro": "^1.2.87",
60
+ "ol": "^10.7.0",
61
+ "ol-ext": "^4.0.37",
62
+ "ol-mapbox-style": "^13.2.0",
63
+ "painterro": "^1.2.92",
65
64
  "parse-css-color": "^0.2.1",
66
65
  "path-browserify": "^1.0.1",
67
66
  "pdf-lib": "^1.17.1",
68
- "pdfjs-dist": "^4.9.155",
67
+ "pdfjs-dist": "^5.4.449",
69
68
  "point-in-polygon": "^1.1.0",
70
69
  "polygon-intersect-test": "^1.0.1",
71
- "proj4": "^2.15.0",
70
+ "proj4": "^2.20.2",
72
71
  "prop-types": "^15.8.1",
73
- "qrcode.react": "^4.1.0",
72
+ "qrcode.react": "^4.2.0",
74
73
  "randomcolor": "^0.6.2",
75
- "react": "^18.3.1",
76
- "react-chartjs-2": "^5.2.0",
77
- "react-dom": "^18.3.1",
74
+ "react": "^19.2.3",
75
+ "react-chartjs-2": "^5.3.1",
76
+ "react-dom": "^19.2.3",
78
77
  "react-google-recaptcha": "^3.1.0",
79
- "react-redux": "^9.1.2",
80
- "react-reverse-portal": "^2.1.2",
81
- "react-rnd": "^10.4.13",
82
- "react-share": "^5.1.1",
78
+ "react-redux": "^9.2.0",
79
+ "react-reverse-portal": "^2.3.0",
80
+ "react-rnd": "^10.5.2",
81
+ "react-share": "^5.2.2",
83
82
  "react-sortablejs": "^1.5.1",
84
83
  "react-swipeable": "^7.0.2",
85
84
  "redux-logger": "^3.0.6",
86
85
  "reselect": "^5.1.1",
87
- "simplepolygon": "^1.2.3",
86
+ "simplepolygon": "^2.0.2",
88
87
  "sortablejs": "^1.15.6",
89
88
  "suncalc": "^1.9.0",
90
89
  "svgpath": "^2.6.0",
@@ -94,36 +93,36 @@
94
93
  "toposort": "^2.0.2",
95
94
  "url": "^0.11.4",
96
95
  "utif": "^3.1.0",
97
- "uuid": "^11.0.3",
96
+ "uuid": "^13.0.0",
98
97
  "xlsx": "^0.18.5"
99
98
  },
100
99
  "devDependencies": {
101
- "@babel/cli": "^7.27.0",
102
- "@babel/core": "^7.26.0",
103
- "@babel/eslint-parser": "^7.25.9",
104
- "@babel/plugin-transform-class-properties": "^7.25.9",
105
- "@babel/plugin-transform-object-rest-spread": "^7.25.9",
106
- "@babel/preset-env": "^7.26.0",
107
- "@babel/preset-react": "^7.26.3",
100
+ "@babel/cli": "^7.28.3",
101
+ "@babel/core": "^7.28.5",
102
+ "@babel/eslint-parser": "^7.28.5",
103
+ "@babel/plugin-transform-class-properties": "^7.27.1",
104
+ "@babel/plugin-transform-object-rest-spread": "^7.28.4",
105
+ "@babel/preset-env": "^7.28.5",
106
+ "@babel/preset-react": "^7.28.5",
108
107
  "@microsoft/eslint-formatter-sarif": "^3.1.0",
109
- "@types/react": "^18.3.1",
110
- "babel-loader": "^9.2.1",
108
+ "@types/react": "^19.2.7",
109
+ "@types/three": "^0.170.0",
110
+ "babel-loader": "^10.0.0",
111
111
  "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
112
- "clean-webpack-plugin": "^4.0.0",
113
- "copy-webpack-plugin": "^12.0.2",
112
+ "copy-webpack-plugin": "^13.0.1",
114
113
  "css-loader": "^7.1.2",
115
- "eslint": "^8.56.0",
116
- "eslint-plugin-perfectionist": "^2.10.0",
117
- "eslint-plugin-react": "^7.37.2",
118
- "html-webpack-plugin": "^5.6.4",
119
- "react-docgen": "^5.4.3",
114
+ "eslint": "^9.39.2",
115
+ "eslint-plugin-perfectionist": "^5.1.0",
116
+ "eslint-plugin-react": "^7.37.5",
117
+ "html-webpack-plugin": "^5.6.5",
118
+ "react-docgen": "^8.0.2",
120
119
  "source-map-loader": "^5.0.0",
121
120
  "style-loader": "^4.0.0",
122
- "typescript": "^5.7.2",
123
- "webpack": "^5.97.1",
121
+ "typescript": "^5.9.3",
122
+ "webpack": "^5.104.1",
124
123
  "webpack-bundle-size-analyzer": "^3.1.0",
125
- "webpack-cli": "^5.1.4",
126
- "webpack-dev-server": "^5.1.0"
124
+ "webpack-cli": "^6.0.1",
125
+ "webpack-dev-server": "^5.2.2"
127
126
  },
128
127
  "bin": {
129
128
  "qwc_build_iconfont": "./scripts/makeIconkit.js",
package/plugins/API.js CHANGED
@@ -69,18 +69,18 @@ import QtDesignerForm from '../components/QtDesignerForm';
69
69
  import ResizeableWindow from '../components/ResizeableWindow';
70
70
  import SearchBox from '../components/SearchBox';
71
71
  import ServiceInfoWindow from '../components/ServiceInfoWindow';
72
+ import ShareLink from '../components/share/ShareLink';
73
+ import ShareQRCode from '../components/share/ShareQRCode';
74
+ import ShareSocials from '../components/share/ShareSocials';
72
75
  import SideBar from '../components/SideBar';
73
76
  import { Swipeable } from '../components/Swipeable';
74
77
  import TaskBar from '../components/TaskBar';
75
78
  import ThemeLayersListWindow from '../components/ThemeLayersListWindow';
76
79
  import ThemeList from '../components/ThemeList';
77
- import Toolbar from '../components/Toolbar';
78
- import ShareLink from '../components/share/ShareLink';
79
- import ShareQRCode from '../components/share/ShareQRCode';
80
- import ShareSocials from '../components/share/ShareSocials';
81
80
  import FixedTimeline from '../components/timeline/FixedTimeline';
82
81
  import InfiniteTimeline from '../components/timeline/InfiniteTimeline';
83
82
  import TimelineFeaturesSlider from '../components/timeline/TimelineFeaturesSlider';
83
+ import Toolbar from '../components/Toolbar';
84
84
  import AccordeonWidget from '../components/widgets/AccordeonWidget';
85
85
  import ButtonBar from '../components/widgets/ButtonBar';
86
86
  import ColorButton from '../components/widgets/ColorButton';
@@ -259,7 +259,7 @@ var FeatureForm = /*#__PURE__*/function (_React$Component) {
259
259
  },
260
260
  value: this.state.selectedFeature
261
261
  }, Object.entries(this.state.pickedFeatures).map(function (_ref7) {
262
- var _ref9, _ref10, _match$layer$translat, _match$layer$translat2, _match$sublayer;
262
+ var _ref9, _ref0, _match$layer$translat, _match$layer$translat2, _match$sublayer;
263
263
  var _ref8 = _slicedToArray(_ref7, 2),
264
264
  id = _ref8[0],
265
265
  feature = _ref8[1];
@@ -270,7 +270,7 @@ var FeatureForm = /*#__PURE__*/function (_React$Component) {
270
270
  featureId = _id$split2[2];
271
271
  var editConfig = _this2.props.editConfigs[mapName][layerName];
272
272
  var match = LayerUtils.searchLayer(_this2.props.layers, 'wms_name', mapName, 'name', layerName);
273
- var layerTitle = (_ref9 = (_ref10 = (_match$layer$translat = (_match$layer$translat2 = match.layer.translations) === null || _match$layer$translat2 === void 0 || (_match$layer$translat2 = _match$layer$translat2.layertree) === null || _match$layer$translat2 === void 0 ? void 0 : _match$layer$translat2[layerName]) !== null && _match$layer$translat !== void 0 ? _match$layer$translat : editConfig.layerTitle) !== null && _ref10 !== void 0 ? _ref10 : match === null || match === void 0 || (_match$sublayer = match.sublayer) === null || _match$sublayer === void 0 ? void 0 : _match$sublayer.title) !== null && _ref9 !== void 0 ? _ref9 : layerName;
273
+ var layerTitle = (_ref9 = (_ref0 = (_match$layer$translat = (_match$layer$translat2 = match.layer.translations) === null || _match$layer$translat2 === void 0 || (_match$layer$translat2 = _match$layer$translat2.layertree) === null || _match$layer$translat2 === void 0 ? void 0 : _match$layer$translat2[layerName]) !== null && _match$layer$translat !== void 0 ? _match$layer$translat : editConfig.layerTitle) !== null && _ref0 !== void 0 ? _ref0 : match === null || match === void 0 || (_match$sublayer = match.sublayer) === null || _match$sublayer === void 0 ? void 0 : _match$sublayer.title) !== null && _ref9 !== void 0 ? _ref9 : layerName;
274
274
  var featureName = editConfig.displayField ? feature.properties[editConfig.displayField] : featureText + " " + featureId;
275
275
  return /*#__PURE__*/React.createElement("option", {
276
276
  key: id,
@@ -294,18 +294,18 @@ var FeatureSearch = /*#__PURE__*/function (_React$Component) {
294
294
  });
295
295
  _defineProperty(_this, "reloadSelectOptions", function () {
296
296
  var _this$state$searchPro, _this$state$searchPro2;
297
- Object.entries((_this$state$searchPro = (_this$state$searchPro2 = _this.state.searchProviders[_this.state.selectedProvider]) === null || _this$state$searchPro2 === void 0 || (_this$state$searchPro2 = _this$state$searchPro2.params) === null || _this$state$searchPro2 === void 0 ? void 0 : _this$state$searchPro2.fields) !== null && _this$state$searchPro !== void 0 ? _this$state$searchPro : {}).forEach(function (_ref10) {
298
- var _ref11 = _slicedToArray(_ref10, 2),
299
- name = _ref11[0],
300
- fieldcfg = _ref11[1];
297
+ Object.entries((_this$state$searchPro = (_this$state$searchPro2 = _this.state.searchProviders[_this.state.selectedProvider]) === null || _this$state$searchPro2 === void 0 || (_this$state$searchPro2 = _this$state$searchPro2.params) === null || _this$state$searchPro2 === void 0 ? void 0 : _this$state$searchPro2.fields) !== null && _this$state$searchPro !== void 0 ? _this$state$searchPro : {}).forEach(function (_ref0) {
298
+ var _ref1 = _slicedToArray(_ref0, 2),
299
+ name = _ref1[0],
300
+ fieldcfg = _ref1[1];
301
301
  if (fieldcfg.type === "select") {
302
302
  if (fieldcfg.options_query) {
303
303
  var _this$state$providerS3;
304
304
  var url = fieldcfg.options_query;
305
- Object.entries(_this.state.formValues).forEach(function (_ref12) {
306
- var _ref13 = _slicedToArray(_ref12, 2),
307
- key = _ref13[0],
308
- value = _ref13[1];
305
+ Object.entries(_this.state.formValues).forEach(function (_ref10) {
306
+ var _ref11 = _slicedToArray(_ref10, 2),
307
+ key = _ref11[0],
308
+ value = _ref11[1];
309
309
  url = url.replace("$".concat(key, "$"), value);
310
310
  });
311
311
  if (((_this$state$providerS3 = _this.state.providerSelectOptions[name]) === null || _this$state$providerS3 === void 0 ? void 0 : _this$state$providerS3.source) !== url) {
@@ -415,10 +415,10 @@ var FeatureSearch = /*#__PURE__*/function (_React$Component) {
415
415
  this.setState(function (state) {
416
416
  var _state$searchProvider;
417
417
  return {
418
- formValues: Object.entries(((_state$searchProvider = state.searchProviders[state.selectedProvider]) === null || _state$searchProvider === void 0 || (_state$searchProvider = _state$searchProvider.params) === null || _state$searchProvider === void 0 ? void 0 : _state$searchProvider.fields) || []).reduce(function (res, _ref14) {
419
- var _ref15 = _slicedToArray(_ref14, 2),
420
- field = _ref15[0],
421
- cfg = _ref15[1];
418
+ formValues: Object.entries(((_state$searchProvider = state.searchProviders[state.selectedProvider]) === null || _state$searchProvider === void 0 || (_state$searchProvider = _state$searchProvider.params) === null || _state$searchProvider === void 0 ? void 0 : _state$searchProvider.fields) || []).reduce(function (res, _ref12) {
419
+ var _ref13 = _slicedToArray(_ref12, 2),
420
+ field = _ref13[0],
421
+ cfg = _ref13[1];
422
422
  return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, field, ""));
423
423
  }, {})
424
424
  };
@@ -32,7 +32,6 @@ import React from 'react';
32
32
  import { connect } from 'react-redux';
33
33
  import polySelfIntersections from 'geojson-polygon-self-intersections';
34
34
  import isEmpty from 'lodash.isempty';
35
- import omit from 'lodash.omit';
36
35
  import PropTypes from 'prop-types';
37
36
  import { LayerRole, removeLayer, addLayerFeatures, removeLayerFeatures, clearLayer } from '../actions/layers';
38
37
  import { changeRedliningState, resetRedliningState } from '../actions/redlining';
@@ -67,16 +66,16 @@ import './style/Redlining.css';
67
66
  * "pluginData": {
68
67
  * "geometryLinks": [
69
68
  * {
70
- * "name": "<geomLinkName>", // Link name referenced in theme item
71
- * "title": "<geomLinkTitle>", // Link title, displayed in the selection combo
72
- * "geomType": ["<geomType>", "<geomType>"] // Supported geometry types (Point, LineString, Polygon)
73
- * "format": "wkt|geojson", // Format of data to send to application
74
- * "url": "<targetApplicationUrl>", // Application target URL, receiving the POST submit. Can contain the $username$ placeholder parameter.
75
- * "params": {"<key>": "<value>", ...} // Optional: additional form parameters to post to URL
76
- * "target": "<target>" | { // Optional: form POST target which to display the result
77
- * "iframedialog": true, // Use an iframe dialog
78
- * "w": <dialogWidth>, // Dialog width
79
- * "h": <dialogHeight> // Dialog height
69
+ * "name": "<geomLinkName>", // Link name referenced in theme item
70
+ * "title": "<geomLinkTitle>", // Link title, displayed in the selection combo
71
+ * "geomType": ["<geomType>", "<geomType>"], // Supported geometry types (Point, LineString, Polygon)
72
+ * "format": "wkt|geojson", // Format of data to send to application
73
+ * "url": "<targetApplicationUrl>", // Application target URL, receiving the POST submit. Can contain the $username$ placeholder parameter.
74
+ * "params": {"<key>": "<value>", ...} // Optional: additional form parameters to post to URL
75
+ * "target": "<target>" | { // Optional: form POST target which to display the result
76
+ * "iframedialog": true, // Use an iframe dialog
77
+ * "w": <dialogWidth>, // Dialog width
78
+ * "h": <dialogHeight> // Dialog height
80
79
  * }
81
80
  * }
82
81
  * ]
@@ -511,8 +510,8 @@ var GeometryDigitizer = /*#__PURE__*/function (_React$Component) {
511
510
  }).join(";") : JSON.stringify({
512
511
  type: "FeatureCollection",
513
512
  features: supportedFeatures.map(function (feature) {
514
- var newFeature = omit(feature, EXCLUDE_PROPS);
515
- newFeature.properties = omit(newFeature.properties, EXCLUDE_ATTRS);
513
+ var newFeature = MiscUtils.objectOmit(feature, EXCLUDE_PROPS);
514
+ newFeature.properties = MiscUtils.objectOmit(newFeature.properties, EXCLUDE_ATTRS);
516
515
  return newFeature;
517
516
  })
518
517
  });
package/plugins/Map.js CHANGED
@@ -36,9 +36,10 @@ import { connect } from 'react-redux';
36
36
  import isEmpty from 'lodash.isempty';
37
37
  import PropTypes from 'prop-types';
38
38
  import { LayerRole } from '../actions/layers';
39
- import { MapContainerPortalContext } from '../components/PluginsContainer';
40
39
  import OlLayer from '../components/map/OlLayer';
41
40
  import OlMap from '../components/map/OlMap';
41
+ import { MapContainerPortalContext } from '../components/PluginsContainer';
42
+ import ViewSwitcher from '../components/ViewSwitcher';
42
43
  import Spinner from '../components/widgets/Spinner';
43
44
  import LayerUtils from '../utils/LayerUtils';
44
45
  import LocaleUtils from '../utils/LocaleUtils';
@@ -273,7 +274,10 @@ var Map = /*#__PURE__*/function (_React$Component) {
273
274
  mapOptions: this.props.mapOptions
274
275
  }, this.props.map, {
275
276
  fullExtent: (_this$props$theme = this.props.theme) === null || _this$props$theme === void 0 ? void 0 : _this$props$theme.bbox
276
- }), this.renderLayers(), this.renderSupportTools())), loadingIndicator], this.context);
277
+ }), this.renderLayers(), this.renderSupportTools())), /*#__PURE__*/React.createElement(ViewSwitcher, {
278
+ key: "ViewSwitcher",
279
+ position: this.props.viewSwitcherPosition
280
+ }), loadingIndicator], this.context);
277
281
  }
278
282
  }]);
279
283
  }(React.Component);
@@ -303,7 +307,9 @@ _defineProperty(Map, "propTypes", {
303
307
  tools: PropTypes.object,
304
308
  /** Options to pass to the map support plugins, in the form `{"<Name>": {<options>}}`.
305
309
  * Refer to the documentation of the <a href="#mapSupportPlugins">Map support plugins</a> for settable options. */
306
- toolsOptions: PropTypes.object
310
+ toolsOptions: PropTypes.object,
311
+ /** Position of the view switcher button. */
312
+ viewSwitcherPosition: PropTypes.number
307
313
  });
308
314
  _defineProperty(Map, "defaultProps", {
309
315
  mapOptions: {},
@@ -311,7 +317,8 @@ _defineProperty(Map, "defaultProps", {
311
317
  swipeGeometryTypeBlacklist: [],
312
318
  swipeLayerNameBlacklist: [],
313
319
  tools: {},
314
- toolsOptions: {}
320
+ toolsOptions: {},
321
+ viewSwitcherPosition: 6
315
322
  });
316
323
  export default (function (tools) {
317
324
  return connect(function (state) {
@@ -145,7 +145,7 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
145
145
  var expr = '';
146
146
  try {
147
147
  expr = JSON.parse(entry.expr);
148
- } catch (e) {
148
+ } catch (_unused) {
149
149
  return;
150
150
  }
151
151
  if (layerExpressions[entry.layer]) {
@@ -225,7 +225,7 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
225
225
  var expr = null;
226
226
  try {
227
227
  expr = JSON.parse(entry.expr);
228
- } catch (e) {
228
+ } catch (_unused2) {
229
229
  return null;
230
230
  }
231
231
  return {
@@ -339,7 +339,7 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
339
339
  var filterexpr = null;
340
340
  try {
341
341
  filterexpr = JSON.parse(_this.state.filterEditor.value);
342
- } catch (e) {
342
+ } catch (_unused3) {
343
343
  // Pass
344
344
  }
345
345
  if (!Array.isArray(filterexpr) || !_validateExpression(filterexpr)) {
@@ -704,16 +704,16 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
704
704
  if (!prevProps.theme && (_this$props$startupPa = this.props.startupParams) !== null && _this$props$startupPa !== void 0 && _this$props$startupPa.f) {
705
705
  try {
706
706
  var startupConfig = JSON.parse(this.props.startupParams.f);
707
- Object.entries(startupConfig).forEach(function (_ref10) {
708
- var _ref11 = _slicedToArray(_ref10, 2),
709
- filterId = _ref11[0],
710
- values = _ref11[1];
707
+ Object.entries(startupConfig).forEach(function (_ref0) {
708
+ var _ref1 = _slicedToArray(_ref0, 2),
709
+ filterId = _ref1[0],
710
+ values = _ref1[1];
711
711
  if (filterId in filters) {
712
712
  filters[filterId].active = true;
713
- Object.entries(values).forEach(function (_ref12) {
714
- var _ref13 = _slicedToArray(_ref12, 2),
715
- fieldId = _ref13[0],
716
- value = _ref13[1];
713
+ Object.entries(values).forEach(function (_ref10) {
714
+ var _ref11 = _slicedToArray(_ref10, 2),
715
+ fieldId = _ref11[0],
716
+ value = _ref11[1];
717
717
  filters[filterId].values[fieldId] = value;
718
718
  });
719
719
  }
@@ -737,7 +737,7 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
737
737
  }));
738
738
  }, {});
739
739
  }
740
- } catch (e) {
740
+ } catch (_unused4) {
741
741
  /* eslint-disable-next-line */
742
742
  console.log("Error while parsing startup filter");
743
743
  }
package/plugins/MapTip.js CHANGED
@@ -29,11 +29,11 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
29
29
  * LICENSE file in the root directory of this source tree.
30
30
  */
31
31
 
32
+ import htmlReactParser, { domToReact } from 'html-react-parser';
32
33
  import React from 'react';
33
34
  import ReactDOM from 'react-dom';
34
35
  import { connect } from 'react-redux';
35
36
  import DOMPurify from 'dompurify';
36
- import htmlReactParser, { domToReact } from 'html-react-parser';
37
37
  import isEmpty from 'lodash.isempty';
38
38
  import PropTypes from 'prop-types';
39
39
  import { v4 as uuidv4 } from 'uuid';