qwc2
Version:
QGIS Web Client
344 lines (334 loc) • 17.7 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 { 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);
}
};
}