qwc2
Version:
QGIS Web Client
352 lines (351 loc) • 17.6 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 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); }
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 _n2 = 0, F = function F() {}; return { s: F, n: function n() { return _n2 >= r.length ? { done: !0 } : { done: !1, value: r[_n2++] }; }, 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; }
/**
* Copyright 2018-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 deepmerge from 'deepmerge';
import { remove as removeDiacritics } from 'diacritics';
import isEmpty from 'lodash.isempty';
import url from 'url';
import { v4 as uuidv4 } from 'uuid';
import { LayerRole } from '../actions/layers';
import StandardApp from '../components/StandardApp';
import { SearchResultType } from '../utils/SearchProviders';
import ConfigUtils from './ConfigUtils';
import LayerUtils from './LayerUtils';
var ThemeUtils = {
getThemeById: function getThemeById(themes, id) {
for (var i = 0, n = themes.items.length; i < n; ++i) {
if (themes.items[i].id === id) {
return themes.items[i];
}
}
for (var _i = 0, _n = themes.subdirs.length; _i < _n; ++_i) {
var theme = this.getThemeById(themes.subdirs[_i], id);
if (theme) {
return theme;
}
}
return null;
},
createThemeBackgroundLayers: function createThemeBackgroundLayers(backgroundLayers, themes, visibleLayer, externalLayers) {
var bgLayers = [];
var visibleIdx = -1;
var defaultVisibleIdx = -1;
var _iterator = _createForOfIteratorHelper(backgroundLayers),
_step;
try {
var _loop = function _loop() {
var entry = _step.value;
if (!entry.name) {
return 1; // continue
}
var bgLayer = themes.backgroundLayers.find(function (lyr) {
return lyr.name === entry.name;
});
if (bgLayer) {
if (entry.visibility === true) {
defaultVisibleIdx = bgLayers.length;
}
if (bgLayer.name === visibleLayer) {
visibleIdx = bgLayers.length;
}
bgLayer = _objectSpread(_objectSpread({}, bgLayer), {}, {
role: LayerRole.BACKGROUND,
thumbnail: bgLayer.thumbnail || "img/mapthumbs/default.jpg",
visibility: false,
opacity: bgLayer.opacity !== undefined ? bgLayer.opacity : 255
});
if (bgLayer.resource) {
bgLayer.id = uuidv4();
bgLayer.type = "placeholder";
var params = LayerUtils.splitLayerUrlParam(bgLayer.resource);
params.id = bgLayer.id;
var key = params.type + ":" + params.url;
(externalLayers[key] = externalLayers[key] || []).push(params);
delete bgLayer.resource;
} else if (bgLayer.type === "wms") {
bgLayer.version = bgLayer.params.VERSION || bgLayer.version || themes.defaultWMSVersion || "1.3.0";
} else if (bgLayer.type === "group") {
bgLayer.items = bgLayer.items.map(function (item) {
if (item.ref) {
var sublayer = themes.backgroundLayers.find(function (l) {
return l.name === item.ref;
});
if (sublayer) {
item = _objectSpread(_objectSpread(_objectSpread({}, item), sublayer), LayerUtils.buildWMSLayerParams(sublayer));
if (item.type === "wms") {
item.version = item.params.VERSION || item.version || themes.defaultWMSVersion || "1.3.0";
}
delete item.ref;
} else {
item = null;
}
}
return item;
}).filter(function (x) {
return x;
});
}
bgLayers.push(bgLayer);
} else {
// eslint-disable-next-line
console.warn("Could not find background layer " + entry.name);
}
};
for (_iterator.s(); !(_step = _iterator.n()).done;) {
if (_loop()) continue;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
if (visibleIdx >= 0) {
bgLayers[visibleIdx].visibility = true;
} else if (defaultVisibleIdx >= 0 && visibleLayer !== "") {
bgLayers[defaultVisibleIdx].visibility = true;
}
return bgLayers;
},
createThemeLayer: function createThemeLayer(theme, themes) {
var role = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : LayerRole.THEME;
var subLayers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
var urlParts = url.parse(theme.url, true);
// Resolve relative urls
if (!urlParts.host) {
var locationParts = url.parse(window.location.href);
urlParts.protocol = locationParts.protocol;
urlParts.host = locationParts.host;
}
var sublayerNames = LayerUtils.getSublayerNames({
sublayers: subLayers !== null && subLayers !== void 0 ? subLayers : theme.sublayers
});
var commonTranslations = StandardApp.store.getState().locale.messagesTree.maptranslations || {};
var baseParams = urlParts.query;
var layer = {
type: "wms",
id: theme.id,
url: url.format(urlParts),
version: theme.version || themes.defaultWMSVersion || "1.3.0",
visibility: true,
expanded: theme.expanded,
name: theme.name,
title: theme.title,
bbox: theme.bbox,
sublayers: subLayers !== null && subLayers !== void 0 ? subLayers : theme.sublayers,
tiled: theme.tiled,
tileSize: theme.tileSize,
ratio: !theme.tiled ? 1 : undefined,
serverType: 'qgis',
format: theme.format,
rev: +new Date(),
role: role,
attribution: theme.attribution,
legendUrl: ThemeUtils.inheritBaseUrlParams(theme.legendUrl, theme.url, baseParams),
printUrl: ThemeUtils.inheritBaseUrlParams(theme.printUrl, theme.url, baseParams),
featureInfoUrl: ThemeUtils.inheritBaseUrlParams(theme.featureInfoUrl, theme.url, baseParams),
infoFormats: theme.infoFormats,
mapFormats: theme.availableFormats,
layerTreeHiddenSublayers: theme.layerTreeHiddenSublayers,
predefinedFilters: (theme.predefinedFilters || []).filter(function (entry) {
return Object.keys(entry.filter).find(function (name) {
return sublayerNames.includes(name);
});
}),
externalLayerMap: _objectSpread(_objectSpread({}, theme.externalLayerMap), (theme.externalLayers || []).reduce(function (res, cur) {
res[cur.internalLayer] = _objectSpread({}, themes.externalLayers.find(function (entry) {
return entry.name === cur.name;
}));
LayerUtils.completeExternalLayer(res[cur.internalLayer], LayerUtils.searchSubLayer(theme, 'name', cur.internalLayer));
return res;
}, {})),
translations: deepmerge(commonTranslations, theme.translations),
editConfig: theme.editConfig,
wms_name: theme.wms_name
};
layer = LayerUtils.recomputeLayerBBox(layer);
// Drawing order only makes sense if layer reordering is disabled
if (ConfigUtils.getConfigProp("allowReorderingLayers", theme) !== true) {
layer.drawingOrder = theme.drawingOrder;
}
return layer;
},
inheritBaseUrlParams: function inheritBaseUrlParams(capabilityUrl, baseUrl, baseParams) {
if (!capabilityUrl) {
return baseUrl;
}
if (capabilityUrl.split("?")[0] === baseUrl.split("?")[0]) {
var parts = url.parse(capabilityUrl, true);
parts.query = _objectSpread(_objectSpread({}, baseParams), parts.query);
return url.format(parts);
}
return capabilityUrl;
},
searchThemes: function searchThemes(themes, searchtext) {
var filter = new RegExp(removeDiacritics(searchtext).replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&"), "i");
var matches = [];
var _searchThemeGroup = function searchThemeGroup(themeGroup) {
(themeGroup.subdirs || []).forEach(function (subdir) {
return _searchThemeGroup(subdir, filter);
});
matches.push.apply(matches, _toConsumableArray((themeGroup.items || []).filter(function (item) {
return removeDiacritics(item.title).match(filter) || removeDiacritics(item.keywords || "").match(filter) || removeDiacritics(item["abstract"] || "").match(filter);
})));
};
_searchThemeGroup(themes, filter);
return isEmpty(matches) ? [] : [{
id: "themes",
titlemsgid: "search.themes",
type: SearchResultType.THEME,
items: matches.map(function (theme) {
return {
id: theme.id,
text: theme.title,
theme: theme,
layer: ThemeUtils.createThemeLayer(theme, themes),
thumbnail: ConfigUtils.getAssetsPath() + "/" + theme.thumbnail
};
})
}];
},
searchThemeLayers: function searchThemeLayers(themes, searchtext) {
var filter = new RegExp(removeDiacritics(searchtext).replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&"), "i");
var matches = [];
var _searchLayer = function searchLayer(theme, layer) {
var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
(layer.sublayers || []).forEach(function (sublayer, idx) {
var subpath = [].concat(_toConsumableArray(path), [idx]);
if (removeDiacritics(sublayer.name).match(filter) || removeDiacritics(sublayer.title).match(filter)) {
// Clone theme, ensuring path to layer is visible
var newtheme = _objectSpread({}, theme);
var cur = newtheme;
var _loop2 = function _loop2(i) {
var isMutuallyExclusive = cur.mutuallyExclusive;
cur.sublayers = cur.sublayers.map(function (entry, j) {
return _objectSpread(_objectSpread({}, entry), {}, {
visibility: j === subpath[i] || entry.visibility && !isMutuallyExclusive
});
});
cur = cur.sublayers[subpath[i]];
};
for (var i = 0; i < subpath.length; ++i) {
_loop2(i);
}
matches.push({
theme: newtheme,
layer: ThemeUtils.createThemeLayer(newtheme, themes, LayerRole.USERLAYER, [cur])
});
}
_searchLayer(theme, sublayer, subpath);
});
};
var _searchThemeGroup2 = function searchThemeGroup(themeGroup) {
(themeGroup.subdirs || []).forEach(function (subdir) {
return _searchThemeGroup2(subdir, filter);
});
(themeGroup.items || []).forEach(function (item) {
return _searchLayer(item, item);
});
};
_searchThemeGroup2(themes, filter);
return isEmpty(matches) ? [] : [{
id: "themelayers",
titlemsgid: "search.themelayers",
type: SearchResultType.THEMELAYER,
items: matches.map(function (result) {
return {
id: result.layer.id + ":" + result.layer.sublayers[0].name,
text: result.layer.title + ": " + result.layer.sublayers[0].title,
layer: result.layer,
theme: result.theme
};
})
}];
},
getThemeNames: function getThemeNames(themes) {
var names = (themes.items || []).reduce(function (res, theme) {
return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, theme.id, theme.title));
}, {});
(themes.subdirs || []).forEach(function (group) {
Object.assign(names, ThemeUtils.getThemeNames(group));
});
return names;
},
themeFlagsAllowed: function themeFlagsAllowed(theme, flagWhitelist, flagBlacklist) {
var themeFlags = (theme === null || theme === void 0 ? void 0 : theme.flags) || [];
if (flagBlacklist && flagBlacklist.find(function (flag) {
return themeFlags.includes(flag);
}) !== undefined) {
return false;
}
if (flagWhitelist && flagWhitelist.find(function (flag) {
return themeFlags.includes(flag);
}) === undefined) {
return false;
}
return true;
},
allowedItems: function allowedItems(items, theme) {
var filter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
return (items || []).map(function (item) {
if (item.subitems) {
var subitems = ThemeUtils.allowedItems(item.subitems, theme, filter).filter(Boolean);
if (!isEmpty(subitems)) {
return _objectSpread(_objectSpread({}, item), {}, {
subitems: subitems
});
} else {
return null;
}
} else {
if (filter && !filter(item)) {
return null;
}
if (theme) {
if (!ThemeUtils.themeFlagsAllowed(theme, item.themeFlagWhitelist, item.themeFlagBlacklist)) {
return null;
}
if (item.themeBlacklist && (item.themeBlacklist.includes(theme.title) || item.themeBlacklist.includes(theme.name))) {
return null;
}
if (item.themeWhitelist && !(item.themeWhitelist.includes(theme.title) || item.themeWhitelist.includes(theme.name))) {
return null;
}
if (item.requireAuth && !ConfigUtils.getConfigProp("username")) {
return null;
}
}
return item;
}
}).filter(Boolean);
},
applyTranslations: function applyTranslations(group) {
var commonTranslations = StandardApp.store.getState().locale.messagesTree.maptranslations || {};
return _objectSpread(_objectSpread({}, group), {}, {
subdirs: group.subdirs ? group.subdirs.map(ThemeUtils.applyTranslations) : null,
items: group.items ? group.items.map(function (item) {
var _item$translations$th, _item$translations;
return _objectSpread(_objectSpread({}, LayerUtils.applyTranslations(item, deepmerge(commonTranslations, item.translations))), {}, {
title: (_item$translations$th = (_item$translations = item.translations) === null || _item$translations === void 0 || (_item$translations = _item$translations.theme) === null || _item$translations === void 0 ? void 0 : _item$translations.title) !== null && _item$translations$th !== void 0 ? _item$translations$th : item.title
});
}) : null
});
}
};
export default ThemeUtils;