@kalisio/kdk 1.3.6 → 1.5.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/.nyc_output/{0d403586-0c7c-4336-94d1-a49e9f02a905.json → 058fc679-d60a-4501-ac04-71171e5200b8.json} +0 -0
- package/.nyc_output/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +1 -0
- package/.nyc_output/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +1 -0
- package/.nyc_output/{21dd57bd-48c5-41c8-8800-252db32a9366.json → 8b1830fa-932e-4a61-9837-4a5b18f83ea9.json} +0 -0
- package/.nyc_output/{3eb3a2ca-53c2-4551-ba6b-adf70f9a53cd.json → afd2d144-3570-4858-b94a-b523dbd023dd.json} +0 -0
- package/.nyc_output/processinfo/058fc679-d60a-4501-ac04-71171e5200b8.json +1 -0
- package/.nyc_output/processinfo/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +1 -0
- package/.nyc_output/processinfo/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +1 -0
- package/.nyc_output/processinfo/8b1830fa-932e-4a61-9837-4a5b18f83ea9.json +1 -0
- package/.nyc_output/processinfo/afd2d144-3570-4858-b94a-b523dbd023dd.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/CHANGELOG.md +167 -79
- package/README.md +1 -1
- package/coverage/core/api/application.js.html +436 -436
- package/coverage/core/api/authentication.js.html +119 -119
- package/coverage/core/api/db.js.html +201 -201
- package/coverage/core/api/hooks/hooks.account.js.html +48 -48
- package/coverage/core/api/hooks/hooks.authentication.js.html +64 -64
- package/coverage/core/api/hooks/hooks.authorisations.js.html +369 -378
- package/coverage/core/api/hooks/hooks.devices.js.html +49 -49
- package/coverage/core/api/hooks/hooks.groups.js.html +37 -37
- package/coverage/core/api/hooks/hooks.logger.js.html +27 -27
- package/coverage/core/api/hooks/hooks.model.js.html +269 -269
- package/coverage/core/api/hooks/hooks.organisations.js.html +183 -231
- package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
- package/coverage/core/api/hooks/hooks.query.js.html +234 -198
- package/coverage/core/api/hooks/hooks.service.js.html +82 -82
- package/coverage/core/api/hooks/hooks.storage.js.html +121 -121
- package/coverage/core/api/hooks/hooks.tags.js.html +232 -232
- package/coverage/core/api/hooks/hooks.users.js.html +304 -256
- package/coverage/core/api/hooks/index.html +172 -172
- package/coverage/core/api/hooks/index.js.html +24 -24
- package/coverage/core/api/index.html +75 -75
- package/coverage/core/api/index.js.html +26 -26
- package/coverage/core/api/marshall.js.html +57 -57
- package/coverage/core/api/models/groups.model.mongodb.js.html +20 -20
- package/coverage/core/api/models/index.html +50 -50
- package/coverage/core/api/models/organisations.model.mongodb.js.html +12 -12
- package/coverage/core/api/models/tags.model.mongodb.js.html +22 -22
- package/coverage/core/api/models/users.model.mongodb.js.html +20 -20
- package/coverage/core/api/oauth2-handler.js.html +18 -18
- package/coverage/core/api/oauth2-verifier.js.html +38 -38
- package/coverage/core/api/services/account/account.hooks.js.html +16 -16
- package/coverage/core/api/services/account/account.service.js.html +108 -108
- package/coverage/core/api/services/account/index.html +32 -32
- package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
- package/coverage/core/api/services/authorisations/authorisations.service.js.html +132 -129
- package/coverage/core/api/services/authorisations/index.html +28 -28
- package/coverage/core/api/services/databases/databases.hooks.js.html +9 -9
- package/coverage/core/api/services/databases/databases.service.js.html +12 -12
- package/coverage/core/api/services/databases/index.html +24 -24
- package/coverage/core/api/services/devices/devices.hooks.js.html +9 -9
- package/coverage/core/api/services/devices/devices.service.js.html +121 -121
- package/coverage/core/api/services/devices/index.html +28 -28
- package/coverage/core/api/services/groups/groups.hooks.js.html +9 -9
- package/coverage/core/api/services/groups/index.html +13 -13
- package/coverage/core/api/services/index.html +21 -21
- package/coverage/core/api/services/index.js.html +137 -137
- package/coverage/core/api/services/mailer/index.html +24 -24
- package/coverage/core/api/services/mailer/mailer.hooks.js.html +9 -9
- package/coverage/core/api/services/mailer/mailer.service.js.html +19 -19
- package/coverage/core/api/services/organisations/index.html +24 -24
- package/coverage/core/api/services/organisations/organisations.hooks.js.html +8 -8
- package/coverage/core/api/services/organisations/organisations.service.js.html +67 -67
- package/coverage/core/api/services/pusher/index.html +34 -34
- package/coverage/core/api/services/pusher/pusher.channels.js.html +8 -8
- package/coverage/core/api/services/pusher/pusher.hooks.js.html +10 -10
- package/coverage/core/api/services/pusher/pusher.service.js.html +414 -414
- package/coverage/core/api/services/storage/index.html +21 -21
- package/coverage/core/api/services/storage/storage.hooks.js.html +35 -35
- package/coverage/core/api/services/tags/index.html +21 -21
- package/coverage/core/api/services/tags/tags.hooks.js.html +25 -25
- package/coverage/core/api/services/users/index.html +21 -21
- package/coverage/core/api/services/users/users.hooks.js.html +33 -33
- package/coverage/core/common/errors.js.html +1 -1
- package/coverage/core/common/index.html +42 -27
- package/coverage/core/common/index.js.html +16 -16
- package/coverage/core/common/permissions.js.html +325 -265
- package/coverage/index.html +182 -182
- package/coverage/lcov-report/core/api/application.js.html +436 -436
- package/coverage/lcov-report/core/api/authentication.js.html +119 -119
- package/coverage/lcov-report/core/api/db.js.html +201 -201
- package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +48 -48
- package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +64 -64
- package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +369 -378
- package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +49 -49
- package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +37 -37
- package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +27 -27
- package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +269 -269
- package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +183 -231
- package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
- package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +234 -198
- package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +82 -82
- package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +121 -121
- package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +232 -232
- package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +304 -256
- package/coverage/lcov-report/core/api/hooks/index.html +172 -172
- package/coverage/lcov-report/core/api/hooks/index.js.html +24 -24
- package/coverage/lcov-report/core/api/index.html +75 -75
- package/coverage/lcov-report/core/api/index.js.html +26 -26
- package/coverage/lcov-report/core/api/marshall.js.html +57 -57
- package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +20 -20
- package/coverage/lcov-report/core/api/models/index.html +50 -50
- package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +12 -12
- package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +22 -22
- package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +20 -20
- package/coverage/lcov-report/core/api/oauth2-handler.js.html +18 -18
- package/coverage/lcov-report/core/api/oauth2-verifier.js.html +38 -38
- package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +16 -16
- package/coverage/lcov-report/core/api/services/account/account.service.js.html +108 -108
- package/coverage/lcov-report/core/api/services/account/index.html +32 -32
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +132 -129
- package/coverage/lcov-report/core/api/services/authorisations/index.html +28 -28
- package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +12 -12
- package/coverage/lcov-report/core/api/services/databases/index.html +24 -24
- package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +121 -121
- package/coverage/lcov-report/core/api/services/devices/index.html +28 -28
- package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/groups/index.html +13 -13
- package/coverage/lcov-report/core/api/services/index.html +21 -21
- package/coverage/lcov-report/core/api/services/index.js.html +137 -137
- package/coverage/lcov-report/core/api/services/mailer/index.html +24 -24
- package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +9 -9
- package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +19 -19
- package/coverage/lcov-report/core/api/services/organisations/index.html +24 -24
- package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +8 -8
- package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +67 -67
- package/coverage/lcov-report/core/api/services/pusher/index.html +34 -34
- package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +8 -8
- package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +10 -10
- package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +414 -414
- package/coverage/lcov-report/core/api/services/storage/index.html +21 -21
- package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +35 -35
- package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
- package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +25 -25
- package/coverage/lcov-report/core/api/services/users/index.html +21 -21
- package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +33 -33
- package/coverage/lcov-report/core/common/errors.js.html +1 -1
- package/coverage/lcov-report/core/common/index.html +42 -27
- package/coverage/lcov-report/core/common/index.js.html +16 -16
- package/coverage/lcov-report/core/common/permissions.js.html +325 -265
- package/coverage/lcov-report/index.html +182 -182
- package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
- package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +118 -37
- package/coverage/lcov-report/map/api/hooks/index.html +7 -7
- package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
- package/coverage/lcov-report/map/api/index.html +1 -1
- package/coverage/lcov-report/map/api/index.js.html +1 -1
- package/coverage/lcov-report/map/api/marshall.js.html +1 -1
- package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/map/api/models/index.html +1 -1
- package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
- package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
- package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
- package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +2 -2
- package/coverage/lcov-report/map/api/services/features/index.html +1 -1
- package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
- package/coverage/lcov-report/map/api/services/index.html +1 -1
- package/coverage/lcov-report/map/api/services/index.js.html +1 -1
- package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/errors.js.html +1 -1
- package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/grid.js.html +1 -1
- package/coverage/lcov-report/map/common/index.html +12 -12
- package/coverage/lcov-report/map/common/index.js.html +1 -1
- package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/permissions.js.html +1 -1
- package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/wfs-utils.js.html +8 -5
- package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/wmts-utils.js.html +71 -11
- package/coverage/lcov.info +3742 -3949
- package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
- package/coverage/map/api/hooks/hooks.query.js.html +118 -37
- package/coverage/map/api/hooks/index.html +7 -7
- package/coverage/map/api/hooks/index.js.html +1 -1
- package/coverage/map/api/index.html +1 -1
- package/coverage/map/api/index.js.html +1 -1
- package/coverage/map/api/marshall.js.html +1 -1
- package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
- package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
- package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
- package/coverage/map/api/models/index.html +1 -1
- package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
- package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
- package/coverage/map/api/services/alerts/index.html +1 -1
- package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
- package/coverage/map/api/services/catalog/index.html +1 -1
- package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
- package/coverage/map/api/services/daptiles/index.html +1 -1
- package/coverage/map/api/services/features/features.hooks.js.html +2 -2
- package/coverage/map/api/services/features/index.html +1 -1
- package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
- package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
- package/coverage/map/api/services/geocoder/index.html +1 -1
- package/coverage/map/api/services/index.html +1 -1
- package/coverage/map/api/services/index.js.html +1 -1
- package/coverage/map/common/dynamic-grid-source.js.html +1 -1
- package/coverage/map/common/errors.js.html +1 -1
- package/coverage/map/common/geotiff-grid-source.js.html +1 -1
- package/coverage/map/common/grid.js.html +1 -1
- package/coverage/map/common/index.html +12 -12
- package/coverage/map/common/index.js.html +1 -1
- package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
- package/coverage/map/common/moment-utils.js.html +1 -1
- package/coverage/map/common/opendap-grid-source.js.html +1 -1
- package/coverage/map/common/opendap-utils.js.html +1 -1
- package/coverage/map/common/permissions.js.html +1 -1
- package/coverage/map/common/time-based-grid-source.js.html +1 -1
- package/coverage/map/common/tms-utils.js.html +1 -1
- package/coverage/map/common/wcs-grid-source.js.html +1 -1
- package/coverage/map/common/wcs-utils.js.html +1 -1
- package/coverage/map/common/weacast-grid-source.js.html +1 -1
- package/coverage/map/common/wfs-utils.js.html +8 -5
- package/coverage/map/common/wms-utils.js.html +1 -1
- package/coverage/map/common/wmts-utils.js.html +71 -11
- package/extras/icons/kanban.png +0 -0
- package/extras/tours/core/add-member.js +10 -1
- package/extras/tours/core/{tag-member.js → edit-member-tags.js} +4 -3
- package/extras/tours/core/groups.js +8 -2
- package/extras/tours/core/members.js +11 -21
- package/extras/tours/core/tags.js +7 -1
- package/extras/tours/map/catalog-categories.js +4 -4
- package/extras/tours/map/catalog-panel.js +16 -16
- package/extras/tours/map/favorite-views.js +3 -3
- package/lib/core/api/hooks/hooks.authorisations.js +149 -140
- package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
- package/lib/core/api/hooks/hooks.organisations.js +1 -23
- package/lib/core/api/hooks/hooks.organisations.js.map +1 -1
- package/lib/core/api/hooks/hooks.query.js +22 -0
- package/lib/core/api/hooks/hooks.query.js.map +1 -1
- package/lib/core/api/hooks/hooks.users.js +34 -18
- package/lib/core/api/hooks/hooks.users.js.map +1 -1
- package/lib/core/api/services/authorisations/authorisations.service.js +34 -25
- package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
- package/lib/core/client/api.js +1 -0
- package/lib/core/client/api.js.map +1 -1
- package/lib/core/client/components/account/KAccountDZ.vue +3 -4
- package/lib/core/client/components/account/KAccountDevices.vue +5 -6
- package/lib/core/client/components/account/KDeviceCard.vue +2 -1
- package/lib/core/client/components/account/KIdentityPanel.vue +1 -7
- package/lib/core/client/components/collection/KBoard.vue +26 -155
- package/lib/core/client/components/collection/KCard.vue +144 -42
- package/lib/core/client/components/collection/KCardSection.vue +52 -0
- package/lib/core/client/components/collection/KColumn.vue +181 -0
- package/lib/core/client/components/collection/KGrid.vue +13 -18
- package/lib/core/client/components/collection/KHistory.vue +61 -89
- package/lib/core/client/components/collection/KHistoryEntry.vue +90 -66
- package/lib/core/client/components/collection/KItem.vue +21 -2
- package/lib/core/client/components/collection/KList.vue +9 -12
- package/lib/core/client/components/collection/KTable.vue +33 -39
- package/lib/core/client/components/collection/index.js +6 -1
- package/lib/core/client/components/collection/index.js.map +1 -1
- package/lib/core/client/components/editor/KEditor.vue +0 -6
- package/lib/core/client/components/editor/KModalEditor.vue +4 -4
- package/lib/core/client/components/editor/KSettingsEditor.vue +49 -0
- package/lib/core/client/components/form/KAttachmentField.vue +10 -10
- package/lib/core/client/components/form/KChipsField.vue +28 -23
- package/lib/core/client/components/form/KColorField.vue +30 -25
- package/lib/core/client/components/form/KFileField.vue +11 -40
- package/lib/core/client/components/form/KForm.vue +0 -12
- package/lib/core/client/components/form/KIconField.vue +1 -0
- package/lib/core/client/components/form/KItemField.vue +6 -2
- package/lib/core/client/components/form/KRoleField.vue +56 -0
- package/lib/core/client/components/form/KSelectField.vue +16 -1
- package/lib/core/client/components/form/KView.vue +5 -14
- package/lib/core/client/components/frame/KAction.vue +18 -12
- package/lib/core/client/components/frame/KAvatar.vue +3 -3
- package/lib/core/client/components/frame/KChart.vue +60 -0
- package/lib/core/client/components/frame/KChipsPane.vue +80 -0
- package/lib/core/client/components/frame/KContent.vue +1 -1
- package/lib/core/client/components/frame/KModal.vue +30 -44
- package/lib/core/client/components/frame/KPanel.vue +1 -1
- package/lib/core/client/components/frame/{KMenu.vue → KPopupAction.vue} +6 -7
- package/lib/core/client/components/frame/KSpot.vue +31 -0
- package/lib/core/client/components/frame/KStamp.vue +62 -0
- package/lib/core/client/components/frame/index.js +56 -1
- package/lib/core/client/components/frame/index.js.map +1 -1
- package/lib/core/client/components/input/KColorChooser.vue +16 -8
- package/lib/core/client/components/input/KIconChooser.vue +2 -1
- package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
- package/lib/core/client/components/input/KUploader.vue +14 -5
- package/lib/core/client/components/layout/KAbout.vue +9 -3
- package/lib/core/client/components/layout/KFab.vue +1 -1
- package/lib/core/client/components/layout/KPage.vue +44 -19
- package/lib/core/client/components/layout/KTour.vue +2 -2
- package/lib/core/client/components/layout/KWelcome.vue +13 -12
- package/lib/core/client/components/layout/KWindow.vue +1 -1
- package/lib/core/client/components/media/KImageViewer.vue +9 -7
- package/lib/core/client/components/media/KMediaBrowser.vue +12 -8
- package/lib/core/client/components/menu/KMenu.vue +103 -0
- package/lib/core/client/components/team/KAddMember.vue +17 -9
- package/lib/core/client/components/team/KChangeRole.vue +5 -7
- package/lib/core/client/components/team/KGroupCard.vue +34 -51
- package/lib/core/client/components/team/KGroupsActivity.vue +9 -2
- package/lib/core/client/components/team/KJoinGroup.vue +5 -7
- package/lib/core/client/components/team/KMemberCard.vue +104 -63
- package/lib/core/client/components/team/KMembersActivity.vue +9 -2
- package/lib/core/client/components/team/KOrganisationsActivity.vue +8 -1
- package/lib/core/client/components/team/KTagCard.vue +26 -26
- package/lib/core/client/components/team/KTagsActivity.vue +9 -2
- package/lib/core/client/components/time/KTimeRange.vue +144 -0
- package/lib/core/client/components/viewer/KModalViewer.vue +6 -0
- package/lib/core/client/components/viewer/KViewer.vue +0 -6
- package/lib/core/client/i18n/core_en.json +138 -94
- package/lib/core/client/i18n/core_fr.json +61 -17
- package/lib/core/client/index.js +46 -14
- package/lib/core/client/index.js.map +1 -1
- package/lib/core/client/layout.js +8 -1
- package/lib/core/client/layout.js.map +1 -1
- package/lib/core/client/mixins/mixin.authorisation.js +28 -18
- package/lib/core/client/mixins/mixin.authorisation.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-collection.js +57 -9
- package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-context.js +1 -1
- package/lib/core/client/mixins/mixin.base-context.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-editor.js +26 -16
- package/lib/core/client/mixins/mixin.base-editor.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-field.js +0 -4
- package/lib/core/client/mixins/mixin.base-field.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-item.js +29 -14
- package/lib/core/client/mixins/mixin.base-item.js.map +1 -1
- package/lib/core/client/mixins/mixin.base-viewer.js +0 -2
- package/lib/core/client/mixins/mixin.base-viewer.js.map +1 -1
- package/lib/core/client/mixins/mixin.object-proxy.js +17 -3
- package/lib/core/client/mixins/mixin.object-proxy.js.map +1 -1
- package/lib/core/client/mixins/mixin.schema-proxy.js +31 -0
- package/lib/core/client/mixins/mixin.schema-proxy.js.map +1 -1
- package/lib/core/client/mixins/mixin.service.js +5 -33
- package/lib/core/client/mixins/mixin.service.js.map +1 -1
- package/lib/core/client/reader.js +54 -0
- package/lib/core/client/reader.js.map +1 -0
- package/lib/core/client/readers/index.js +30 -0
- package/lib/core/client/readers/index.js.map +1 -0
- package/lib/core/client/readers/reader.csv.js +43 -0
- package/lib/core/client/readers/reader.csv.js.map +1 -0
- package/lib/core/client/readers/reader.json.js +38 -0
- package/lib/core/client/readers/reader.json.js.map +1 -0
- package/lib/core/client/services/index.js +23 -0
- package/lib/core/client/services/index.js.map +1 -1
- package/lib/core/client/services/local-settings.service.js +4 -0
- package/lib/core/client/services/local-settings.service.js.map +1 -1
- package/lib/core/client/time.js +131 -0
- package/lib/core/client/time.js.map +1 -0
- package/lib/core/common/permissions.js +65 -23
- package/lib/core/common/permissions.js.map +1 -1
- package/lib/core/common/schemas/groups.create.json +1 -1
- package/lib/core/common/schemas/groups.update.json +1 -1
- package/lib/core/common/schemas/organisations.create.json +1 -1
- package/lib/core/common/schemas/organisations.update.json +2 -2
- package/lib/core/common/schemas/settings.update.json +139 -0
- package/lib/core/common/schemas/tags.update.json +9 -1
- package/lib/map/api/hooks/hooks.query.js +55 -29
- package/lib/map/api/hooks/hooks.query.js.map +1 -1
- package/lib/map/api/services/features/features.hooks.js +1 -1
- package/lib/map/api/services/features/features.hooks.js.map +1 -1
- package/lib/map/client/components/KCaptureToolbar.vue +156 -0
- package/lib/map/client/components/KColorLegend.vue +25 -23
- package/lib/map/client/components/KFavoriteViews.vue +71 -35
- package/lib/map/client/components/KFeaturesChart.vue +11 -9
- package/lib/map/client/components/KFeaturesFilter.vue +18 -8
- package/lib/map/client/components/KFeaturesTable.vue +27 -2
- package/lib/map/client/components/KLayerEditionToolbar.vue +51 -0
- package/lib/map/client/components/KLayerStyleEditor.vue +12 -5
- package/lib/map/client/components/KLayerStyleForm.vue +44 -33
- package/lib/map/client/components/KLocationInput.vue +126 -65
- package/lib/map/client/components/KLocationMap.vue +199 -84
- package/lib/map/client/components/KMeasureTool.vue +340 -0
- package/lib/map/client/components/KPositionIndicator.vue +1 -0
- package/lib/map/client/components/KTimeline.vue +41 -37
- package/lib/map/client/components/KUrlLegend.vue +21 -19
- package/lib/map/client/components/catalog/KBaseLayersSelector.vue +105 -0
- package/lib/map/client/components/catalog/KCatalog.vue +14 -2
- package/lib/map/client/components/catalog/KConnectLayer.vue +31 -11
- package/lib/map/client/components/catalog/KCreateLayer.vue +37 -14
- package/lib/map/client/components/catalog/KImportLayer.vue +33 -40
- package/lib/map/client/components/catalog/KLayerCategories.vue +86 -62
- package/lib/map/client/components/catalog/KLayersSelector.vue +44 -42
- package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
- package/lib/map/client/components/form/KLocationField.vue +1 -1
- package/lib/map/client/components/form/KOwsLayerField.vue +7 -0
- package/lib/map/client/components/form/KOwsServiceField.vue +1 -0
- package/lib/map/client/components/widget/KInformationBox.vue +10 -16
- package/lib/map/client/components/widget/KMapillaryViewer.vue +59 -49
- package/lib/map/client/components/widget/KTimeSeries.vue +119 -31
- package/lib/map/client/i18n/map_en.json +105 -20
- package/lib/map/client/i18n/map_fr.json +107 -23
- package/lib/map/client/init.js +24 -7
- package/lib/map/client/init.js.map +1 -1
- package/lib/map/client/leaflet/GSMaPLayer.js +4 -9
- package/lib/map/client/leaflet/GSMaPLayer.js.map +1 -1
- package/lib/map/client/leaflet/MaskLayer.js +73 -0
- package/lib/map/client/leaflet/MaskLayer.js.map +1 -0
- package/lib/map/client/mixins/globe/mixin.base-globe.js +7 -6
- package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js +7 -9
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.popup.js +4 -0
- package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.tooltip.js +4 -0
- package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/index.js +8 -13
- package/lib/map/client/mixins/index.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.base-map.js +71 -8
- package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.canvas-layers.js +276 -51
- package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.edit-layers.js +218 -121
- package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.file-layers.js +46 -93
- package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.geojson-layers.js +22 -11
- package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.georaster-layers.js +7 -4
- package/lib/map/client/mixins/map/mixin.georaster-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.gsmap-layers.js +3 -3
- package/lib/map/client/mixins/map/mixin.gsmap-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.heatmap-layers.js +8 -10
- package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.mapillary-layers.js +25 -40
- package/lib/map/client/mixins/map/mixin.mapillary-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.popup.js +4 -0
- package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +5 -3
- package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +5 -3
- package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tooltip.js +4 -0
- package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/mixin.activity.js +62 -68
- package/lib/map/client/mixins/mixin.activity.js.map +1 -1
- package/lib/map/client/mixins/mixin.context.js +26 -3
- package/lib/map/client/mixins/mixin.context.js.map +1 -1
- package/lib/map/client/mixins/mixin.feature-selection.js +8 -10
- package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
- package/lib/map/client/mixins/mixin.feature-service.js +9 -7
- package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
- package/lib/map/client/mixins/mixin.infobox.js +4 -0
- package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
- package/lib/map/client/mixins/mixin.weacast.js +6 -4
- package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
- package/lib/map/client/pixi-utils.js +9 -0
- package/lib/map/client/pixi-utils.js.map +1 -1
- package/lib/map/client/readers/index.js +42 -0
- package/lib/map/client/readers/index.js.map +1 -0
- package/lib/map/client/readers/reader.geojson.js +59 -0
- package/lib/map/client/readers/reader.geojson.js.map +1 -0
- package/lib/map/client/readers/reader.gpx.js +41 -0
- package/lib/map/client/readers/reader.gpx.js.map +1 -0
- package/lib/map/client/readers/reader.kml.js +41 -0
- package/lib/map/client/readers/reader.kml.js.map +1 -0
- package/lib/map/client/utils.js +52 -1
- package/lib/map/client/utils.js.map +1 -1
- package/lib/map/common/wfs-utils.js +1 -1
- package/lib/map/common/wfs-utils.js.map +1 -1
- package/lib/map/common/wmts-utils.js +31 -7
- package/lib/map/common/wmts-utils.js.map +1 -1
- package/lib/test/client/core/account.js +100 -0
- package/lib/test/client/core/account.js.map +1 -0
- package/lib/test/client/core/api.js +400 -0
- package/lib/test/client/core/api.js.map +1 -0
- package/lib/test/client/core/collection.js +109 -0
- package/lib/test/client/core/collection.js.map +1 -0
- package/lib/test/client/core/index.js +90 -0
- package/lib/test/client/core/index.js.map +1 -0
- package/lib/test/client/core/layout.js +221 -0
- package/lib/test/client/core/layout.js.map +1 -0
- package/lib/test/client/core/runner.js +203 -0
- package/lib/test/client/core/runner.js.map +1 -0
- package/lib/test/client/core/screens.js +68 -0
- package/lib/test/client/core/screens.js.map +1 -0
- package/lib/test/client/core/utils.js +304 -0
- package/lib/test/client/core/utils.js.map +1 -0
- package/lib/test/client/index.js +20 -0
- package/lib/test/client/index.js.map +1 -0
- package/lib/test/client/map/catalog.js +192 -0
- package/lib/test/client/map/catalog.js.map +1 -0
- package/lib/test/client/map/controls.js +54 -0
- package/lib/test/client/map/controls.js.map +1 -0
- package/lib/test/client/map/index.js +30 -0
- package/lib/test/client/map/index.js.map +1 -0
- package/package.json +18 -9
- package/test.client.js +1 -0
- package/tests/core/test-log-2021-09-02.log +47 -0
- package/tests/map/test-log-%DATE%.logYYYY-09-DD +6 -0
- package/tests/map/test-log-2021-09-02.log +3 -0
- package/.nyc_output/5baea3f8-cf8e-4c76-8ccf-0e48b6f16fa4.json +0 -1
- package/.nyc_output/dddde6b5-9024-4b0e-8d8b-4502d437b8a4.json +0 -1
- package/.nyc_output/ef5e94ba-9a99-4fb6-ab1d-1a974112bb83.json +0 -1
- package/.nyc_output/fd4681f8-5f41-4f17-b393-9f399b24c128.json +0 -1
- package/.nyc_output/processinfo/0d403586-0c7c-4336-94d1-a49e9f02a905.json +0 -1
- package/.nyc_output/processinfo/21dd57bd-48c5-41c8-8800-252db32a9366.json +0 -1
- package/.nyc_output/processinfo/3eb3a2ca-53c2-4551-ba6b-adf70f9a53cd.json +0 -1
- package/.nyc_output/processinfo/5baea3f8-cf8e-4c76-8ccf-0e48b6f16fa4.json +0 -1
- package/.nyc_output/processinfo/dddde6b5-9024-4b0e-8d8b-4502d437b8a4.json +0 -1
- package/.nyc_output/processinfo/ef5e94ba-9a99-4fb6-ab1d-1a974112bb83.json +0 -1
- package/.nyc_output/processinfo/fd4681f8-5f41-4f17-b393-9f399b24c128.json +0 -1
- package/extras/testcafe/Dockerfile +0 -48
- package/extras/testcafe/docker-entrypoint.sh +0 -27
- package/extras/testcafe/page-models/core/account.js +0 -75
- package/extras/testcafe/page-models/core/base-collection.js +0 -41
- package/extras/testcafe/page-models/core/base-page.js +0 -25
- package/extras/testcafe/page-models/core/groups.js +0 -36
- package/extras/testcafe/page-models/core/index.js +0 -140
- package/extras/testcafe/page-models/core/layout.js +0 -145
- package/extras/testcafe/page-models/core/members.js +0 -98
- package/extras/testcafe/page-models/core/organisations.js +0 -76
- package/extras/testcafe/page-models/core/screens.js +0 -99
- package/extras/testcafe/page-models/core/tags.js +0 -21
- package/extras/testcafe/page-models/map/add-layer.js +0 -51
- package/extras/testcafe/page-models/map/catalog.js +0 -132
- package/extras/testcafe/page-models/map/index.js +0 -36
- package/extras/testcafe/page-models/map/map-activity.js +0 -42
- package/extras/testcafe/page-models/map/timeline.js +0 -67
- package/lib/core/client/components/frame/KLabel.vue +0 -56
- package/lib/core/client/components/team/KTagsPane.vue +0 -35
- package/lib/map/client/leaflet/TiledMapillaryLayer.js +0 -137
- package/lib/map/client/leaflet/TiledMapillaryLayer.js.map +0 -1
- package/lib/map/client/mixins/mixin.time.js +0 -73
- package/lib/map/client/mixins/mixin.time.js.map +0 -1
- package/tests/core/account.test.js +0 -423
- package/tests/core/client.test.js.skip +0 -37
- package/tests/core/config/default.js +0 -96
- package/tests/core/config/email-templates/confirmInvitation/html.ejs +0 -18
- package/tests/core/config/email-templates/identityChange/html.ejs +0 -12
- package/tests/core/config/email-templates/newDevice/html.ejs +0 -7
- package/tests/core/config/email-templates/passwordChange/html.ejs +0 -5
- package/tests/core/config/email-templates/resendVerifySignup/html.ejs +0 -10
- package/tests/core/config/email-templates/resetPwd/html.ejs +0 -5
- package/tests/core/config/email-templates/sendResetPwd/html.ejs +0 -8
- package/tests/core/config/email-templates/verifySignup/html.ejs +0 -3
- package/tests/core/data/10k_most_common_passwords.txt +0 -10000
- package/tests/core/data/logo.png +0 -0
- package/tests/core/hooks.test.js +0 -175
- package/tests/core/index.test.js +0 -432
- package/tests/core/notifications.test.js +0 -465
- package/tests/core/storage.test.js +0 -134
- package/tests/core/team.test.js +0 -610
- package/tests/core/utils.js +0 -62
- package/tests/map/alerts.test.js +0 -554
- package/tests/map/config/default.js +0 -112
- package/tests/map/config/layers.json +0 -37
- package/tests/map/daptiles.test.js +0 -41
- package/tests/map/data/DescribeCoverage.xml +0 -55
- package/tests/map/data/GetCoverage.tif +0 -0
- package/tests/map/data/adsb.observations.json +0 -132
- package/tests/map/data/dataset.grb.das +0 -55
- package/tests/map/data/dataset.grb.dds +0 -17
- package/tests/map/data/dataset.grb.dods +0 -0
- package/tests/map/data/lat_lon_bounds.grb.dods +0 -0
- package/tests/map/data/subdataset.grb.dods +0 -0
- package/tests/map/data/vigicrues.observations.json +0 -47042
- package/tests/map/data/vigicrues.stations.json +0 -15422
- package/tests/map/data/zones.json +0 -1228
- package/tests/map/forecast-data/gfs-world/u-wind/2021-07-15_12-00-00_2021-07-15_12-00-00.grib +0 -0
- package/tests/map/forecast-data/gfs-world/v-wind/2021-07-15_12-00-00_2021-07-15_12-00-00.grib +0 -0
- package/tests/map/grid-sources.test.js +0 -304
- package/tests/map/hooks.test.js +0 -96
- package/tests/map/index.test.js +0 -333
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-06/schema#",
|
|
3
|
+
"$id": "http://www.kalisio.xyz/schemas/settings.update.json#",
|
|
4
|
+
"title": "schemas.UPDATE_SETTINGS_TITLE",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"shortTime": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"group": "schemas.TIME_FORMAT_SETTINGS",
|
|
10
|
+
"field": {
|
|
11
|
+
"component": "form/KTextField",
|
|
12
|
+
"label": "schemas.TIME_FORMAT_SHORT_TIME_FIELD_LABEL",
|
|
13
|
+
"helper": "schemas.TIME_FORMAT_SHORT_TIME_FIELD_HELPER"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"longTime": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"group": "schemas.TIME_FORMAT_SETTINGS",
|
|
19
|
+
"field": {
|
|
20
|
+
"component": "form/KTextField",
|
|
21
|
+
"label": "schemas.TIME_FORMAT_LONG_TIME_FIELD_LABEL",
|
|
22
|
+
"helper": "schemas.TIME_FORMAT_LONG_TIME_FIELD_HELPER"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"shortDate": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"group": "schemas.TIME_FORMAT_SETTINGS",
|
|
28
|
+
"field": {
|
|
29
|
+
"component": "form/KTextField",
|
|
30
|
+
"label": "schemas.TIME_FORMAT_SHORT_DATE_FIELD_LABEL",
|
|
31
|
+
"helper": "schemas.TIME_FORMAT_SHORT_DATE_FIELD_HELPER"
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"longDate": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"group": "schemas.TIME_FORMAT_SETTINGS",
|
|
38
|
+
"field": {
|
|
39
|
+
"component": "form/KTextField",
|
|
40
|
+
"label": "schemas.TIME_FORMAT_LONG_DATE_FIELD_LABEL",
|
|
41
|
+
"helper": "schemas.TIME_FORMAT_LONG_DATE_FIELD_HELPER"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"shortYear": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"group": "schemas.TIME_FORMAT_SETTINGS",
|
|
47
|
+
"field": {
|
|
48
|
+
"component": "form/KTextField",
|
|
49
|
+
"label": "schemas.TIME_FORMAT_SHORT_YEAR_FIELD_LABEL",
|
|
50
|
+
"helper": "schemas.TIME_FORMAT_SHORT_YEAR_FIELD_HELPER"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"longYear": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"group": "schemas.TIME_FORMAT_SETTINGS",
|
|
56
|
+
"field": {
|
|
57
|
+
"component": "form/KTextField",
|
|
58
|
+
"label": "schemas.TIME_FORMAT_LONG_YEAR_FIELD_LABEL",
|
|
59
|
+
"helper": "schemas.TIME_FORMAT_LONG_YEAR_FIELD_HELPER"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"utc": {
|
|
63
|
+
"type": "boolean",
|
|
64
|
+
"group": "schemas.TIME_FORMAT_SETTINGS",
|
|
65
|
+
"field": {
|
|
66
|
+
"component": "form/KToggleField",
|
|
67
|
+
"label": "schemas.TIME_FORMAT_UTC_FIELD_LABEL"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"timelineStep": {
|
|
71
|
+
"type": "number",
|
|
72
|
+
"group": "schemas.TIMELINE_SETTINGS",
|
|
73
|
+
"field": {
|
|
74
|
+
"component": "form/KSelectField",
|
|
75
|
+
"label": "schemas.TIMELINE_STEP",
|
|
76
|
+
"options": [
|
|
77
|
+
{ "label": "5m", "value": 5 },
|
|
78
|
+
{ "label": "10m", "value": 10 },
|
|
79
|
+
{ "label": "12m", "value": 12 },
|
|
80
|
+
{ "label": "15m", "value": 15 },
|
|
81
|
+
{ "label": "20m", "value": 20 },
|
|
82
|
+
{ "label": "30m", "value": 30 },
|
|
83
|
+
{ "label": "60m", "value": 60, "selected": true }
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"timeseriesSpan": {
|
|
88
|
+
"type": "number",
|
|
89
|
+
"group": "schemas.TIMESERIES_SETTINGS",
|
|
90
|
+
"field": {
|
|
91
|
+
"component": "form/KSelectField",
|
|
92
|
+
"label": "schemas.TIMESERIES_SPAN",
|
|
93
|
+
"options": [
|
|
94
|
+
{ "label": "3H", "value": 180 },
|
|
95
|
+
{ "label": "6H", "value": 360 },
|
|
96
|
+
{ "label": "12H", "value": 720 },
|
|
97
|
+
{ "label": "24H", "value": 1440, "selected": true },
|
|
98
|
+
{ "label": "48H", "value": 2880 },
|
|
99
|
+
{ "label": "72H", "value": 4320 },
|
|
100
|
+
{ "label": "96H", "value": 5760 }
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"restoreView": {
|
|
105
|
+
"type": "boolean",
|
|
106
|
+
"group": "schemas.MAP_SETTINGS",
|
|
107
|
+
"field": {
|
|
108
|
+
"component": "form/KToggleField",
|
|
109
|
+
"label": "schemas.RESTORE_VIEW_FIELD_LABEL"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"restoreLayers": {
|
|
113
|
+
"type": "boolean",
|
|
114
|
+
"group": "schemas.MAP_SETTINGS",
|
|
115
|
+
"field": {
|
|
116
|
+
"component": "form/KToggleField",
|
|
117
|
+
"label": "schemas.RESTORE_LAYERS_FIELD_LABEL"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"location": {
|
|
121
|
+
"type": "string",
|
|
122
|
+
"group": "schemas.MAP_SETTINGS",
|
|
123
|
+
"field": {
|
|
124
|
+
"component": "form/KTextField",
|
|
125
|
+
"label": "schemas.LOCATION_FORMAT_LABEL",
|
|
126
|
+
"helper": "schemas.LOCATION_FORMAT_HELPER"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"required": [
|
|
131
|
+
"shortTime",
|
|
132
|
+
"longTime",
|
|
133
|
+
"shortDate",
|
|
134
|
+
"longDate",
|
|
135
|
+
"shortYear",
|
|
136
|
+
"longYear",
|
|
137
|
+
"location"
|
|
138
|
+
]
|
|
139
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json-schema.org/draft-06/schema#",
|
|
3
3
|
"$id": "http://www.kalisio.xyz/schemas/tags.update.json#",
|
|
4
|
-
"title": "schemas.
|
|
4
|
+
"title": "schemas.TAG_NAME",
|
|
5
5
|
"description": "Tag edition schema",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
@@ -20,6 +20,14 @@
|
|
|
20
20
|
"component": "form/KIconField",
|
|
21
21
|
"label": "schemas.TAGS_ICON_FIELD_LABEL"
|
|
22
22
|
}
|
|
23
|
+
},
|
|
24
|
+
"description": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"maxLength": 2048,
|
|
27
|
+
"field": {
|
|
28
|
+
"component": "form/KTextField",
|
|
29
|
+
"label": "schemas.TAGS_DESCRIPTION_FIELD_LABEL"
|
|
30
|
+
}
|
|
23
31
|
}
|
|
24
32
|
},
|
|
25
33
|
"required": ["value"]
|
|
@@ -38,6 +38,7 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
|
|
|
38
38
|
} else {
|
|
39
39
|
Object.assign(groupBy, {
|
|
40
40
|
time: { $push: '$time' }, // Keep track of all times
|
|
41
|
+
runTime: { $push: '$runTime' }, // Keep track of all run times
|
|
41
42
|
type: { $last: '$type' }, // type is assumed similar for all results, keep last
|
|
42
43
|
properties: { $last: '$properties' // non-aggregated properties are assumed similar for all results, keep last
|
|
43
44
|
} });
|
|
@@ -73,8 +74,8 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
|
|
|
73
74
|
}
|
|
74
75
|
// Find matching features only
|
|
75
76
|
pipeline.push({ $match: Object.assign({ [prefix + element]: { $exists: true } }, match) });
|
|
76
|
-
// Ensure they are ordered by increasing time by default
|
|
77
|
-
pipeline.push({ $sort:
|
|
77
|
+
// Ensure they are ordered by increasing time by default and most recent forecast first
|
|
78
|
+
pipeline.push({ $sort: Object.assign({ time: 1, runTime: -1 }, query.$sort) });
|
|
78
79
|
// Keep track of all feature values
|
|
79
80
|
if (singleTime) {
|
|
80
81
|
pipeline.push({ $group: groupBy });
|
|
@@ -89,10 +90,11 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
|
|
|
89
90
|
});
|
|
90
91
|
});
|
|
91
92
|
const elementResults = yield collection.aggregate(pipeline, aggregateOptions).toArray();
|
|
92
|
-
debug(`Generated ${elementResults.length} feature(s) for ${element} element
|
|
93
|
+
debug(`Generated ${elementResults.length} feature(s) for ${element} element`, elementResults);
|
|
93
94
|
// Rearrange data so that we get ordered arrays indexed by element
|
|
94
95
|
elementResults.forEach(function (result) {
|
|
95
96
|
result.time = { [element]: result.time };
|
|
97
|
+
if (result.runTime) result.runTime = { [element]: result.runTime };
|
|
96
98
|
if (!singleTime && !isGeometry) {
|
|
97
99
|
// Set back the element values as properties because we aggregated in an accumulator
|
|
98
100
|
// to avoid conflict with non-aggregated feature properties
|
|
@@ -114,6 +116,9 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
|
|
|
114
116
|
// Merge with previous matching feature if any
|
|
115
117
|
if (previousResult) {
|
|
116
118
|
Object.assign(previousResult.time, result.time);
|
|
119
|
+
if (result.runTime) {
|
|
120
|
+
if (previousResult.runTime) Object.assign(previousResult.runTime, result.runTime);else previousResult.runTime = { [element]: result.runTime };
|
|
121
|
+
}
|
|
117
122
|
_lodash2.default.set(previousResult, prefix + element, _lodash2.default.get(result, prefix + element));
|
|
118
123
|
} else {
|
|
119
124
|
aggregatedResults.push(result);
|
|
@@ -262,27 +267,31 @@ function asGeoJson(options = {}) {
|
|
|
262
267
|
const params = hook.params;
|
|
263
268
|
const query = params.query;
|
|
264
269
|
if (!options.force && !params.asGeoJson) return;
|
|
265
|
-
if (query.$distinct) return; // Not applicable in this case
|
|
266
|
-
|
|
270
|
+
if (query.$distinct || query.$aggregation) return; // Not applicable in this case
|
|
271
|
+
const longitudeProperty = options.longitudeProperty || 'longitude';
|
|
272
|
+
const latitudeProperty = options.latitudeProperty || 'latitude';
|
|
273
|
+
const altitudeProperty = options.altitudeProperty || 'altitude';
|
|
274
|
+
const geometryProperty = options.geometryProperty || 'geometry';
|
|
275
|
+
let results = _lodash2.default.get(hook, options.dataPath || 'result');
|
|
267
276
|
// Already as GeoJson ?
|
|
268
277
|
if (results.type === 'FeatureCollection') return;
|
|
269
|
-
const
|
|
270
|
-
|
|
278
|
+
const isPaginated = !_lodash2.default.isNil(results.data);
|
|
279
|
+
const pagination = isPaginated ? _lodash2.default.pick(results, ['total', 'skip', 'limit']) : {};
|
|
280
|
+
results = isPaginated ? results.data : results;
|
|
271
281
|
results = results.filter(item => {
|
|
272
|
-
//
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
282
|
+
// Check if item is not already in GeoJson feature format and we can convert if required
|
|
283
|
+
return _lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty) ||
|
|
284
|
+
// When performing feature aggregation on geometries the result can be an array
|
|
285
|
+
Array.isArray(_lodash2.default.get(item, geometryProperty)) ||
|
|
286
|
+
// Check for a geometry property (previously provided or already transformed item)
|
|
287
|
+
_lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates');
|
|
278
288
|
}).map(item => {
|
|
279
289
|
let coordinates;
|
|
280
|
-
// Item locations are not already in GeoJson feature format so we need to convert
|
|
281
290
|
// Keep track of coordinates before picking properties
|
|
282
|
-
if (
|
|
283
|
-
coordinates = [_lodash2.default.get(item,
|
|
284
|
-
if (
|
|
285
|
-
coordinates.push(_lodash2.default.get(item,
|
|
291
|
+
if (_lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty)) {
|
|
292
|
+
coordinates = [_lodash2.default.get(item, longitudeProperty), _lodash2.default.get(item, latitudeProperty)];
|
|
293
|
+
if (_lodash2.default.has(item, altitudeProperty)) {
|
|
294
|
+
coordinates.push(_lodash2.default.get(item, altitudeProperty));
|
|
286
295
|
}
|
|
287
296
|
}
|
|
288
297
|
if (options.pick) {
|
|
@@ -291,11 +300,26 @@ function asGeoJson(options = {}) {
|
|
|
291
300
|
if (options.omit) {
|
|
292
301
|
item = _lodash2.default.omit(item, options.omit);
|
|
293
302
|
}
|
|
294
|
-
// Item locations are
|
|
295
|
-
if (
|
|
296
|
-
return Object.assign({
|
|
297
|
-
|
|
298
|
-
|
|
303
|
+
// Item locations are already in GeoJson format
|
|
304
|
+
if (_lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates')) {
|
|
305
|
+
return Object.assign({
|
|
306
|
+
type: 'Feature',
|
|
307
|
+
geometry: _lodash2.default.get(item, geometryProperty),
|
|
308
|
+
properties: {}
|
|
309
|
+
}, _lodash2.default.omit(item, [geometryProperty]));
|
|
310
|
+
} else if (Array.isArray(_lodash2.default.get(item, geometryProperty))) {
|
|
311
|
+
return Object.assign({
|
|
312
|
+
type: 'Feature',
|
|
313
|
+
geometry: { type: 'GeometryCollection', geometries: _lodash2.default.get(item, geometryProperty) },
|
|
314
|
+
properties: {}
|
|
315
|
+
}, _lodash2.default.omit(item, [geometryProperty]));
|
|
316
|
+
} else if (coordinates) {
|
|
317
|
+
// Item locations are not already in GeoJson feature format so we need to convert
|
|
318
|
+
return Object.assign({
|
|
319
|
+
type: 'Feature',
|
|
320
|
+
geometry: { type: 'Point', coordinates },
|
|
321
|
+
properties: {}
|
|
322
|
+
}, _lodash2.default.omit(item, [longitudeProperty, latitudeProperty]));
|
|
299
323
|
}
|
|
300
324
|
});
|
|
301
325
|
// Move some data to properties ?
|
|
@@ -307,16 +331,18 @@ function asGeoJson(options = {}) {
|
|
|
307
331
|
});
|
|
308
332
|
});
|
|
309
333
|
}
|
|
310
|
-
// Copy pagination information so that client can use it anyway
|
|
334
|
+
// Copy pagination information if any so that client can use it anyway
|
|
311
335
|
if (_lodash2.default.get(options, 'asFeatureCollection', true)) {
|
|
312
|
-
hook.result
|
|
336
|
+
_lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
|
|
313
337
|
type: 'FeatureCollection',
|
|
314
338
|
features: results
|
|
315
|
-
}, pagination);
|
|
316
|
-
} else {
|
|
317
|
-
hook.result
|
|
339
|
+
}, pagination)); // If no pagination this merged object will be empty
|
|
340
|
+
} else if (isPaginated) {
|
|
341
|
+
_lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
|
|
318
342
|
data: results
|
|
319
|
-
}, pagination);
|
|
343
|
+
}, pagination));
|
|
344
|
+
} else {
|
|
345
|
+
_lodash2.default.set(hook, options.dataPath || 'result', results);
|
|
320
346
|
}
|
|
321
347
|
};
|
|
322
348
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../map/api/hooks/hooks.query.js"],"names":["hook","query","params","service","$aggregate","collection","Model","featureId","options","featureIdType","ids","$groupBy","reduce","object","id","Object","assign","groupBy","_id","keys","_","singleTime","toNumber","$limit","map","key","feature","$first","time","$push","type","$last","properties","includes","geometry","match","omit","aggregateOptions","has","set","get","hint","aggregatedResults","Promise","all","element","isGeometry","prefix","pipeline","$geoNear","push","$match","$exists","$sort","$group","$replaceRoot","newRoot","debug","forEach","forOwn","stage","value","elementResults","aggregate","toArray","length","result","unset","resultKeys","pick","previousResult","find","aggregatedResultKeys","aggregatedResult","isEqual","aggregateFeaturesQuery","marshallGeometryQuery","marshallSpatialQuery","asGeoJson","isNil","centerLon","longitude","centerLat","latitude","distance","near","coordinates","maxDistance","distanceField","spherical","$geoWithin","$centerSphere","south","north","west","east","geometryQuery","$geoIntersects","$geometry","geoJson","force","$distinct","results","pagination","Array","isArray","data","filter","item","longitudeProperty","latitudeProperty","altitudeProperty","mapping","from","to","delete","features"],"mappings":"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","file":"hooks.query.js","sourcesContent":["import _ from 'lodash'\r\nimport { marshallGeometry } from '../marshall'\r\nimport makeDebug from 'debug'\r\n\r\nconst debug = makeDebug('kdk:map:query:hooks')\r\n\r\nexport function marshallGeometryQuery (hook) {\r\n const query = hook.params.query\r\n if (_.isNil(query)) return\r\n const geometry = query.geometry\r\n if (_.isNil(geometry)) return\r\n marshallGeometry(geometry)\r\n}\r\n\r\nexport function marshallSpatialQuery (hook) {\r\n const query = hook.params.query\r\n if (query) {\r\n if (!_.isNil(query.geometry)) marshallGeometry(query.geometry)\r\n // Shortcut for proximity query\r\n if ((!_.isNil(query.centerLon) || !_.isNil(query.longitude)) &&\r\n (!_.isNil(query.centerLat) || !_.isNil(query.latitude)) && !_.isNil(query.distance)) {\r\n const longitude = (_.isNil(query.centerLon) ? _.toNumber(query.longitude) : _.toNumber(query.centerLon))\r\n const latitude = (_.isNil(query.centerLat) ? _.toNumber(query.latitude) : _.toNumber(query.centerLat))\r\n const distance = _.toNumber(query.distance)\r\n // Transform to MongoDB spatial request\r\n delete query.centerLon\r\n delete query.longitude\r\n delete query.centerLat\r\n delete query.latitude\r\n delete query.distance\r\n // Aggregation requires a specific operator\r\n if (query.$aggregate) {\r\n query.$geoNear = {\r\n near: { type: 'Point', coordinates: [longitude, latitude] },\r\n maxDistance: distance,\r\n distanceField: 'distance',\r\n spherical: true\r\n }\r\n } else {\r\n /* We switched from $near to $geoWithin due to https://github.com/kalisio/kdk/issues/345\r\n query.geometry = {\r\n $near: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n },\r\n $maxDistance: distance\r\n }\r\n }\r\n */\r\n query.geometry = {\r\n $geoWithin: {\r\n $centerSphere: [[longitude, latitude], distance / 6378137.0] // Earth radius as in radians\r\n }\r\n }\r\n }\r\n }\r\n // Shortcut for bbox query\r\n if (!_.isNil(query.south) && !_.isNil(query.north) && !_.isNil(query.west) && !_.isNil(query.east)) {\r\n const south = _.toNumber(query.south)\r\n const north = _.toNumber(query.north)\r\n const west = _.toNumber(query.west)\r\n const east = _.toNumber(query.east)\r\n // Transform to MongoDB spatial request\r\n delete query.south\r\n delete query.north\r\n delete query.west\r\n delete query.east\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Polygon',\r\n coordinates: [ // BBox as a polygon\r\n [[west, south], [east, south], [east, north], [west, north], [west, south]] // Closing point\r\n ]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n // Shortcut for location query\r\n if (!_.isNil(query.longitude) && !_.isNil(query.latitude)) {\r\n const longitude = _.toNumber(query.longitude)\r\n const latitude = _.toNumber(query.latitude)\r\n // Transform to MongoDB spatial request\r\n delete query.longitude\r\n delete query.latitude\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n if (query.geoJson) {\r\n delete query.geoJson\r\n hook.params.asGeoJson = true\r\n }\r\n }\r\n}\r\n\r\nexport function asGeoJson (options = {}) {\r\n return function (hook) {\r\n const params = hook.params\r\n const query = params.query\r\n if (!options.force && !params.asGeoJson) return\r\n if (query.$distinct) return // Not applicable in this case\r\n let results = hook.result\r\n // Already as GeoJson ?\r\n if (results.type === 'FeatureCollection') return\r\n const pagination = _.pick(results, ['total', 'skip', 'limit'])\r\n results = Array.isArray(results) ? results : results.data\r\n results = results\r\n .filter(item => {\r\n // Item locations are not already in GeoJson feature format so we need to convert if we can\r\n if (options.longitudeProperty && options.latitudeProperty) {\r\n return _.has(item, options.longitudeProperty) && _.has(item, options.latitudeProperty)\r\n } else {\r\n return true\r\n }\r\n })\r\n .map(item => {\r\n let coordinates\r\n // Item locations are not already in GeoJson feature format so we need to convert\r\n // Keep track of coordinates before picking properties\r\n if (options.longitudeProperty && options.latitudeProperty) {\r\n coordinates = [_.get(item, options.longitudeProperty), _.get(item, options.latitudeProperty)]\r\n if (options.altitudeProperty && _.has(item, options.altitudeProperty)) {\r\n coordinates.push(_.get(item, options.altitudeProperty))\r\n }\r\n }\r\n if (options.pick) {\r\n item = _.pick(item, options.pick)\r\n }\r\n if (options.omit) {\r\n item = _.omit(item, options.omit)\r\n }\r\n // Item locations are not already in GeoJson feature format so we need to convert\r\n if (options.longitudeProperty && options.latitudeProperty) {\r\n return Object.assign({ type: 'Feature', geometry: { type: 'Point', coordinates }, properties: {} }, item)\r\n } else {\r\n return item\r\n }\r\n })\r\n // Move some data to properties ?\r\n if (options.properties) {\r\n results.forEach(item => {\r\n options.properties.forEach(mapping => {\r\n if (mapping.from) _.set(item, `properties.${mapping.to || mapping.from}`, _.get(item, `${mapping.from}`))\r\n if (mapping.delete) _.unset(item, `${mapping.from}`)\r\n })\r\n })\r\n }\r\n // Copy pagination information so that client can use it anyway\r\n if (_.get(options, 'asFeatureCollection', true)) {\r\n hook.result = Object.assign({\r\n type: 'FeatureCollection',\r\n features: results\r\n }, pagination)\r\n } else {\r\n hook.result = Object.assign({\r\n data: results\r\n }, pagination)\r\n }\r\n }\r\n}\r\n\r\nexport async function aggregateFeaturesQuery (hook) {\r\n const query = hook.params.query\r\n const service = hook.service\r\n if (!query) return\r\n // Perform aggregation\r\n if (query.$aggregate) {\r\n const collection = service.Model\r\n const featureId = (service.options ? service.options.featureId : '')\r\n const featureIdType = (service.options ? service.options.featureIdType : 'string')\r\n const ids = typeof query.$groupBy === 'string' // Group by matching ID(s), ie single ID or array of field to create a compound ID\r\n ? { [query.$groupBy]: '$properties.' + query.$groupBy }\r\n // Aggregated in an accumulator to avoid conflict with feature properties\r\n : query.$groupBy.reduce((object, id) => Object.assign(object, { [id]: '$properties.' + id }), {})\r\n const groupBy = { _id: ids }\r\n let keys = _.keys(ids)\r\n // Do we only keep first or last available time ?\r\n const singleTime = (_.toNumber(query.$limit) === 1)\r\n if (singleTime) {\r\n // When single time no aggregation is performed at all so we only have raw features\r\n keys = keys.map(key => 'properties.' + key)\r\n // In this case no need to aggregate on each element we simply keep the first feature\r\n // BUG: according to https://jira.mongodb.org/browse/SERVER-9507 MongoDB is not yet\r\n // able to optimize this kind of operations to avoid full index scan\r\n // For now we should restrict it to short time range\r\n Object.assign(groupBy, { feature: { $first: '$$ROOT' } })\r\n } else {\r\n Object.assign(groupBy, {\r\n time: { $push: '$time' }, // Keep track of all times\r\n type: { $last: '$type' }, // type is assumed similar for all results, keep last\r\n properties: { $last: '$properties' } // non-aggregated properties are assumed similar for all results, keep last\r\n })\r\n // Check if we aggregate geometry or simply properties\r\n if (!query.$aggregate.includes('geometry')) {\r\n Object.assign(groupBy, {\r\n geometry: { $last: '$geometry' } // geometry is assumed similar for all results, keep last\r\n })\r\n }\r\n }\r\n // The query contains the match stage except options relevent to the aggregation pipeline\r\n const match = _.omit(query, ['$groupBy', '$aggregate', '$geoNear', '$sort', '$limit', '$skip'])\r\n const aggregateOptions = {}\r\n // Check for any required type conversion (eg HTTP requests)\r\n if (featureId && _.has(match, 'properties.' + featureId)) {\r\n if (featureIdType === 'number') _.set(match, 'properties.' + featureId, _.toNumber(_.get(match, 'properties.' + featureId)))\r\n // Check if we could provide a hint to the aggregation when targeting feature ID\r\n // Indeed, in that case, we define the appropriate index\r\n aggregateOptions.hint = { ['properties.' + featureId]: 1 }\r\n }\r\n // Ensure we do not mix results with/without relevant element values\r\n // by separately querying each element then merging\r\n let aggregatedResults\r\n await Promise.all(query.$aggregate.map(async element => {\r\n const isGeometry = (element === 'geometry')\r\n // Geometry is a root property while others are feature properties\r\n const prefix = (isGeometry ? '' : 'properties.')\r\n const pipeline = []\r\n // Check for geometry stage\r\n if (query.$geoNear) {\r\n pipeline.push({ $geoNear: query.$geoNear })\r\n }\r\n // Find matching features only\r\n pipeline.push({ $match: Object.assign({ [prefix + element]: { $exists: true } }, match) })\r\n // Ensure they are ordered by increasing time by default\r\n pipeline.push({ $sort: query.$sort || { time: 1 } })\r\n // Keep track of all feature values\r\n if (singleTime) {\r\n pipeline.push({ $group: groupBy })\r\n pipeline.push({ $replaceRoot: { newRoot: '$feature' } })\r\n } else {\r\n pipeline.push({ $group: Object.assign({ [element]: { $push: '$' + prefix + element } }, groupBy) })\r\n }\r\n debug(`Aggregating ${element} element for features`)\r\n pipeline.forEach(stage => {\r\n _.forOwn(stage, (value, key) => debug('Stage', key, value))\r\n })\r\n const elementResults = await collection.aggregate(pipeline, aggregateOptions).toArray()\r\n debug(`Generated ${elementResults.length} feature(s) for ${element} element`)\r\n // Rearrange data so that we get ordered arrays indexed by element\r\n elementResults.forEach(result => {\r\n result.time = { [element]: result.time }\r\n if (!singleTime && !isGeometry) {\r\n // Set back the element values as properties because we aggregated in an accumulator\r\n // to avoid conflict with non-aggregated feature properties\r\n _.set(result, prefix + element, _.get(result, element))\r\n // Delete accumulator\r\n _.unset(result, element)\r\n }\r\n })\r\n // Now merge with previous element results\r\n if (!aggregatedResults) {\r\n aggregatedResults = elementResults\r\n } else {\r\n elementResults.forEach(result => {\r\n const resultKeys = _.pick(result, keys)\r\n const previousResult = aggregatedResults.find(aggregatedResult => {\r\n const aggregatedResultKeys = _.pick(aggregatedResult, keys)\r\n return _.isEqual(aggregatedResultKeys, resultKeys)\r\n })\r\n // Merge with previous matching feature if any\r\n if (previousResult) {\r\n Object.assign(previousResult.time, result.time)\r\n _.set(previousResult, prefix + element, _.get(result, prefix + element))\r\n } else {\r\n aggregatedResults.push(result)\r\n }\r\n })\r\n }\r\n }))\r\n delete query.$groupBy\r\n delete query.$aggregate\r\n delete query.$geoNear\r\n // Set result to avoid service DB call\r\n hook.result = aggregatedResults\r\n }\r\n return hook\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../map/api/hooks/hooks.query.js"],"names":["hook","query","params","service","$aggregate","collection","Model","featureId","options","featureIdType","ids","$groupBy","reduce","object","id","Object","assign","groupBy","_id","keys","_","singleTime","toNumber","$limit","map","key","feature","$first","time","$push","runTime","type","$last","properties","includes","geometry","match","omit","aggregateOptions","has","set","get","hint","aggregatedResults","Promise","all","element","isGeometry","prefix","pipeline","$geoNear","push","$match","$exists","$sort","$group","$replaceRoot","newRoot","debug","forEach","forOwn","stage","value","elementResults","aggregate","toArray","length","result","unset","resultKeys","pick","previousResult","find","aggregatedResultKeys","aggregatedResult","isEqual","aggregateFeaturesQuery","marshallGeometryQuery","marshallSpatialQuery","asGeoJson","isNil","centerLon","longitude","centerLat","latitude","distance","near","coordinates","maxDistance","distanceField","spherical","$geoWithin","$centerSphere","south","north","west","east","geometryQuery","$geoIntersects","$geometry","geoJson","force","$distinct","$aggregation","longitudeProperty","latitudeProperty","altitudeProperty","geometryProperty","results","dataPath","isPaginated","data","pagination","filter","item","Array","isArray","geometries","mapping","from","to","delete","features"],"mappings":"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","file":"hooks.query.js","sourcesContent":["import _ from 'lodash'\r\nimport { marshallGeometry } from '../marshall'\r\nimport makeDebug from 'debug'\r\n\r\nconst debug = makeDebug('kdk:map:query:hooks')\r\n\r\nexport function marshallGeometryQuery (hook) {\r\n const query = hook.params.query\r\n if (_.isNil(query)) return\r\n const geometry = query.geometry\r\n if (_.isNil(geometry)) return\r\n marshallGeometry(geometry)\r\n}\r\n\r\nexport function marshallSpatialQuery (hook) {\r\n const query = hook.params.query\r\n if (query) {\r\n if (!_.isNil(query.geometry)) marshallGeometry(query.geometry)\r\n // Shortcut for proximity query\r\n if ((!_.isNil(query.centerLon) || !_.isNil(query.longitude)) &&\r\n (!_.isNil(query.centerLat) || !_.isNil(query.latitude)) && !_.isNil(query.distance)) {\r\n const longitude = (_.isNil(query.centerLon) ? _.toNumber(query.longitude) : _.toNumber(query.centerLon))\r\n const latitude = (_.isNil(query.centerLat) ? _.toNumber(query.latitude) : _.toNumber(query.centerLat))\r\n const distance = _.toNumber(query.distance)\r\n // Transform to MongoDB spatial request\r\n delete query.centerLon\r\n delete query.longitude\r\n delete query.centerLat\r\n delete query.latitude\r\n delete query.distance\r\n // Aggregation requires a specific operator\r\n if (query.$aggregate) {\r\n query.$geoNear = {\r\n near: { type: 'Point', coordinates: [longitude, latitude] },\r\n maxDistance: distance,\r\n distanceField: 'distance',\r\n spherical: true\r\n }\r\n } else {\r\n /* We switched from $near to $geoWithin due to https://github.com/kalisio/kdk/issues/345\r\n query.geometry = {\r\n $near: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n },\r\n $maxDistance: distance\r\n }\r\n }\r\n */\r\n query.geometry = {\r\n $geoWithin: {\r\n $centerSphere: [[longitude, latitude], distance / 6378137.0] // Earth radius as in radians\r\n }\r\n }\r\n }\r\n }\r\n // Shortcut for bbox query\r\n if (!_.isNil(query.south) && !_.isNil(query.north) && !_.isNil(query.west) && !_.isNil(query.east)) {\r\n const south = _.toNumber(query.south)\r\n const north = _.toNumber(query.north)\r\n const west = _.toNumber(query.west)\r\n const east = _.toNumber(query.east)\r\n // Transform to MongoDB spatial request\r\n delete query.south\r\n delete query.north\r\n delete query.west\r\n delete query.east\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Polygon',\r\n coordinates: [ // BBox as a polygon\r\n [[west, south], [east, south], [east, north], [west, north], [west, south]] // Closing point\r\n ]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n // Shortcut for location query\r\n if (!_.isNil(query.longitude) && !_.isNil(query.latitude)) {\r\n const longitude = _.toNumber(query.longitude)\r\n const latitude = _.toNumber(query.latitude)\r\n // Transform to MongoDB spatial request\r\n delete query.longitude\r\n delete query.latitude\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n if (query.geoJson) {\r\n delete query.geoJson\r\n hook.params.asGeoJson = true\r\n }\r\n }\r\n}\r\n\r\nexport function asGeoJson (options = {}) {\r\n return function (hook) {\r\n const params = hook.params\r\n const query = params.query\r\n if (!options.force && !params.asGeoJson) return\r\n if (query.$distinct || query.$aggregation) return // Not applicable in this case\r\n const longitudeProperty = (options.longitudeProperty || 'longitude')\r\n const latitudeProperty = (options.latitudeProperty || 'latitude')\r\n const altitudeProperty = (options.altitudeProperty || 'altitude')\r\n const geometryProperty = (options.geometryProperty || 'geometry')\r\n let results = _.get(hook, options.dataPath || 'result')\r\n // Already as GeoJson ?\r\n if (results.type === 'FeatureCollection') return\r\n const isPaginated = !_.isNil(results.data)\r\n const pagination = (isPaginated ? _.pick(results, ['total', 'skip', 'limit']) : {})\r\n results = (isPaginated ? results.data : results)\r\n results = results\r\n .filter(item => {\r\n // Check if item is not already in GeoJson feature format and we can convert if required\r\n return (_.has(item, longitudeProperty) && _.has(item, latitudeProperty)) ||\r\n // When performing feature aggregation on geometries the result can be an array\r\n Array.isArray(_.get(item, geometryProperty)) ||\r\n // Check for a geometry property (previously provided or already transformed item)\r\n (_.has(item, geometryProperty + '.type') && _.has(item, geometryProperty + '.coordinates'))\r\n })\r\n .map(item => {\r\n let coordinates\r\n // Keep track of coordinates before picking properties\r\n if (_.has(item, longitudeProperty) && _.has(item, latitudeProperty)) {\r\n coordinates = [_.get(item, longitudeProperty), _.get(item, latitudeProperty)]\r\n if (_.has(item, altitudeProperty)) {\r\n coordinates.push(_.get(item, altitudeProperty))\r\n }\r\n }\r\n if (options.pick) {\r\n item = _.pick(item, options.pick)\r\n }\r\n if (options.omit) {\r\n item = _.omit(item, options.omit)\r\n }\r\n // Item locations are already in GeoJson format\r\n if (_.has(item, geometryProperty + '.type') && _.has(item, geometryProperty + '.coordinates')) {\r\n return Object.assign({\r\n type: 'Feature',\r\n geometry: _.get(item, geometryProperty),\r\n properties: {}\r\n }, _.omit(item, [geometryProperty]))\r\n } else if (Array.isArray(_.get(item, geometryProperty))) {\r\n return Object.assign({\r\n type: 'Feature',\r\n geometry: { type: 'GeometryCollection', geometries: _.get(item, geometryProperty) },\r\n properties: {}\r\n }, _.omit(item, [geometryProperty]))\r\n } else if (coordinates) {\r\n // Item locations are not already in GeoJson feature format so we need to convert\r\n return Object.assign({\r\n type: 'Feature',\r\n geometry: { type: 'Point', coordinates },\r\n properties: {}\r\n }, _.omit(item, [longitudeProperty, latitudeProperty]))\r\n }\r\n })\r\n // Move some data to properties ?\r\n if (options.properties) {\r\n results.forEach(item => {\r\n options.properties.forEach(mapping => {\r\n if (mapping.from) _.set(item, `properties.${mapping.to || mapping.from}`, _.get(item, `${mapping.from}`))\r\n if (mapping.delete) _.unset(item, `${mapping.from}`)\r\n })\r\n })\r\n }\r\n // Copy pagination information if any so that client can use it anyway\r\n if (_.get(options, 'asFeatureCollection', true)) {\r\n _.set(hook, options.dataPath || 'result', Object.assign({\r\n type: 'FeatureCollection',\r\n features: results\r\n }, pagination)) // If no pagination this merged object will be empty\r\n } else if (isPaginated) {\r\n _.set(hook, options.dataPath || 'result', Object.assign({\r\n data: results\r\n }, pagination))\r\n } else {\r\n _.set(hook, options.dataPath || 'result', results)\r\n }\r\n }\r\n}\r\n\r\nexport async function aggregateFeaturesQuery (hook) {\r\n const query = hook.params.query\r\n const service = hook.service\r\n if (!query) return\r\n // Perform aggregation\r\n if (query.$aggregate) {\r\n const collection = service.Model\r\n const featureId = (service.options ? service.options.featureId : '')\r\n const featureIdType = (service.options ? service.options.featureIdType : 'string')\r\n const ids = typeof query.$groupBy === 'string' // Group by matching ID(s), ie single ID or array of field to create a compound ID\r\n ? { [query.$groupBy]: '$properties.' + query.$groupBy }\r\n // Aggregated in an accumulator to avoid conflict with feature properties\r\n : query.$groupBy.reduce((object, id) => Object.assign(object, { [id]: '$properties.' + id }), {})\r\n const groupBy = { _id: ids }\r\n let keys = _.keys(ids)\r\n // Do we only keep first or last available time ?\r\n const singleTime = (_.toNumber(query.$limit) === 1)\r\n if (singleTime) {\r\n // When single time no aggregation is performed at all so we only have raw features\r\n keys = keys.map(key => 'properties.' + key)\r\n // In this case no need to aggregate on each element we simply keep the first feature\r\n // BUG: according to https://jira.mongodb.org/browse/SERVER-9507 MongoDB is not yet\r\n // able to optimize this kind of operations to avoid full index scan\r\n // For now we should restrict it to short time range\r\n Object.assign(groupBy, { feature: { $first: '$$ROOT' } })\r\n } else {\r\n Object.assign(groupBy, {\r\n time: { $push: '$time' }, // Keep track of all times\r\n runTime: { $push: '$runTime' }, // Keep track of all run times\r\n type: { $last: '$type' }, // type is assumed similar for all results, keep last\r\n properties: { $last: '$properties' } // non-aggregated properties are assumed similar for all results, keep last\r\n })\r\n // Check if we aggregate geometry or simply properties\r\n if (!query.$aggregate.includes('geometry')) {\r\n Object.assign(groupBy, {\r\n geometry: { $last: '$geometry' } // geometry is assumed similar for all results, keep last\r\n })\r\n }\r\n }\r\n // The query contains the match stage except options relevent to the aggregation pipeline\r\n const match = _.omit(query, ['$groupBy', '$aggregate', '$geoNear', '$sort', '$limit', '$skip'])\r\n const aggregateOptions = {}\r\n // Check for any required type conversion (eg HTTP requests)\r\n if (featureId && _.has(match, 'properties.' + featureId)) {\r\n if (featureIdType === 'number') _.set(match, 'properties.' + featureId, _.toNumber(_.get(match, 'properties.' + featureId)))\r\n // Check if we could provide a hint to the aggregation when targeting feature ID\r\n // Indeed, in that case, we define the appropriate index\r\n aggregateOptions.hint = { ['properties.' + featureId]: 1 }\r\n }\r\n // Ensure we do not mix results with/without relevant element values\r\n // by separately querying each element then merging\r\n let aggregatedResults\r\n await Promise.all(query.$aggregate.map(async element => {\r\n const isGeometry = (element === 'geometry')\r\n // Geometry is a root property while others are feature properties\r\n const prefix = (isGeometry ? '' : 'properties.')\r\n const pipeline = []\r\n // Check for geometry stage\r\n if (query.$geoNear) {\r\n pipeline.push({ $geoNear: query.$geoNear })\r\n }\r\n // Find matching features only\r\n pipeline.push({ $match: Object.assign({ [prefix + element]: { $exists: true } }, match) })\r\n // Ensure they are ordered by increasing time by default and most recent forecast first\r\n pipeline.push({ $sort: Object.assign({ time: 1, runTime: -1 }, query.$sort) })\r\n // Keep track of all feature values\r\n if (singleTime) {\r\n pipeline.push({ $group: groupBy })\r\n pipeline.push({ $replaceRoot: { newRoot: '$feature' } })\r\n } else {\r\n pipeline.push({ $group: Object.assign({ [element]: { $push: '$' + prefix + element } }, groupBy) })\r\n }\r\n debug(`Aggregating ${element} element for features`)\r\n pipeline.forEach(stage => {\r\n _.forOwn(stage, (value, key) => debug('Stage', key, value))\r\n })\r\n const elementResults = await collection.aggregate(pipeline, aggregateOptions).toArray()\r\n debug(`Generated ${elementResults.length} feature(s) for ${element} element`, elementResults)\r\n // Rearrange data so that we get ordered arrays indexed by element\r\n elementResults.forEach(result => {\r\n result.time = { [element]: result.time }\r\n if (result.runTime) result.runTime = { [element]: result.runTime }\r\n if (!singleTime && !isGeometry) {\r\n // Set back the element values as properties because we aggregated in an accumulator\r\n // to avoid conflict with non-aggregated feature properties\r\n _.set(result, prefix + element, _.get(result, element))\r\n // Delete accumulator\r\n _.unset(result, element)\r\n }\r\n })\r\n // Now merge with previous element results\r\n if (!aggregatedResults) {\r\n aggregatedResults = elementResults\r\n } else {\r\n elementResults.forEach(result => {\r\n const resultKeys = _.pick(result, keys)\r\n const previousResult = aggregatedResults.find(aggregatedResult => {\r\n const aggregatedResultKeys = _.pick(aggregatedResult, keys)\r\n return _.isEqual(aggregatedResultKeys, resultKeys)\r\n })\r\n // Merge with previous matching feature if any\r\n if (previousResult) {\r\n Object.assign(previousResult.time, result.time)\r\n if (result.runTime) {\r\n if (previousResult.runTime) Object.assign(previousResult.runTime, result.runTime)\r\n else previousResult.runTime = { [element]: result.runTime }\r\n }\r\n _.set(previousResult, prefix + element, _.get(result, prefix + element))\r\n } else {\r\n aggregatedResults.push(result)\r\n }\r\n })\r\n }\r\n }))\r\n delete query.$groupBy\r\n delete query.$aggregate\r\n delete query.$geoNear\r\n // Set result to avoid service DB call\r\n hook.result = aggregatedResults\r\n }\r\n return hook\r\n}\r\n"]}
|
|
@@ -13,7 +13,7 @@ function simplifyResult(hook) {
|
|
|
13
13
|
module.exports = {
|
|
14
14
|
before: {
|
|
15
15
|
all: [_api.hooks.marshallTimeQuery, _api.hooks.convertObjectIDs(['layer'])],
|
|
16
|
-
find: [_api.hooks.marshallComparisonQuery, _api.hooks.marshallSortQuery, _hooks.marshallSpatialQuery, _api.hooks.distinct, _hooks.aggregateFeaturesQuery],
|
|
16
|
+
find: [_api.hooks.marshallComparisonQuery, _api.hooks.marshallSortQuery, _hooks.marshallSpatialQuery, _api.hooks.distinct, _hooks.aggregateFeaturesQuery, _api.hooks.aggregationQuery],
|
|
17
17
|
get: [],
|
|
18
18
|
create: [_api.hooks.processTimes(['time'])],
|
|
19
19
|
update: [_api.hooks.processTimes(['time'])],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../map/api/services/features/features.hooks.js"],"names":["simplifyResult","hook","Array","isArray","result","map","item","_id","module","exports","before","all","coreHooks","marshallTimeQuery","convertObjectIDs","find","marshallComparisonQuery","marshallSortQuery","marshallSpatialQuery","distinct","aggregateFeaturesQuery","get","create","processTimes","update","patch","remove","after","unprocessTimes","force","skipEvents","error"],"mappings":";;AAAA;;AACA;;AAEA,SAASA,cAAT,CAAyBC,IAAzB,EAA+B;AAC7B;AACA,MAAIC,MAAMC,OAAN,CAAcF,KAAKG,MAAnB,CAAJ,EAAgCH,KAAKG,MAAL,GAAcH,KAAKG,MAAL,CAAYC,GAAZ,CAAgBC,SAAS,EAAEC,KAAKD,KAAKC,GAAZ,EAAT,CAAhB,CAAd;AAChC,SAAON,IAAP;AACD;;AAEDO,OAAOC,OAAP,GAAiB;AACfC,UAAQ;AACNC,SAAK,CAACC,WAAUC,iBAAX,EAA8BD,WAAUE,gBAAV,CAA2B,CAAC,OAAD,CAA3B,CAA9B,CADC;AAENC,UAAM,CAACH,WAAUI,uBAAX,EAAoCJ,WAAUK,iBAA9C,EAAiEC,2BAAjE,EACJN,WAAUO,QADN,EACgBC,6BADhB,CAFA;AAINC,SAAK,EAJC;AAKNC,YAAQ,
|
|
1
|
+
{"version":3,"sources":["../../../../../map/api/services/features/features.hooks.js"],"names":["simplifyResult","hook","Array","isArray","result","map","item","_id","module","exports","before","all","coreHooks","marshallTimeQuery","convertObjectIDs","find","marshallComparisonQuery","marshallSortQuery","marshallSpatialQuery","distinct","aggregateFeaturesQuery","aggregationQuery","get","create","processTimes","update","patch","remove","after","unprocessTimes","force","skipEvents","error"],"mappings":";;AAAA;;AACA;;AAEA,SAASA,cAAT,CAAyBC,IAAzB,EAA+B;AAC7B;AACA,MAAIC,MAAMC,OAAN,CAAcF,KAAKG,MAAnB,CAAJ,EAAgCH,KAAKG,MAAL,GAAcH,KAAKG,MAAL,CAAYC,GAAZ,CAAgBC,SAAS,EAAEC,KAAKD,KAAKC,GAAZ,EAAT,CAAhB,CAAd;AAChC,SAAON,IAAP;AACD;;AAEDO,OAAOC,OAAP,GAAiB;AACfC,UAAQ;AACNC,SAAK,CAACC,WAAUC,iBAAX,EAA8BD,WAAUE,gBAAV,CAA2B,CAAC,OAAD,CAA3B,CAA9B,CADC;AAENC,UAAM,CAACH,WAAUI,uBAAX,EAAoCJ,WAAUK,iBAA9C,EAAiEC,2BAAjE,EACJN,WAAUO,QADN,EACgBC,6BADhB,EACwCR,WAAUS,gBADlD,CAFA;AAINC,SAAK,EAJC;AAKNC,YAAQ,CAACX,WAAUY,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CALF;AAMNC,YAAQ,CAACb,WAAUY,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CANF;AAONE,WAAO,CAACd,WAAUY,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CAPD;AAQNG,YAAQ,CAACf,WAAUI,uBAAX,EAAoCE,2BAApC;AARF,GADO;;AAYfU,SAAO;AACLjB,SAAK,CAACC,WAAUiB,cAAV,CAAyB,CAAC,MAAD,CAAzB,CAAD,CADA;AAELd,UAAM,CAAC,sBAAU,EAAEe,OAAO,IAAT,EAAV,CAAD,CAFD;AAGLR,SAAK,EAHA;AAIL;AACAC,YAAQ,CAACvB,cAAD,EAAiBY,WAAUmB,UAA3B,CALH;AAMLN,YAAQ,CAACzB,cAAD,EAAiBY,WAAUmB,UAA3B,CANH;AAOLL,WAAO,CAAC1B,cAAD,EAAiBY,WAAUmB,UAA3B,CAPF;AAQLJ,YAAQ,CAAC3B,cAAD,EAAiBY,WAAUmB,UAA3B;AARH,GAZQ;;AAuBfC,SAAO;AACLrB,SAAK,EADA;AAELI,UAAM,EAFD;AAGLO,SAAK,EAHA;AAILC,YAAQ,EAJH;AAKLE,YAAQ,EALH;AAMLC,WAAO,EANF;AAOLC,YAAQ;AAPH;AAvBQ,CAAjB","file":"features.hooks.js","sourcesContent":["import { hooks as coreHooks } from '../../../../core/api'\r\nimport { marshallSpatialQuery, aggregateFeaturesQuery, asGeoJson } from '../../hooks'\r\n\r\nfunction simplifyResult (hook) {\r\n // Only keep track of object IDs so that caller can at least get them if required\r\n if (Array.isArray(hook.result)) hook.result = hook.result.map(item => ({ _id: item._id }))\r\n return hook\r\n}\r\n\r\nmodule.exports = {\r\n before: {\r\n all: [coreHooks.marshallTimeQuery, coreHooks.convertObjectIDs(['layer'])],\r\n find: [coreHooks.marshallComparisonQuery, coreHooks.marshallSortQuery, marshallSpatialQuery,\r\n coreHooks.distinct, aggregateFeaturesQuery, coreHooks.aggregationQuery],\r\n get: [],\r\n create: [coreHooks.processTimes(['time'])],\r\n update: [coreHooks.processTimes(['time'])],\r\n patch: [coreHooks.processTimes(['time'])],\r\n remove: [coreHooks.marshallComparisonQuery, marshallSpatialQuery]\r\n },\r\n\r\n after: {\r\n all: [coreHooks.unprocessTimes(['time'])],\r\n find: [asGeoJson({ force: true })],\r\n get: [],\r\n // Avoid emitting events and full result on feature edition because we usually proceed with big batches\r\n create: [simplifyResult, coreHooks.skipEvents],\r\n update: [simplifyResult, coreHooks.skipEvents],\r\n patch: [simplifyResult, coreHooks.skipEvents],\r\n remove: [simplifyResult, coreHooks.skipEvents]\r\n },\r\n\r\n error: {\r\n all: [],\r\n find: [],\r\n get: [],\r\n create: [],\r\n update: [],\r\n patch: [],\r\n remove: []\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="q-pl-sm q-pr-xs row justify-center items-center no-wrap q-gutter-x-xs">
|
|
3
|
+
<q-select
|
|
4
|
+
v-model="resolution"
|
|
5
|
+
:options="getResolutions()"
|
|
6
|
+
dense
|
|
7
|
+
borderless>
|
|
8
|
+
<template v-slot:option="scope">
|
|
9
|
+
<q-item v-bind="scope.itemProps" v-on="scope.itemEvents">
|
|
10
|
+
<q-item-section>
|
|
11
|
+
<q-item-label v-html="scope.opt.label" />
|
|
12
|
+
</q-item-section>
|
|
13
|
+
<q-item-section side>
|
|
14
|
+
<q-item-label caption>{{ scope.opt.description }}</q-item-label>
|
|
15
|
+
</q-item-section>
|
|
16
|
+
</q-item>
|
|
17
|
+
</template>
|
|
18
|
+
</q-select>
|
|
19
|
+
<q-input
|
|
20
|
+
v-model.number="width"
|
|
21
|
+
type="number"
|
|
22
|
+
min="256" max="4000"
|
|
23
|
+
mask="(#)###"
|
|
24
|
+
borderless
|
|
25
|
+
dense
|
|
26
|
+
input-class="text-center"
|
|
27
|
+
style="max-width: 54px" />
|
|
28
|
+
<span>x</span>
|
|
29
|
+
<q-input
|
|
30
|
+
v-model.number="height"
|
|
31
|
+
type="number"
|
|
32
|
+
min="256" max="4000"
|
|
33
|
+
mask="(#)###"
|
|
34
|
+
borderless
|
|
35
|
+
dense
|
|
36
|
+
input-class="text-center"
|
|
37
|
+
style="max-width: 54px" />
|
|
38
|
+
<k-action
|
|
39
|
+
id="capture-button"
|
|
40
|
+
icon="las la-camera"
|
|
41
|
+
tooltip="KCaptureToolbar.CAPTURE_ACTION"
|
|
42
|
+
:handler="() => this.capture()" />
|
|
43
|
+
</div>
|
|
44
|
+
</template>
|
|
45
|
+
|
|
46
|
+
<script>
|
|
47
|
+
import _ from 'lodash'
|
|
48
|
+
import { Events, Time } from '../../../core/client'
|
|
49
|
+
import { exportFile } from 'quasar'
|
|
50
|
+
|
|
51
|
+
export default {
|
|
52
|
+
name: 'k-capture-toolbar',
|
|
53
|
+
inject: ['kActivity'],
|
|
54
|
+
data () {
|
|
55
|
+
return {
|
|
56
|
+
width: 1280,
|
|
57
|
+
height: 720,
|
|
58
|
+
resolution: undefined
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
watch: {
|
|
62
|
+
resolution: {
|
|
63
|
+
immediate: true,
|
|
64
|
+
handler (value) {
|
|
65
|
+
if (!value) this.resolution = this.getResolutions()[1]
|
|
66
|
+
else {
|
|
67
|
+
const size = _.split(this.resolution.value, 'x')
|
|
68
|
+
this.width = size[0]
|
|
69
|
+
this.height = size[1]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
width: {
|
|
74
|
+
handler (value) {
|
|
75
|
+
if (value < 256) this.width = 256
|
|
76
|
+
if (value > 4000) this.width = 4000
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
height: {
|
|
80
|
+
handler (value) {
|
|
81
|
+
if (value < 256) this.height = 256
|
|
82
|
+
if (value > 4000) this.height = 4000
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
methods: {
|
|
87
|
+
getResolutions () {
|
|
88
|
+
return [
|
|
89
|
+
{ label: this.$t('KCaptureToolbar.SD_LABEL'), description: this.$t('KCaptureToolbar.SD_DESCRIPTION'), value: '640x480' },
|
|
90
|
+
{ label: this.$t('KCaptureToolbar.HD_LABEL'), description: this.$t('KCaptureToolbar.HD_DESCRIPTION'), value: '1280x720' },
|
|
91
|
+
{ label: this.$t('KCaptureToolbar.FHD_LABEL'), description: this.$t('KCaptureToolbar.FHD_DESCRIPTION'), value: '1920x1080' },
|
|
92
|
+
{ label: this.$t('KCaptureToolbar.QHD_LABEL'), description: this.$t('KCaptureToolbar.QHD_DESCRIPTION'), value: '2560x1440' },
|
|
93
|
+
{ label: this.$t('KCaptureToolbar.2K_LABEL'), description: this.$t('KCaptureToolbar.2K_DESCRIPTION'), value: '2048x1080' },
|
|
94
|
+
{ label: this.$t('KCaptureToolbar.4K_LABEL'), description: this.$t('KCaptureToolbar.4K_DESCRIPTION'), value: '3840x2160' }
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
async capture () {
|
|
98
|
+
// Retrieve the layers
|
|
99
|
+
const layers = []
|
|
100
|
+
const contextLayers = this.kActivity.getContextParameters('layers').layers
|
|
101
|
+
_.forEach(contextLayers, layer => {
|
|
102
|
+
const isVisibleByDefaut = _.get(this.kActivity.layers[layer], 'leaflet.isVisible', false)
|
|
103
|
+
if (!isVisibleByDefaut) layers.push(layer)
|
|
104
|
+
})
|
|
105
|
+
// Retrieve the extension
|
|
106
|
+
const bbox = this.kActivity.getContextParameters('view')
|
|
107
|
+
// Setup the request url options
|
|
108
|
+
const endpoint = this.$config('gateway') + '/capture'
|
|
109
|
+
const options = {
|
|
110
|
+
method: 'POST',
|
|
111
|
+
mode: 'cors',
|
|
112
|
+
body: JSON.stringify({
|
|
113
|
+
activity: this.kActivity.is3D() ? 'globe' : 'map',
|
|
114
|
+
layers,
|
|
115
|
+
bbox: [bbox.west, bbox.south, bbox.east, bbox.north],
|
|
116
|
+
size: { width: +this.width, height: +this.height },
|
|
117
|
+
time: Time.getCurrentTime().toISOString()
|
|
118
|
+
}),
|
|
119
|
+
headers: {
|
|
120
|
+
'Content-Type': 'application/json'
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Add the Authorization header if jwt is defined
|
|
124
|
+
const jwt = this.$api.get('storage').getItem(this.$config('gatewayJwt'))
|
|
125
|
+
if (jwt) options.headers.Authorization = 'Bearer ' + jwt
|
|
126
|
+
// Perform the request
|
|
127
|
+
let dismiss = null
|
|
128
|
+
try {
|
|
129
|
+
dismiss = this.$q.notify({
|
|
130
|
+
group: 'capture',
|
|
131
|
+
icon: 'las la-hourglass-half',
|
|
132
|
+
message: this.$t('KCaptureToolbar.CAPTURING_VIEW'),
|
|
133
|
+
color: 'primary',
|
|
134
|
+
timeout: 0,
|
|
135
|
+
spinner: true
|
|
136
|
+
})
|
|
137
|
+
const response = await fetch(endpoint, options)
|
|
138
|
+
dismiss()
|
|
139
|
+
if (response.ok) {
|
|
140
|
+
const arrayBuffer = await response.arrayBuffer()
|
|
141
|
+
exportFile('capture.png', new Uint8Array(arrayBuffer))
|
|
142
|
+
} else {
|
|
143
|
+
Events.$emit('error', { message: this.$t('errors.' + response.status) })
|
|
144
|
+
}
|
|
145
|
+
} catch (error) {
|
|
146
|
+
// Network error
|
|
147
|
+
dismiss()
|
|
148
|
+
Events.$emit('error', { message: this.$t('errors.NETWORK_ERROR') })
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
beforeCreate () {
|
|
153
|
+
this.$options.components['k-action'] = this.$load('frame/KAction')
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
</script>
|