@kalisio/kdk 2.5.3 → 2.6.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/.github/workflows/main.yaml +35 -6
- package/client.globe.js +8 -0
- package/client.js +8 -0
- package/client.map.js +8 -0
- package/core/api/hooks/hooks.push.js +3 -2
- package/core/api/hooks/hooks.tags.js +56 -0
- package/core/api/models/tags.model.mongodb.js +8 -0
- package/core/api/services/index.js +33 -2
- package/core/api/services/tags/tags.hooks.js +47 -0
- package/core/client/api.js +5 -5
- package/core/client/components/KActivity.vue +3 -2
- package/core/client/components/KChip.vue +2 -2
- package/core/client/components/KEditor.vue +3 -1
- package/core/client/components/KFollower.vue +4 -4
- package/core/client/components/KStore.vue +1 -1
- package/core/client/components/KTab.vue +20 -7
- package/core/client/components/account/KProfile.vue +9 -25
- package/core/client/components/action/KAction.vue +10 -10
- package/core/client/components/action/KToggleFullscreenAction.vue +2 -11
- package/core/client/components/app/KHome.vue +3 -2
- package/core/client/components/collection/KFilter.vue +5 -4
- package/core/client/components/collection/KGrid.vue +5 -1
- package/core/client/components/collection/KItemsFilter.vue +47 -0
- package/core/client/components/collection/KItemsSorter.vue +42 -0
- package/core/client/components/collection/KScrollDown.vue +2 -2
- package/core/client/components/collection/KSearchFilterControl.vue +3 -2
- package/core/client/components/collection/KSorter.vue +33 -37
- package/core/client/components/collection/KTagsFilterControl.vue +14 -40
- package/core/client/components/collection/KTagsFilterView.vue +10 -45
- package/core/client/components/collection/KTimeFilterControl.vue +6 -7
- package/core/client/components/collection/KTimeFilterView.vue +13 -22
- package/core/client/components/collection/KTimeLine.vue +18 -9
- package/core/client/components/form/KColorField.vue +13 -6
- package/core/client/components/form/KColorScaleField.vue +7 -12
- package/core/client/components/form/KFileField.vue +118 -89
- package/core/client/components/form/KForm.vue +30 -18
- package/core/client/components/form/KIconField.vue +4 -1
- package/core/client/components/form/KNumberField.vue +9 -2
- package/core/client/components/form/KSelectField.vue +1 -4
- package/core/client/components/form/KTagField.vue +229 -0
- package/core/client/components/form/KTextField.vue +4 -0
- package/core/client/components/form/KTextareaField.vue +3 -1
- package/core/client/components/input/KShapePicker.vue +3 -3
- package/core/client/components/layout/KFab.vue +32 -20
- package/core/client/components/layout/KPage.vue +11 -6
- package/core/client/components/layout/KWindow.vue +5 -0
- package/core/client/components/media/index.js +2 -6
- package/core/client/components/menu/KMenu.vue +12 -10
- package/core/client/components/menu/KSubMenu.vue +12 -12
- package/core/client/components/messages/KMessageCard.vue +13 -12
- package/core/client/components/messages/KMessageComposer.vue +13 -9
- package/core/client/components/messages/KMessagesTimeLine.vue +16 -8
- package/core/client/components/tags/KTagFilter.vue +99 -0
- package/core/client/components/tags/KTagItem.vue +65 -0
- package/core/client/components/tags/KTagManager.vue +198 -0
- package/core/client/components/tags/KTagSelection.vue +82 -0
- package/core/client/components/time/KDate.vue +3 -17
- package/core/client/components/time/KDateTime.vue +1 -1
- package/core/client/components/time/KTime.vue +0 -4
- package/core/client/composables/collection-filter.js +41 -2
- package/core/client/composables/collection.js +3 -3
- package/core/client/composables/index.js +1 -0
- package/core/client/composables/pwa.js +13 -0
- package/core/client/composables/session.js +7 -8
- package/core/client/composables/user.js +36 -0
- package/core/client/directives/index.js +1 -0
- package/core/client/directives/v-drop-file.js +174 -0
- package/core/client/document.js +2 -1
- package/core/client/exporter.js +17 -3
- package/core/client/i18n/core_en.json +34 -7
- package/core/client/i18n/core_fr.json +36 -9
- package/core/client/i18n.js +26 -11
- package/core/client/layout.js +5 -5
- package/core/client/mixins/mixin.base-activity.js +8 -5
- package/core/client/mixins/mixin.base-editor.js +2 -1
- package/core/client/mixins/mixin.base-field.js +3 -2
- package/core/client/mixins/mixin.base-item.js +12 -10
- package/core/client/mixins/mixin.service.js +3 -1
- package/core/client/platform.js +0 -3
- package/core/client/readers/reader.json.js +2 -2
- package/core/client/utils/index.js +2 -0
- package/core/client/utils/utils.collection.js +6 -6
- package/core/client/utils/utils.colors.js +46 -19
- package/core/client/utils/utils.files.js +19 -0
- package/core/client/utils/utils.locale.js +13 -17
- package/core/client/utils/utils.services.js +27 -0
- package/core/client/utils/utils.shapes.js +2 -2
- package/core/client/utils/utils.tags.js +17 -0
- package/core/client/utils/utils.tours.js +31 -0
- package/core/common/permissions.js +3 -0
- package/core/common/schemas/tags.update.json +35 -0
- package/core/common/schemas/users.update-profile.json +1 -1
- package/core/common/utils.js +5 -5
- package/extras/configs/panes.top.js +11 -0
- package/extras/configs/stickies.js +1 -1
- package/extras/configs/widgets.left.js +13 -1
- package/extras/libs/jsts.min.js +8 -0
- package/{test/client/core/account.js → extras/tests/core/account.mjs} +4 -4
- package/extras/tests/core/api.mjs +114 -0
- package/{test/client/core/collection.js → extras/tests/core/collection.mjs} +8 -8
- package/{test/client/core/dialogs.js → extras/tests/core/dialogs.mjs} +1 -1
- package/extras/tests/core/index.mjs +9 -0
- package/{test/client/core/layout.js → extras/tests/core/layout.mjs} +7 -3
- package/{test/client/core/runner.js → extras/tests/core/runner.mjs} +3 -3
- package/{test/client/core/screens.js → extras/tests/core/screens.mjs} +1 -1
- package/{test/client/core/utils.js → extras/tests/core/utils.mjs} +79 -26
- package/extras/tests/index.mjs +4 -0
- package/{test/client/map/api.js → extras/tests/map/api.mjs} +1 -1
- package/{test/client/map/catalog.js → extras/tests/map/catalog.mjs} +18 -18
- package/{test/client/map/controls.js → extras/tests/map/controls.mjs} +3 -3
- package/extras/tests/map/index.mjs +5 -0
- package/{test/client/map/time.js → extras/tests/map/time.mjs} +3 -3
- package/{test/client/map/utils.js → extras/tests/map/utils.mjs} +6 -5
- package/extras/tours/fab.js +36 -0
- package/extras/tours/layout.js +49 -0
- package/extras/tours/pane.left.js +78 -0
- package/extras/tours/pane.right.js +145 -0
- package/extras/tours/pane.top.js +239 -0
- package/map/api/config/layers.cjs +28 -13
- package/map/api/hooks/hooks.query.js +12 -7
- package/map/api/models/catalog.model.mongodb.js +17 -6
- package/map/api/services/catalog/catalog.hooks.js +1 -1
- package/map/api/services/index.js +18 -1
- package/map/client/cesium/utils/utils.cesium.js +25 -65
- package/map/client/cesium/utils/utils.features.js +1 -0
- package/map/client/cesium/utils/utils.geojson.js +1 -0
- package/map/client/cesium/utils/utils.style.js +7 -6
- package/map/client/components/KFeatureEditor.vue +3 -3
- package/map/client/components/KFeaturesChart.vue +4 -4
- package/map/client/components/KFeaturesFilterEditor.vue +19 -13
- package/map/client/components/KFeaturesFilterManager.vue +7 -4
- package/map/client/components/KFeaturesTable.vue +2 -2
- package/map/client/components/KLayerEditor.vue +6 -6
- package/map/client/components/KMeasureTool.vue +2 -1
- package/map/client/components/catalog/KBaseLayersSelector.vue +1 -1
- package/map/client/components/catalog/KCategoryItem.vue +15 -1
- package/map/client/components/catalog/KConnectLayer.vue +2 -2
- package/map/client/components/catalog/KCreateView.vue +3 -2
- package/map/client/components/catalog/KFilteredLayerItem.vue +26 -6
- package/map/client/components/catalog/KImportLayer.vue +6 -3
- package/map/client/components/catalog/KLayerCategories.vue +6 -6
- package/map/client/components/catalog/KLayerItem.vue +12 -2
- package/map/client/components/catalog/KLayersList.vue +180 -0
- package/map/client/components/catalog/KLayersPanel.vue +146 -36
- package/map/client/components/catalog/KLayersSelector.vue +96 -48
- package/map/client/components/catalog/KProjectEditor.vue +0 -9
- package/map/client/components/catalog/KProjectSelector.vue +3 -2
- package/map/client/components/catalog/KProjectsPanel.vue +23 -8
- package/map/client/components/catalog/KViewsPanel.vue +18 -8
- package/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
- package/map/client/components/form/KDirectionField.vue +3 -6
- package/map/client/components/form/KLayerCategoryField.vue +2 -2
- package/map/client/components/form/KOwsServiceField.vue +25 -24
- package/map/client/components/form/KSelectLayersField.vue +4 -4
- package/map/client/components/form/KSelectViewsField.vue +4 -4
- package/map/client/components/legend/KLayerLegend.vue +11 -2
- package/map/client/components/legend/KLegend.vue +44 -51
- package/map/client/components/location/KLocationCardSection.vue +6 -7
- package/map/client/components/location/KLocationMap.vue +23 -13
- package/map/client/components/stickies/KPosition.vue +5 -0
- package/map/client/components/styles/KLayerStyleAction.vue +59 -12
- package/map/client/components/styles/KStyleEditor.vue +71 -8
- package/map/client/components/styles/KStyleEditorSection.vue +82 -33
- package/map/client/components/styles/KStyleManager.vue +119 -59
- package/map/client/components/styles/KStylePreview.vue +9 -25
- package/map/client/components/styles/KStylePreviewItem.vue +22 -1
- package/map/client/components/tools/KSearchTool.vue +1 -1
- package/map/client/components/widget/KElevationProfile.vue +20 -17
- package/map/client/components/widget/KInformationBox.vue +5 -5
- package/map/client/components/widget/KMapillaryViewer.vue +2 -1
- package/map/client/components/widget/KTimeSeries.vue +11 -9
- package/map/client/globe.js +2 -0
- package/map/client/i18n/map_en.json +29 -7
- package/map/client/i18n/map_fr.json +29 -7
- package/map/client/leaflet/GradientPath.js +61 -24
- package/map/client/leaflet/ShapeMarker.js +12 -5
- package/map/client/leaflet/TiledMeshLayer.js +3 -3
- package/map/client/leaflet/utils/utils.geojson.js +66 -8
- package/map/client/leaflet/utils/utils.style.js +14 -15
- package/map/client/mixins/globe/mixin.base-globe.js +181 -34
- package/map/client/mixins/globe/mixin.file-layers.js +3 -0
- package/map/client/mixins/globe/mixin.geojson-layers.js +179 -31
- package/map/client/mixins/globe/mixin.opendap-layers.js +2 -1
- package/map/client/mixins/globe/mixin.style.js +23 -1
- package/map/client/mixins/globe/mixin.tooltip.js +14 -2
- package/map/client/mixins/map/mixin.base-map.js +146 -58
- package/map/client/mixins/map/mixin.edit-layers.js +18 -15
- package/map/client/mixins/map/mixin.geojson-layers.js +181 -106
- package/map/client/mixins/map/mixin.heatmap-layers.js +3 -2
- package/map/client/mixins/map/mixin.map-activity.js +6 -1
- package/map/client/mixins/map/mixin.mapillary-layers.js +2 -1
- package/map/client/mixins/map/mixin.pmtiles-layers.js +3 -3
- package/map/client/mixins/map/mixin.tiled-mesh-layers.js +3 -2
- package/map/client/mixins/map/mixin.tiled-wind-layers.js +3 -2
- package/map/client/mixins/mixin.activity.js +197 -51
- package/map/client/mixins/mixin.context.js +11 -11
- package/map/client/mixins/mixin.feature-service.js +11 -9
- package/map/client/mixins/mixin.weacast.js +5 -3
- package/map/client/readers/reader.geojson.js +3 -1
- package/map/client/utils/utils.capture.js +3 -3
- package/map/client/utils/utils.catalog.js +9 -5
- package/map/client/utils/utils.features.js +120 -54
- package/map/client/utils/utils.js +25 -10
- package/map/client/utils/utils.layers.js +148 -24
- package/map/client/utils/utils.location.js +26 -9
- package/map/client/utils/utils.schema.js +2 -1
- package/map/client/utils/utils.style.js +53 -9
- package/map/common/geotiff-grid-source.js +1 -3
- package/map/common/opendap-utils.js +0 -1
- package/map/common/tms-utils.js +0 -1
- package/map/common/wcs-utils.js +0 -1
- package/map/common/wfs-utils.js +0 -1
- package/map/common/wms-utils.js +7 -1
- package/map/common/wmts-utils.js +0 -1
- package/package.json +12 -12
- package/scripts/init_runner.sh +3 -3
- package/scripts/kash/CHANGELOG.md +27 -0
- package/scripts/kash/kash.sh +556 -237
- package/scripts/kash/scripts/run_tests.sh +44 -5
- package/scripts/setup_workspace.sh +23 -13
- package/test/api/core/config/default.cjs +2 -1
- package/test/api/core/tags.test.js +62 -0
- package/test/api/map/config/default.cjs +2 -1
- package/test/api/map/config/layers.json +9 -0
- package/test/api/map/data/openradiation.json +13811 -0
- package/test/api/map/grid-sources.test.js +1 -3
- package/test/api/map/index.test.js +60 -1
- package/test/api/map/style.test.js +30 -1
- package/test.api.js +1 -1
- package/vite/App.vue +18 -0
- package/vite/AppWithGlobe.vue +84 -0
- package/vite/GlobeActivity.vue +58 -0
- package/vite/MapActivity.vue +63 -0
- package/vite/MapActivityWithGlobe.vue +63 -0
- package/vite/README.md +169 -0
- package/vite/config.js +221 -0
- package/vite/index_with_globe.html +50 -0
- package/vite/index_with_map.html +50 -0
- package/vite/package.json +173 -0
- package/vite/quasar.variables.scss +17 -0
- package/vite/vite.config.js +166 -0
- package/vite/yarn.lock +11641 -0
- package/core/client/components/media/KImageViewer.vue +0 -68
- package/core/client/components/media/KMarkdownViewer.vue +0 -55
- package/core/client/components/media/KMediaBrowser.vue +0 -301
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/core/api/application.js.html +0 -1870
- package/coverage/core/api/authentication.js.html +0 -874
- package/coverage/core/api/db.js.html +0 -793
- package/coverage/core/api/hooks/hooks.authentication.js.html +0 -139
- package/coverage/core/api/hooks/hooks.authorisations.js.html +0 -958
- package/coverage/core/api/hooks/hooks.groups.js.html +0 -229
- package/coverage/core/api/hooks/hooks.logger.js.html +0 -163
- package/coverage/core/api/hooks/hooks.model.js.html +0 -967
- package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
- package/coverage/core/api/hooks/hooks.push.js.html +0 -265
- package/coverage/core/api/hooks/hooks.query.js.html +0 -862
- package/coverage/core/api/hooks/hooks.schemas.js.html +0 -298
- package/coverage/core/api/hooks/hooks.service.js.html +0 -319
- package/coverage/core/api/hooks/hooks.storage.js.html +0 -193
- package/coverage/core/api/hooks/hooks.users.js.html +0 -595
- package/coverage/core/api/hooks/index.html +0 -266
- package/coverage/core/api/hooks/index.js.html +0 -115
- package/coverage/core/api/index.html +0 -176
- package/coverage/core/api/index.js.html +0 -148
- package/coverage/core/api/marshall.js.html +0 -448
- package/coverage/core/api/models/groups.model.mongodb.js.html +0 -109
- package/coverage/core/api/models/index.html +0 -131
- package/coverage/core/api/models/messages.model.mongodb.js.html +0 -121
- package/coverage/core/api/models/organisations.model.mongodb.js.html +0 -94
- package/coverage/core/api/models/tags.model.mongodb.js.html +0 -115
- package/coverage/core/api/models/users.model.mongodb.js.html +0 -115
- package/coverage/core/api/services/account/account.hooks.js.html +0 -208
- package/coverage/core/api/services/account/account.service.js.html +0 -436
- package/coverage/core/api/services/account/index.html +0 -131
- package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +0 -184
- package/coverage/core/api/services/authorisations/authorisations.service.js.html +0 -520
- package/coverage/core/api/services/authorisations/index.html +0 -131
- package/coverage/core/api/services/databases/databases.hooks.js.html +0 -193
- package/coverage/core/api/services/databases/databases.service.js.html +0 -100
- package/coverage/core/api/services/databases/index.html +0 -131
- package/coverage/core/api/services/groups/groups.hooks.js.html +0 -178
- package/coverage/core/api/services/groups/index.html +0 -116
- package/coverage/core/api/services/import-export/import-export.hooks.js.html +0 -184
- package/coverage/core/api/services/import-export/import-export.service.js.html +0 -118
- package/coverage/core/api/services/import-export/index.html +0 -131
- package/coverage/core/api/services/index.html +0 -116
- package/coverage/core/api/services/index.js.html +0 -532
- package/coverage/core/api/services/mailer/index.html +0 -131
- package/coverage/core/api/services/mailer/mailer.hooks.js.html +0 -190
- package/coverage/core/api/services/mailer/mailer.service.js.html +0 -118
- package/coverage/core/api/services/messages/index.html +0 -116
- package/coverage/core/api/services/messages/messages.hooks.js.html +0 -202
- package/coverage/core/api/services/organisations/index.html +0 -131
- package/coverage/core/api/services/organisations/organisations.hooks.js.html +0 -178
- package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
- package/coverage/core/api/services/push/index.html +0 -131
- package/coverage/core/api/services/push/push.hooks.js.html +0 -190
- package/coverage/core/api/services/push/push.service.js.html +0 -121
- package/coverage/core/api/services/storage/index.html +0 -131
- package/coverage/core/api/services/storage/storage.hooks.js.html +0 -190
- package/coverage/core/api/services/storage/storage.service.js.html +0 -172
- package/coverage/core/api/services/tags/index.html +0 -116
- package/coverage/core/api/services/tags/tags.hooks.js.html +0 -178
- package/coverage/core/api/services/users/index.html +0 -131
- package/coverage/core/api/services/users/users.hooks.js.html +0 -310
- package/coverage/core/api/services/users/users.service.js.html +0 -100
- package/coverage/core/api/utils.js.html +0 -118
- package/coverage/core/common/errors.js.html +0 -88
- package/coverage/core/common/index.html +0 -191
- package/coverage/core/common/index.js.html +0 -115
- package/coverage/core/common/permissions.js.html +0 -733
- package/coverage/core/common/schema.js.html +0 -190
- package/coverage/core/common/utils.js.html +0 -226
- package/coverage/core/common/utils.offline.js.html +0 -199
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -476
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/core/api/application.js.html +0 -1870
- package/coverage/lcov-report/core/api/authentication.js.html +0 -874
- package/coverage/lcov-report/core/api/db.js.html +0 -793
- package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +0 -139
- package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +0 -958
- package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +0 -229
- package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +0 -163
- package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +0 -967
- package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
- package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +0 -265
- package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +0 -862
- package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +0 -298
- package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +0 -319
- package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +0 -193
- package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +0 -595
- package/coverage/lcov-report/core/api/hooks/index.html +0 -266
- package/coverage/lcov-report/core/api/hooks/index.js.html +0 -115
- package/coverage/lcov-report/core/api/index.html +0 -176
- package/coverage/lcov-report/core/api/index.js.html +0 -148
- package/coverage/lcov-report/core/api/marshall.js.html +0 -448
- package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +0 -109
- package/coverage/lcov-report/core/api/models/index.html +0 -131
- package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +0 -121
- package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +0 -94
- package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +0 -115
- package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +0 -115
- package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +0 -208
- package/coverage/lcov-report/core/api/services/account/account.service.js.html +0 -436
- package/coverage/lcov-report/core/api/services/account/index.html +0 -131
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +0 -184
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +0 -520
- package/coverage/lcov-report/core/api/services/authorisations/index.html +0 -131
- package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +0 -193
- package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +0 -100
- package/coverage/lcov-report/core/api/services/databases/index.html +0 -131
- package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +0 -178
- package/coverage/lcov-report/core/api/services/groups/index.html +0 -116
- package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +0 -184
- package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +0 -118
- package/coverage/lcov-report/core/api/services/import-export/index.html +0 -131
- package/coverage/lcov-report/core/api/services/index.html +0 -116
- package/coverage/lcov-report/core/api/services/index.js.html +0 -532
- package/coverage/lcov-report/core/api/services/mailer/index.html +0 -131
- package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +0 -190
- package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +0 -118
- package/coverage/lcov-report/core/api/services/messages/index.html +0 -116
- package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +0 -202
- package/coverage/lcov-report/core/api/services/organisations/index.html +0 -131
- package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +0 -178
- package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
- package/coverage/lcov-report/core/api/services/push/index.html +0 -131
- package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +0 -190
- package/coverage/lcov-report/core/api/services/push/push.service.js.html +0 -121
- package/coverage/lcov-report/core/api/services/storage/index.html +0 -131
- package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +0 -190
- package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +0 -172
- package/coverage/lcov-report/core/api/services/tags/index.html +0 -116
- package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +0 -178
- package/coverage/lcov-report/core/api/services/users/index.html +0 -131
- package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +0 -310
- package/coverage/lcov-report/core/api/services/users/users.service.js.html +0 -100
- package/coverage/lcov-report/core/api/utils.js.html +0 -118
- package/coverage/lcov-report/core/common/errors.js.html +0 -88
- package/coverage/lcov-report/core/common/index.html +0 -191
- package/coverage/lcov-report/core/common/index.js.html +0 -115
- package/coverage/lcov-report/core/common/permissions.js.html +0 -733
- package/coverage/lcov-report/core/common/schema.js.html +0 -190
- package/coverage/lcov-report/core/common/utils.js.html +0 -226
- package/coverage/lcov-report/core/common/utils.offline.js.html +0 -199
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -476
- package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +0 -553
- package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +0 -397
- package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +0 -1294
- package/coverage/lcov-report/map/api/hooks/index.html +0 -161
- package/coverage/lcov-report/map/api/hooks/index.js.html +0 -94
- package/coverage/lcov-report/map/api/index.html +0 -131
- package/coverage/lcov-report/map/api/index.js.html +0 -139
- package/coverage/lcov-report/map/api/marshall.js.html +0 -178
- package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +0 -106
- package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +0 -169
- package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +0 -196
- package/coverage/lcov-report/map/api/models/index.html +0 -176
- package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +0 -109
- package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +0 -112
- package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +0 -274
- package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +0 -610
- package/coverage/lcov-report/map/api/services/alerts/index.html +0 -131
- package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +0 -328
- package/coverage/lcov-report/map/api/services/catalog/index.html +0 -116
- package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +0 -1510
- package/coverage/lcov-report/map/api/services/daptiles/index.html +0 -116
- package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +0 -310
- package/coverage/lcov-report/map/api/services/features/features.service.js.html +0 -544
- package/coverage/lcov-report/map/api/services/features/index.html +0 -131
- package/coverage/lcov-report/map/api/services/index.html +0 -116
- package/coverage/lcov-report/map/api/services/index.js.html +0 -1054
- package/coverage/lcov-report/map/api/services/projects/index.html +0 -116
- package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +0 -439
- package/coverage/lcov-report/map/api/services/styles/index.html +0 -116
- package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +0 -196
- package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +0 -466
- package/coverage/lcov-report/map/common/errors.js.html +0 -94
- package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +0 -544
- package/coverage/lcov-report/map/common/grid.js.html +0 -1612
- package/coverage/lcov-report/map/common/index.html +0 -371
- package/coverage/lcov-report/map/common/index.js.html +0 -172
- package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +0 -556
- package/coverage/lcov-report/map/common/moment-utils.js.html +0 -157
- package/coverage/lcov-report/map/common/opendap-grid-source.js.html +0 -868
- package/coverage/lcov-report/map/common/opendap-utils.js.html +0 -826
- package/coverage/lcov-report/map/common/permissions.js.html +0 -130
- package/coverage/lcov-report/map/common/time-based-grid-source.js.html +0 -418
- package/coverage/lcov-report/map/common/tms-utils.js.html +0 -274
- package/coverage/lcov-report/map/common/wcs-grid-source.js.html +0 -364
- package/coverage/lcov-report/map/common/wcs-utils.js.html +0 -586
- package/coverage/lcov-report/map/common/weacast-grid-source.js.html +0 -1033
- package/coverage/lcov-report/map/common/wfs-utils.js.html +0 -574
- package/coverage/lcov-report/map/common/wms-utils.js.html +0 -451
- package/coverage/lcov-report/map/common/wmts-utils.js.html +0 -547
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -11520
- package/coverage/map/api/hooks/hooks.catalog.js.html +0 -553
- package/coverage/map/api/hooks/hooks.features.js.html +0 -397
- package/coverage/map/api/hooks/hooks.query.js.html +0 -1294
- package/coverage/map/api/hooks/index.html +0 -161
- package/coverage/map/api/hooks/index.js.html +0 -94
- package/coverage/map/api/index.html +0 -131
- package/coverage/map/api/index.js.html +0 -139
- package/coverage/map/api/marshall.js.html +0 -178
- package/coverage/map/api/models/alerts.model.mongodb.js.html +0 -106
- package/coverage/map/api/models/catalog.model.mongodb.js.html +0 -169
- package/coverage/map/api/models/features.model.mongodb.js.html +0 -196
- package/coverage/map/api/models/index.html +0 -176
- package/coverage/map/api/models/projects.model.mongodb.js.html +0 -109
- package/coverage/map/api/models/styles.model.mongodb.js.html +0 -112
- package/coverage/map/api/services/alerts/alerts.hooks.js.html +0 -274
- package/coverage/map/api/services/alerts/alerts.service.js.html +0 -610
- package/coverage/map/api/services/alerts/index.html +0 -131
- package/coverage/map/api/services/catalog/catalog.hooks.js.html +0 -328
- package/coverage/map/api/services/catalog/index.html +0 -116
- package/coverage/map/api/services/daptiles/daptiles.service.js.html +0 -1510
- package/coverage/map/api/services/daptiles/index.html +0 -116
- package/coverage/map/api/services/features/features.hooks.js.html +0 -310
- package/coverage/map/api/services/features/features.service.js.html +0 -544
- package/coverage/map/api/services/features/index.html +0 -131
- package/coverage/map/api/services/index.html +0 -116
- package/coverage/map/api/services/index.js.html +0 -1054
- package/coverage/map/api/services/projects/index.html +0 -116
- package/coverage/map/api/services/projects/projects.hooks.js.html +0 -439
- package/coverage/map/api/services/styles/index.html +0 -116
- package/coverage/map/api/services/styles/styles.hooks.js.html +0 -196
- package/coverage/map/common/dynamic-grid-source.js.html +0 -466
- package/coverage/map/common/errors.js.html +0 -94
- package/coverage/map/common/geotiff-grid-source.js.html +0 -544
- package/coverage/map/common/grid.js.html +0 -1612
- package/coverage/map/common/index.html +0 -371
- package/coverage/map/common/index.js.html +0 -172
- package/coverage/map/common/meteo-model-grid-source.js.html +0 -556
- package/coverage/map/common/moment-utils.js.html +0 -157
- package/coverage/map/common/opendap-grid-source.js.html +0 -868
- package/coverage/map/common/opendap-utils.js.html +0 -826
- package/coverage/map/common/permissions.js.html +0 -130
- package/coverage/map/common/time-based-grid-source.js.html +0 -418
- package/coverage/map/common/tms-utils.js.html +0 -274
- package/coverage/map/common/wcs-grid-source.js.html +0 -364
- package/coverage/map/common/wcs-utils.js.html +0 -586
- package/coverage/map/common/weacast-grid-source.js.html +0 -1033
- package/coverage/map/common/wfs-utils.js.html +0 -574
- package/coverage/map/common/wms-utils.js.html +0 -451
- package/coverage/map/common/wmts-utils.js.html +0 -547
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/tmp/coverage-151198-1753351220086-0.json +0 -1
- package/coverage/tmp/coverage-151210-1753351220070-0.json +0 -1
- package/coverage/tmp/coverage-151221-1753351129816-0.json +0 -1
- package/coverage/tmp/coverage-151233-1753351129803-0.json +0 -1
- package/coverage/tmp/coverage-151240-1753351129770-0.json +0 -1
- package/coverage/tmp/coverage-151307-1753351220058-0.json +0 -1
- package/coverage/tmp/coverage-151319-1753351220044-0.json +0 -1
- package/coverage/tmp/coverage-151326-1753351220010-0.json +0 -1
- package/extras/tours/core/account-profile.js +0 -32
- package/extras/tours/core/account.js +0 -143
- package/extras/tours/core/add-member.js +0 -75
- package/extras/tours/core/add-tag.js +0 -13
- package/extras/tours/core/create-group.js +0 -19
- package/extras/tours/core/create-organisation.js +0 -19
- package/extras/tours/core/create-tag.js +0 -26
- package/extras/tours/core/edit-member-role.js +0 -13
- package/extras/tours/core/groups.js +0 -65
- package/extras/tours/core/join-group.js +0 -13
- package/extras/tours/core/login.js +0 -41
- package/extras/tours/core/members.js +0 -108
- package/extras/tours/core/register.js +0 -61
- package/extras/tours/core/send-reset-password.js +0 -14
- package/extras/tours/core/tags.js +0 -65
- package/extras/tours/map/catalog-panel.js +0 -112
- package/extras/tours/map/fab.js +0 -26
- package/extras/tours/map/navigation-bar.js +0 -187
- package/extras/tours/map/side-nav.js +0 -36
- package/test/api/core/test-log-2025-02-05.log +0 -23
- package/test/api/core/test-log-2025-05-21.log +0 -15
- package/test/api/core/test-log-2025-06-25.log +0 -9
- package/test/api/core/test-log-2025-07-24.log +0 -44
- package/test/api/map/test-log-2025-05-27.log +0 -13
- package/test/api/map/test-log-2025-06-23.log +0 -7
- package/test/api/map/test-log-2025-07-24.log +0 -11
- package/test/client/core/api.js +0 -361
- package/test/client/core/index.js +0 -9
- package/test/client/index.js +0 -4
- package/test/client/map/index.js +0 -5
- package/test.client.js +0 -1
- /package/{test/client/core/time.js → extras/tests/core/time.mjs} +0 -0
- /package/extras/tours/{map/add-layer.js → add-layer.js} +0 -0
- /package/extras/tours/{map/catalog-categories.js → catalog-categories.js} +0 -0
- /package/extras/tours/{map/connect-layer.js → connect-layer.js} +0 -0
- /package/extras/tours/{map/create-layer.js → create-layer.js} +0 -0
- /package/extras/tours/{map/create-view.js → create-view.js} +0 -0
- /package/extras/tours/{map/import-layer.js → import-layer.js} +0 -0
- /package/extras/tours/{map/timeline.js → pane.bottom.js} +0 -0
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
<script>
|
|
19
19
|
import { KModal, KForm } from '../../../../core/client/components'
|
|
20
20
|
import { baseModal } from '../../../../core/client/mixins'
|
|
21
|
+
import { api } from '../../../../core/client/api.js'
|
|
21
22
|
import { useProject } from '../../composables'
|
|
22
23
|
|
|
23
24
|
export default {
|
|
@@ -97,9 +98,9 @@ export default {
|
|
|
97
98
|
this.creating = true
|
|
98
99
|
const createdView = await this.kActivity.saveContext(view)
|
|
99
100
|
// Add view to current project ? Check if not coming from another planet first
|
|
100
|
-
if (this.project && (this.project.getPlanetApi() ===
|
|
101
|
+
if (this.project && (this.project.getPlanetApi() === api)) {
|
|
101
102
|
this.project.views.push({ _id: createdView._id })
|
|
102
|
-
await
|
|
103
|
+
await api.getService('projects').patch(this.project._id, {
|
|
103
104
|
views: this.project.views
|
|
104
105
|
})
|
|
105
106
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<KLayerItem v-if="!layer
|
|
2
|
+
<KLayerItem v-if="!layer?.filters && layer?.isVisible !== undefined"
|
|
3
3
|
v-bind="$props"
|
|
4
4
|
:layer="layer"
|
|
5
5
|
@toggled="onToggled"
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<slot name="status" />
|
|
9
9
|
</template>
|
|
10
10
|
</KLayerItem>
|
|
11
|
-
<q-tree v-else
|
|
11
|
+
<q-tree v-else-if="layer?.label"
|
|
12
12
|
:nodes="[layer]"
|
|
13
13
|
node-key="label"
|
|
14
14
|
label-key="label"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
>
|
|
18
18
|
<template v-slot:default-header="prop">
|
|
19
19
|
<!-- Layer rendering -->
|
|
20
|
-
<KLayerItem v-if="prop.node.name"
|
|
20
|
+
<KLayerItem v-if="prop.node.name && layer?.isVisible !== undefined"
|
|
21
21
|
v-bind="$props"
|
|
22
22
|
:layer="layer"
|
|
23
23
|
@toggled="onToggled"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
</template>
|
|
28
28
|
</KLayerItem>
|
|
29
29
|
<!-- Filter rendering -->
|
|
30
|
-
<div v-else class="row items-center q-pl-md q-pr-sm no-wrap">
|
|
30
|
+
<div v-else class="row col items-center q-pl-md q-pr-sm no-wrap">
|
|
31
31
|
<!-- Filter toggle -->
|
|
32
32
|
<q-toggle
|
|
33
33
|
:ref="onToggleRefCreated(prop.node)"
|
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
/>
|
|
40
40
|
<div :class="{
|
|
41
41
|
'text-primary': layer.isVisible,
|
|
42
|
-
'text-grey-6': layer.isDisabled || !layer.isVisible || !prop.node.isActive
|
|
42
|
+
'text-grey-6': layer.isDisabled || !layer.isVisible || !prop.node.isActive,
|
|
43
|
+
'col': true
|
|
43
44
|
}"
|
|
44
45
|
>
|
|
45
46
|
{{ $tie(prop.node.label) }}
|
|
@@ -51,6 +52,13 @@
|
|
|
51
52
|
{{ prop.node.tooltip || prop.node.description }}
|
|
52
53
|
</q-tooltip>
|
|
53
54
|
</div>
|
|
55
|
+
<!-- Filter actions -->
|
|
56
|
+
<KPanel
|
|
57
|
+
:id="`${layer.name}-${prop.node.label}-filter-actions`"
|
|
58
|
+
:content="filterActions"
|
|
59
|
+
:context="{ layer, filter: prop.node }"
|
|
60
|
+
:filter="{ id: { $nin: ['toggle', 'toggle-filter'] } }"
|
|
61
|
+
/>
|
|
54
62
|
</div>
|
|
55
63
|
</template>
|
|
56
64
|
</q-tree>
|
|
@@ -58,8 +66,9 @@
|
|
|
58
66
|
|
|
59
67
|
<script setup>
|
|
60
68
|
import _ from 'lodash'
|
|
61
|
-
import { ref } from 'vue'
|
|
69
|
+
import { ref, computed } from 'vue'
|
|
62
70
|
import KLayerItem from './KLayerItem.vue'
|
|
71
|
+
import KPanel from '../../../../core/client/components/KPanel.vue'
|
|
63
72
|
|
|
64
73
|
// Props
|
|
65
74
|
const props = defineProps({
|
|
@@ -75,6 +84,17 @@ const emit = defineEmits(['toggled', 'filter-toggled'])
|
|
|
75
84
|
// Datas
|
|
76
85
|
const filters = ref([])
|
|
77
86
|
|
|
87
|
+
// Computed
|
|
88
|
+
const filterActions = computed(() => {
|
|
89
|
+
const filterActions = _.cloneDeep(props.layer.actions)
|
|
90
|
+
_.forEach(filterActions, (action) => {
|
|
91
|
+
action.content = _.filter(action.content, (item) => {
|
|
92
|
+
return _.get(item, 'isFilterAction')
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
return filterActions
|
|
96
|
+
})
|
|
97
|
+
|
|
78
98
|
// Functions
|
|
79
99
|
function onToggleRefCreated (node) {
|
|
80
100
|
if (node) {
|
|
@@ -27,7 +27,7 @@ import _ from 'lodash'
|
|
|
27
27
|
import path from 'path-browserify'
|
|
28
28
|
import { ref, computed } from 'vue'
|
|
29
29
|
import { generatePropertiesSchema } from '../../utils'
|
|
30
|
-
import { i18n } from '../../../../core/client'
|
|
30
|
+
import { Events, i18n } from '../../../../core/client'
|
|
31
31
|
import { KPanel } from '../../../../core/client/components'
|
|
32
32
|
import { useCurrentActivity } from '../../composables'
|
|
33
33
|
import KForm from '../../../../core/client/components/form/KForm.vue'
|
|
@@ -56,7 +56,7 @@ const fileFormSchema = computed(() => {
|
|
|
56
56
|
component: 'form/KFileField',
|
|
57
57
|
label: 'KImportLayer.FILE_FIELD_LABEL',
|
|
58
58
|
mimeTypes: '.json,.geojson,.gpx,.kml',
|
|
59
|
-
|
|
59
|
+
maxFileSize: 1024 * 1024 * 1024
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
},
|
|
@@ -147,7 +147,10 @@ async function onImport () {
|
|
|
147
147
|
const fileResult = fileForm.value.validate()
|
|
148
148
|
const propertiesResult = propertiesForm.value.validate()
|
|
149
149
|
if (!fileResult.isValid || !propertiesResult.isValid) return
|
|
150
|
-
|
|
150
|
+
if (CurrentActivity.value.hasLayer(propertiesResult.values.name)) {
|
|
151
|
+
Events.emit('error', { message: i18n.t('KImportLayer.LAYER_ALREADY_EXISTS', { layer: propertiesResult.values.name }) })
|
|
152
|
+
}
|
|
153
|
+
importing.value = true
|
|
151
154
|
await CurrentActivity.value.addGeoJsonLayer({
|
|
152
155
|
name: propertiesResult.values.name,
|
|
153
156
|
description: propertiesResult.values.description,
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
|
|
41
41
|
<script>
|
|
42
42
|
import _ from 'lodash'
|
|
43
|
-
import { mixins as kCoreMixins } from '../../../../core/client'
|
|
43
|
+
import { api, Store, mixins as kCoreMixins } from '../../../../core/client'
|
|
44
44
|
import { KModal, KGrid, KAction, KPanel, KForm } from '../../../../core/client/components'
|
|
45
45
|
|
|
46
46
|
export default {
|
|
@@ -195,8 +195,8 @@ export default {
|
|
|
195
195
|
},
|
|
196
196
|
data () {
|
|
197
197
|
return {
|
|
198
|
-
filter:
|
|
199
|
-
sorter:
|
|
198
|
+
filter: Store.get('filter'),
|
|
199
|
+
sorter: Store.get('sorter'),
|
|
200
200
|
mode: 'list',
|
|
201
201
|
count: undefined,
|
|
202
202
|
savingCategory: false,
|
|
@@ -226,7 +226,7 @@ export default {
|
|
|
226
226
|
category.type = 'Category'
|
|
227
227
|
this.savingCategory = true
|
|
228
228
|
try {
|
|
229
|
-
await
|
|
229
|
+
await api.getService('catalog').create(category)
|
|
230
230
|
this.savingCategory = false
|
|
231
231
|
} catch (error) {
|
|
232
232
|
this.savingCategory = false
|
|
@@ -241,7 +241,7 @@ export default {
|
|
|
241
241
|
if (result.isValid) {
|
|
242
242
|
this.savingCategory = true
|
|
243
243
|
try {
|
|
244
|
-
await
|
|
244
|
+
await api.getService('catalog').patch(this.editedCategory._id, result.values)
|
|
245
245
|
this.savingCategory = false
|
|
246
246
|
} catch (error) {
|
|
247
247
|
this.savingCategory = false
|
|
@@ -281,7 +281,7 @@ export default {
|
|
|
281
281
|
this.editedCategory = category
|
|
282
282
|
},
|
|
283
283
|
removeCategory (category) {
|
|
284
|
-
|
|
284
|
+
api.getService('catalog').remove(category._id)
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
287
|
}
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
<q-space />
|
|
31
31
|
<slot name="status">
|
|
32
32
|
<q-icon name="las la-exclamation-circle" size="sm" color="warning" v-if="layer.isDisabled">
|
|
33
|
-
<q-tooltip>{{ $t('
|
|
33
|
+
<q-tooltip>{{ $t('KLayersList.LAYER_DISABLED') }}</q-tooltip>
|
|
34
34
|
</q-icon>
|
|
35
35
|
</slot>
|
|
36
36
|
<!-- Layer actions -->
|
|
37
37
|
<KPanel
|
|
38
38
|
:id="`${layer.name}-actions`"
|
|
39
|
-
:content="
|
|
39
|
+
:content="layerActions"
|
|
40
40
|
:context="layer"
|
|
41
41
|
:filter="{ id: { $nin: ['toggle', 'toggle-filter'] } }"
|
|
42
42
|
/>
|
|
@@ -74,6 +74,16 @@ const label = computed(() => {
|
|
|
74
74
|
const label = _.get(props.layer, 'label')
|
|
75
75
|
return Document.sanitizeHtml(label || _.get(props.layer, 'name'))
|
|
76
76
|
})
|
|
77
|
+
const layerActions = computed(() => {
|
|
78
|
+
const layerActions = _.cloneDeep(_.get(props.layer, 'actions', []))
|
|
79
|
+
_.forEach(layerActions, (action) => {
|
|
80
|
+
if (!_.has(action, 'content')) return
|
|
81
|
+
action.content = _.filter(action.content, (item) => {
|
|
82
|
+
return !_.get(item, 'isFilterAction')
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
return layerActions
|
|
86
|
+
})
|
|
77
87
|
|
|
78
88
|
// Functions
|
|
79
89
|
function onToggled () {
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<slot name="header" />
|
|
4
|
+
|
|
5
|
+
<div v-if="layers && layers.length > 0">
|
|
6
|
+
<template v-for="(layer, index) in layers">
|
|
7
|
+
<div
|
|
8
|
+
v-if="layer"
|
|
9
|
+
:key="index"
|
|
10
|
+
class="draggable-layer"
|
|
11
|
+
:draggable="isDraggable()"
|
|
12
|
+
@dragstart="onDragStart($event, index, layer)"
|
|
13
|
+
@drop="onDrop($event, index)"
|
|
14
|
+
@dragover.prevent
|
|
15
|
+
@dragenter.prevent
|
|
16
|
+
>
|
|
17
|
+
<q-icon v-if="isDraggable()" name="las la-grip-lines" color="primary" text-color="black" class="drag-handle" />
|
|
18
|
+
<component
|
|
19
|
+
:is="layerRenderer.component"
|
|
20
|
+
v-bind="layerRenderer.options"
|
|
21
|
+
:layer="layer"
|
|
22
|
+
@toggled="onLayerToggled"
|
|
23
|
+
@filter-toggled="onLayerFilterToggled"
|
|
24
|
+
style="flex-grow: 1;"
|
|
25
|
+
/>
|
|
26
|
+
</div>
|
|
27
|
+
</template>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div v-else-if="!options.hideIfEmpty" class="row justify-center q-pa-sm">
|
|
31
|
+
<KStamp
|
|
32
|
+
icon="las la-exclamation-circle"
|
|
33
|
+
icon-size="sm"
|
|
34
|
+
:text="$t('KLayersList.NO_LAYER_AVAILABLE')"
|
|
35
|
+
direction="horizontal"
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<slot name="footer" />
|
|
40
|
+
</div>
|
|
41
|
+
</template>
|
|
42
|
+
|
|
43
|
+
<script setup>
|
|
44
|
+
import _ from 'lodash'
|
|
45
|
+
import { computed, ref } from 'vue'
|
|
46
|
+
import { utils } from '../../../../core/client'
|
|
47
|
+
import KStamp from '../../../../core/client/components/KStamp.vue'
|
|
48
|
+
import { useCurrentActivity } from '../../composables'
|
|
49
|
+
import { getCategories } from '../../utils.map'
|
|
50
|
+
|
|
51
|
+
// Props
|
|
52
|
+
const props = defineProps({
|
|
53
|
+
category: {
|
|
54
|
+
type: Object,
|
|
55
|
+
default: () => {}
|
|
56
|
+
},
|
|
57
|
+
layers: {
|
|
58
|
+
type: Array,
|
|
59
|
+
default: () => []
|
|
60
|
+
},
|
|
61
|
+
layersDraggable: {
|
|
62
|
+
type: [Boolean, Function],
|
|
63
|
+
default: () => false
|
|
64
|
+
},
|
|
65
|
+
options: {
|
|
66
|
+
type: Object,
|
|
67
|
+
default: () => {}
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
// Emits
|
|
72
|
+
const emit = defineEmits(['orphan-layer-updated'])
|
|
73
|
+
|
|
74
|
+
// Data
|
|
75
|
+
const draggedIndex = ref(null)
|
|
76
|
+
const { CurrentActivity } = useCurrentActivity()
|
|
77
|
+
const { updateCategoriesOrder, updateLayersOrder } = CurrentActivity.value
|
|
78
|
+
|
|
79
|
+
// Computed
|
|
80
|
+
const layerRenderer = computed(() => ({
|
|
81
|
+
component: utils.loadComponent(_.get(props.options, 'renderer', 'catalog/KFilteredLayerItem')),
|
|
82
|
+
options: _.get(props.options, 'renderer.options', {})
|
|
83
|
+
}))
|
|
84
|
+
|
|
85
|
+
// Drag & Drop handlers
|
|
86
|
+
function onDragStart (event, index, layer) {
|
|
87
|
+
draggedIndex.value = index
|
|
88
|
+
event.dataTransfer.dropEffect = 'move'
|
|
89
|
+
event.dataTransfer.effectAllowed = 'move'
|
|
90
|
+
event.dataTransfer.setData('draggedIndex', draggedIndex.value)
|
|
91
|
+
event.dataTransfer.setData('layerName', layer?.name)
|
|
92
|
+
event.dataTransfer.setData('categoryID', props.category?._id)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function onDrop (event, targetIndex) {
|
|
96
|
+
const layerName = event.dataTransfer.getData('layerName')
|
|
97
|
+
const layer = props.layers.find(layer => layer.name === layerName)
|
|
98
|
+
const sourceCategoryId = event.dataTransfer.getData('categoryID')
|
|
99
|
+
if (!props.category?._id) { // source and target are orphan layers
|
|
100
|
+
// WARNING: Need to use a string here as dataTransfer serialize to strings
|
|
101
|
+
if (sourceCategoryId !== 'undefined') return
|
|
102
|
+
emit('orphan-layer-updated', targetIndex, draggedIndex.value)
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
if (layerName && layerName.length > 0) { // source is layer
|
|
106
|
+
const isLayerFromCurrentCategory = props.category._id === sourceCategoryId
|
|
107
|
+
// Avoid mutating read-only prop
|
|
108
|
+
const categoryLayers = _.clone(props.category.layers)
|
|
109
|
+
if (isLayerFromCurrentCategory) { // reorder layers in category
|
|
110
|
+
const removedLayers = categoryLayers.splice(draggedIndex.value, 1)
|
|
111
|
+
if (removedLayers.length > 0) categoryLayers.splice(targetIndex, 0, removedLayers[0])
|
|
112
|
+
await updateLayersOrder(props.category._id, { layers: categoryLayers }, layer)
|
|
113
|
+
} else { // layer isn't from current category: move layer to current category
|
|
114
|
+
// WARNING: Need to use a string here as dataTransfer serialize to strings
|
|
115
|
+
if (sourceCategoryId === 'undefined') { // source is orphan layer
|
|
116
|
+
emit('orphan-layer-updated', -1, draggedIndex.value)
|
|
117
|
+
categoryLayers.splice(targetIndex, 0, layerName)
|
|
118
|
+
await updateLayersOrder(props.category._id, { layers: categoryLayers }, layer)
|
|
119
|
+
} else { // source isn't orphan layer
|
|
120
|
+
const sourceCategory = await getCategories({ query: { _id: sourceCategoryId } })
|
|
121
|
+
const sourceCategoryLayers = sourceCategory[0].layers
|
|
122
|
+
const removedLayers = sourceCategoryLayers.splice(draggedIndex.value, 1)
|
|
123
|
+
if (removedLayers.length > 0) categoryLayers.splice(targetIndex, 0, removedLayers[0])
|
|
124
|
+
await updateLayersOrder(props.category._id, { layers: categoryLayers }, layer)
|
|
125
|
+
await updateLayersOrder(sourceCategoryId, { layers: sourceCategoryLayers }, layer)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
} else { // drag source is category: reorder categories with target layer's category
|
|
129
|
+
const sourceCategoryId = event.dataTransfer.getData('categoryID')
|
|
130
|
+
const targetCategoryId = props.category._id
|
|
131
|
+
await updateCategoriesOrder(sourceCategoryId, targetCategoryId)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Layer toggle handling
|
|
136
|
+
function toggleLayer (layer) {
|
|
137
|
+
const toggleAction = _.find(layer.actions, { id: 'toggle' })
|
|
138
|
+
if (toggleAction) toggleAction.handler()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function onLayerToggled (layer) {
|
|
142
|
+
if (layer.isDisabled) return
|
|
143
|
+
if (props.options.exclusive) {
|
|
144
|
+
// Due to v-model the visible flag has already been changed on the layer
|
|
145
|
+
// Simply reset others layers before activating the new one to avoid any problem
|
|
146
|
+
const visibleLayers = _.filter(props.layers, { isVisible: true })
|
|
147
|
+
for (const visibleLayer of visibleLayers) {
|
|
148
|
+
if (visibleLayer !== layer) await toggleLayer(visibleLayer)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
await toggleLayer(layer)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function toggleLayerFilter (layer, filter) {
|
|
155
|
+
const toggleFilterAction = _.find(layer.actions, { id: 'toggle-filter' })
|
|
156
|
+
if (toggleFilterAction) toggleFilterAction.handler(filter)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function onLayerFilterToggled (layer, filter) {
|
|
160
|
+
if (layer.isDisabled) return
|
|
161
|
+
toggleLayerFilter(layer, filter)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function isDraggable () {
|
|
165
|
+
return (typeof props.layersDraggable === 'function' ? props.layersDraggable(props.category) : props.layersDraggable)
|
|
166
|
+
}
|
|
167
|
+
</script>
|
|
168
|
+
|
|
169
|
+
<style scoped>
|
|
170
|
+
.draggable-layer {
|
|
171
|
+
display: flex;
|
|
172
|
+
align-items: center;
|
|
173
|
+
}
|
|
174
|
+
.drag-handle {
|
|
175
|
+
cursor: move;
|
|
176
|
+
margin-left: 16px;
|
|
177
|
+
font-size: 18px;
|
|
178
|
+
user-select: none;
|
|
179
|
+
}
|
|
180
|
+
</style>
|
|
@@ -24,20 +24,45 @@
|
|
|
24
24
|
/>
|
|
25
25
|
</slot>
|
|
26
26
|
<!-- Orphan layers -->
|
|
27
|
-
<
|
|
28
|
-
:layers="
|
|
27
|
+
<KLayersList
|
|
28
|
+
:layers="filteredOrphanLayers"
|
|
29
|
+
:layersDraggable="layersDraggable"
|
|
29
30
|
:options="orphanLayersOptions"
|
|
31
|
+
@orphanLayerUpdated="onOrphanLayerUpdated"
|
|
30
32
|
/>
|
|
31
33
|
<!-- Categorized layers -->
|
|
32
|
-
<template v-for="category in filteredCategories">
|
|
34
|
+
<template v-for="(category, index) in filteredCategories">
|
|
33
35
|
<KCategoryItem
|
|
34
36
|
v-if="isCategoryVisible(category)"
|
|
35
37
|
:key="getCategoryId(category)"
|
|
36
38
|
:id="getCategoryId(category)"
|
|
37
39
|
:category="category"
|
|
38
40
|
:layers="layersByCategory[category.name]"
|
|
41
|
+
:layersDraggable="layersDraggable"
|
|
39
42
|
:forecastModels="forecastModels"
|
|
40
|
-
|
|
43
|
+
>
|
|
44
|
+
<template v-slot:header>
|
|
45
|
+
<div
|
|
46
|
+
:key="index"
|
|
47
|
+
class="draggable-category"
|
|
48
|
+
:draggable="isDraggable(category)"
|
|
49
|
+
@dragstart="onDragStart($event, index, category)"
|
|
50
|
+
@drop="onDrop($event, index)"
|
|
51
|
+
@dragover.prevent
|
|
52
|
+
@dragenter.prevent
|
|
53
|
+
>
|
|
54
|
+
<q-item-section v-if="isDraggable(category)" avatar class="drag-handle">
|
|
55
|
+
<q-icon name="las la-bars" color="primary" text-color="black" size="20px" />
|
|
56
|
+
</q-item-section>
|
|
57
|
+
|
|
58
|
+
<q-icon v-else :name="getCategoryIcon(category)" color="primary" text-color="black" size="20px" style="margin-right: 16px;" />
|
|
59
|
+
|
|
60
|
+
<q-item-section>
|
|
61
|
+
{{ i18n.tie(category.name) }}
|
|
62
|
+
</q-item-section>
|
|
63
|
+
</div>
|
|
64
|
+
</template>
|
|
65
|
+
</KCategoryItem>
|
|
41
66
|
</template>
|
|
42
67
|
<!-- Custom content -->
|
|
43
68
|
<slot name="after-content">
|
|
@@ -73,31 +98,36 @@ export default {
|
|
|
73
98
|
<script setup>
|
|
74
99
|
import _ from 'lodash'
|
|
75
100
|
import sift from 'sift'
|
|
76
|
-
import { ref, watchEffect
|
|
77
|
-
import { utils as coreUtils } from '../../../../core/client'
|
|
78
|
-
import {
|
|
79
|
-
import {
|
|
80
|
-
import KLayersSelector from './KLayersSelector.vue'
|
|
101
|
+
import { ref, watchEffect } from 'vue'
|
|
102
|
+
import { utils as coreUtils, i18n } from '../../../../core/client'
|
|
103
|
+
import { useCurrentActivity, useProject } from '../../composables'
|
|
104
|
+
import { getLayersByCategory } from '../../utils'
|
|
81
105
|
import KCategoryItem from './KCategoryItem.vue'
|
|
106
|
+
import KLayersList from './KLayersList.vue'
|
|
82
107
|
|
|
83
108
|
// Props
|
|
84
109
|
const props = defineProps({
|
|
85
|
-
layers: {
|
|
86
|
-
type: [Object, Array],
|
|
87
|
-
default: () => []
|
|
88
|
-
},
|
|
89
110
|
layersFilter: {
|
|
90
111
|
type: [Object, Function],
|
|
91
112
|
default: () => {}
|
|
92
113
|
},
|
|
93
|
-
|
|
94
|
-
type:
|
|
95
|
-
default
|
|
114
|
+
orphanLayersFilter: {
|
|
115
|
+
type: [Object, Function],
|
|
116
|
+
// By default orphan layers are user/activity layers
|
|
117
|
+
default: () => ({ scope: { $in: ['user', 'activity'] } })
|
|
96
118
|
},
|
|
97
119
|
layerCategoriesFilter: {
|
|
98
120
|
type: [Object, Function],
|
|
99
121
|
default: () => {}
|
|
100
122
|
},
|
|
123
|
+
layersDraggable: {
|
|
124
|
+
type: [Boolean, Function],
|
|
125
|
+
default: false
|
|
126
|
+
},
|
|
127
|
+
categoriesDraggable: {
|
|
128
|
+
type: [Boolean, Function],
|
|
129
|
+
default: () => false
|
|
130
|
+
},
|
|
101
131
|
forecastModels: {
|
|
102
132
|
type: Array,
|
|
103
133
|
default: () => []
|
|
@@ -138,10 +168,13 @@ const props = defineProps({
|
|
|
138
168
|
|
|
139
169
|
// Data
|
|
140
170
|
const { hasProject } = useProject()
|
|
171
|
+
const { CurrentActivity } = useCurrentActivity()
|
|
172
|
+
const { forecastModels, updateCategoriesOrder, updateLayersOrder, updateOrphanLayersOrder } = CurrentActivity.value
|
|
141
173
|
const orphanLayersOptions = { hideIfEmpty: true }
|
|
142
174
|
const filteredCategories = ref([])
|
|
143
175
|
const layersByCategory = ref({})
|
|
144
|
-
const
|
|
176
|
+
const filteredOrphanLayers = ref([])
|
|
177
|
+
const draggedIndex = ref(null)
|
|
145
178
|
|
|
146
179
|
// Watch
|
|
147
180
|
watchEffect(() => { refresh() })
|
|
@@ -150,36 +183,113 @@ watchEffect(() => { refresh() })
|
|
|
150
183
|
function getCategoryId (category) {
|
|
151
184
|
return _.kebabCase(category.name)
|
|
152
185
|
}
|
|
186
|
+
function getCategoryIcon (category) {
|
|
187
|
+
return _.get(category, 'icon.name', _.get(category, 'icon'), 'las la-bars')
|
|
188
|
+
}
|
|
153
189
|
function isCategoryVisible (category) {
|
|
154
|
-
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
190
|
+
const options = category.options || category
|
|
191
|
+
// Show a built-in category only if it has some layers.
|
|
192
|
+
// Indeed, depending on the app configuration, none might be available for this category.
|
|
193
|
+
// User-defined categories are visible by default, even if empty,
|
|
194
|
+
// except if used inside a project as in this case having no layers means we don't want to use this category.
|
|
195
|
+
// App might also force to hide it anyway with the hideIfEmpty option.
|
|
158
196
|
const isEmpty = (layersByCategory.value[category.name].length === 0)
|
|
159
|
-
|
|
160
|
-
if (hasProject()) return false
|
|
161
|
-
else return !_.get(category, 'hideIfEmpty', !category._id)
|
|
162
|
-
}
|
|
163
|
-
return true
|
|
197
|
+
return (isEmpty ? !_.get(options, 'hideIfEmpty', !category._id || hasProject()) : true)
|
|
164
198
|
}
|
|
165
199
|
function refresh () {
|
|
200
|
+
const { layers, layerCategories, orphanLayers } = CurrentActivity.value
|
|
166
201
|
// filter layers
|
|
167
202
|
const layersFilter = (typeof props.layersFilter === 'object' ? sift(props.layersFilter) : props.layersFilter)
|
|
168
|
-
const filteredLayers = _.filter(
|
|
203
|
+
const filteredLayers = _.filter(layers, layersFilter)
|
|
169
204
|
// filter categories
|
|
170
205
|
const categoriesFilter = (typeof props.layerCategoriesFilter === 'object' ? sift(props.layerCategoriesFilter) : props.layerCategoriesFilter)
|
|
171
|
-
filteredCategories.value = _.filter(
|
|
206
|
+
filteredCategories.value = _.filter(layerCategories, categoriesFilter)
|
|
172
207
|
_.forEach(filteredCategories.value, category => {
|
|
173
|
-
const component = _.get(category, 'component', 'catalog/
|
|
208
|
+
const component = _.get(category, 'component', 'catalog/KLayersList')
|
|
174
209
|
if (!category.componentInstance) category.componentInstance = coreUtils.loadComponent(component)
|
|
175
210
|
})
|
|
176
|
-
// compute layers by categories
|
|
211
|
+
// compute layers by categories
|
|
177
212
|
layersByCategory.value = getLayersByCategory(filteredLayers, filteredCategories.value)
|
|
178
|
-
|
|
179
|
-
|
|
213
|
+
// filter orphan layers
|
|
214
|
+
const orphanLayersFilter = (typeof props.orphanLayersFilter === 'object' ? sift(props.orphanLayersFilter) : props.orphanLayersFilter)
|
|
215
|
+
filteredOrphanLayers.value = _.filter(_.filter(orphanLayers, layersFilter), orphanLayersFilter)
|
|
216
|
+
}
|
|
180
217
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
218
|
+
async function onOrphanLayerUpdated (targetIndex, draggedIndex) {
|
|
219
|
+
const { orphanLayers } = CurrentActivity.value
|
|
220
|
+
const layer = filteredOrphanLayers.value[draggedIndex]
|
|
221
|
+
const targetLayer = (targetIndex >= 0 ? filteredOrphanLayers.value[targetIndex] : null)
|
|
222
|
+
const removedLayers = filteredOrphanLayers.value.splice(draggedIndex, 1)
|
|
223
|
+
// As orphan layers are filtered we might have a mismatch between activity list index and panel index
|
|
224
|
+
// so that we find the layer by name in the activity list to perform the same reordering
|
|
225
|
+
let orphanLayer
|
|
226
|
+
draggedIndex = _.findIndex(orphanLayers, orphanLayer => orphanLayer.name === layer.name)
|
|
227
|
+
if (draggedIndex >= 0) {
|
|
228
|
+
orphanLayer = orphanLayers[draggedIndex]
|
|
229
|
+
orphanLayers.splice(draggedIndex, 1)
|
|
230
|
+
}
|
|
231
|
+
// If not -1 it means the orphan layer has been moved within the orphan layers list.
|
|
232
|
+
// Otherwise it has been moved to another category so that we only need to remove it from the list
|
|
233
|
+
if ((removedLayers.length > 0) && targetLayer) {
|
|
234
|
+
filteredOrphanLayers.value.splice(targetIndex, 0, removedLayers[0])
|
|
235
|
+
// As orphan layers are filtered we might have a mismatch between activity list index and panel index
|
|
236
|
+
// so that we find the layer by name in the activity list to perform the same reordering
|
|
237
|
+
targetIndex = _.findIndex(orphanLayers, orphanLayer => orphanLayer.name === targetLayer.name)
|
|
238
|
+
if (orphanLayer && (targetIndex >= 0)) orphanLayers.splice(targetIndex, 0, orphanLayer)
|
|
239
|
+
}
|
|
240
|
+
await updateOrphanLayersOrder(filteredOrphanLayers.value.map(layer => layer?._id || layer?.name), layer)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function onDragStart (event, index, category) {
|
|
244
|
+
draggedIndex.value = index
|
|
245
|
+
event.dataTransfer.dropEffect = 'move'
|
|
246
|
+
event.dataTransfer.effectAllowed = 'move'
|
|
247
|
+
event.dataTransfer.setData('categoryID', category._id)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
async function onDrop (event, targetIndex) {
|
|
251
|
+
const sourceCategoryId = event.dataTransfer.getData('categoryID')
|
|
252
|
+
const layerName = event.dataTransfer.getData('layerName')
|
|
253
|
+
const layers = _.flatten(_.values(layersByCategory.value)).concat(filteredOrphanLayers.value)
|
|
254
|
+
const layer = layers.find(layer => layer.name === layerName)
|
|
255
|
+
const draggedLayerIndex = event.dataTransfer.getData('draggedIndex')
|
|
256
|
+
if (layerName && layerName.length > 0) { // drag source is layer: change layer category
|
|
257
|
+
const currentCategoryLayers = filteredCategories.value[targetIndex]?.layers
|
|
258
|
+
// WARNING: Need to use a string here as dataTransfer serialize to strings
|
|
259
|
+
if (sourceCategoryId === 'undefined') { // source is orphan layer
|
|
260
|
+
onOrphanLayerUpdated(-1, draggedLayerIndex)
|
|
261
|
+
currentCategoryLayers.unshift(layerName)
|
|
262
|
+
await updateLayersOrder(filteredCategories.value[targetIndex]._id, { layers: currentCategoryLayers }, layer)
|
|
263
|
+
} else {
|
|
264
|
+
const sourceCategoryLayers = filteredCategories.value.find(category => category?._id === sourceCategoryId)?.layers
|
|
265
|
+
const removedLayers = sourceCategoryLayers.splice(draggedLayerIndex, 1)
|
|
266
|
+
if (removedLayers.length > 0) currentCategoryLayers.unshift(removedLayers[0])
|
|
267
|
+
await updateLayersOrder(filteredCategories.value[targetIndex]._id, { layers: currentCategoryLayers }, layer)
|
|
268
|
+
await updateLayersOrder(sourceCategoryId, { layers: sourceCategoryLayers }, layer)
|
|
269
|
+
}
|
|
270
|
+
} else { // drag source is category: reorder category
|
|
271
|
+
await updateCategoriesOrder(sourceCategoryId, filteredCategories.value[targetIndex]._id)
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function isDraggable (category) {
|
|
276
|
+
return !!category._id && (typeof props.categoriesDraggable === 'function' ? props.categoriesDraggable(category) : props.categoriesDraggable)
|
|
277
|
+
}
|
|
185
278
|
</script>
|
|
279
|
+
|
|
280
|
+
<style scoped>
|
|
281
|
+
.draggable-category {
|
|
282
|
+
display: flex;
|
|
283
|
+
align-items: center;
|
|
284
|
+
flex-grow: 1;
|
|
285
|
+
}
|
|
286
|
+
.drag-handle {
|
|
287
|
+
min-width: 0;
|
|
288
|
+
width: 1px;
|
|
289
|
+
cursor: move;
|
|
290
|
+
margin-left: 0px;
|
|
291
|
+
margin-right: 32px;
|
|
292
|
+
padding: 0px;
|
|
293
|
+
user-select: none;
|
|
294
|
+
}
|
|
295
|
+
</style>
|