qwc2-lts
Version:
QGIS Web Client
24 lines • 13.4 kB
JavaScript
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{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;// 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 _iterator=_createForOfIteratorHelper(ThemeUtils.createThemeBackgroundLayers(theme,themes,visibleBgLayer,externalLayers,dispatch,initialTheme)),_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,layer:themeLayer.id});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 initialView=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;return function(dispatch,getState){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=getState().layers.flat.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=getState().layers.flat.filter(function(layer){return layer.role===LayerRole.USERLAYER}).length;var removeLayers=getState().layers.flat.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||[]});// Preserve extent if desired and possible
if(preserve&&!initialView&&getState().map.projection===theme.mapCrs){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,getState().map.projection);var b2=getState().map.bbox.bounds;if(b2[0]>=b1[0]&&b2[1]>=b1[1]&&b2[2]<=b1[2]&&b2[3]<=b1[3]){// theme bbox (b1) includes current bbox (b2)
initialView={bounds:getState().map.bbox.bounds,crs:getState().map.projection}}}else if(ConfigUtils.getConfigProp("preserveExtentOnThemeSwitch",theme)==="force"){initialView={bounds:getState().map.bbox.bounds,crs:getState().map.projection}}}// Reconfigure map
dispatch(configureMap(theme.mapCrs,theme.scales,initialView||theme.initialBbox));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)})}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)}}}export function restoreDefaultTheme(){return function(dispatch,getState){var themes=getState().theme.themes;dispatch(setCurrentTheme(ThemeUtils.getThemeById(themes,themes.defaultTheme),themes,false))}}