@kalisio/kdk 1.6.0 → 1.7.0
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.
- package/.travis.test.sh +1 -1
- package/CHANGELOG.md +63 -13
- package/extras/tours/map/catalog-panel.js +61 -10
- package/extras/tours/map/create-view.js +25 -0
- package/extras/tours/map/fab.js +10 -1
- package/extras/tours/map/navigation-bar.js +7 -9
- package/lib/core/api/application.js +9 -1
- package/lib/core/api/application.js.map +1 -1
- package/lib/core/client/components/chart/KChart.vue +115 -0
- package/lib/core/client/components/chart/KStatsChart.vue +76 -0
- package/lib/core/client/components/chart/index.js +20 -0
- package/lib/core/client/components/chart/index.js.map +1 -0
- package/lib/core/client/components/collection/KFilter.vue +6 -0
- package/lib/core/client/components/collection/KHistoryEntry.vue +1 -1
- package/lib/core/client/components/collection/KItem.vue +4 -4
- package/lib/core/client/components/form/KChipsField.vue +4 -4
- package/lib/core/client/components/form/KView.vue +1 -1
- package/lib/core/client/components/frame/KAction.vue +40 -5
- package/lib/core/client/components/frame/KBlock.vue +7 -7
- package/lib/core/client/components/frame/KContent.vue +1 -1
- package/lib/core/client/components/frame/KOpener.vue +1 -1
- package/lib/core/client/components/frame/KPanel.vue +8 -7
- package/lib/core/client/components/frame/KPopupAction.vue +6 -0
- package/lib/core/client/components/frame/KScreen.vue +1 -1
- package/lib/core/client/components/frame/KStamp.vue +4 -2
- package/lib/core/client/components/frame/index.js +1 -6
- package/lib/core/client/components/frame/index.js.map +1 -1
- package/lib/core/client/components/input/KIconChooser.vue +5 -2
- package/lib/core/client/components/input/KPalette.vue +1 -1
- package/lib/core/client/components/input/index.js +14 -4
- package/lib/core/client/components/input/index.js.map +1 -1
- package/lib/core/client/components/layout/KFab.vue +1 -1
- package/lib/core/client/components/layout/KLayout.vue +10 -2
- package/lib/core/client/components/layout/KPage.vue +19 -18
- package/lib/core/client/components/layout/KTour.vue +5 -3
- package/lib/core/client/components/layout/KWindow.vue +211 -59
- package/lib/core/client/components/media/KMediaBrowser.vue +6 -6
- package/lib/core/client/components/menu/KMenu.vue +13 -5
- package/lib/core/client/components/menu/KRadialFab.vue +22 -24
- package/lib/core/client/components/menu/KRadialFabItem.vue +17 -18
- package/lib/core/client/components/team/KGroupsActivity.vue +1 -1
- package/lib/core/client/components/team/KJoinGroup.vue +2 -2
- package/lib/core/client/components/time/KAbsoluteTimeRange.vue +190 -0
- package/lib/core/client/components/time/KRelativeTimeRanges.vue +192 -0
- package/lib/core/client/components/time/index.js +20 -0
- package/lib/core/client/components/time/index.js.map +1 -0
- package/lib/core/client/i18n/core_en.json +35 -12
- package/lib/core/client/i18n/core_fr.json +36 -13
- package/lib/core/client/index.js +1 -1
- package/lib/core/client/index.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-collection.js +11 -1
- package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-widget.js +25 -13
- package/lib/core/client/mixins/mixin.base-widget.js.map +1 -1
- package/lib/core/client/services/index.js +2 -1
- package/lib/core/client/services/index.js.map +1 -1
- package/lib/core/client/services/local-settings.service.js +4 -0
- package/lib/core/client/services/local-settings.service.js.map +1 -1
- package/lib/core/client/time.js +25 -15
- package/lib/core/client/time.js.map +1 -1
- package/lib/core/client/units.js +12 -0
- package/lib/core/client/units.js.map +1 -1
- package/lib/core/client/utils.js +11 -0
- package/lib/core/client/utils.js.map +1 -1
- package/lib/core/common/schemas/settings.update.json +14 -4
- package/lib/map/api/hooks/hooks.catalog.js +20 -0
- package/lib/map/api/hooks/hooks.catalog.js.map +1 -1
- package/lib/map/api/models/catalog.model.mongodb.js +6 -1
- package/lib/map/api/models/catalog.model.mongodb.js.map +1 -1
- package/lib/map/api/models/features.model.mongodb.js +5 -0
- package/lib/map/api/models/features.model.mongodb.js.map +1 -1
- package/lib/map/api/services/catalog/catalog.hooks.js +3 -1
- package/lib/map/api/services/catalog/catalog.hooks.js.map +1 -1
- package/lib/map/client/components/KColorLegend.vue +22 -21
- package/lib/map/client/components/KFeaturesChart.vue +81 -110
- package/lib/map/client/components/KLayerStyleForm.vue +119 -47
- package/lib/map/client/components/KLevelSlider.vue +30 -29
- package/lib/map/client/components/KLocationMap.vue +2 -2
- package/lib/map/client/components/KMeasureTool.vue +30 -6
- package/lib/map/client/components/KPositionIndicator.vue +4 -4
- package/lib/map/client/components/KTimeline.vue +25 -27
- package/lib/map/client/components/KTimezoneMap.vue +156 -0
- package/lib/map/client/components/KUrlLegend.vue +11 -10
- package/lib/map/client/components/catalog/KBaseLayersSelector.vue +1 -1
- package/lib/map/client/components/catalog/KCatalogLayersPanel.vue +56 -0
- package/lib/map/client/components/catalog/KCreateView.vue +91 -0
- package/lib/map/client/components/catalog/KLayerCategories.vue +2 -1
- package/lib/map/client/components/catalog/{KCatalog.vue → KLayersPanel.vue} +19 -37
- package/lib/map/client/components/catalog/KUserLayersPanel.vue +40 -0
- package/lib/map/client/components/catalog/KViewSelector.vue +46 -0
- package/lib/map/client/components/catalog/KViewsPanel.vue +110 -0
- package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +4 -13
- package/lib/map/client/components/form/KTimezoneField.vue +135 -0
- package/lib/map/client/components/widget/KElevationProfile.vue +488 -0
- package/lib/map/client/components/widget/KInformationBox.vue +48 -23
- package/lib/map/client/components/widget/KMapillaryViewer.vue +26 -20
- package/lib/map/client/components/widget/KTimeSeries.vue +267 -347
- package/lib/map/client/i18n/map_en.json +63 -40
- package/lib/map/client/i18n/map_fr.json +65 -42
- package/lib/map/client/leaflet/GradientPath.js +40 -19
- package/lib/map/client/leaflet/GradientPath.js.map +1 -1
- package/lib/map/client/leaflet/TiledFeatureLayer.js +527 -93
- package/lib/map/client/leaflet/TiledFeatureLayer.js.map +1 -1
- package/lib/map/client/leaflet/TiledMeshLayer.js +58 -35
- package/lib/map/client/leaflet/TiledMeshLayer.js.map +1 -1
- package/lib/map/client/leaflet/utils.js +44 -3
- package/lib/map/client/leaflet/utils.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.base-globe.js +16 -1
- package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.file-layers.js +12 -2
- package/lib/map/client/mixins/globe/mixin.file-layers.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js +7 -6
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.popup.js +4 -2
- package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.style.js +8 -4
- package/lib/map/client/mixins/globe/mixin.style.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.tooltip.js +4 -2
- package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/index.js +23 -18
- package/lib/map/client/mixins/index.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.base-map.js +20 -2
- package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.edit-layers.js +8 -4
- package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.geojson-layers.js +27 -5
- package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.heatmap-layers.js +6 -1
- package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.popup.js +1 -1
- package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.style.js +8 -4
- package/lib/map/client/mixins/map/mixin.style.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +4 -11
- package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +0 -11
- package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tooltip.js +1 -1
- package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/mixin.activity.js +150 -150
- package/lib/map/client/mixins/mixin.activity.js.map +1 -1
- package/lib/map/client/mixins/mixin.catalog-panel.js +36 -0
- package/lib/map/client/mixins/mixin.catalog-panel.js.map +1 -0
- package/lib/map/client/mixins/mixin.feature-selection.js +17 -8
- package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
- package/lib/map/client/mixins/mixin.feature-service.js +36 -16
- package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
- package/lib/map/client/mixins/mixin.infobox.js +1 -1
- package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
- package/lib/map/client/mixins/mixin.levels.js +26 -12
- package/lib/map/client/mixins/mixin.levels.js.map +1 -1
- package/lib/map/client/mixins/mixin.style.js +1 -0
- package/lib/map/client/mixins/mixin.style.js.map +1 -1
- package/lib/map/client/mixins/mixin.weacast.js +15 -23
- package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
- package/lib/map/client/pixi-utils.js +8 -177
- package/lib/map/client/pixi-utils.js.map +1 -1
- package/lib/map/client/utils.js +1 -0
- package/lib/map/client/utils.js.map +1 -1
- package/lib/map/common/grid.js +131 -0
- package/lib/map/common/grid.js.map +1 -1
- package/lib/map/common/index.js +22 -11
- package/lib/map/common/index.js.map +1 -1
- package/lib/map/common/meteo-model-grid-source.js +5 -2
- package/lib/map/common/meteo-model-grid-source.js.map +1 -1
- package/lib/map/common/time-based-grid-source.js +5 -2
- package/lib/map/common/time-based-grid-source.js.map +1 -1
- package/lib/test/client/core/collection.js +31 -13
- package/lib/test/client/core/collection.js.map +1 -1
- package/lib/test/client/core/layout.js +137 -49
- package/lib/test/client/core/layout.js.map +1 -1
- package/lib/test/client/core/utils.js +89 -22
- package/lib/test/client/core/utils.js.map +1 -1
- package/lib/test/client/map/catalog.js +134 -41
- package/lib/test/client/map/catalog.js.map +1 -1
- package/lib/test/client/map/controls.js +7 -4
- package/lib/test/client/map/controls.js.map +1 -1
- package/lib/test/client/map/index.js +12 -0
- package/lib/test/client/map/index.js.map +1 -1
- package/lib/test/client/map/utils.js +67 -0
- package/lib/test/client/map/utils.js.map +1 -0
- package/package.json +5 -5
- package/extras/tours/map/favorite-views.js +0 -53
- package/lib/core/client/components/frame/KChart.vue +0 -60
- package/lib/core/client/components/input/KCodeInput.vue +0 -50
- package/lib/core/client/components/input/KTimeRangeChooser.vue +0 -109
- package/lib/core/client/components/time/KTimeRange.vue +0 -144
- package/lib/map/client/components/KFavoriteViews.vue +0 -217
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../map/client/mixins/mixin.activity.js"],"names":["data","forecastModelHandlers","layerCategories","variables","engine","engineReady","engineContainerWidth","engineContainerHeight","computed","viewStyle","variablesForCurrentLevel","map","variable","Object","assign","name","selectedLevel","_","omit","currentVariables","hasSelectableLevels","methods","is2D","is3D","getFeatureActions","feature","layer","getCatalogLayers","layers","globalCatalogService","$api","getService","response","find","concat","catalogService","gatewayToken","get","getItem","$config","addCatalogLayer","i18n","locale","kCoreUtils","getAppLocale","i18next","addResourceBundle","$t","label","description","isWeacastLayer","startsWith","weacastApi","forecastModel","addLayer","uniqBy","removeCatalogLayer","removeLayer","getCatalogCategories","categories","query","type","refreshLayerCategories","refreshLayers","clearLayers","catalogLayers","filter","i","length","hasVisibleBaseLayer","isVisible","baseLayer","showLayer","isUserLayer","isFeatureLayer","hasFeatureSchema","has","isLayerSelectable","isLayerEdited","isLayerStorable","_id","isLayerEditable","isLayerRemovable","isLayerStyleEditable","isLayerDataEditable","resetLayer","isLayerVisible","configureLayerActions","actions","activityOptions","Layout","filterContent","bindContent","cloneDeep","push","id","handler","onTriggerLayer","$set","onLayerAdded","hideLayer","hasContext","storeContext","onZoomIn","center","getCenter","longitude","latitude","zoomLevel","altitude","onZoomOut","onZoomToLayer","zoomToLayer","onSaveLayer","geoJson","toGeoJson","check","checkFeatures","kinks","result","dialog","title","features","message","options","model","items","value","html","ok","flat","cancel","includes","downloadAsBlob","JSON","stringify","set","nbPoints","forEach","Loading","show","processed","total","createdLayer","create","chunkSize","nbFeatures","createFeatures","chunk","patch","baseQuery","$toast","timeout","error","logger","hide","onFilterLayerData","filterModal","$createComponent","propsData","contextId","$mount","open","$on","closeModal","onViewLayerData","viewModal","featureActions","tooltip","icon","context","item","onChartLayerData","chartModal","onEditLayer","editModal","service","objectId","openModal","updatedLayer","renameLayer","onEditLayerStyle","editStyleModal","updateLayer","editLayerByName","editOptions","getLayerByName","startEditLayer","onEditLayerData","stopEditLayer","editMode","onEndLayerEdition","status","onRemoveLayer","Dialog","onOk","removeFeatures","remove","onMapReady","onGlobeReady","getProbeTimeRange","start","Time","getCurrentTime","clone","end","span","$store","subtract","add","onProbeLocation","setCursor","$once","unsetCursor","onToggleFullscreen","$q","fullscreen","isActive","request","exit","initialize","restoreContext","viewRestored","$geolocation","position","update","setupWeacast","toggle","setForecastModel","catalogListeners","_serviceEvents","event","object","onCatalogUpdated","on","finalize","removeListener","getLayers","mounted","beforeDestroy","$off"],"mappings":"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","file":"mixin.activity.js","sourcesContent":["import _ from 'lodash'\r\nimport i18next from 'i18next'\r\nimport sift from 'sift'\r\nimport logger from 'loglevel'\r\nimport centroid from '@turf/centroid'\r\nimport explode from '@turf/explode'\r\nimport { Loading, Dialog } from 'quasar'\r\nimport { Time } from '../../../core/client/time'\r\nimport { Layout } from '../../../core/client/layout'\r\nimport { setGatewayJwt } from '../utils'\r\nimport { utils as kCoreUtils } from '../../../core/client'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n forecastModelHandlers: {},\r\n layerCategories: [],\r\n variables: [],\r\n engine: 'leaflet',\r\n engineReady: false,\r\n engineContainerWidth: null,\r\n engineContainerHeight: null\r\n }\r\n },\r\n computed: {\r\n viewStyle () {\r\n return 'width: 100%; height: 100%; fontWeight: normal; zIndex: 0; position: absolute;'\r\n },\r\n variablesForCurrentLevel () {\r\n return this.variables.map(variable => Object.assign({ name: `${variable.name}-${this.selectedLevel}` }, _.omit(variable, ['name'])))\r\n },\r\n currentVariables () {\r\n return this.hasSelectableLevels ? this.variablesForCurrentLevel : this.variables\r\n }\r\n },\r\n methods: {\r\n is2D () {\r\n return (this.engine === 'leaflet')\r\n },\r\n is3D () {\r\n return (this.engine === 'cesium')\r\n },\r\n // This method should be overriden in activities\r\n getFeatureActions (feature, layer) {\r\n return []\r\n },\r\n async getCatalogLayers () {\r\n let layers = []\r\n // We get layers coming from global catalog first if any\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n if (globalCatalogService) {\r\n const response = await globalCatalogService.find()\r\n layers = layers.concat(response.data)\r\n }\r\n // Then we get layers coming from contextual catalog if any\r\n const catalogService = this.$api.getService('catalog')\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n const response = await catalogService.find()\r\n layers = layers.concat(response.data)\r\n }\r\n const gatewayToken = this.$api.get('storage').getItem(this.$config('gatewayJwt'))\r\n return (gatewayToken ? setGatewayJwt(layers, gatewayToken) : layers)\r\n },\r\n async addCatalogLayer (layer) {\r\n // Check if available for current engine\r\n if (layer[this.engine]) {\r\n // Process i18n\r\n if (layer.i18n) {\r\n const locale = kCoreUtils.getAppLocale()\r\n const i18n = _.get(layer.i18n, locale)\r\n if (i18n) i18next.addResourceBundle(locale, 'kdk', i18n, true, true)\r\n }\r\n if (this.$t(layer.name)) layer.label = this.$t(layer.name)\r\n if (this.$t(layer.description)) layer.description = this.$t(layer.description)\r\n // Check for Weacast API availability\r\n const isWeacastLayer = _.get(layer, `${this.engine}.type`, '').startsWith('weacast.')\r\n if (isWeacastLayer && (!this.weacastApi || !this.forecastModel)) return\r\n await this.addLayer(layer)\r\n }\r\n // Filter layers with variables, not just visible ones because we might want to\r\n // probe weather even if there is no visual representation (e.g. in globe)\r\n if (layer.variables) this.variables = _.uniqBy(this.variables.concat(layer.variables), (variable) => variable.name)\r\n },\r\n async removeCatalogLayer (layer) {\r\n // Check if available for current engine\r\n if (layer[this.engine]) {\r\n await this.removeLayer(layer.name)\r\n }\r\n },\r\n async getCatalogCategories () {\r\n let categories = []\r\n // We get categories coming from global catalog first if any\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n if (globalCatalogService) {\r\n const response = await globalCatalogService.find({ query: { type: 'Category' } })\r\n categories = categories.concat(response.data)\r\n }\r\n // Then we get categories coming from contextual catalog if any\r\n const catalogService = this.$api.getService('catalog')\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n const response = await catalogService.find({ query: { type: 'Category' } })\r\n categories = categories.concat(response.data)\r\n }\r\n return categories\r\n },\r\n async refreshLayerCategories () {\r\n // Merge built-in categories with user-defiend ones\r\n this.layerCategories = await this.getCatalogCategories()\r\n this.layerCategories = this.layerCategories.concat(_.get(this, 'activityOptions.catalog.categories', []))\r\n },\r\n async refreshLayers () {\r\n // Clear layers and variables\r\n this.clearLayers()\r\n this.variables = []\r\n let catalogLayers = await this.getCatalogLayers()\r\n // Apply global layer filter\r\n catalogLayers = catalogLayers.filter(sift(_.get(this, 'activityOptions.catalog.filter', {})))\r\n // Iterate and await layers as creation is async and we need to have all layers ready\r\n // before checking if there is some background layer\r\n for (let i = 0; i < catalogLayers.length; i++) {\r\n await this.addCatalogLayer(catalogLayers[i])\r\n }\r\n // We need at least an active background\r\n const hasVisibleBaseLayer = catalogLayers.find((layer) => (layer.type === 'BaseLayer') && layer.isVisible)\r\n if (!hasVisibleBaseLayer) {\r\n const baseLayer = catalogLayers.find((layer) => (layer.type === 'BaseLayer'))\r\n if (baseLayer) await this.showLayer(baseLayer.name)\r\n }\r\n },\r\n isUserLayer (layer) {\r\n return (_.get(layer, 'scope') === 'user')\r\n },\r\n isFeatureLayer (layer) {\r\n return (_.get(layer, 'service') === 'features')\r\n },\r\n hasFeatureSchema (layer) {\r\n return _.has(layer, 'schema')\r\n },\r\n isLayerSelectable (layer) {\r\n // Only possible when not edited by default\r\n if ((typeof this.isLayerEdited === 'function') && this.isLayerEdited(layer)) return false\r\n return _.get(layer, 'isSelectable', true)\r\n },\r\n isLayerStorable (layer) {\r\n // Only possible when not saved by default\r\n if (layer._id) return false\r\n return _.get(layer, 'isStorable', this.isUserLayer(layer))\r\n },\r\n isLayerEditable (layer) {\r\n // Only possible when saved by default\r\n if (!layer._id) return false\r\n return _.get(layer, 'isEditable', this.isUserLayer(layer))\r\n },\r\n isLayerRemovable (layer) {\r\n return _.get(layer, 'isRemovable', this.isUserLayer(layer))\r\n },\r\n isLayerStyleEditable (layer) {\r\n return _.get(layer, 'isStyleEditable', this.isUserLayer(layer))\r\n },\r\n isLayerDataEditable (layer) {\r\n return _.get(layer, 'isDataEditable', this.isUserLayer(layer) && this.isFeatureLayer(layer))\r\n },\r\n async resetLayer (layer) {\r\n // Reset layer with new setup but keep track of current visibility state\r\n // as adding the layer back will restore default visibility state\r\n const isVisible = this.isLayerVisible(layer.name)\r\n await this.removeLayer(layer.name)\r\n await this.addLayer(layer)\r\n if (isVisible) await this.showLayer(layer.name)\r\n },\r\n configureLayerActions (layer) {\r\n let actions = _.get(this.activityOptions, 'layers.actions')\r\n if (actions) {\r\n // Apply filtering\r\n actions = Layout.filterContent(actions, _.get(this.activityOptions, 'layers.filter', {}))\r\n }\r\n // As context is different for each item we need to clone the global action configuration\r\n // otheriwse context will always reference the last processed item\r\n actions = Layout.bindContent(_.cloneDeep(actions), this)\r\n // Add 'virtual' action used to trigger the layer\r\n actions.push({ id: 'toggle', handler: () => this.onTriggerLayer(layer) })\r\n // Store the actions and make it reactive\r\n this.$set(layer, 'actions', actions)\r\n return actions\r\n },\r\n onLayerAdded (layer) {\r\n this.configureLayerActions(layer)\r\n },\r\n async onTriggerLayer (layer) {\r\n if (!this.isLayerVisible(layer.name)) {\r\n await this.showLayer(layer.name)\r\n } else {\r\n await this.hideLayer(layer.name)\r\n }\r\n // Check if the activity is using context restoration\r\n const hasContext = (typeof this.storeContext === 'function')\r\n if (hasContext) this.storeContext('layers')\r\n },\r\n onZoomIn () {\r\n const center = this.getCenter()\r\n this.center(center.longitude, center.latitude, center.zoomLevel ? center.zoomLevel + 1 : center.altitude * 0.5)\r\n },\r\n onZoomOut () {\r\n const center = this.getCenter()\r\n this.center(center.longitude, center.latitude, center.zoomLevel ? center.zoomLevel - 1 : center.altitude * 2)\r\n },\r\n onZoomToLayer (layer) {\r\n this.zoomToLayer(layer.name)\r\n },\r\n async onSaveLayer (layer) {\r\n // Take care that WFS layers rely on the same type as our own feature layers\r\n if (!_.has(layer, 'wfs') && _.get(layer, `${this.engine}.type`) === 'geoJson') {\r\n const geoJson = this.toGeoJson(layer.name)\r\n // Check for invalid features first\r\n const check = this.checkFeatures(geoJson)\r\n if (check.kinks.length > 0) {\r\n const result = await kCoreUtils.dialog({\r\n title: this.$t('mixins.activity.INVALID_FEATURES_DIALOG_TITLE', { features: check.kinks }),\r\n message: this.$t('mixins.activity.INVALID_FEATURES_DIALOG_MESSAGE', { features: check.kinks }),\r\n options: {\r\n type: 'toggle',\r\n model: [],\r\n items: [\r\n { label: this.$t('mixins.activity.DOWNLOAD_INVALID_FEATURES_LABEL'), value: 'download' }\r\n ]\r\n },\r\n html: true,\r\n ok: {\r\n label: this.$t('OK'),\r\n flat: true\r\n },\r\n cancel: {\r\n label: this.$t('CANCEL'),\r\n flat: true\r\n }\r\n })\r\n if (!result.ok) return\r\n // Export invalid features if required\r\n if (_.get(result, 'data', []).includes('download')) {\r\n kCoreUtils.downloadAsBlob(JSON.stringify({ type: 'FeatureCollection', features: check.kinks }),\r\n this.$t('mixins.activity.INVALID_FEATURES_FILE'), 'application/json;charset=utf-8;')\r\n }\r\n }\r\n // Change data source from in-memory to features service\r\n _.set(layer, 'service', 'features')\r\n if (_.has(layer, 'leaflet')) _.set(layer, 'leaflet.source', '/api/features')\r\n if (_.has(layer, 'cesium')) _.set(layer, 'cesium.source', '/api/features')\r\n const features = (geoJson.type === 'FeatureCollection' ? geoJson.features : [geoJson])\r\n // If too much data use tiling\r\n // The threshold is based on the number of points and not features.\r\n // Indeed otherwise the complexity will be different depending on the geometry type\r\n // (eg a bucket of 1000 polygons can actually contains a lot of points).\r\n let nbPoints = 0\r\n features.forEach(feature => {\r\n nbPoints += explode(feature).features.length\r\n })\r\n if (this.is2D() && (nbPoints > 5000)) {\r\n _.set(layer, 'leaflet.tiled', true)\r\n _.set(layer, 'leaflet.minZoom', 15)\r\n }\r\n Loading.show({ message: this.$t('mixins.activity.SAVING_LABEL', { processed: 0, total: features.length }) })\r\n try {\r\n let createdLayer = await this.$api.getService('catalog')\r\n .create(_.omit(layer, ['actions', 'label', 'isVisible', 'isDisabled']))\r\n const chunkSize = _.get(this, 'activityOptions.featuresChunkSize', 5000)\r\n let nbFeatures = 0\r\n // We use the generated DB ID as layer ID on features\r\n await this.createFeatures(geoJson, createdLayer._id, chunkSize, (i, chunk) => {\r\n // Update saving message according to new chunk data\r\n nbFeatures += chunk.length\r\n Loading.show({\r\n message: this.$t('mixins.activity.SAVING_LABEL', { processed: nbFeatures, total: features.length })\r\n })\r\n })\r\n // Because we save all features in a single service use filtering to separate layers\r\n createdLayer = await this.$api.getService('catalog').patch(createdLayer._id, { baseQuery: { layer: createdLayer._id } })\r\n // Reset layer with new setup\r\n await this.resetLayer(createdLayer)\r\n if (_.get(layer, 'leaflet.tiled')) {\r\n this.$toast({ type: 'positive', message: this.$t('mixins.activity.SAVE_DIALOG_MESSAGE'), timeout: 10000, html: true })\r\n }\r\n } catch (error) {\r\n // User error message on operation should be raised by error hook, otherwise this is more a coding error\r\n logger.error(error)\r\n }\r\n Loading.hide()\r\n } else {\r\n // Otherwise simply save in catalog\r\n const createdLayer = await this.$api.getService('catalog')\r\n .create(_.omit(layer, ['actions', 'label', 'isVisible', 'isDisabled']))\r\n // Reset layer with new setup\r\n await this.resetLayer(createdLayer)\r\n }\r\n },\r\n async onFilterLayerData (layer) {\r\n this.filterModal = await this.$createComponent('KFeaturesFilter', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer\r\n }\r\n })\r\n this.filterModal.$mount()\r\n this.filterModal.open()\r\n this.filterModal.$on('applied', async () => {\r\n // Reset layer with new setup\r\n await this.resetLayer(layer)\r\n this.filterModal.closeModal()\r\n })\r\n this.filterModal.$on('closed', () => {\r\n this.filterModal = null\r\n })\r\n },\r\n async onViewLayerData (layer) {\r\n this.viewModal = await this.$createComponent('KFeaturesTable', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer,\r\n featureActions: [{\r\n name: 'zoom-to',\r\n tooltip: this.$t('mixins.activity.ZOOM_TO_LABEL'),\r\n icon: 'zoom_out_map',\r\n handler: (context) => {\r\n // Use altitude or zoom level depending on engine\r\n this.center(..._.get(centroid(context.item), 'geometry.coordinates'), this.is2D() ? 18 : 750)\r\n this.viewModal.closeModal()\r\n }\r\n }]\r\n }\r\n })\r\n this.viewModal.$mount()\r\n this.viewModal.open()\r\n this.viewModal.$on('closed', () => {\r\n this.viewModal = null\r\n })\r\n },\r\n async onChartLayerData (layer) {\r\n this.chartModal = await this.$createComponent('KFeaturesChart', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer\r\n }\r\n })\r\n this.chartModal.$mount()\r\n this.chartModal.open()\r\n this.chartModal.$on('closed', () => {\r\n this.chartModal = null\r\n })\r\n },\r\n async onEditLayer (layer) {\r\n this.editModal = await this.$createComponent('editor/KModalEditor', {\r\n propsData: {\r\n service: 'catalog',\r\n contextId: this.contextId,\r\n objectId: layer._id\r\n }\r\n })\r\n this.editModal.$mount()\r\n this.editModal.openModal()\r\n this.editModal.$on('applied', updatedLayer => {\r\n // Actual layer update should be triggerred by real-time event\r\n // but as we might not always use sockets perform it anyway\r\n // If renamed need to update the layer map accordingly\r\n if (layer.name !== updatedLayer.name) {\r\n this.renameLayer(layer.name, updatedLayer.name)\r\n }\r\n Object.assign(layer, updatedLayer)\r\n this.editModal.closeModal()\r\n })\r\n this.editModal.$on('closed', () => {\r\n this.editModal = null\r\n })\r\n },\r\n async onEditLayerStyle (layer) {\r\n this.editStyleModal = await this.$createComponent('KLayerStyleEditor', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer,\r\n options: this.activityOptions.engine\r\n }\r\n })\r\n this.editStyleModal.$mount()\r\n this.editStyleModal.open()\r\n this.editStyleModal.$on('applied', async () => {\r\n // Actual layer update should be triggerred by real-time event\r\n // but as we might not always use sockets perform it anyway\r\n // Keep track of data as we will reset the layer\r\n const geoJson = this.toGeoJson(layer.name)\r\n // Reset layer with new setup\r\n await this.resetLayer(layer)\r\n // Update data only when in memory as reset has lost it\r\n if (!layer._id) {\r\n this.updateLayer(layer.name, geoJson)\r\n }\r\n this.editStyleModal.closeModal()\r\n })\r\n this.editStyleModal.$on('closed', () => {\r\n this.editStyleModal = null\r\n })\r\n },\r\n editLayerByName (name, editOptions = {}) {\r\n // this one is used through postRobot to trigger edition\r\n // on a layer\r\n const layer = this.getLayerByName(name)\r\n if (!layer) return\r\n this.startEditLayer(layer, editOptions)\r\n },\r\n onEditLayerData (layer) {\r\n // this one is triggered by a layer action (toggle)\r\n if (this.isLayerEdited(layer)) {\r\n // always accept editions in the action\r\n this.stopEditLayer('accept')\r\n } else {\r\n // start editing properties by default\r\n this.startEditLayer(layer, { editMode: 'edit-properties' })\r\n }\r\n },\r\n onEndLayerEdition (status = 'accept') {\r\n // this one can be triggered from a toolbar to accept or reject changes\r\n this.stopEditLayer(status)\r\n },\r\n async onRemoveLayer (layer) {\r\n Dialog.create({\r\n title: this.$t('mixins.activity.REMOVE_DIALOG_TITLE', { layer: layer.name }),\r\n message: this.$t('mixins.activity.REMOVE_DIALOG_MESSAGE', { layer: layer.name }),\r\n html: true,\r\n ok: {\r\n label: this.$t('OK'),\r\n flat: true\r\n },\r\n cancel: {\r\n label: this.$t('CANCEL'),\r\n flat: true\r\n }\r\n }).onOk(async () => {\r\n Loading.show({ message: this.$t('mixins.activity.REMOVING_LABEL') })\r\n try {\r\n // Stop any running edition\r\n if (this.isLayerEdited(layer)) this.onEditLayerData(layer)\r\n if (layer._id) {\r\n // If persistent feature layer remove features as well\r\n if (this.isFeatureLayer(layer)) {\r\n await this.removeFeatures(layer._id)\r\n }\r\n await this.$api.getService('catalog').remove(layer._id)\r\n }\r\n // Actual layer removal should be triggerred by real-time event\r\n // but as we might not always use sockets perform it anyway\r\n this.removeLayer(layer.name)\r\n } catch (error) {\r\n // User error message on operation should be raised by error hook, otherwise this is more a coding error\r\n logger.error(error)\r\n }\r\n Loading.hide()\r\n })\r\n },\r\n onMapReady () {\r\n this.engineReady = true\r\n this.engine = 'leaflet'\r\n },\r\n onGlobeReady () {\r\n this.engineReady = true\r\n this.engine = 'cesium'\r\n },\r\n getProbeTimeRange () {\r\n const start = Time.getCurrentTime().clone()\r\n const end = start.clone()\r\n const span = this.$store.get('timeseries.span')\r\n // We center on current time with the same span on past/future\r\n start.subtract(span, 'm')\r\n end.add(span, 'm')\r\n return { start, end }\r\n },\r\n onProbeLocation () {\r\n this.setCursor('probe-cursor')\r\n this.$once('click', () => {\r\n this.unsetCursor('probe-cursor')\r\n })\r\n },\r\n onToggleFullscreen () {\r\n if (!this.$q.fullscreen.isActive) this.$q.fullscreen.request()\r\n else this.$q.fullscreen.exit()\r\n },\r\n async initialize () {\r\n // Check if the activity is using context restoration\r\n const hasContext = (typeof this.restoreContext === 'function')\r\n // Geolocate by default if view has not been restored\r\n const viewRestored = (hasContext ? await this.restoreContext('view') : false)\r\n if (!viewRestored) {\r\n // Provided by geolocation if enabled\r\n if (!this.$geolocation.get().position) await this.$geolocation.update()\r\n const position = this.$geolocation.get().position\r\n if (position) this.center(position.longitude, position.latitude)\r\n }\r\n // Retrieve the forecast models\r\n if (this.setupWeacast) {\r\n try {\r\n await this.setupWeacast()\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n this.forecastModelHandlers = { toggle: (model) => this.setForecastModel(model) }\r\n } else {\r\n this.forecastModelHandlers = {}\r\n }\r\n // Retrieve the layers\r\n try {\r\n await this.refreshLayerCategories()\r\n await this.refreshLayers()\r\n if (hasContext) await this.restoreContext('layers')\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n // Retrieve the time\r\n if (hasContext) this.restoreContext('time')\r\n // Listen about changes in global/contextual catalog services\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n const catalogService = this.$api.getService('catalog')\r\n // Keep track of binded listeners as we use the same function with different contexts\r\n this.catalogListeners = {}\r\n globalCatalogService._serviceEvents.forEach(event => {\r\n this.catalogListeners[event] = (object) => this.onCatalogUpdated(event, object)\r\n globalCatalogService.on(event, this.catalogListeners[event])\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n catalogService.on(event, this.catalogListeners[event])\r\n }\r\n })\r\n },\r\n finalize () {\r\n // Stop listening about changes in global/contextual catalog services\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n const catalogService = this.$api.getService('catalog')\r\n globalCatalogService._serviceEvents.forEach(event => {\r\n globalCatalogService.removeListener(event, this.catalogListeners[event])\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n catalogService.removeListener(event, this.catalogListeners[event])\r\n }\r\n })\r\n this.catalogListeners = {}\r\n },\r\n async onCatalogUpdated (event, object) {\r\n switch (object.type) {\r\n case 'Category':\r\n // In any case we rebuild categories\r\n this.refreshLayerCategories()\r\n break\r\n case 'Context':\r\n case 'Service':\r\n // Nothing to do\r\n break\r\n default: {\r\n // Updating a layer requires to remove/add it again to cover all use cases\r\n // (eg style edition, etc.)\r\n // Here we find layer by ID as renaming could have occured from another client\r\n const layers = this.getLayers({ _id: object._id })\r\n if (layers.length > 0) await this.removeCatalogLayer(layers[0])\r\n if (event !== 'removed') await this.addCatalogLayer(object)\r\n break\r\n }\r\n }\r\n }\r\n },\r\n mounted () {\r\n this.$on('map-ready', this.onMapReady)\r\n this.$on('globe-ready', this.onGlobeReady)\r\n this.$on('layer-added', this.onLayerAdded)\r\n },\r\n beforeDestroy () {\r\n this.$off('map-ready', this.onMapReady)\r\n this.$off('globe-ready', this.onGlobeReady)\r\n this.$off('layer-added', this.onLayerAdded)\r\n this.finalize()\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../map/client/mixins/mixin.activity.js"],"names":["data","forecastModelHandlers","layerCategories","variables","engine","engineReady","engineContainerWidth","engineContainerHeight","computed","viewStyle","variablesForCurrentLevel","map","variable","Object","assign","name","selectedLevel","_","omit","currentVariables","forecastLevel","methods","is2D","is3D","getFeatureActions","feature","layer","getCatalogLayers","layers","globalCatalogService","$api","getService","response","find","concat","catalogService","gatewayToken","get","getItem","$config","addCatalogLayer","i18n","locale","kCoreUtils","getAppLocale","i18next","addResourceBundle","$t","label","description","isWeacastLayer","startsWith","weacastApi","forecastModel","addLayer","uniqBy","removeCatalogLayer","removeLayer","getCatalogCategories","categories","query","type","addCatalogCategory","category","push","refreshLayerCategories","i","length","refreshLayers","clearLayers","catalogLayers","hasVisibleBaseLayer","isVisible","baseLayer","showLayer","isUserLayer","isFeatureLayer","hasFeatureSchema","has","isLayerSelectable","isLayerEdited","isLayerStorable","_id","isLayerEditable","isLayerRemovable","isLayerStyleEditable","isLayerDataEditable","resetLayer","isLayerVisible","configureLayerActions","actions","Layout","filterContent","bindContent","cloneDeep","id","handler","onTriggerLayer","$set","onLayerAdded","hideLayer","hasContext","storeContext","onZoomIn","center","getCenter","longitude","latitude","zoomLevel","altitude","onZoomOut","onZoomToLayer","zoomToLayer","onSaveLayer","geoJson","toGeoJson","check","checkFeatures","kinks","result","dialog","title","features","message","options","model","items","value","html","ok","flat","cancel","includes","downloadAsBlob","JSON","stringify","set","nbPoints","forEach","Loading","show","processed","total","createdLayer","create","chunkSize","nbFeatures","createFeatures","chunk","patch","baseQuery","$toast","timeout","error","logger","hide","onFilterLayerData","filterModal","$createComponent","propsData","contextId","$mount","open","$on","closeModal","onViewLayerData","viewModal","featureActions","tooltip","icon","context","item","onChartLayerData","chartModal","onEditLayer","editModal","service","objectId","openModal","updatedLayer","renameLayer","onEditLayerStyle","editStyleModal","activityOptions","updateLayer","editLayerByName","editOptions","getLayerByName","startEditLayer","onEditLayerData","stopEditLayer","editMode","onEndLayerEdition","status","onRemoveLayer","Dialog","onOk","removeFeatures","remove","onMapReady","onGlobeReady","onProbeLocation","setCursor","$once","unsetCursor","onToggleFullscreen","$q","fullscreen","isActive","request","exit","initialize","restoreContext","viewRestored","$geolocation","position","update","setupWeacast","toggle","setForecastModel","catalogListeners","_serviceEvents","event","object","onCatalogUpdated","on","finalize","removeListener","getLayers","mounted","beforeDestroy","$off"],"mappings":"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","file":"mixin.activity.js","sourcesContent":["import _ from 'lodash'\r\nimport i18next from 'i18next'\r\nimport logger from 'loglevel'\r\nimport centroid from '@turf/centroid'\r\nimport explode from '@turf/explode'\r\nimport { Loading, Dialog } from 'quasar'\r\nimport { Layout } from '../../../core/client/layout'\r\nimport { setGatewayJwt } from '../utils'\r\nimport { utils as kCoreUtils } from '../../../core/client'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n forecastModelHandlers: {},\r\n layerCategories: [],\r\n variables: [],\r\n engine: 'leaflet',\r\n engineReady: false,\r\n engineContainerWidth: null,\r\n engineContainerHeight: null\r\n }\r\n },\r\n computed: {\r\n viewStyle () {\r\n return 'width: 100%; height: 100%; fontWeight: normal; zIndex: 0; position: absolute;'\r\n },\r\n variablesForCurrentLevel () {\r\n return this.variables.map(variable => Object.assign({ name: `${variable.name}-${this.selectedLevel}` }, _.omit(variable, ['name'])))\r\n },\r\n currentVariables () {\r\n return this.forecastLevel ? this.variablesForCurrentLevel : this.variables\r\n }\r\n },\r\n methods: {\r\n is2D () {\r\n return (this.engine === 'leaflet')\r\n },\r\n is3D () {\r\n return (this.engine === 'cesium')\r\n },\r\n // This method should be overriden in activities\r\n getFeatureActions (feature, layer) {\r\n return []\r\n },\r\n async getCatalogLayers () {\r\n let layers = []\r\n // We get layers coming from global catalog first if any\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n if (globalCatalogService) {\r\n const response = await globalCatalogService.find()\r\n layers = layers.concat(response.data)\r\n }\r\n // Then we get layers coming from contextual catalog if any\r\n const catalogService = this.$api.getService('catalog')\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n const response = await catalogService.find()\r\n layers = layers.concat(response.data)\r\n }\r\n const gatewayToken = this.$api.get('storage').getItem(this.$config('gatewayJwt'))\r\n return (gatewayToken ? setGatewayJwt(layers, gatewayToken) : layers)\r\n },\r\n async addCatalogLayer (layer) {\r\n // Check if available for current engine\r\n if (layer[this.engine]) {\r\n // Process i18n\r\n if (layer.i18n) {\r\n const locale = kCoreUtils.getAppLocale()\r\n const i18n = _.get(layer.i18n, locale)\r\n if (i18n) i18next.addResourceBundle(locale, 'kdk', i18n, true, true)\r\n }\r\n if (this.$t(layer.name)) layer.label = this.$t(layer.name)\r\n if (this.$t(layer.description)) layer.description = this.$t(layer.description)\r\n // Check for Weacast API availability\r\n const isWeacastLayer = _.get(layer, `${this.engine}.type`, '').startsWith('weacast.')\r\n if (isWeacastLayer && (!this.weacastApi || !this.forecastModel)) return\r\n await this.addLayer(layer)\r\n }\r\n // Filter layers with variables, not just visible ones because we might want to\r\n // probe weather even if there is no visual representation (e.g. in globe)\r\n if (layer.variables) this.variables = _.uniqBy(this.variables.concat(layer.variables), (variable) => variable.name)\r\n },\r\n async removeCatalogLayer (layer) {\r\n // Check if available for current engine\r\n if (layer[this.engine]) {\r\n await this.removeLayer(layer.name)\r\n }\r\n },\r\n async getCatalogCategories () {\r\n let categories = []\r\n // We get categories coming from global catalog first if any\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n if (globalCatalogService) {\r\n const response = await globalCatalogService.find({ query: { type: 'Category' } })\r\n categories = categories.concat(response.data)\r\n }\r\n // Then we get categories coming from contextual catalog if any\r\n const catalogService = this.$api.getService('catalog')\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n const response = await catalogService.find({ query: { type: 'Category' } })\r\n categories = categories.concat(response.data)\r\n }\r\n return categories\r\n },\r\n async addCatalogCategory (category) {\r\n // Process i18n\r\n if (category.i18n) {\r\n const locale = kCoreUtils.getAppLocale()\r\n const i18n = _.get(category.i18n, locale)\r\n if (i18n) i18next.addResourceBundle(locale, 'kdk', i18n, true, true)\r\n }\r\n if (this.$t(category.name)) category.label = this.$t(category.name)\r\n if (this.$t(category.description)) category.description = this.$t(category.description)\r\n this.layerCategories.push(category)\r\n },\r\n async refreshLayerCategories () {\r\n this.layerCategories = []\r\n const layerCategories = await this.getCatalogCategories()\r\n for (let i = 0; i < layerCategories.length; i++) {\r\n this.addCatalogCategory(layerCategories[i])\r\n }\r\n },\r\n async refreshLayers () {\r\n // Clear layers and variables\r\n this.clearLayers()\r\n this.variables = []\r\n const catalogLayers = await this.getCatalogLayers()\r\n // Iterate and await layers as creation is async and we need to have all layers ready\r\n // before checking if there is some background layer\r\n for (let i = 0; i < catalogLayers.length; i++) {\r\n await this.addCatalogLayer(catalogLayers[i])\r\n }\r\n // We need at least an active background\r\n const hasVisibleBaseLayer = catalogLayers.find((layer) => (layer.type === 'BaseLayer') && layer.isVisible)\r\n if (!hasVisibleBaseLayer) {\r\n const baseLayer = catalogLayers.find((layer) => (layer.type === 'BaseLayer'))\r\n if (baseLayer) await this.showLayer(baseLayer.name)\r\n }\r\n },\r\n isUserLayer (layer) {\r\n return (_.get(layer, 'scope') === 'user')\r\n },\r\n isFeatureLayer (layer) {\r\n return (_.get(layer, 'service') === 'features')\r\n },\r\n hasFeatureSchema (layer) {\r\n return _.has(layer, 'schema')\r\n },\r\n isLayerSelectable (layer) {\r\n // Only possible when not edited by default\r\n if ((typeof this.isLayerEdited === 'function') && this.isLayerEdited(layer)) return false\r\n return _.get(layer, 'isSelectable', true)\r\n },\r\n isLayerStorable (layer) {\r\n // Only possible when not saved by default\r\n if (layer._id) return false\r\n return _.get(layer, 'isStorable', this.isUserLayer(layer))\r\n },\r\n isLayerEditable (layer) {\r\n // Only possible when saved by default\r\n if (!layer._id) return false\r\n return _.get(layer, 'isEditable', this.isUserLayer(layer))\r\n },\r\n isLayerRemovable (layer) {\r\n return _.get(layer, 'isRemovable', this.isUserLayer(layer))\r\n },\r\n isLayerStyleEditable (layer) {\r\n return _.get(layer, 'isStyleEditable', this.isUserLayer(layer))\r\n },\r\n isLayerDataEditable (layer) {\r\n return _.get(layer, 'isDataEditable', this.isUserLayer(layer) && this.isFeatureLayer(layer))\r\n },\r\n async resetLayer (layer) {\r\n // Reset layer with new setup but keep track of current visibility state\r\n // as adding the layer back will restore default visibility state\r\n const isVisible = this.isLayerVisible(layer.name)\r\n await this.removeLayer(layer.name)\r\n await this.addLayer(layer)\r\n if (isVisible) await this.showLayer(layer.name)\r\n },\r\n configureLayerActions (layer) {\r\n let actions = _.get(this, 'activityOptions.layers.actions')\r\n if (actions) {\r\n // Apply filtering\r\n actions = Layout.filterContent(actions, _.get(this, 'activityOptions.layers.filter', {}))\r\n }\r\n // As context is different for each item we need to clone the global action configuration\r\n // otheriwse context will always reference the last processed item\r\n actions = Layout.bindContent(_.cloneDeep(actions), this)\r\n // Add 'virtual' action used to trigger the layer\r\n actions.push({ id: 'toggle', handler: () => this.onTriggerLayer(layer) })\r\n // Store the actions and make it reactive\r\n this.$set(layer, 'actions', actions)\r\n return actions\r\n },\r\n onLayerAdded (layer) {\r\n this.configureLayerActions(layer)\r\n },\r\n async onTriggerLayer (layer) {\r\n if (!this.isLayerVisible(layer.name)) {\r\n await this.showLayer(layer.name)\r\n } else {\r\n await this.hideLayer(layer.name)\r\n }\r\n // Check if the activity is using context restoration\r\n const hasContext = (typeof this.storeContext === 'function')\r\n if (hasContext) this.storeContext('layers')\r\n },\r\n onZoomIn () {\r\n const center = this.getCenter()\r\n this.center(center.longitude, center.latitude, center.zoomLevel ? center.zoomLevel + 1 : center.altitude * 0.5)\r\n },\r\n onZoomOut () {\r\n const center = this.getCenter()\r\n this.center(center.longitude, center.latitude, center.zoomLevel ? center.zoomLevel - 1 : center.altitude * 2)\r\n },\r\n onZoomToLayer (layer) {\r\n this.zoomToLayer(layer.name)\r\n },\r\n async onSaveLayer (layer) {\r\n // Take care that WFS layers rely on the same type as our own feature layers\r\n if (!_.has(layer, 'wfs') && _.get(layer, `${this.engine}.type`) === 'geoJson') {\r\n const geoJson = this.toGeoJson(layer.name)\r\n // Check for invalid features first\r\n const check = this.checkFeatures(geoJson)\r\n if (check.kinks.length > 0) {\r\n const result = await kCoreUtils.dialog({\r\n title: this.$t('mixins.activity.INVALID_FEATURES_DIALOG_TITLE', { features: check.kinks }),\r\n message: this.$t('mixins.activity.INVALID_FEATURES_DIALOG_MESSAGE', { features: check.kinks }),\r\n options: {\r\n type: 'toggle',\r\n model: [],\r\n items: [\r\n { label: this.$t('mixins.activity.DOWNLOAD_INVALID_FEATURES_LABEL'), value: 'download' }\r\n ]\r\n },\r\n html: true,\r\n ok: {\r\n label: this.$t('OK'),\r\n flat: true\r\n },\r\n cancel: {\r\n label: this.$t('CANCEL'),\r\n flat: true\r\n }\r\n })\r\n if (!result.ok) return\r\n // Export invalid features if required\r\n if (_.get(result, 'data', []).includes('download')) {\r\n kCoreUtils.downloadAsBlob(JSON.stringify({ type: 'FeatureCollection', features: check.kinks }),\r\n this.$t('mixins.activity.INVALID_FEATURES_FILE'), 'application/json;charset=utf-8;')\r\n }\r\n }\r\n // Change data source from in-memory to features service\r\n _.set(layer, 'service', 'features')\r\n if (_.has(layer, 'leaflet')) _.set(layer, 'leaflet.source', '/api/features')\r\n if (_.has(layer, 'cesium')) _.set(layer, 'cesium.source', '/api/features')\r\n const features = (geoJson.type === 'FeatureCollection' ? geoJson.features : [geoJson])\r\n // If too much data use tiling\r\n // The threshold is based on the number of points and not features.\r\n // Indeed otherwise the complexity will be different depending on the geometry type\r\n // (eg a bucket of 1000 polygons can actually contains a lot of points).\r\n let nbPoints = 0\r\n features.forEach(feature => {\r\n nbPoints += explode(feature).features.length\r\n })\r\n if (this.is2D() && (nbPoints > 5000)) {\r\n _.set(layer, 'leaflet.tiled', true)\r\n _.set(layer, 'leaflet.minZoom', 15)\r\n }\r\n Loading.show({ message: this.$t('mixins.activity.SAVING_LABEL', { processed: 0, total: features.length }) })\r\n try {\r\n let createdLayer = await this.$api.getService('catalog')\r\n .create(_.omit(layer, ['actions', 'label', 'isVisible', 'isDisabled']))\r\n const chunkSize = _.get(this, 'activityOptions.featuresChunkSize', 5000)\r\n let nbFeatures = 0\r\n // We use the generated DB ID as layer ID on features\r\n await this.createFeatures(geoJson, createdLayer._id, chunkSize, (i, chunk) => {\r\n // Update saving message according to new chunk data\r\n nbFeatures += chunk.length\r\n Loading.show({\r\n message: this.$t('mixins.activity.SAVING_LABEL', { processed: nbFeatures, total: features.length })\r\n })\r\n })\r\n // Because we save all features in a single service use filtering to separate layers\r\n createdLayer = await this.$api.getService('catalog').patch(createdLayer._id, { baseQuery: { layer: createdLayer._id } })\r\n // Reset layer with new setup\r\n await this.resetLayer(createdLayer)\r\n if (_.get(layer, 'leaflet.tiled')) {\r\n this.$toast({ type: 'positive', message: this.$t('mixins.activity.SAVE_DIALOG_MESSAGE'), timeout: 10000, html: true })\r\n }\r\n } catch (error) {\r\n // User error message on operation should be raised by error hook, otherwise this is more a coding error\r\n logger.error(error)\r\n }\r\n Loading.hide()\r\n } else {\r\n // Otherwise simply save in catalog\r\n const createdLayer = await this.$api.getService('catalog')\r\n .create(_.omit(layer, ['actions', 'label', 'isVisible', 'isDisabled']))\r\n // Reset layer with new setup\r\n await this.resetLayer(createdLayer)\r\n }\r\n },\r\n async onFilterLayerData (layer) {\r\n this.filterModal = await this.$createComponent('KFeaturesFilter', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer\r\n }\r\n })\r\n this.filterModal.$mount()\r\n this.filterModal.open()\r\n this.filterModal.$on('applied', async () => {\r\n // Reset layer with new setup\r\n await this.resetLayer(layer)\r\n this.filterModal.closeModal()\r\n })\r\n this.filterModal.$on('closed', () => {\r\n this.filterModal = null\r\n })\r\n },\r\n async onViewLayerData (layer) {\r\n this.viewModal = await this.$createComponent('KFeaturesTable', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer,\r\n featureActions: [{\r\n name: 'zoom-to',\r\n tooltip: this.$t('mixins.activity.ZOOM_TO_LABEL'),\r\n icon: 'zoom_out_map',\r\n handler: (context) => {\r\n // Use altitude or zoom level depending on engine\r\n this.center(..._.get(centroid(context.item), 'geometry.coordinates'), this.is2D() ? 18 : 750)\r\n this.viewModal.closeModal()\r\n }\r\n }]\r\n }\r\n })\r\n this.viewModal.$mount()\r\n this.viewModal.open()\r\n this.viewModal.$on('closed', () => {\r\n this.viewModal = null\r\n })\r\n },\r\n async onChartLayerData (layer) {\r\n this.chartModal = await this.$createComponent('KFeaturesChart', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer\r\n }\r\n })\r\n this.chartModal.$mount()\r\n this.chartModal.open()\r\n this.chartModal.$on('closed', () => {\r\n this.chartModal = null\r\n })\r\n },\r\n async onEditLayer (layer) {\r\n this.editModal = await this.$createComponent('editor/KModalEditor', {\r\n propsData: {\r\n service: 'catalog',\r\n contextId: this.contextId,\r\n objectId: layer._id\r\n }\r\n })\r\n this.editModal.$mount()\r\n this.editModal.openModal()\r\n this.editModal.$on('applied', updatedLayer => {\r\n // Actual layer update should be triggerred by real-time event\r\n // but as we might not always use sockets perform it anyway\r\n // If renamed need to update the layer map accordingly\r\n if (layer.name !== updatedLayer.name) {\r\n this.renameLayer(layer.name, updatedLayer.name)\r\n }\r\n Object.assign(layer, updatedLayer)\r\n this.editModal.closeModal()\r\n })\r\n this.editModal.$on('closed', () => {\r\n this.editModal = null\r\n })\r\n },\r\n async onEditLayerStyle (layer) {\r\n this.editStyleModal = await this.$createComponent('KLayerStyleEditor', {\r\n propsData: {\r\n contextId: this.contextId,\r\n layer,\r\n options: this.activityOptions.engine\r\n }\r\n })\r\n this.editStyleModal.$mount()\r\n this.editStyleModal.open()\r\n this.editStyleModal.$on('applied', async () => {\r\n // Actual layer update should be triggerred by real-time event\r\n // but as we might not always use sockets perform it anyway\r\n // Keep track of data as we will reset the layer\r\n const geoJson = this.toGeoJson(layer.name)\r\n // Reset layer with new setup\r\n await this.resetLayer(layer)\r\n // Update data only when in memory as reset has lost it\r\n if (!layer._id) {\r\n this.updateLayer(layer.name, geoJson)\r\n }\r\n this.editStyleModal.closeModal()\r\n })\r\n this.editStyleModal.$on('closed', () => {\r\n this.editStyleModal = null\r\n })\r\n },\r\n editLayerByName (name, editOptions = {}) {\r\n // this one is used through postRobot to trigger edition\r\n // on a layer\r\n const layer = this.getLayerByName(name)\r\n if (!layer) return\r\n this.startEditLayer(layer, editOptions)\r\n },\r\n onEditLayerData (layer) {\r\n // this one is triggered by a layer action (toggle)\r\n if (this.isLayerEdited(layer)) {\r\n // always accept editions in the action\r\n this.stopEditLayer('accept')\r\n } else {\r\n // start editing properties by default\r\n this.startEditLayer(layer, { editMode: 'edit-properties' })\r\n }\r\n },\r\n onEndLayerEdition (status = 'accept') {\r\n // this one can be triggered from a toolbar to accept or reject changes\r\n this.stopEditLayer(status)\r\n },\r\n async onRemoveLayer (layer) {\r\n Dialog.create({\r\n title: this.$t('mixins.activity.REMOVE_DIALOG_TITLE', { layer: layer.name }),\r\n message: this.$t('mixins.activity.REMOVE_DIALOG_MESSAGE', { layer: layer.name }),\r\n html: true,\r\n ok: {\r\n label: this.$t('OK'),\r\n flat: true\r\n },\r\n cancel: {\r\n label: this.$t('CANCEL'),\r\n flat: true\r\n }\r\n }).onOk(async () => {\r\n Loading.show({ message: this.$t('mixins.activity.REMOVING_LABEL') })\r\n try {\r\n // Stop any running edition\r\n if (this.isLayerEdited(layer)) this.onEditLayerData(layer)\r\n if (layer._id) {\r\n // If persistent feature layer remove features as well\r\n if (this.isFeatureLayer(layer)) {\r\n await this.removeFeatures(layer._id)\r\n }\r\n await this.$api.getService('catalog').remove(layer._id)\r\n }\r\n // Actual layer removal should be triggerred by real-time event\r\n // but as we might not always use sockets perform it anyway\r\n this.removeLayer(layer.name)\r\n } catch (error) {\r\n // User error message on operation should be raised by error hook, otherwise this is more a coding error\r\n logger.error(error)\r\n }\r\n Loading.hide()\r\n })\r\n },\r\n onMapReady () {\r\n this.engineReady = true\r\n this.engine = 'leaflet'\r\n },\r\n onGlobeReady () {\r\n this.engineReady = true\r\n this.engine = 'cesium'\r\n },\r\n onProbeLocation () {\r\n this.setCursor('probe-cursor')\r\n this.$once('click', () => {\r\n this.unsetCursor('probe-cursor')\r\n })\r\n },\r\n onToggleFullscreen () {\r\n if (!this.$q.fullscreen.isActive) this.$q.fullscreen.request()\r\n else this.$q.fullscreen.exit()\r\n },\r\n async initialize () {\r\n // Check if the activity is using context restoration\r\n const hasContext = (typeof this.restoreContext === 'function')\r\n // Geolocate by default if view has not been restored\r\n const viewRestored = (hasContext ? await this.restoreContext('view') : false)\r\n if (!viewRestored) {\r\n // Provided by geolocation if enabled\r\n if (!this.$geolocation.get().position) await this.$geolocation.update()\r\n const position = this.$geolocation.get().position\r\n if (position) this.center(position.longitude, position.latitude)\r\n }\r\n // Retrieve the forecast models\r\n if (this.setupWeacast) {\r\n try {\r\n await this.setupWeacast()\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n this.forecastModelHandlers = { toggle: (model) => this.setForecastModel(model) }\r\n } else {\r\n this.forecastModelHandlers = {}\r\n }\r\n // Retrieve the layers\r\n try {\r\n await this.refreshLayerCategories()\r\n await this.refreshLayers()\r\n if (hasContext) await this.restoreContext('layers')\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n // Retrieve the time\r\n if (hasContext) this.restoreContext('time')\r\n // Listen about changes in global/contextual catalog services\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n const catalogService = this.$api.getService('catalog')\r\n // Keep track of binded listeners as we use the same function with different contexts\r\n this.catalogListeners = {}\r\n globalCatalogService._serviceEvents.forEach(event => {\r\n this.catalogListeners[event] = (object) => this.onCatalogUpdated(event, object)\r\n globalCatalogService.on(event, this.catalogListeners[event])\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n catalogService.on(event, this.catalogListeners[event])\r\n }\r\n })\r\n },\r\n finalize () {\r\n // Stop listening about changes in global/contextual catalog services\r\n const globalCatalogService = this.$api.getService('catalog', '')\r\n const catalogService = this.$api.getService('catalog')\r\n globalCatalogService._serviceEvents.forEach(event => {\r\n globalCatalogService.removeListener(event, this.catalogListeners[event])\r\n if (catalogService && (catalogService !== globalCatalogService)) {\r\n catalogService.removeListener(event, this.catalogListeners[event])\r\n }\r\n })\r\n this.catalogListeners = {}\r\n },\r\n async onCatalogUpdated (event, object) {\r\n switch (object.type) {\r\n case 'Category':\r\n // In any case we rebuild categories\r\n this.refreshLayerCategories()\r\n break\r\n case 'Context':\r\n case 'Service':\r\n // Nothing to do\r\n break\r\n default: {\r\n // Updating a layer requires to remove/add it again to cover all use cases\r\n // (eg style edition, etc.)\r\n // Here we find layer by ID as renaming could have occured from another client\r\n const layers = this.getLayers({ _id: object._id })\r\n if (layers.length > 0) await this.removeCatalogLayer(layers[0])\r\n if (event !== 'removed') await this.addCatalogLayer(object)\r\n break\r\n }\r\n }\r\n }\r\n },\r\n mounted () {\r\n this.$on('map-ready', this.onMapReady)\r\n this.$on('globe-ready', this.onGlobeReady)\r\n this.$on('layer-added', this.onLayerAdded)\r\n },\r\n beforeDestroy () {\r\n this.$off('map-ready', this.onMapReady)\r\n this.$off('globe-ready', this.onGlobeReady)\r\n this.$off('layer-added', this.onLayerAdded)\r\n this.finalize()\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = {
|
|
7
|
+
computed: {
|
|
8
|
+
panelStyle() {
|
|
9
|
+
const screenHeight = this.$q.screen.height;
|
|
10
|
+
this.scrollAreaMaxHeight = screenHeight * 0.75; // 75vh
|
|
11
|
+
let width = 420;
|
|
12
|
+
if (this.$q.screen.lt.sm) {
|
|
13
|
+
this.scrollAreaMaxHeight = screenHeight * 0.60;
|
|
14
|
+
width = 300;
|
|
15
|
+
} else if (this.$q.screen.lt.md) {
|
|
16
|
+
this.scrollAreaMaxHeight = screenHeight * 0.65;
|
|
17
|
+
width = 340;
|
|
18
|
+
} else if (this.$q.screen.lt.lg) {
|
|
19
|
+
this.scrollAreaMaxHeight = screenHeight * 0.70;
|
|
20
|
+
width = 380;
|
|
21
|
+
}
|
|
22
|
+
return `height: ${this.scrollAreaMaxHeight}px; width: ${width}px`;
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
data() {
|
|
26
|
+
return {
|
|
27
|
+
scrollAreaMaxHeight: 0
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
beforeCreate() {
|
|
31
|
+
// Load the required components
|
|
32
|
+
this.$options.components['k-scroll-area'] = this.$load('frame/KScrollArea');
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
module.exports = exports['default'];
|
|
36
|
+
//# sourceMappingURL=mixin.catalog-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../map/client/mixins/mixin.catalog-panel.js"],"names":["computed","panelStyle","screenHeight","$q","screen","height","scrollAreaMaxHeight","width","lt","sm","md","lg","data","beforeCreate","$options","components","$load"],"mappings":";;;;;kBAAe;AACbA,YAAU;AACRC,iBAAc;AACZ,YAAMC,eAAe,KAAKC,EAAL,CAAQC,MAAR,CAAeC,MAApC;AACA,WAAKC,mBAAL,GAA2BJ,eAAe,IAA1C,CAFY,CAEmC;AAC/C,UAAIK,QAAQ,GAAZ;AACA,UAAI,KAAKJ,EAAL,CAAQC,MAAR,CAAeI,EAAf,CAAkBC,EAAtB,EAA0B;AACxB,aAAKH,mBAAL,GAA2BJ,eAAe,IAA1C;AACAK,gBAAQ,GAAR;AACD,OAHD,MAGO,IAAI,KAAKJ,EAAL,CAAQC,MAAR,CAAeI,EAAf,CAAkBE,EAAtB,EAA0B;AAC/B,aAAKJ,mBAAL,GAA2BJ,eAAe,IAA1C;AACAK,gBAAQ,GAAR;AACD,OAHM,MAGA,IAAI,KAAKJ,EAAL,CAAQC,MAAR,CAAeI,EAAf,CAAkBG,EAAtB,EAA0B;AAC/B,aAAKL,mBAAL,GAA2BJ,eAAe,IAA1C;AACAK,gBAAQ,GAAR;AACD;AACD,aAAQ,WAAU,KAAKD,mBAAoB,cAAaC,KAAM,IAA9D;AACD;AAhBO,GADG;AAmBbK,SAAQ;AACN,WAAO;AACLN,2BAAqB;AADhB,KAAP;AAGD,GAvBY;AAwBbO,iBAAgB;AACd;AACA,SAAKC,QAAL,CAAcC,UAAd,CAAyB,eAAzB,IAA4C,KAAKC,KAAL,CAAW,mBAAX,CAA5C;AACD;AA3BY,C","file":"mixin.catalog-panel.js","sourcesContent":["export default {\r\n computed: {\r\n panelStyle () {\r\n const screenHeight = this.$q.screen.height\r\n this.scrollAreaMaxHeight = screenHeight * 0.75 // 75vh\r\n let width = 420\r\n if (this.$q.screen.lt.sm) {\r\n this.scrollAreaMaxHeight = screenHeight * 0.60\r\n width = 300\r\n } else if (this.$q.screen.lt.md) {\r\n this.scrollAreaMaxHeight = screenHeight * 0.65\r\n width = 340\r\n } else if (this.$q.screen.lt.lg) {\r\n this.scrollAreaMaxHeight = screenHeight * 0.70\r\n width = 380\r\n }\r\n return `height: ${this.scrollAreaMaxHeight}px; width: ${width}px`\r\n }\r\n },\r\n data () {\r\n return {\r\n scrollAreaMaxHeight: 0\r\n }\r\n },\r\n beforeCreate () {\r\n // Load the required components\r\n this.$options.components['k-scroll-area'] = this.$load('frame/KScrollArea')\r\n }\r\n}\r\n"]}
|
|
@@ -41,16 +41,25 @@ exports.default = {
|
|
|
41
41
|
},
|
|
42
42
|
methods: {
|
|
43
43
|
getWidgetForLayer() {
|
|
44
|
-
// FIXME: should not be hard-coded
|
|
45
44
|
let widget;
|
|
46
45
|
if (this.selection.layer) {
|
|
47
|
-
widget = _lodash2.default.get(this.selection.layer, 'widget'
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
widget = _lodash2.default.get(this.selection.layer, 'widget');
|
|
47
|
+
if (widget) {
|
|
48
|
+
if (typeof widget !== 'string') {
|
|
49
|
+
// expect an object with at least a 'type' property
|
|
50
|
+
widget = _lodash2.default.get(widget, 'type', 'information-box');
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
// fallback to old widget selection logic
|
|
54
|
+
if (_lodash2.default.has(this.selection.layer, 'probe') || // Static probe on pre-defined sites
|
|
55
|
+
_lodash2.default.has(this.selection.layer, 'variables')) {
|
|
56
|
+
// Measurement history
|
|
57
|
+
widget = 'time-series';
|
|
58
|
+
} else if (_lodash2.default.get(this.selection.layer, 'leaflet.type') === 'mapillary') {
|
|
59
|
+
widget = 'mapillary-viewer';
|
|
60
|
+
} else {
|
|
61
|
+
widget = 'information-box';
|
|
62
|
+
}
|
|
54
63
|
}
|
|
55
64
|
} else {
|
|
56
65
|
if (this.isCursor('probe-cursor')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../map/client/mixins/mixin.feature-selection.js"],"names":["data","selection","$store","get","computed","hasFeatureSelection","feature","methods","getWidgetForLayer","widget","layer","_","has","isCursor","clearSelection","closeWidget","setSelection","location","set","hasOpenWidget","openWidget","centerOnSelection","center","lng","lat","addSelectionHighlight","id","removeSelectionHighlight","highlight","cloneDeep","type","geometry","coordinates","Object","assign","_id","merge","properties","geodesic","is2D","radius","colors","getBrand","selectionHighlight","updateSelectionLayer","updateSelectionHighlight","unset","createSelectionLayer","getLayerByName","SelectionLayerName","addLayer","name","scope","isSelectable","leaflet","isVisible","realtime","interactive","popup","pick","cesium","isLayerVisible","showLayer","updateLayer","features","values","removeSelectionLayer","removeLayer","onFeatureSelectionClicked","event","isLayerSelectable","undefined","onFeatureSelectionLayerShown","onFeatureSelectionLayerHidden","onFeatureSelectionLayerDisabled","disabledSelectionHighlight","onFeatureSelectionLayerEnabled","created","$on","beforeDestroy","$off"],"mappings":"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","file":"mixin.feature-selection.js","sourcesContent":["import bbox from '@turf/bbox'\r\nimport bboxPolygon from '@turf/bbox-polygon'\r\nimport centroid from '@turf/centroid'\r\nimport _ from 'lodash'\r\nimport { colors } from 'quasar'\r\nimport { SelectionLayerName } from '../utils'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n selection: this.$store.get('selection')\r\n }\r\n },\r\n computed: {\r\n hasFeatureSelection () {\r\n return this.selection.feature\r\n }\r\n },\r\n methods: {\r\n getWidgetForLayer () {\r\n // FIXME: should not be hard-coded\r\n let widget\r\n if (this.selection.layer) {\r\n widget = _.get(this.selection.layer, 'widget', 'information-box')\r\n if (_.has(this.selection.layer, 'probe') || // Static probe on pre-defined sites\r\n _.has(this.selection.layer, 'variables')) { // Measurement history\r\n widget = 'time-series'\r\n } else if (_.get(this.selection.layer, 'leaflet.type') === 'mapillary') {\r\n widget = 'mapillary-viewer'\r\n }\r\n } else {\r\n if (this.isCursor('probe-cursor')) {\r\n widget = 'time-series'\r\n }\r\n }\r\n return widget\r\n },\r\n clearSelection () {\r\n this.selection.feature = null\r\n this.selection.layer = null\r\n this.closeWidget()\r\n },\r\n setSelection (location, feature, layer) {\r\n this.selection.location = location\r\n // If clicked on the same object unselect otherwise select\r\n if (feature && (feature === this.selection.feature)) {\r\n this.clearSelection()\r\n } else {\r\n this.selection.feature = feature\r\n this.selection.layer = layer\r\n this.$store.set('selection.states', {})\r\n // Open associated default widget if none already open,\r\n // if the user has open another widget it will remain active\r\n const widget = this.getWidgetForLayer()\r\n if (widget && !this.hasOpenWidget()) this.openWidget(widget)\r\n }\r\n },\r\n centerOnSelection () {\r\n if (this.hasFeatureSelection) {\r\n this.center(..._.get(centroid(this.selection.feature), 'geometry.coordinates'))\r\n } else if (this.selection.location) {\r\n this.center(this.selection.location.lng, this.selection.location.lat)\r\n }\r\n },\r\n addSelectionHighlight (id, feature = {}) {\r\n // Remove previous selection if any\r\n this.removeSelectionHighlight(id)\r\n // Start from selected feature or location to build highlight\r\n const highlight = (this.selection.feature ? _.cloneDeep(this.selection.feature) : {\r\n type: 'Feature',\r\n geometry: { type: 'Point', coordinates: [this.selection.location.lng, this.selection.location.lat] }\r\n })\r\n // Use bbox for line/polygons\r\n if (highlight.geometry.type !== 'Point') {\r\n Object.assign(highlight, bboxPolygon(bbox(this.selection.feature)))\r\n }\r\n // Add an identifier if we'd like to update it\r\n highlight._id = highlight.id = id\r\n // Add default styling and additional information provided if any\r\n _.merge(highlight, {\r\n properties: {\r\n 'marker-type': 'circleMarker',\r\n geodesic: !this.is2D(), // In 3D we use a circle on ground\r\n radius: this.is2D() ? 18 : 1000,\r\n 'stroke-color': colors.getBrand('secondary'),\r\n 'stroke-width': 3,\r\n 'fill-color': colors.getBrand('secondary'),\r\n 'fill-opacity': 0.5\r\n }\r\n }, feature)\r\n _.set(this.selectionHighlight, id, highlight)\r\n this.updateSelectionLayer()\r\n return highlight\r\n },\r\n updateSelectionHighlight (id, feature) {\r\n if (_.has(this.selectionHighlight, id)) {\r\n _.merge(_.get(this.selectionHighlight, id), feature)\r\n this.updateSelectionLayer()\r\n }\r\n },\r\n removeSelectionHighlight (id) {\r\n if (_.has(this.selectionHighlight, id)) {\r\n _.unset(this.selectionHighlight, id)\r\n this.updateSelectionLayer()\r\n }\r\n },\r\n async createSelectionLayer () {\r\n // Get any previous layer or create it the first time\r\n const layer = this.getLayerByName(SelectionLayerName)\r\n if (!layer) {\r\n await this.addLayer({\r\n name: SelectionLayerName,\r\n type: 'OverlayLayer',\r\n scope: 'system',\r\n isSelectable: false,\r\n leaflet: {\r\n type: 'geoJson',\r\n isVisible: true,\r\n realtime: true,\r\n interactive: false,\r\n popup: { pick: [] }\r\n },\r\n cesium: {\r\n type: 'geoJson',\r\n isVisible: true,\r\n realtime: true,\r\n popup: { pick: [] }\r\n }\r\n })\r\n }\r\n if (!this.isLayerVisible(SelectionLayerName)) await this.showLayer(SelectionLayerName)\r\n },\r\n updateSelectionLayer () {\r\n this.updateLayer(SelectionLayerName, { type: 'FeatureCollection', features: Object.values(this.selectionHighlight) })\r\n },\r\n removeSelectionLayer () {\r\n this.removeLayer(SelectionLayerName)\r\n },\r\n onFeatureSelectionClicked (layer, event) {\r\n // Retrieve the location/feature\r\n const location = _.get(event, 'latlng')\r\n let feature\r\n // Check the target layer\r\n if (layer && layer.name) {\r\n // FIXME: need to retrieve original layer options as here we get processed options by the underlying engine\r\n layer = this.getLayerByName(layer.name)\r\n // Check if selectable\r\n if (layer && this.isLayerSelectable(layer)) {\r\n // Retrieve the feature and manage 2D/3D entity\r\n feature = _.get(event, 'target.feature')\r\n } else {\r\n // Avoid updating selection on click if not selectable\r\n return\r\n }\r\n } else {\r\n // Avoid updating selection on click if not probe\r\n if ((!this.isCursor('probe-cursor')) && (!this.isCursor('position-cursor'))) return\r\n // Otherwise this is a position selection only\r\n layer = undefined\r\n }\r\n // Update the selection\r\n this.setSelection(location, feature, layer)\r\n },\r\n onFeatureSelectionLayerShown (layer) {\r\n // If at least one layer is visible we have to create selection layer\r\n if (this.isLayerSelectable(layer)) this.createSelectionLayer()\r\n },\r\n onFeatureSelectionLayerHidden (layer) {\r\n if (this.hasFeatureSelection) {\r\n if (layer.name === this.selection.layer.name) this.clearSelection()\r\n }\r\n },\r\n onFeatureSelectionLayerDisabled (layer) {\r\n if (this.hasFeatureSelection) {\r\n if (layer.name === this.selection.layer.name) {\r\n // Backup highlights\r\n this.disabledSelectionHighlight = this.selectionHighlight\r\n // Clear it\r\n this.selectionHighlight = {}\r\n this.updateSelectionLayer()\r\n }\r\n }\r\n },\r\n onFeatureSelectionLayerEnabled (layer) {\r\n if (this.hasFeatureSelection) {\r\n if (layer.name === this.selection.layer.name) {\r\n // Restore highlights\r\n this.selectionHighlight = this.disabledSelectionHighlight\r\n this.updateSelectionLayer()\r\n }\r\n }\r\n }\r\n },\r\n created () {\r\n // Set of highligthed features\r\n this.selectionHighlight = {}\r\n this.$on('click', this.onFeatureSelectionClicked)\r\n this.$on('layer-shown', this.onFeatureSelectionLayerShown)\r\n this.$on('layer-hidden', this.onFeatureSelectionLayerHidden)\r\n this.$on('layer-disabled', this.onFeatureSelectionLayerDisabled)\r\n this.$on('layer-enabled', this.onFeatureSelectionLayerEnabled)\r\n },\r\n beforeDestroy () {\r\n this.$off('click', this.onFeatureSelectionClicked)\r\n this.$off('layer-shown', this.onFeatureSelectionLayerShown)\r\n this.$off('layer-hidden', this.onFeatureSelectionLayerHidden)\r\n this.$off('layer-disabled', this.onFeatureSelectionLayerDisabled)\r\n this.$off('layer-enabled', this.onFeatureSelectionLayerEnabled)\r\n this.removeSelectionLayer()\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../map/client/mixins/mixin.feature-selection.js"],"names":["data","selection","$store","get","computed","hasFeatureSelection","feature","methods","getWidgetForLayer","widget","layer","_","has","isCursor","clearSelection","closeWidget","setSelection","location","set","hasOpenWidget","openWidget","centerOnSelection","center","lng","lat","addSelectionHighlight","id","removeSelectionHighlight","highlight","cloneDeep","type","geometry","coordinates","Object","assign","_id","merge","properties","geodesic","is2D","radius","colors","getBrand","selectionHighlight","updateSelectionLayer","updateSelectionHighlight","unset","createSelectionLayer","getLayerByName","SelectionLayerName","addLayer","name","scope","isSelectable","leaflet","isVisible","realtime","interactive","popup","pick","cesium","isLayerVisible","showLayer","updateLayer","features","values","removeSelectionLayer","removeLayer","onFeatureSelectionClicked","event","isLayerSelectable","undefined","onFeatureSelectionLayerShown","onFeatureSelectionLayerHidden","onFeatureSelectionLayerDisabled","disabledSelectionHighlight","onFeatureSelectionLayerEnabled","created","$on","beforeDestroy","$off"],"mappings":"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","file":"mixin.feature-selection.js","sourcesContent":["import bbox from '@turf/bbox'\r\nimport bboxPolygon from '@turf/bbox-polygon'\r\nimport centroid from '@turf/centroid'\r\nimport _ from 'lodash'\r\nimport { colors } from 'quasar'\r\nimport { SelectionLayerName } from '../utils'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n selection: this.$store.get('selection')\r\n }\r\n },\r\n computed: {\r\n hasFeatureSelection () {\r\n return this.selection.feature\r\n }\r\n },\r\n methods: {\r\n getWidgetForLayer () {\r\n let widget\r\n if (this.selection.layer) {\r\n widget = _.get(this.selection.layer, 'widget')\r\n if (widget) {\r\n if (typeof widget !== 'string') {\r\n // expect an object with at least a 'type' property\r\n widget = _.get(widget, 'type', 'information-box')\r\n }\r\n } else {\r\n // fallback to old widget selection logic\r\n if (_.has(this.selection.layer, 'probe') || // Static probe on pre-defined sites\r\n _.has(this.selection.layer, 'variables')) { // Measurement history\r\n widget = 'time-series'\r\n } else if (_.get(this.selection.layer, 'leaflet.type') === 'mapillary') {\r\n widget = 'mapillary-viewer'\r\n } else {\r\n widget = 'information-box'\r\n }\r\n }\r\n } else {\r\n if (this.isCursor('probe-cursor')) {\r\n widget = 'time-series'\r\n }\r\n }\r\n return widget\r\n },\r\n clearSelection () {\r\n this.selection.feature = null\r\n this.selection.layer = null\r\n this.closeWidget()\r\n },\r\n setSelection (location, feature, layer) {\r\n this.selection.location = location\r\n // If clicked on the same object unselect otherwise select\r\n if (feature && (feature === this.selection.feature)) {\r\n this.clearSelection()\r\n } else {\r\n this.selection.feature = feature\r\n this.selection.layer = layer\r\n this.$store.set('selection.states', {})\r\n // Open associated default widget if none already open,\r\n // if the user has open another widget it will remain active\r\n const widget = this.getWidgetForLayer()\r\n if (widget && !this.hasOpenWidget()) this.openWidget(widget)\r\n }\r\n },\r\n centerOnSelection () {\r\n if (this.hasFeatureSelection) {\r\n this.center(..._.get(centroid(this.selection.feature), 'geometry.coordinates'))\r\n } else if (this.selection.location) {\r\n this.center(this.selection.location.lng, this.selection.location.lat)\r\n }\r\n },\r\n addSelectionHighlight (id, feature = {}) {\r\n // Remove previous selection if any\r\n this.removeSelectionHighlight(id)\r\n // Start from selected feature or location to build highlight\r\n const highlight = (this.selection.feature ? _.cloneDeep(this.selection.feature) : {\r\n type: 'Feature',\r\n geometry: { type: 'Point', coordinates: [this.selection.location.lng, this.selection.location.lat] }\r\n })\r\n // Use bbox for line/polygons\r\n if (highlight.geometry.type !== 'Point') {\r\n Object.assign(highlight, bboxPolygon(bbox(this.selection.feature)))\r\n }\r\n // Add an identifier if we'd like to update it\r\n highlight._id = highlight.id = id\r\n // Add default styling and additional information provided if any\r\n _.merge(highlight, {\r\n properties: {\r\n 'marker-type': 'circleMarker',\r\n geodesic: !this.is2D(), // In 3D we use a circle on ground\r\n radius: this.is2D() ? 18 : 1000,\r\n 'stroke-color': colors.getBrand('secondary'),\r\n 'stroke-width': 3,\r\n 'fill-color': colors.getBrand('secondary'),\r\n 'fill-opacity': 0.5\r\n }\r\n }, feature)\r\n _.set(this.selectionHighlight, id, highlight)\r\n this.updateSelectionLayer()\r\n return highlight\r\n },\r\n updateSelectionHighlight (id, feature) {\r\n if (_.has(this.selectionHighlight, id)) {\r\n _.merge(_.get(this.selectionHighlight, id), feature)\r\n this.updateSelectionLayer()\r\n }\r\n },\r\n removeSelectionHighlight (id) {\r\n if (_.has(this.selectionHighlight, id)) {\r\n _.unset(this.selectionHighlight, id)\r\n this.updateSelectionLayer()\r\n }\r\n },\r\n async createSelectionLayer () {\r\n // Get any previous layer or create it the first time\r\n const layer = this.getLayerByName(SelectionLayerName)\r\n if (!layer) {\r\n await this.addLayer({\r\n name: SelectionLayerName,\r\n type: 'OverlayLayer',\r\n scope: 'system',\r\n isSelectable: false,\r\n leaflet: {\r\n type: 'geoJson',\r\n isVisible: true,\r\n realtime: true,\r\n interactive: false,\r\n popup: { pick: [] }\r\n },\r\n cesium: {\r\n type: 'geoJson',\r\n isVisible: true,\r\n realtime: true,\r\n popup: { pick: [] }\r\n }\r\n })\r\n }\r\n if (!this.isLayerVisible(SelectionLayerName)) await this.showLayer(SelectionLayerName)\r\n },\r\n updateSelectionLayer () {\r\n this.updateLayer(SelectionLayerName, { type: 'FeatureCollection', features: Object.values(this.selectionHighlight) })\r\n },\r\n removeSelectionLayer () {\r\n this.removeLayer(SelectionLayerName)\r\n },\r\n onFeatureSelectionClicked (layer, event) {\r\n // Retrieve the location/feature\r\n const location = _.get(event, 'latlng')\r\n let feature\r\n // Check the target layer\r\n if (layer && layer.name) {\r\n // FIXME: need to retrieve original layer options as here we get processed options by the underlying engine\r\n layer = this.getLayerByName(layer.name)\r\n // Check if selectable\r\n if (layer && this.isLayerSelectable(layer)) {\r\n // Retrieve the feature and manage 2D/3D entity\r\n feature = _.get(event, 'target.feature')\r\n } else {\r\n // Avoid updating selection on click if not selectable\r\n return\r\n }\r\n } else {\r\n // Avoid updating selection on click if not probe\r\n if ((!this.isCursor('probe-cursor')) && (!this.isCursor('position-cursor'))) return\r\n // Otherwise this is a position selection only\r\n layer = undefined\r\n }\r\n // Update the selection\r\n this.setSelection(location, feature, layer)\r\n },\r\n onFeatureSelectionLayerShown (layer) {\r\n // If at least one layer is visible we have to create selection layer\r\n if (this.isLayerSelectable(layer)) this.createSelectionLayer()\r\n },\r\n onFeatureSelectionLayerHidden (layer) {\r\n if (this.hasFeatureSelection) {\r\n if (layer.name === this.selection.layer.name) this.clearSelection()\r\n }\r\n },\r\n onFeatureSelectionLayerDisabled (layer) {\r\n if (this.hasFeatureSelection) {\r\n if (layer.name === this.selection.layer.name) {\r\n // Backup highlights\r\n this.disabledSelectionHighlight = this.selectionHighlight\r\n // Clear it\r\n this.selectionHighlight = {}\r\n this.updateSelectionLayer()\r\n }\r\n }\r\n },\r\n onFeatureSelectionLayerEnabled (layer) {\r\n if (this.hasFeatureSelection) {\r\n if (layer.name === this.selection.layer.name) {\r\n // Restore highlights\r\n this.selectionHighlight = this.disabledSelectionHighlight\r\n this.updateSelectionLayer()\r\n }\r\n }\r\n }\r\n },\r\n created () {\r\n // Set of highligthed features\r\n this.selectionHighlight = {}\r\n this.$on('click', this.onFeatureSelectionClicked)\r\n this.$on('layer-shown', this.onFeatureSelectionLayerShown)\r\n this.$on('layer-hidden', this.onFeatureSelectionLayerHidden)\r\n this.$on('layer-disabled', this.onFeatureSelectionLayerDisabled)\r\n this.$on('layer-enabled', this.onFeatureSelectionLayerEnabled)\r\n },\r\n beforeDestroy () {\r\n this.$off('click', this.onFeatureSelectionClicked)\r\n this.$off('layer-shown', this.onFeatureSelectionLayerShown)\r\n this.$off('layer-hidden', this.onFeatureSelectionLayerHidden)\r\n this.$off('layer-disabled', this.onFeatureSelectionLayerDisabled)\r\n this.$off('layer-enabled', this.onFeatureSelectionLayerEnabled)\r\n this.removeSelectionLayer()\r\n }\r\n}\r\n"]}
|
|
@@ -60,7 +60,7 @@ exports.default = {
|
|
|
60
60
|
const interval = _lodash2.default.has(options, 'every') ? _lodash2.default.get(options, 'every')
|
|
61
61
|
// Backward compatibility with old configuration style
|
|
62
62
|
: _lodash2.default.get(options, this.engine, options).interval;
|
|
63
|
-
return _moment2.default.duration(interval);
|
|
63
|
+
return interval ? _moment2.default.duration(interval) : null;
|
|
64
64
|
},
|
|
65
65
|
getFeaturesQueryInterval(options) {
|
|
66
66
|
const interval = this.getFeaturesUpdateInterval(options);
|
|
@@ -70,17 +70,22 @@ exports.default = {
|
|
|
70
70
|
// If query interval not given use 2 x refresh interval as default value
|
|
71
71
|
// this ensures we cover last interval if server/client update processes are not in sync
|
|
72
72
|
if (!queryInterval && interval) queryInterval = _moment2.default.duration(-2 * interval.asMilliseconds());
|
|
73
|
-
return _moment2.default.duration(queryInterval);
|
|
73
|
+
return queryInterval ? _moment2.default.duration(queryInterval) : null;
|
|
74
74
|
},
|
|
75
75
|
shouldSkipFeaturesUpdate(lastUpdateTime, options, interval) {
|
|
76
76
|
// If not given try to compute query interval from options
|
|
77
77
|
if (!interval) {
|
|
78
78
|
interval = this.getFeaturesUpdateInterval(options);
|
|
79
79
|
}
|
|
80
|
+
// We assume this is not a time-varying layer
|
|
80
81
|
if (!interval) return true;
|
|
81
82
|
const now = _time.Time.getCurrentTime();
|
|
83
|
+
const elapsed = _moment2.default.duration(now.diff(lastUpdateTime));
|
|
82
84
|
// If query interval has elapsed since last update we need to update again
|
|
83
|
-
return
|
|
85
|
+
return Math.abs(elapsed.asMilliseconds()) < interval.asMilliseconds();
|
|
86
|
+
},
|
|
87
|
+
getFeaturesLevel(options) {
|
|
88
|
+
return this.selectableLevelsLayer && this.selectableLevelsLayer.name === options.name ? this.selectedLevel : null;
|
|
84
89
|
},
|
|
85
90
|
getProbeFeatures(options) {
|
|
86
91
|
var _this = this;
|
|
@@ -108,7 +113,7 @@ exports.default = {
|
|
|
108
113
|
return _this2.getProbeFeatures(layer);
|
|
109
114
|
})();
|
|
110
115
|
},
|
|
111
|
-
getFeatures(options, queryInterval) {
|
|
116
|
+
getFeatures(options, queryInterval, queryLevel) {
|
|
112
117
|
var _this3 = this;
|
|
113
118
|
|
|
114
119
|
return _asyncToGenerator(function* () {
|
|
@@ -116,41 +121,56 @@ exports.default = {
|
|
|
116
121
|
if (!queryInterval) {
|
|
117
122
|
queryInterval = _this3.getFeaturesQueryInterval(options);
|
|
118
123
|
}
|
|
124
|
+
// If not given try to compute query level from options
|
|
125
|
+
if (!queryLevel) {
|
|
126
|
+
queryLevel = _this3.getFeaturesLevel(options);
|
|
127
|
+
}
|
|
119
128
|
// Any base query to process ?
|
|
120
129
|
let query = yield _this3.getBaseQueryForFeatures(options);
|
|
121
|
-
//
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
// Request features with at least one data available during last query interval
|
|
131
|
+
if (queryInterval) {
|
|
132
|
+
// Check if we have variables to be aggregated in time or not
|
|
133
|
+
if (options.variables) {
|
|
134
|
+
query = Object.assign({
|
|
135
|
+
$groupBy: options.featureId,
|
|
136
|
+
$aggregate: options.variables.map(function (variable) {
|
|
137
|
+
return variable.name;
|
|
138
|
+
})
|
|
139
|
+
}, query);
|
|
140
|
+
} else if (options.featureId) {
|
|
141
|
+
query = Object.assign({
|
|
142
|
+
$groupBy: options.featureId,
|
|
143
|
+
$aggregate: ['geometry']
|
|
144
|
+
}, query);
|
|
145
|
+
}
|
|
130
146
|
const now = _time.Time.getCurrentTime();
|
|
131
147
|
if (_moment2.default.isDuration(queryInterval)) {
|
|
132
148
|
// Depending on the duration format we might have negative or positive values
|
|
133
149
|
const gte = queryInterval.asMilliseconds() > 0 ? now.clone().subtract(queryInterval) : now.clone().add(queryInterval);
|
|
134
150
|
const lte = now;
|
|
135
151
|
Object.assign(query, {
|
|
136
|
-
$limit: 1,
|
|
137
152
|
$sort: { time: -1, runTime: -1 },
|
|
138
153
|
time: {
|
|
139
154
|
$gte: gte.format(),
|
|
140
155
|
$lte: lte.format()
|
|
141
156
|
}
|
|
142
157
|
});
|
|
158
|
+
// If we can aggregate then keep track of last element of each aggregation
|
|
159
|
+
if (options.featureId) query.$limit = 1;
|
|
143
160
|
} else if (typeof queryInterval === 'object') {
|
|
144
161
|
query.time = queryInterval;
|
|
145
162
|
} else {
|
|
146
|
-
// Last available data only for realtime visualization
|
|
147
163
|
Object.assign(query, {
|
|
148
|
-
$limit: 1,
|
|
149
164
|
$sort: { time: -1, runTime: -1 },
|
|
150
165
|
time: { $lte: now.format() }
|
|
151
166
|
});
|
|
167
|
+
// If we can aggregate then keep track of last element of each aggregation
|
|
168
|
+
if (options.featureId) query.$limit = 1;
|
|
152
169
|
}
|
|
153
170
|
}
|
|
171
|
+
if (!_lodash2.default.isNil(queryLevel)) {
|
|
172
|
+
query.level = queryLevel;
|
|
173
|
+
}
|
|
154
174
|
const response = yield _this3.$api.getService(options.service).find({ query });
|
|
155
175
|
if (typeof options.processor === 'function') {
|
|
156
176
|
const features = response.type === 'FeatureCollection' ? response.features : [response];
|