UNPKG

qwc2

Version:
344 lines (334 loc) 17.7 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * Copyright 2016-2024 Sourcepole AG * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ import ReducerIndex from '../reducers/index'; import themeReducer from '../reducers/theme'; ReducerIndex.register("theme", themeReducer); import isEmpty from 'lodash.isempty'; import { setView3dMode, View3DMode } from '../actions/display'; import { setCurrentTask } from '../actions/task'; import ConfigUtils from '../utils/ConfigUtils'; import CoordinatesUtils from '../utils/CoordinatesUtils'; import LayerUtils from '../utils/LayerUtils'; import LocaleUtils from '../utils/LocaleUtils'; import MapUtils from '../utils/MapUtils'; import { UrlParams } from '../utils/PermaLinkUtils'; import ServiceLayerUtils from '../utils/ServiceLayerUtils'; import ThemeUtils from '../utils/ThemeUtils'; import { LayerRole, addLayer, removeLayer, removeAllLayers, replacePlaceholderLayer, setSwipe } from './layers'; import { configureMap } from './map'; import { showNotification, NotificationType } from './windows'; export var THEMES_LOADED = 'THEMES_LOADED'; export var SET_THEME_LAYERS_LIST = 'SET_THEME_LAYERS_LIST'; export var SET_CURRENT_THEME = 'SET_CURRENT_THEME'; export var SWITCHING_THEME = 'SWITCHING_THEME'; export function themesLoaded(themes) { return { type: THEMES_LOADED, themes: themes }; } export function setThemeLayersList(theme) { return { type: SET_THEME_LAYERS_LIST, themelist: theme }; } export function finishThemeSetup(dispatch, theme, themes, layerConfigs, insertPos, permalinkLayers, externalLayerRestorer, visibleBgLayer, initialTheme) { var _theme$config; var initialView = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : null; // Create layer var themeLayer = ThemeUtils.createThemeLayer(theme, themes); var layers = [themeLayer]; // Restore theme layer configuration, create placeholders for missing layers var externalLayers = {}; if (!isEmpty(permalinkLayers) && ConfigUtils.getConfigProp("storeAllLayersInPermalink")) { layers = permalinkLayers; } else { if (layerConfigs) { if (ConfigUtils.getConfigProp("allowReorderingLayers", theme) !== true) { layers = LayerUtils.restoreLayerParams(themeLayer, layerConfigs, permalinkLayers, externalLayers); } else { layers = LayerUtils.restoreOrderedLayerParams(themeLayer, layerConfigs, permalinkLayers, externalLayers); } } if (isEmpty(layers)) { layers = [_objectSpread(_objectSpread({}, themeLayer), {}, { sublayers: [] })]; } } // Add background layers for theme var haveVisibleBg = false; var bgLayers = ThemeUtils.createThemeBackgroundLayers(theme.backgroundLayers || [], themes, visibleBgLayer, externalLayers); if (initialTheme && visibleBgLayer) { var _bgLayers$find; var visibleLayer = (_bgLayers$find = bgLayers.find(function (entry) { return entry.visibility; })) === null || _bgLayers$find === void 0 ? void 0 : _bgLayers$find.name; if (visibleLayer !== visibleBgLayer) { dispatch(showNotification("missingbglayer", LocaleUtils.tr("app.missingbg", visibleBgLayer), NotificationType.WARN, true)); } } var _iterator = _createForOfIteratorHelper(bgLayers), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var bgLayer = _step.value; haveVisibleBg |= bgLayer.visibility; dispatch(addLayer(bgLayer)); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (!haveVisibleBg) { UrlParams.updateParams({ bl: "" }); } var _iterator2 = _createForOfIteratorHelper(layers.reverse()), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var layer = _step2.value; dispatch(addLayer(layer, insertPos)); } // Restore external layers } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } if (externalLayerRestorer) { externalLayerRestorer(externalLayers, themes, function (source, layer) { dispatch(replacePlaceholderLayer(source, layer)); }); } else { for (var _i = 0, _Object$keys = Object.keys(externalLayers); _i < _Object$keys.length; _i++) { var key = _Object$keys[_i]; var idx = key.indexOf(":"); var service = key.slice(0, idx); var serviceUrl = key.slice(idx + 1); ServiceLayerUtils.findLayers(service, serviceUrl, externalLayers[key], theme.mapCrs, function (id, layer) { // Don't expose sublayers if (layer) { layer.sublayers = null; } dispatch(replacePlaceholderLayer(id, layer)); }); } } dispatch({ type: SET_CURRENT_THEME, theme: theme }); if (initialView === null) { if (theme.startupView === "2d") { dispatch(setView3dMode(View3DMode.DISABLED)); } else if (theme.startupView === "3d2d") { dispatch(setView3dMode(View3DMode.SPLITSCREEN)); } else if (theme.startupView === "3d") { dispatch(setView3dMode(View3DMode.FULLSCREEN)); } } else { UrlParams.updateParams({ v: initialView }); } dispatch({ type: SWITCHING_THEME, switching: false }); var task = (_theme$config = theme.config) === null || _theme$config === void 0 ? void 0 : _theme$config.startupTask; if (task) { var mapClickAction = ConfigUtils.getPluginConfig(task.key).mapClickAction; dispatch(setCurrentTask(task.key, task.mode, mapClickAction)); } } export function setCurrentTheme(theme, themes) { var preserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var initialExtent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; var layerParams = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; var visibleBgLayer = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null; var permalinkLayers = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null; var themeLayerRestorer = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null; var externalLayerRestorer = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null; var initialView = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : null; return function (dispatch, getState) { var _getState$layers; var curLayers = ((_getState$layers = getState().layers) === null || _getState$layers === void 0 ? void 0 : _getState$layers.flat) || []; var mapCrs = theme.mapCrs || themes.defaultMapCrs || "EPSG:3857"; if (!(mapCrs in CoordinatesUtils.getAvailableCRS())) { dispatch(showNotification("missingprojection", LocaleUtils.tr("app.missingprojection", theme.title, mapCrs), NotificationType.WARN, true)); return; } var initialTheme = !getState().theme.current; dispatch({ type: SWITCHING_THEME, switching: true }); // Get current background layer if it needs to be preserved if (preserve && visibleBgLayer === null && ConfigUtils.getConfigProp("preserveBackgroundOnThemeSwitch", theme) === true) { var curBgLayer = curLayers.find(function (layer) { return layer.role === LayerRole.BACKGROUND && layer.visibility === true; }); visibleBgLayer = curBgLayer ? curBgLayer.name : null; } // Remove old layers var insertPos = 0; if (preserve && ConfigUtils.getConfigProp("preserveNonThemeLayersOnThemeSwitch", theme) === true) { // Compute insertion position of new theme layers by counting how many non-theme layers remain insertPos = curLayers.filter(function (layer) { return layer.role === LayerRole.USERLAYER; }).length; var removeLayers = curLayers.filter(function (layer) { return layer.role !== LayerRole.USERLAYER; }).map(function (layer) { return layer.id; }); var _iterator3 = _createForOfIteratorHelper(removeLayers), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var layerId = _step3.value; dispatch(removeLayer(layerId)); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } } else { dispatch(removeAllLayers()); } dispatch(setSwipe(null)); if (!theme) { dispatch({ type: SWITCHING_THEME, switching: false }); return; } // Inherit defaults if necessary theme = _objectSpread(_objectSpread({}, theme), {}, { mapCrs: mapCrs, version: theme.version || themes.defaultWMSVersion || "1.3.0", scales: theme.scales || themes.defaultScales || MapUtils.getGoogleMercatorScales(0, 21), printScales: theme.printScales || themes.defaultPrintScales || undefined, printResolutions: theme.printResolutions || themes.defaultPrintResolutions || undefined, printGrid: theme.printGrid || themes.defaultPrintGrid || undefined, searchProviders: theme.searchProviders || themes.defaultSearchProviders || undefined, backgroundLayers: theme.backgroundLayers || themes.defaultBackgroundLayers || [], defaultDisplayCrs: theme.defaultDisplayCrs || themes.defaultDisplayCrs || undefined }); // Preserve extent if desired and possible if (getState().display.view3dMode !== View3DMode.FULLSCREEN) { var curCrs = getState().map.projection; if (preserve && !initialExtent && curCrs === theme.mapCrs) { var curBounds = getState().map.bbox.bounds; if (ConfigUtils.getConfigProp("preserveExtentOnThemeSwitch", theme) === true) { // If theme bbox (b1) includes current bbox (b2), keep current extent var b1 = CoordinatesUtils.reprojectBbox(theme.bbox.bounds, theme.bbox.crs, curCrs); var b2 = curBounds; if (b2[0] >= b1[0] && b2[1] >= b1[1] && b2[2] <= b1[2] && b2[3] <= b1[3]) { // theme bbox (b1) includes current bbox (b2) initialExtent = { bounds: curBounds, crs: curCrs }; } } else if (ConfigUtils.getConfigProp("preserveExtentOnThemeSwitch", theme) === "force") { initialExtent = { bounds: curBounds, crs: curCrs }; } } } // Reconfigure map dispatch(configureMap(theme.mapCrs, theme.scales, initialExtent || theme.initialBbox, theme.defaultDisplayCrs)); var layerConfigs = layerParams ? layerParams.map(function (param) { return LayerUtils.splitLayerUrlParam(param); }) : null; if (layerConfigs) { layerConfigs = LayerUtils.replaceLayerGroups(layerConfigs, theme); } // Restore missing theme layers var missingThemeLayers = null; if (layerConfigs) { var layerNames = LayerUtils.getSublayerNames(theme); missingThemeLayers = layerConfigs.reduce(function (missing, layerConfig) { if (layerConfig.type === 'theme' && !layerNames.includes(layerConfig.name)) { return _objectSpread(_objectSpread({}, missing), {}, _defineProperty({}, layerConfig.name, layerConfig)); } else { return missing; } }, {}); } if (themeLayerRestorer && !isEmpty(missingThemeLayers)) { themeLayerRestorer(Object.keys(missingThemeLayers), theme, function (newLayers, newLayerNames) { var newTheme = LayerUtils.mergeSubLayers(theme, { sublayers: newLayers }); if (newLayerNames) { layerConfigs = layerConfigs.reduce(function (res, layerConfig) { if (layerConfig.name in newLayerNames) { // If layerConfig exactly matches a restored theme layer, return unchanged config if (newLayerNames[layerConfig.name].length === 1 && newLayerNames[layerConfig.name][0] === layerConfig.name) { return [].concat(_toConsumableArray(res), [layerConfig]); } // Else, in case multiple theme layers were returned (i.e. layerConfig.name specifies a group) // generate layerConfigs based on the group layerConfig, preserving the opacity/visibility/etc of the sublayer return [].concat(_toConsumableArray(res), _toConsumableArray(newLayerNames[layerConfig.name].map(function (sublayername) { var _sublayer$opacity, _sublayer$visibility; var sublayer = LayerUtils.searchSubLayer({ sublayers: newLayers }, "name", sublayername); return _objectSpread(_objectSpread({}, layerConfig), {}, { name: sublayername, opacity: (_sublayer$opacity = sublayer.opacity) !== null && _sublayer$opacity !== void 0 ? _sublayer$opacity : 255, visibility: (_sublayer$visibility = sublayer.visibility) !== null && _sublayer$visibility !== void 0 ? _sublayer$visibility : true, tristate: sublayer.tristate || false, style: sublayer.style }); }))); } else { return [].concat(_toConsumableArray(res), [layerConfig]); } }, []); var diff = Object.keys(missingThemeLayers).filter(function (entry) { return isEmpty(newLayerNames[entry]); }); if (!isEmpty(diff)) { dispatch(showNotification("missinglayers", LocaleUtils.tr("app.missinglayers", diff.join(", ")), NotificationType.WARN, true)); } } finishThemeSetup(dispatch, newTheme, themes, layerConfigs, insertPos, permalinkLayers, externalLayerRestorer, visibleBgLayer, initialTheme, initialView); }); } else { if (!isEmpty(missingThemeLayers)) { dispatch(showNotification("missinglayers", LocaleUtils.tr("app.missinglayers", Object.keys(missingThemeLayers).join(", ")), NotificationType.WARN, true)); } finishThemeSetup(dispatch, theme, themes, layerConfigs, insertPos, permalinkLayers, externalLayerRestorer, visibleBgLayer, initialTheme, initialView); } }; }