@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.
Files changed (188) hide show
  1. package/.travis.test.sh +1 -1
  2. package/CHANGELOG.md +63 -13
  3. package/extras/tours/map/catalog-panel.js +61 -10
  4. package/extras/tours/map/create-view.js +25 -0
  5. package/extras/tours/map/fab.js +10 -1
  6. package/extras/tours/map/navigation-bar.js +7 -9
  7. package/lib/core/api/application.js +9 -1
  8. package/lib/core/api/application.js.map +1 -1
  9. package/lib/core/client/components/chart/KChart.vue +115 -0
  10. package/lib/core/client/components/chart/KStatsChart.vue +76 -0
  11. package/lib/core/client/components/chart/index.js +20 -0
  12. package/lib/core/client/components/chart/index.js.map +1 -0
  13. package/lib/core/client/components/collection/KFilter.vue +6 -0
  14. package/lib/core/client/components/collection/KHistoryEntry.vue +1 -1
  15. package/lib/core/client/components/collection/KItem.vue +4 -4
  16. package/lib/core/client/components/form/KChipsField.vue +4 -4
  17. package/lib/core/client/components/form/KView.vue +1 -1
  18. package/lib/core/client/components/frame/KAction.vue +40 -5
  19. package/lib/core/client/components/frame/KBlock.vue +7 -7
  20. package/lib/core/client/components/frame/KContent.vue +1 -1
  21. package/lib/core/client/components/frame/KOpener.vue +1 -1
  22. package/lib/core/client/components/frame/KPanel.vue +8 -7
  23. package/lib/core/client/components/frame/KPopupAction.vue +6 -0
  24. package/lib/core/client/components/frame/KScreen.vue +1 -1
  25. package/lib/core/client/components/frame/KStamp.vue +4 -2
  26. package/lib/core/client/components/frame/index.js +1 -6
  27. package/lib/core/client/components/frame/index.js.map +1 -1
  28. package/lib/core/client/components/input/KIconChooser.vue +5 -2
  29. package/lib/core/client/components/input/KPalette.vue +1 -1
  30. package/lib/core/client/components/input/index.js +14 -4
  31. package/lib/core/client/components/input/index.js.map +1 -1
  32. package/lib/core/client/components/layout/KFab.vue +1 -1
  33. package/lib/core/client/components/layout/KLayout.vue +10 -2
  34. package/lib/core/client/components/layout/KPage.vue +19 -18
  35. package/lib/core/client/components/layout/KTour.vue +5 -3
  36. package/lib/core/client/components/layout/KWindow.vue +211 -59
  37. package/lib/core/client/components/media/KMediaBrowser.vue +6 -6
  38. package/lib/core/client/components/menu/KMenu.vue +13 -5
  39. package/lib/core/client/components/menu/KRadialFab.vue +22 -24
  40. package/lib/core/client/components/menu/KRadialFabItem.vue +17 -18
  41. package/lib/core/client/components/team/KGroupsActivity.vue +1 -1
  42. package/lib/core/client/components/team/KJoinGroup.vue +2 -2
  43. package/lib/core/client/components/time/KAbsoluteTimeRange.vue +190 -0
  44. package/lib/core/client/components/time/KRelativeTimeRanges.vue +192 -0
  45. package/lib/core/client/components/time/index.js +20 -0
  46. package/lib/core/client/components/time/index.js.map +1 -0
  47. package/lib/core/client/i18n/core_en.json +35 -12
  48. package/lib/core/client/i18n/core_fr.json +36 -13
  49. package/lib/core/client/index.js +1 -1
  50. package/lib/core/client/index.js.map +1 -1
  51. package/lib/core/client/mixins/mixin.base-collection.js +11 -1
  52. package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
  53. package/lib/core/client/mixins/mixin.base-widget.js +25 -13
  54. package/lib/core/client/mixins/mixin.base-widget.js.map +1 -1
  55. package/lib/core/client/services/index.js +2 -1
  56. package/lib/core/client/services/index.js.map +1 -1
  57. package/lib/core/client/services/local-settings.service.js +4 -0
  58. package/lib/core/client/services/local-settings.service.js.map +1 -1
  59. package/lib/core/client/time.js +25 -15
  60. package/lib/core/client/time.js.map +1 -1
  61. package/lib/core/client/units.js +12 -0
  62. package/lib/core/client/units.js.map +1 -1
  63. package/lib/core/client/utils.js +11 -0
  64. package/lib/core/client/utils.js.map +1 -1
  65. package/lib/core/common/schemas/settings.update.json +14 -4
  66. package/lib/map/api/hooks/hooks.catalog.js +20 -0
  67. package/lib/map/api/hooks/hooks.catalog.js.map +1 -1
  68. package/lib/map/api/models/catalog.model.mongodb.js +6 -1
  69. package/lib/map/api/models/catalog.model.mongodb.js.map +1 -1
  70. package/lib/map/api/models/features.model.mongodb.js +5 -0
  71. package/lib/map/api/models/features.model.mongodb.js.map +1 -1
  72. package/lib/map/api/services/catalog/catalog.hooks.js +3 -1
  73. package/lib/map/api/services/catalog/catalog.hooks.js.map +1 -1
  74. package/lib/map/client/components/KColorLegend.vue +22 -21
  75. package/lib/map/client/components/KFeaturesChart.vue +81 -110
  76. package/lib/map/client/components/KLayerStyleForm.vue +119 -47
  77. package/lib/map/client/components/KLevelSlider.vue +30 -29
  78. package/lib/map/client/components/KLocationMap.vue +2 -2
  79. package/lib/map/client/components/KMeasureTool.vue +30 -6
  80. package/lib/map/client/components/KPositionIndicator.vue +4 -4
  81. package/lib/map/client/components/KTimeline.vue +25 -27
  82. package/lib/map/client/components/KTimezoneMap.vue +156 -0
  83. package/lib/map/client/components/KUrlLegend.vue +11 -10
  84. package/lib/map/client/components/catalog/KBaseLayersSelector.vue +1 -1
  85. package/lib/map/client/components/catalog/KCatalogLayersPanel.vue +56 -0
  86. package/lib/map/client/components/catalog/KCreateView.vue +91 -0
  87. package/lib/map/client/components/catalog/KLayerCategories.vue +2 -1
  88. package/lib/map/client/components/catalog/{KCatalog.vue → KLayersPanel.vue} +19 -37
  89. package/lib/map/client/components/catalog/KUserLayersPanel.vue +40 -0
  90. package/lib/map/client/components/catalog/KViewSelector.vue +46 -0
  91. package/lib/map/client/components/catalog/KViewsPanel.vue +110 -0
  92. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +4 -13
  93. package/lib/map/client/components/form/KTimezoneField.vue +135 -0
  94. package/lib/map/client/components/widget/KElevationProfile.vue +488 -0
  95. package/lib/map/client/components/widget/KInformationBox.vue +48 -23
  96. package/lib/map/client/components/widget/KMapillaryViewer.vue +26 -20
  97. package/lib/map/client/components/widget/KTimeSeries.vue +267 -347
  98. package/lib/map/client/i18n/map_en.json +63 -40
  99. package/lib/map/client/i18n/map_fr.json +65 -42
  100. package/lib/map/client/leaflet/GradientPath.js +40 -19
  101. package/lib/map/client/leaflet/GradientPath.js.map +1 -1
  102. package/lib/map/client/leaflet/TiledFeatureLayer.js +527 -93
  103. package/lib/map/client/leaflet/TiledFeatureLayer.js.map +1 -1
  104. package/lib/map/client/leaflet/TiledMeshLayer.js +58 -35
  105. package/lib/map/client/leaflet/TiledMeshLayer.js.map +1 -1
  106. package/lib/map/client/leaflet/utils.js +44 -3
  107. package/lib/map/client/leaflet/utils.js.map +1 -1
  108. package/lib/map/client/mixins/globe/mixin.base-globe.js +16 -1
  109. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  110. package/lib/map/client/mixins/globe/mixin.file-layers.js +12 -2
  111. package/lib/map/client/mixins/globe/mixin.file-layers.js.map +1 -1
  112. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +7 -6
  113. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  114. package/lib/map/client/mixins/globe/mixin.popup.js +4 -2
  115. package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
  116. package/lib/map/client/mixins/globe/mixin.style.js +8 -4
  117. package/lib/map/client/mixins/globe/mixin.style.js.map +1 -1
  118. package/lib/map/client/mixins/globe/mixin.tooltip.js +4 -2
  119. package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
  120. package/lib/map/client/mixins/index.js +23 -18
  121. package/lib/map/client/mixins/index.js.map +1 -1
  122. package/lib/map/client/mixins/map/mixin.base-map.js +20 -2
  123. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  124. package/lib/map/client/mixins/map/mixin.edit-layers.js +8 -4
  125. package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
  126. package/lib/map/client/mixins/map/mixin.geojson-layers.js +27 -5
  127. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  128. package/lib/map/client/mixins/map/mixin.heatmap-layers.js +6 -1
  129. package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
  130. package/lib/map/client/mixins/map/mixin.popup.js +1 -1
  131. package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
  132. package/lib/map/client/mixins/map/mixin.style.js +8 -4
  133. package/lib/map/client/mixins/map/mixin.style.js.map +1 -1
  134. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +4 -11
  135. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
  136. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +0 -11
  137. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
  138. package/lib/map/client/mixins/map/mixin.tooltip.js +1 -1
  139. package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
  140. package/lib/map/client/mixins/mixin.activity.js +150 -150
  141. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  142. package/lib/map/client/mixins/mixin.catalog-panel.js +36 -0
  143. package/lib/map/client/mixins/mixin.catalog-panel.js.map +1 -0
  144. package/lib/map/client/mixins/mixin.feature-selection.js +17 -8
  145. package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
  146. package/lib/map/client/mixins/mixin.feature-service.js +36 -16
  147. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  148. package/lib/map/client/mixins/mixin.infobox.js +1 -1
  149. package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
  150. package/lib/map/client/mixins/mixin.levels.js +26 -12
  151. package/lib/map/client/mixins/mixin.levels.js.map +1 -1
  152. package/lib/map/client/mixins/mixin.style.js +1 -0
  153. package/lib/map/client/mixins/mixin.style.js.map +1 -1
  154. package/lib/map/client/mixins/mixin.weacast.js +15 -23
  155. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  156. package/lib/map/client/pixi-utils.js +8 -177
  157. package/lib/map/client/pixi-utils.js.map +1 -1
  158. package/lib/map/client/utils.js +1 -0
  159. package/lib/map/client/utils.js.map +1 -1
  160. package/lib/map/common/grid.js +131 -0
  161. package/lib/map/common/grid.js.map +1 -1
  162. package/lib/map/common/index.js +22 -11
  163. package/lib/map/common/index.js.map +1 -1
  164. package/lib/map/common/meteo-model-grid-source.js +5 -2
  165. package/lib/map/common/meteo-model-grid-source.js.map +1 -1
  166. package/lib/map/common/time-based-grid-source.js +5 -2
  167. package/lib/map/common/time-based-grid-source.js.map +1 -1
  168. package/lib/test/client/core/collection.js +31 -13
  169. package/lib/test/client/core/collection.js.map +1 -1
  170. package/lib/test/client/core/layout.js +137 -49
  171. package/lib/test/client/core/layout.js.map +1 -1
  172. package/lib/test/client/core/utils.js +89 -22
  173. package/lib/test/client/core/utils.js.map +1 -1
  174. package/lib/test/client/map/catalog.js +134 -41
  175. package/lib/test/client/map/catalog.js.map +1 -1
  176. package/lib/test/client/map/controls.js +7 -4
  177. package/lib/test/client/map/controls.js.map +1 -1
  178. package/lib/test/client/map/index.js +12 -0
  179. package/lib/test/client/map/index.js.map +1 -1
  180. package/lib/test/client/map/utils.js +67 -0
  181. package/lib/test/client/map/utils.js.map +1 -0
  182. package/package.json +5 -5
  183. package/extras/tours/map/favorite-views.js +0 -53
  184. package/lib/core/client/components/frame/KChart.vue +0 -60
  185. package/lib/core/client/components/input/KCodeInput.vue +0 -50
  186. package/lib/core/client/components/input/KTimeRangeChooser.vue +0 -109
  187. package/lib/core/client/components/time/KTimeRange.vue +0 -144
  188. 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', 'information-box');
48
- if (_lodash2.default.has(this.selection.layer, 'probe') || // Static probe on pre-defined sites
49
- _lodash2.default.has(this.selection.layer, 'variables')) {
50
- // Measurement history
51
- widget = 'time-series';
52
- } else if (_lodash2.default.get(this.selection.layer, 'leaflet.type') === 'mapillary') {
53
- widget = 'mapillary-viewer';
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 now.isSameOrBefore(lastUpdateTime.clone().add(interval));
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
- // Check if we have variables to be aggregate in time or not
122
- if (options.variables) {
123
- query = Object.assign({
124
- $groupBy: options.featureId,
125
- $aggregate: options.variables.map(function (variable) {
126
- return variable.name;
127
- })
128
- }, query);
129
- // Request feature with at least one data available during last query interval if none given
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];