@kalisio/kdk 1.3.5 → 1.4.2
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/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +1 -0
- package/.nyc_output/{0b8aa700-8daa-49ce-85e7-a8f8965d55f0.json → 2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json} +0 -0
- package/.nyc_output/{20df4355-911a-4b16-a8ab-d3392e9f0a7f.json → 81d21e46-766a-46bc-b1b7-143ca577347a.json} +0 -0
- package/.nyc_output/a762cb58-70dc-4d39-ab69-928635affa98.json +1 -0
- package/.nyc_output/{257af0bb-96c3-465a-b5ef-a1df60078d5f.json → aaf3ebbb-f895-4d7b-9255-bc5dee832570.json} +0 -0
- package/.nyc_output/{284aebfa-23fd-425f-9d72-e4b8904dc224.json → dbeb2602-0ac2-4e66-978b-0d29548359ca.json} +0 -0
- package/.nyc_output/{5cbee06e-be6e-468a-bd78-4793ee785fe4.json → e47d1e4c-2fff-4dcb-908f-d3081162547c.json} +0 -0
- package/.nyc_output/processinfo/{2bece194-92f7-4971-a688-10604044a7fa.json → 2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json} +1 -1
- package/.nyc_output/processinfo/2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json +1 -0
- package/.nyc_output/processinfo/81d21e46-766a-46bc-b1b7-143ca577347a.json +1 -0
- package/.nyc_output/processinfo/a762cb58-70dc-4d39-ab69-928635affa98.json +1 -0
- package/.nyc_output/processinfo/aaf3ebbb-f895-4d7b-9255-bc5dee832570.json +1 -0
- package/.nyc_output/processinfo/dbeb2602-0ac2-4e66-978b-0d29548359ca.json +1 -0
- package/.nyc_output/processinfo/e47d1e4c-2fff-4dcb-908f-d3081162547c.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/CHANGELOG.md +189 -67
- package/README.md +1 -1
- package/coverage/core/api/application.js.html +145 -145
- package/coverage/core/api/authentication.js.html +37 -37
- package/coverage/core/api/db.js.html +74 -74
- package/coverage/core/api/hooks/hooks.account.js.html +15 -15
- package/coverage/core/api/hooks/hooks.authentication.js.html +16 -16
- package/coverage/core/api/hooks/hooks.authorisations.js.html +112 -121
- package/coverage/core/api/hooks/hooks.devices.js.html +5 -5
- package/coverage/core/api/hooks/hooks.groups.js.html +3 -3
- package/coverage/core/api/hooks/hooks.logger.js.html +7 -7
- package/coverage/core/api/hooks/hooks.model.js.html +149 -149
- package/coverage/core/api/hooks/hooks.organisations.js.html +13 -61
- package/coverage/core/api/hooks/hooks.pusher.js.html +7 -7
- package/coverage/core/api/hooks/hooks.query.js.html +68 -32
- package/coverage/core/api/hooks/hooks.service.js.html +15 -15
- package/coverage/core/api/hooks/hooks.storage.js.html +5 -5
- package/coverage/core/api/hooks/hooks.tags.js.html +7 -7
- package/coverage/core/api/hooks/hooks.users.js.html +111 -63
- package/coverage/core/api/hooks/index.html +72 -72
- package/coverage/core/api/hooks/index.js.html +15 -15
- package/coverage/core/api/index.html +35 -35
- package/coverage/core/api/index.js.html +13 -13
- package/coverage/core/api/marshall.js.html +81 -81
- package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
- package/coverage/core/api/models/index.html +1 -1
- package/coverage/core/api/models/organisations.model.mongodb.js.html +1 -1
- package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
- package/coverage/core/api/models/users.model.mongodb.js.html +7 -7
- package/coverage/core/api/oauth2-handler.js.html +3 -3
- package/coverage/core/api/oauth2-verifier.js.html +5 -5
- package/coverage/core/api/services/account/account.hooks.js.html +1 -1
- package/coverage/core/api/services/account/account.service.js.html +34 -34
- package/coverage/core/api/services/account/index.html +17 -17
- package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +3 -3
- package/coverage/core/api/services/authorisations/authorisations.service.js.html +40 -37
- package/coverage/core/api/services/authorisations/index.html +17 -17
- package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
- package/coverage/core/api/services/databases/databases.service.js.html +1 -1
- package/coverage/core/api/services/databases/index.html +1 -1
- package/coverage/core/api/services/devices/devices.hooks.js.html +1 -1
- package/coverage/core/api/services/devices/devices.service.js.html +1 -1
- package/coverage/core/api/services/devices/index.html +1 -1
- package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
- package/coverage/core/api/services/groups/index.html +1 -1
- package/coverage/core/api/services/index.html +5 -5
- package/coverage/core/api/services/index.js.html +40 -40
- package/coverage/core/api/services/mailer/index.html +1 -1
- package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
- package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
- package/coverage/core/api/services/organisations/index.html +1 -1
- package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
- package/coverage/core/api/services/organisations/organisations.service.js.html +1 -1
- package/coverage/core/api/services/pusher/index.html +1 -1
- package/coverage/core/api/services/pusher/pusher.channels.js.html +1 -1
- package/coverage/core/api/services/pusher/pusher.hooks.js.html +1 -1
- package/coverage/core/api/services/pusher/pusher.service.js.html +1 -1
- package/coverage/core/api/services/storage/index.html +1 -1
- package/coverage/core/api/services/storage/storage.hooks.js.html +4 -4
- package/coverage/core/api/services/tags/index.html +1 -1
- package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
- package/coverage/core/api/services/users/index.html +1 -1
- package/coverage/core/api/services/users/users.hooks.js.html +12 -12
- package/coverage/core/common/index.html +32 -32
- package/coverage/core/common/index.js.html +27 -27
- package/coverage/core/common/permissions.js.html +135 -75
- package/coverage/index.html +157 -157
- package/coverage/lcov-report/core/api/application.js.html +145 -145
- package/coverage/lcov-report/core/api/authentication.js.html +37 -37
- package/coverage/lcov-report/core/api/db.js.html +74 -74
- package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +15 -15
- package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +16 -16
- package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +112 -121
- package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +5 -5
- package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +3 -3
- package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +7 -7
- package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +149 -149
- package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +13 -61
- package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +7 -7
- package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +68 -32
- package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +15 -15
- package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +5 -5
- package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +7 -7
- package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +111 -63
- package/coverage/lcov-report/core/api/hooks/index.html +72 -72
- package/coverage/lcov-report/core/api/hooks/index.js.html +15 -15
- package/coverage/lcov-report/core/api/index.html +35 -35
- package/coverage/lcov-report/core/api/index.js.html +13 -13
- package/coverage/lcov-report/core/api/marshall.js.html +81 -81
- package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/core/api/models/index.html +1 -1
- package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +7 -7
- package/coverage/lcov-report/core/api/oauth2-handler.js.html +3 -3
- package/coverage/lcov-report/core/api/oauth2-verifier.js.html +5 -5
- package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/account/account.service.js.html +34 -34
- package/coverage/lcov-report/core/api/services/account/index.html +17 -17
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +3 -3
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +40 -37
- package/coverage/lcov-report/core/api/services/authorisations/index.html +17 -17
- package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
- package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
- package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +1 -1
- package/coverage/lcov-report/core/api/services/devices/index.html +1 -1
- package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
- package/coverage/lcov-report/core/api/services/index.html +5 -5
- package/coverage/lcov-report/core/api/services/index.js.html +40 -40
- package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
- package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
- package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
- package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +1 -1
- package/coverage/lcov-report/core/api/services/pusher/index.html +1 -1
- package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +1 -1
- package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +1 -1
- package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
- package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +4 -4
- package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
- package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/users/index.html +1 -1
- package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +12 -12
- package/coverage/lcov-report/core/common/index.html +32 -32
- package/coverage/lcov-report/core/common/index.js.html +27 -27
- package/coverage/lcov-report/core/common/permissions.js.html +135 -75
- package/coverage/lcov-report/index.html +157 -157
- package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +55 -55
- package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +337 -274
- package/coverage/lcov-report/map/api/hooks/index.html +43 -43
- package/coverage/lcov-report/map/api/hooks/index.js.html +12 -12
- package/coverage/lcov-report/map/api/index.html +31 -31
- package/coverage/lcov-report/map/api/index.js.html +24 -24
- package/coverage/lcov-report/map/api/marshall.js.html +39 -39
- package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +20 -20
- package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +22 -22
- package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +24 -24
- package/coverage/lcov-report/map/api/models/index.html +43 -43
- package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +21 -21
- package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +156 -156
- package/coverage/lcov-report/map/api/services/alerts/index.html +30 -30
- package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +19 -19
- package/coverage/lcov-report/map/api/services/catalog/index.html +17 -17
- 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 +20 -20
- package/coverage/lcov-report/map/api/services/features/index.html +21 -21
- package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +8 -8
- package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +99 -99
- package/coverage/lcov-report/map/api/services/geocoder/index.html +28 -28
- package/coverage/lcov-report/map/api/services/index.html +21 -21
- package/coverage/lcov-report/map/api/services/index.js.html +71 -71
- package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +68 -68
- package/coverage/lcov-report/map/common/errors.js.html +9 -9
- package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +120 -120
- package/coverage/lcov-report/map/common/grid.js.html +268 -268
- package/coverage/lcov-report/map/common/index.html +149 -149
- package/coverage/lcov-report/map/common/index.js.html +31 -31
- package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +71 -71
- package/coverage/lcov-report/map/common/moment-utils.js.html +14 -14
- package/coverage/lcov-report/map/common/opendap-grid-source.js.html +280 -280
- package/coverage/lcov-report/map/common/opendap-utils.js.html +220 -220
- package/coverage/lcov-report/map/common/permissions.js.html +21 -21
- package/coverage/lcov-report/map/common/time-based-grid-source.js.html +51 -51
- package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/wcs-grid-source.js.html +99 -99
- package/coverage/lcov-report/map/common/wcs-utils.js.html +66 -66
- package/coverage/lcov-report/map/common/weacast-grid-source.js.html +196 -196
- 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 +3588 -3659
- package/coverage/map/api/hooks/hooks.catalog.js.html +55 -55
- package/coverage/map/api/hooks/hooks.query.js.html +337 -274
- package/coverage/map/api/hooks/index.html +43 -43
- package/coverage/map/api/hooks/index.js.html +12 -12
- package/coverage/map/api/index.html +31 -31
- package/coverage/map/api/index.js.html +24 -24
- package/coverage/map/api/marshall.js.html +39 -39
- package/coverage/map/api/models/alerts.model.mongodb.js.html +20 -20
- package/coverage/map/api/models/catalog.model.mongodb.js.html +22 -22
- package/coverage/map/api/models/features.model.mongodb.js.html +24 -24
- package/coverage/map/api/models/index.html +43 -43
- package/coverage/map/api/services/alerts/alerts.hooks.js.html +21 -21
- package/coverage/map/api/services/alerts/alerts.service.js.html +156 -156
- package/coverage/map/api/services/alerts/index.html +30 -30
- package/coverage/map/api/services/catalog/catalog.hooks.js.html +19 -19
- package/coverage/map/api/services/catalog/index.html +17 -17
- 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 +20 -20
- package/coverage/map/api/services/features/index.html +21 -21
- package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +8 -8
- package/coverage/map/api/services/geocoder/geocoder.service.js.html +99 -99
- package/coverage/map/api/services/geocoder/index.html +28 -28
- package/coverage/map/api/services/index.html +21 -21
- package/coverage/map/api/services/index.js.html +71 -71
- package/coverage/map/common/dynamic-grid-source.js.html +68 -68
- package/coverage/map/common/errors.js.html +9 -9
- package/coverage/map/common/geotiff-grid-source.js.html +120 -120
- package/coverage/map/common/grid.js.html +268 -268
- package/coverage/map/common/index.html +149 -149
- package/coverage/map/common/index.js.html +31 -31
- package/coverage/map/common/meteo-model-grid-source.js.html +71 -71
- package/coverage/map/common/moment-utils.js.html +14 -14
- package/coverage/map/common/opendap-grid-source.js.html +280 -280
- package/coverage/map/common/opendap-utils.js.html +220 -220
- package/coverage/map/common/permissions.js.html +21 -21
- package/coverage/map/common/time-based-grid-source.js.html +51 -51
- package/coverage/map/common/tms-utils.js.html +1 -1
- package/coverage/map/common/wcs-grid-source.js.html +99 -99
- package/coverage/map/common/wcs-utils.js.html +66 -66
- package/coverage/map/common/weacast-grid-source.js.html +196 -196
- 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/testcafe/page-models/map/catalog.js +2 -2
- 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/KForm.vue +0 -12
- package/lib/core/client/components/form/KIconField.vue +1 -0
- package/lib/core/client/components/form/KItemField.vue +8 -4
- 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/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 +133 -93
- package/lib/core/client/i18n/core_fr.json +56 -16
- package/lib/core/client/index.js +28 -14
- package/lib/core/client/index.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/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 +48 -27
- 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/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 +15 -7
- package/lib/map/client/components/KFeaturesTable.vue +27 -2
- package/lib/map/client/components/KLayerEditionToolbar.vue +43 -0
- package/lib/map/client/components/KLayerStyleEditor.vue +10 -4
- package/lib/map/client/components/KLayerStyleForm.vue +14 -11
- package/lib/map/client/components/KLocationInput.vue +126 -65
- package/lib/map/client/components/KLocationMap.vue +199 -84
- package/lib/map/client/components/KPositionIndicator.vue +1 -0
- package/lib/map/client/components/KTimeline.vue +41 -36
- 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 +28 -8
- package/lib/map/client/components/catalog/KLayerCategories.vue +86 -62
- package/lib/map/client/components/catalog/KLayersSelector.vue +42 -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 +21 -2
- 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 +39 -29
- package/lib/map/client/i18n/map_en.json +65 -17
- package/lib/map/client/i18n/map_fr.json +67 -20
- package/lib/map/client/init.js +18 -6
- 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/GradientPath.js.map +1 -1
- package/lib/map/client/leaflet/MaskLayer.js +64 -0
- package/lib/map/client/leaflet/MaskLayer.js.map +1 -0
- package/lib/map/client/mixins/globe/mixin.base-globe.js +4 -1
- 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/index.js +8 -13
- package/lib/map/client/mixins/index.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.base-map.js +30 -6
- package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.canvas-layers.js +274 -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 +25 -18
- package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.geojson-layers.js +18 -10
- 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.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/mixin.activity.js +60 -68
- package/lib/map/client/mixins/mixin.activity.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 +7 -5
- package/lib/map/client/mixins/mixin.feature-service.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/utils.js +50 -0
- 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 +204 -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 +191 -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 +17 -9
- package/test.client.js +1 -0
- package/tests/core/test-log-2021-07-15.log +71 -0
- package/tests/core/test-log-2021-09-02.log +47 -0
- package/tests/map/test-log-%DATE%.logYYYY-07-DD +12 -0
- package/tests/map/test-log-%DATE%.logYYYY-09-DD +6 -0
- package/tests/map/test-log-2021-07-12.log +12 -0
- package/tests/map/test-log-2021-07-15.log +5 -0
- package/tests/map/test-log-2021-09-02.log +3 -0
- package/.nyc_output/11cd93d8-69cb-405c-98a3-d249ea35b6da.json +0 -1
- package/.nyc_output/2bece194-92f7-4971-a688-10604044a7fa.json +0 -1
- package/.nyc_output/5ddee33e-b658-4c8e-a247-54f575ac67e8.json +0 -1
- package/.nyc_output/78760ae4-555f-4d9c-a6a1-acf5e2f0fe45.json +0 -1
- package/.nyc_output/d0bb2559-084e-4c92-b9e6-29a9abd41f7c.json +0 -1
- package/.nyc_output/processinfo/0b8aa700-8daa-49ce-85e7-a8f8965d55f0.json +0 -1
- package/.nyc_output/processinfo/11cd93d8-69cb-405c-98a3-d249ea35b6da.json +0 -1
- package/.nyc_output/processinfo/20df4355-911a-4b16-a8ab-d3392e9f0a7f.json +0 -1
- package/.nyc_output/processinfo/257af0bb-96c3-465a-b5ef-a1df60078d5f.json +0 -1
- package/.nyc_output/processinfo/284aebfa-23fd-425f-9d72-e4b8904dc224.json +0 -1
- package/.nyc_output/processinfo/5cbee06e-be6e-468a-bd78-4793ee785fe4.json +0 -1
- package/.nyc_output/processinfo/5ddee33e-b658-4c8e-a247-54f575ac67e8.json +0 -1
- package/.nyc_output/processinfo/78760ae4-555f-4d9c-a6a1-acf5e2f0fe45.json +0 -1
- package/.nyc_output/processinfo/d0bb2559-084e-4c92-b9e6-29a9abd41f7c.json +0 -1
- 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 -415
- package/tests/core/client.test.js.skip +0 -37
- package/tests/core/config/default.js +0 -97
- 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 -418
- 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 -59
- 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/grid-sources.test.js +0 -304
- package/tests/map/hooks.test.js +0 -96
- package/tests/map/index.test.js +0 -333
|
@@ -3,10 +3,47 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.RESOURCE_TYPE_KEY = exports.RESOURCE_TYPE = exports.RoleNames = exports.Roles = undefined;
|
|
6
|
+
exports.defineAbilities = exports.RESOURCE_TYPE_KEY = exports.RESOURCE_TYPE = exports.RoleNames = exports.Roles = undefined;
|
|
7
|
+
|
|
8
|
+
// Compute abilities for a given user
|
|
9
|
+
let defineAbilities = exports.defineAbilities = (() => {
|
|
10
|
+
var _ref = _asyncToGenerator(function* (subject, ...args) {
|
|
11
|
+
const { rules, can, cannot } = _umd.AbilityBuilder.extract();
|
|
12
|
+
|
|
13
|
+
// Run registered hooks providing any additional arguments used to handle complex use cases
|
|
14
|
+
yield Promise.all(hooks.map((() => {
|
|
15
|
+
var _ref2 = _asyncToGenerator(function* (hook) {
|
|
16
|
+
yield hook(subject, can, cannot, ...args);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
return function (_x2) {
|
|
20
|
+
return _ref2.apply(this, arguments);
|
|
21
|
+
};
|
|
22
|
+
})()));
|
|
23
|
+
|
|
24
|
+
// CASL cannot infer the object type from the object itself so we need
|
|
25
|
+
// to tell it how he can find the object type, i.e. service name.
|
|
26
|
+
return new _umd.Ability(rules, {
|
|
27
|
+
subjectName: function (resource) {
|
|
28
|
+
if (!resource || typeof resource === 'string') {
|
|
29
|
+
return resource;
|
|
30
|
+
}
|
|
31
|
+
return resource[RESOURCE_TYPE_KEY];
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
return function defineAbilities(_x) {
|
|
37
|
+
return _ref.apply(this, arguments);
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
|
|
41
|
+
exports.isSeniorRole = isSeniorRole;
|
|
42
|
+
exports.isJuniorRole = isJuniorRole;
|
|
43
|
+
exports.getSeniorRoles = getSeniorRoles;
|
|
44
|
+
exports.getJuniorRoles = getJuniorRoles;
|
|
7
45
|
exports.defineResourceRules = defineResourceRules;
|
|
8
46
|
exports.defineUserAbilities = defineUserAbilities;
|
|
9
|
-
exports.defineAbilities = defineAbilities;
|
|
10
47
|
exports.hasServiceAbilities = hasServiceAbilities;
|
|
11
48
|
exports.hasResourceAbilities = hasResourceAbilities;
|
|
12
49
|
exports.removeContext = removeContext;
|
|
@@ -31,6 +68,8 @@ var _umd = require('casl/dist/umd');
|
|
|
31
68
|
|
|
32
69
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
33
70
|
|
|
71
|
+
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
|
72
|
+
|
|
34
73
|
// Define some alias to simplify ability definitions
|
|
35
74
|
_umd.Ability.addAlias('update', 'patch');
|
|
36
75
|
_umd.Ability.addAlias('read', ['get', 'find']);
|
|
@@ -45,6 +84,30 @@ const Roles = exports.Roles = {
|
|
|
45
84
|
|
|
46
85
|
const RoleNames = exports.RoleNames = ['member', 'manager', 'owner'];
|
|
47
86
|
|
|
87
|
+
function isSeniorRole(roleName, juniorName) {
|
|
88
|
+
return Roles[roleName] >= Roles[juniorName];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function isJuniorRole(roleName, seniorName) {
|
|
92
|
+
return Roles[roleName] < Roles[seniorName];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function getSeniorRoles(roleName) {
|
|
96
|
+
const seniorRoles = [];
|
|
97
|
+
_lodash2.default.forEach(Roles, role => {
|
|
98
|
+
if (Roles[roleName] < role) seniorRoles.push(RoleNames[role]);
|
|
99
|
+
});
|
|
100
|
+
return seniorRoles;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function getJuniorRoles(roleName) {
|
|
104
|
+
const juniorRoles = [];
|
|
105
|
+
_lodash2.default.forEach(Roles, role => {
|
|
106
|
+
if (Roles[roleName] >= role) juniorRoles.push(RoleNames[role]);
|
|
107
|
+
});
|
|
108
|
+
return juniorRoles;
|
|
109
|
+
}
|
|
110
|
+
|
|
48
111
|
// Hooks that can be added to customize abilities computation
|
|
49
112
|
let hooks = [];
|
|
50
113
|
|
|
@@ -105,25 +168,6 @@ function defineUserAbilities(subject, can, cannot) {
|
|
|
105
168
|
}
|
|
106
169
|
}
|
|
107
170
|
|
|
108
|
-
// Compute abilities for a given user
|
|
109
|
-
function defineAbilities(subject) {
|
|
110
|
-
const { rules, can, cannot } = _umd.AbilityBuilder.extract();
|
|
111
|
-
|
|
112
|
-
// Run registered hooks
|
|
113
|
-
hooks.forEach(hook => hook(subject, can, cannot));
|
|
114
|
-
|
|
115
|
-
// CASL cannot infer the object type from the object itself so we need
|
|
116
|
-
// to tell it how he can find the object type, i.e. service name.
|
|
117
|
-
return new _umd.Ability(rules, {
|
|
118
|
-
subjectName: resource => {
|
|
119
|
-
if (!resource || typeof resource === 'string') {
|
|
120
|
-
return resource;
|
|
121
|
-
}
|
|
122
|
-
return resource[RESOURCE_TYPE_KEY];
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
171
|
defineAbilities.registerHook = function (hook) {
|
|
128
172
|
if (!hooks.includes(hook)) {
|
|
129
173
|
hooks.push(hook);
|
|
@@ -240,8 +284,6 @@ function defineOrganisationAbilities(subject, can, cannot) {
|
|
|
240
284
|
can(['read', 'create', 'remove'], 'storage', { context: organisation._id });
|
|
241
285
|
}
|
|
242
286
|
if (role >= Roles.manager) {
|
|
243
|
-
// The unique identifier of a service is its path not its name.
|
|
244
|
-
// Indeed we have for instance a 'groups' service in each organisation.
|
|
245
287
|
can('update', 'members', { context: organisation._id });
|
|
246
288
|
can('update', 'tags', { context: organisation._id });
|
|
247
289
|
can('create', 'groups', { context: organisation._id });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../core/common/permissions.js"],"names":["defineResourceRules","defineUserAbilities","defineAbilities","hasServiceAbilities","hasResourceAbilities","removeContext","getQueryForAbilities","findSubjectsForResource","countSubjectsForResource","defineOrganisationAbilities","defineGroupAbilities","findMembersOfOrganisation","countMembersOfOrganisation","findMembersOfGroup","countMembersOfGroup","getRoleForOrganisation","getRoleForGroup","findGroupsWithRole","Ability","addAlias","Roles","member","manager","owner","RoleNames","hooks","RESOURCE_TYPE","RESOURCE_TYPE_KEY","Symbol","for","subject","resource","resourceService","can","role","permissions","_id","cannot","id","toString","$regex","rules","AbilityBuilder","extract","forEach","hook","subjectName","registerHook","includes","push","unregisterHook","filter","registeredHook","abilities","service","path","getPath","_","replace","operation","resourceType","context","object","Object","assign","result","query","forOwn","value","key","Array","isArray","item","isEmpty","rulesFor","cloneDeep","buildSubjectsQueryForResource","resourceScope","resourceId","$elemMatch","set","subjectService","find","$limit","organisations","organisation","groups","group","usersService","organisationId","membersService","groupId","user","isUndefined","undefined"],"mappings":"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","file":"permissions.js","sourcesContent":["import _ from 'lodash'\r\nimport { Ability, AbilityBuilder, toMongoQuery } from 'casl/dist/umd'\r\n\r\n// Define some alias to simplify ability definitions\r\nAbility.addAlias('update', 'patch')\r\nAbility.addAlias('read', ['get', 'find'])\r\nAbility.addAlias('remove', 'delete')\r\nAbility.addAlias('all', ['read', 'create', 'update', 'remove'])\r\n\r\nexport const Roles = {\r\n member: 0,\r\n manager: 1,\r\n owner: 2\r\n}\r\n\r\nexport const RoleNames = [\r\n 'member',\r\n 'manager',\r\n 'owner'\r\n]\r\n\r\n// Hooks that can be added to customize abilities computation\r\nlet hooks = []\r\n\r\n// Get the unique global symbol to store resource type / context on a resource object\r\nexport const RESOURCE_TYPE = 'type'\r\nexport const RESOURCE_TYPE_KEY = Symbol.for(RESOURCE_TYPE)\r\n\r\nexport function defineResourceRules (subject, resource, resourceService, can) {\r\n const role = Roles[resource.permissions]\r\n\r\n if (role >= Roles.member) {\r\n can('read', resourceService, { _id: resource._id })\r\n }\r\n if (role >= Roles.manager) {\r\n can('update', resourceService, { _id: resource._id })\r\n can(['create', 'remove'], 'authorisations', { resource: resource._id })\r\n }\r\n if (role >= Roles.owner) {\r\n can('remove', resourceService, { _id: resource._id })\r\n }\r\n}\r\n\r\n// Hook computing default abilities for a given user\r\nexport function defineUserAbilities (subject, can, cannot) {\r\n // Allow user registration\r\n can('service', 'users')\r\n can('create', 'users')\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n\r\n if (subject && subject._id) {\r\n // Read user profiles for authorizing\r\n can('read', 'users')\r\n // Update user profile and destroy it\r\n can(['update', 'remove'], 'users', { _id: subject._id })\r\n // Access authorisation service, then rights will be granted on a per-resource basis\r\n can('service', 'authorisations')\r\n // Access storage service, then rights will be granted on a per-resource basis\r\n can('service', 'storage')\r\n // This is for the user avatar\r\n // take care that the storage service uses 'id' as input but produces _id as output\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() })\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n // Avatar is part of user profiles so that they can be read by any\r\n can('read', 'storage', { _id: { $regex: '^avatars/*' } })\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n }\r\n}\r\n\r\n// Compute abilities for a given user\r\nexport function defineAbilities (subject) {\r\n const { rules, can, cannot } = AbilityBuilder.extract()\r\n\r\n // Run registered hooks\r\n hooks.forEach(hook => hook(subject, can, cannot))\r\n\r\n // CASL cannot infer the object type from the object itself so we need\r\n // to tell it how he can find the object type, i.e. service name.\r\n return new Ability(rules, {\r\n subjectName: resource => {\r\n if (!resource || typeof resource === 'string') {\r\n return resource\r\n }\r\n return resource[RESOURCE_TYPE_KEY]\r\n }\r\n })\r\n}\r\n\r\ndefineAbilities.registerHook = function (hook) {\r\n if (!hooks.includes(hook)) {\r\n hooks.push(hook)\r\n }\r\n}\r\n\r\ndefineAbilities.unregisterHook = function (hook) {\r\n hooks = hooks.filter(registeredHook => registeredHook !== hook)\r\n}\r\n\r\nexport function hasServiceAbilities (abilities, service) {\r\n if (!abilities) return false\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation\r\n // Take care that in client we have the service path while on server we have the actual object\r\n const path = typeof service === 'string' ? service : service.getPath()\r\n return abilities.can('service', path) || abilities.can('service', _.replace(path, /^.*\\//, '*/'))\r\n}\r\n\r\nexport function hasResourceAbilities (abilities, operation, resourceType, context, resource) {\r\n if (!abilities) return false\r\n // Create a shallow copy adding context and type\r\n const object = Object.assign({}, resource)\r\n object[RESOURCE_TYPE_KEY] = resourceType\r\n // Add a virtual context to take it into account for object having no link to it\r\n if (context) object.context = (typeof context === 'object' ? context._id.toString() : context.toString())\r\n\r\n const result = abilities.can(operation, object)\r\n\r\n return result\r\n}\r\n\r\n// Utility function used to remove the virtual context from query\r\nexport function removeContext (query) {\r\n _.forOwn(query, (value, key) => {\r\n // Process current attributes or recurse\r\n // Take care to nested fields like 'field._id'\r\n if (key === 'context') {\r\n delete query.context\r\n } else if (Array.isArray(value)) {\r\n value.forEach(item => removeContext(item))\r\n // Remove empty objects from array\r\n // _.remove(value, item => _.isEmpty(item))\r\n // Remove empty arrays from query\r\n if (_.isEmpty(value)) delete query[key]\r\n } else if (typeof value === 'object') {\r\n removeContext(value)\r\n // Remove empty objects from query\r\n if (_.isEmpty(value)) delete query[key]\r\n }\r\n })\r\n return query\r\n}\r\n\r\n// Get the query used to filter the objects according to given abilities\r\n// A null query indicates that access should not be granted\r\nexport function getQueryForAbilities (abilities, operation, resourceType) {\r\n if (!abilities) return null\r\n\r\n const rules = abilities.rulesFor(operation, resourceType)\r\n const query = toMongoQuery(rules)\r\n // Remove any context to avoid taking it into account because it is not really stored on objects\r\n // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)\r\n return (query ? removeContext(_.cloneDeep(query)) : null)\r\n}\r\n\r\nfunction buildSubjectsQueryForResource (resourceScope, resourceId, role) {\r\n const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }\r\n if (role) {\r\n _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? role : RoleNames[role]))\r\n }\r\n return query\r\n}\r\n\r\nexport function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\nexport function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Indicate we'd only like to count\r\n query.$limit = 0\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\n// Hook computing organisation abilities for a given user\r\nexport function defineOrganisationAbilities (subject, can, cannot) {\r\n if (subject) {\r\n // Create new organisations\r\n can('service', 'organisations')\r\n can('create', 'organisations')\r\n\r\n if (subject.organisations) {\r\n subject.organisations.forEach(organisation => {\r\n if (organisation._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, organisation, 'organisations', can)\r\n // Specific rules for organisations\r\n const role = Roles[organisation.permissions]\r\n if (role >= Roles.member) {\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation.\r\n can('service', organisation._id.toString() + '/members')\r\n can('read', 'members', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/tags')\r\n can('read', 'tags', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/groups')\r\n can('service', organisation._id.toString() + '/storage')\r\n can(['read', 'create', 'remove'], 'storage', { context: organisation._id })\r\n }\r\n if (role >= Roles.manager) {\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation.\r\n can('update', 'members', { context: organisation._id })\r\n can('update', 'tags', { context: organisation._id })\r\n can('create', 'groups', { context: organisation._id })\r\n can(['create', 'remove'], 'tags', { context: organisation._id })\r\n // Remove invited members\r\n can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })\r\n }\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Hook computing group abilities for a given user\r\nexport function defineGroupAbilities (subject, can, cannot) {\r\n if (subject) {\r\n if (subject.groups) {\r\n subject.groups.forEach(group => {\r\n if (group._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, group, 'groups', can)\r\n // No specific rules for groups\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Helper functions to find the members of a given organisation\r\nexport function findMembersOfOrganisation (usersService, organisationId, role) {\r\n return findSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\nexport function countMembersOfOrganisation (usersService, organisationId, role) {\r\n return countSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\n// Helper functions to find the members of a given group\r\nexport function findMembersOfGroup (membersService, groupId, role) {\r\n return findSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function countMembersOfGroup (membersService, groupId, role) {\r\n return countSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function getRoleForOrganisation (user, organisationId) {\r\n const result = _.find(user.organisations, { _id: organisationId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function getRoleForGroup (user, organisationId, groupId) {\r\n const result = _.find(user.groups, { context: organisationId, _id: groupId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function findGroupsWithRole (user, organisationId, role) {\r\n return _.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../core/common/permissions.js"],"names":["subject","args","rules","can","cannot","AbilityBuilder","extract","Promise","all","hooks","map","hook","Ability","subjectName","resource","RESOURCE_TYPE_KEY","defineAbilities","isSeniorRole","isJuniorRole","getSeniorRoles","getJuniorRoles","defineResourceRules","defineUserAbilities","hasServiceAbilities","hasResourceAbilities","removeContext","getQueryForAbilities","findSubjectsForResource","countSubjectsForResource","defineOrganisationAbilities","defineGroupAbilities","findMembersOfOrganisation","countMembersOfOrganisation","findMembersOfGroup","countMembersOfGroup","getRoleForOrganisation","getRoleForGroup","findGroupsWithRole","addAlias","Roles","member","manager","owner","RoleNames","roleName","juniorName","seniorName","seniorRoles","_","forEach","role","push","juniorRoles","RESOURCE_TYPE","Symbol","for","resourceService","permissions","_id","id","toString","$regex","registerHook","includes","unregisterHook","filter","registeredHook","abilities","service","path","getPath","replace","operation","resourceType","context","object","Object","assign","result","query","forOwn","value","key","Array","isArray","item","isEmpty","rulesFor","cloneDeep","buildSubjectsQueryForResource","resourceScope","resourceId","$elemMatch","set","subjectService","find","$limit","organisations","organisation","groups","group","usersService","organisationId","membersService","groupId","user","isUndefined","undefined"],"mappings":"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","file":"permissions.js","sourcesContent":["import _ from 'lodash'\r\nimport { Ability, AbilityBuilder, toMongoQuery } from 'casl/dist/umd'\r\n\r\n// Define some alias to simplify ability definitions\r\nAbility.addAlias('update', 'patch')\r\nAbility.addAlias('read', ['get', 'find'])\r\nAbility.addAlias('remove', 'delete')\r\nAbility.addAlias('all', ['read', 'create', 'update', 'remove'])\r\n\r\nexport const Roles = {\r\n member: 0,\r\n manager: 1,\r\n owner: 2\r\n}\r\n\r\nexport const RoleNames = [\r\n 'member',\r\n 'manager',\r\n 'owner'\r\n]\r\n\r\nexport function isSeniorRole (roleName, juniorName) {\r\n return Roles[roleName] >= Roles[juniorName]\r\n}\r\n\r\nexport function isJuniorRole (roleName, seniorName) {\r\n return Roles[roleName] < Roles[seniorName]\r\n}\r\n\r\nexport function getSeniorRoles (roleName) {\r\n const seniorRoles = []\r\n _.forEach(Roles, role => { if (Roles[roleName] < role) seniorRoles.push(RoleNames[role]) })\r\n return seniorRoles\r\n}\r\n\r\nexport function getJuniorRoles (roleName) {\r\n const juniorRoles = []\r\n _.forEach(Roles, role => { if (Roles[roleName] >= role) juniorRoles.push(RoleNames[role]) })\r\n return juniorRoles\r\n}\r\n\r\n// Hooks that can be added to customize abilities computation\r\nlet hooks = []\r\n\r\n// Get the unique global symbol to store resource type / context on a resource object\r\nexport const RESOURCE_TYPE = 'type'\r\nexport const RESOURCE_TYPE_KEY = Symbol.for(RESOURCE_TYPE)\r\n\r\nexport function defineResourceRules (subject, resource, resourceService, can) {\r\n const role = Roles[resource.permissions]\r\n\r\n if (role >= Roles.member) {\r\n can('read', resourceService, { _id: resource._id })\r\n }\r\n if (role >= Roles.manager) {\r\n can('update', resourceService, { _id: resource._id })\r\n can(['create', 'remove'], 'authorisations', { resource: resource._id })\r\n }\r\n if (role >= Roles.owner) {\r\n can('remove', resourceService, { _id: resource._id })\r\n }\r\n}\r\n\r\n// Hook computing default abilities for a given user\r\nexport function defineUserAbilities (subject, can, cannot) {\r\n // Allow user registration\r\n can('service', 'users')\r\n can('create', 'users')\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n\r\n if (subject && subject._id) {\r\n // Read user profiles for authorizing\r\n can('read', 'users')\r\n // Update user profile and destroy it\r\n can(['update', 'remove'], 'users', { _id: subject._id })\r\n // Access authorisation service, then rights will be granted on a per-resource basis\r\n can('service', 'authorisations')\r\n // Access storage service, then rights will be granted on a per-resource basis\r\n can('service', 'storage')\r\n // This is for the user avatar\r\n // take care that the storage service uses 'id' as input but produces _id as output\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() })\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n // Avatar is part of user profiles so that they can be read by any\r\n can('read', 'storage', { _id: { $regex: '^avatars/*' } })\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n }\r\n}\r\n\r\n// Compute abilities for a given user\r\nexport async function defineAbilities (subject, ...args) {\r\n const { rules, can, cannot } = AbilityBuilder.extract()\r\n\r\n // Run registered hooks providing any additional arguments used to handle complex use cases\r\n await Promise.all(hooks.map(async hook => {\r\n await hook(subject, can, cannot, ...args)\r\n }))\r\n\r\n // CASL cannot infer the object type from the object itself so we need\r\n // to tell it how he can find the object type, i.e. service name.\r\n return new Ability(rules, {\r\n subjectName: resource => {\r\n if (!resource || typeof resource === 'string') {\r\n return resource\r\n }\r\n return resource[RESOURCE_TYPE_KEY]\r\n }\r\n })\r\n}\r\n\r\ndefineAbilities.registerHook = function (hook) {\r\n if (!hooks.includes(hook)) {\r\n hooks.push(hook)\r\n }\r\n}\r\n\r\ndefineAbilities.unregisterHook = function (hook) {\r\n hooks = hooks.filter(registeredHook => registeredHook !== hook)\r\n}\r\n\r\nexport function hasServiceAbilities (abilities, service) {\r\n if (!abilities) return false\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation\r\n // Take care that in client we have the service path while on server we have the actual object\r\n const path = typeof service === 'string' ? service : service.getPath()\r\n return abilities.can('service', path) || abilities.can('service', _.replace(path, /^.*\\//, '*/'))\r\n}\r\n\r\nexport function hasResourceAbilities (abilities, operation, resourceType, context, resource) {\r\n if (!abilities) return false\r\n // Create a shallow copy adding context and type\r\n const object = Object.assign({}, resource)\r\n object[RESOURCE_TYPE_KEY] = resourceType\r\n // Add a virtual context to take it into account for object having no link to it\r\n if (context) object.context = (typeof context === 'object' ? context._id.toString() : context.toString())\r\n\r\n const result = abilities.can(operation, object)\r\n\r\n return result\r\n}\r\n\r\n// Utility function used to remove the virtual context from query\r\nexport function removeContext (query) {\r\n _.forOwn(query, (value, key) => {\r\n // Process current attributes or recurse\r\n // Take care to nested fields like 'field._id'\r\n if (key === 'context') {\r\n delete query.context\r\n } else if (Array.isArray(value)) {\r\n value.forEach(item => removeContext(item))\r\n // Remove empty objects from array\r\n // _.remove(value, item => _.isEmpty(item))\r\n // Remove empty arrays from query\r\n if (_.isEmpty(value)) delete query[key]\r\n } else if (typeof value === 'object') {\r\n removeContext(value)\r\n // Remove empty objects from query\r\n if (_.isEmpty(value)) delete query[key]\r\n }\r\n })\r\n return query\r\n}\r\n\r\n// Get the query used to filter the objects according to given abilities\r\n// A null query indicates that access should not be granted\r\nexport function getQueryForAbilities (abilities, operation, resourceType) {\r\n if (!abilities) return null\r\n\r\n const rules = abilities.rulesFor(operation, resourceType)\r\n const query = toMongoQuery(rules)\r\n // Remove any context to avoid taking it into account because it is not really stored on objects\r\n // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)\r\n return (query ? removeContext(_.cloneDeep(query)) : null)\r\n}\r\n\r\nfunction buildSubjectsQueryForResource (resourceScope, resourceId, role) {\r\n const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }\r\n if (role) {\r\n _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? role : RoleNames[role]))\r\n }\r\n return query\r\n}\r\n\r\nexport function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\nexport function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Indicate we'd only like to count\r\n query.$limit = 0\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\n// Hook computing organisation abilities for a given user\r\nexport function defineOrganisationAbilities (subject, can, cannot) {\r\n if (subject) {\r\n // Create new organisations\r\n can('service', 'organisations')\r\n can('create', 'organisations')\r\n\r\n if (subject.organisations) {\r\n subject.organisations.forEach(organisation => {\r\n if (organisation._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, organisation, 'organisations', can)\r\n // Specific rules for organisations\r\n const role = Roles[organisation.permissions]\r\n if (role >= Roles.member) {\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation.\r\n can('service', organisation._id.toString() + '/members')\r\n can('read', 'members', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/tags')\r\n can('read', 'tags', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/groups')\r\n can('service', organisation._id.toString() + '/storage')\r\n can(['read', 'create', 'remove'], 'storage', { context: organisation._id })\r\n }\r\n if (role >= Roles.manager) {\r\n can('update', 'members', { context: organisation._id })\r\n can('update', 'tags', { context: organisation._id })\r\n can('create', 'groups', { context: organisation._id })\r\n can(['create', 'remove'], 'tags', { context: organisation._id })\r\n // Remove invited members\r\n can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })\r\n }\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Hook computing group abilities for a given user\r\nexport function defineGroupAbilities (subject, can, cannot) {\r\n if (subject) {\r\n if (subject.groups) {\r\n subject.groups.forEach(group => {\r\n if (group._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, group, 'groups', can)\r\n // No specific rules for groups\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Helper functions to find the members of a given organisation\r\nexport function findMembersOfOrganisation (usersService, organisationId, role) {\r\n return findSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\nexport function countMembersOfOrganisation (usersService, organisationId, role) {\r\n return countSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\n// Helper functions to find the members of a given group\r\nexport function findMembersOfGroup (membersService, groupId, role) {\r\n return findSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function countMembersOfGroup (membersService, groupId, role) {\r\n return countSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function getRoleForOrganisation (user, organisationId) {\r\n const result = _.find(user.organisations, { _id: organisationId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function getRoleForGroup (user, organisationId, groupId) {\r\n const result = _.find(user.groups, { context: organisationId, _id: groupId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function findGroupsWithRole (user, organisationId, role) {\r\n return _.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })\r\n}\r\n"]}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"description": {
|
|
18
18
|
"type": "string",
|
|
19
|
-
"maxLength":
|
|
19
|
+
"maxLength": 2048,
|
|
20
20
|
"field": {
|
|
21
21
|
"component": "form/KTextField",
|
|
22
22
|
"label": "schemas.ORGANISATIONS_DESCRIPTION_FIELD_LABEL"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"field": {
|
|
28
28
|
"component": "form/KAttachmentField",
|
|
29
29
|
"label": "schemas.AVATAR_FIELD_LABEL",
|
|
30
|
-
"service": "storage",
|
|
30
|
+
"service": "<%= id %>/storage",
|
|
31
31
|
"acceptedFiles": ".png,.jpg,.jpeg,.webp",
|
|
32
32
|
"maxFilesize": 0.5,
|
|
33
33
|
"autoProcessQueue": false,
|
|
@@ -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"]
|
|
@@ -89,7 +89,7 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
|
|
|
89
89
|
});
|
|
90
90
|
});
|
|
91
91
|
const elementResults = yield collection.aggregate(pipeline, aggregateOptions).toArray();
|
|
92
|
-
debug(`Generated ${elementResults.length} feature(s) for ${element} element
|
|
92
|
+
debug(`Generated ${elementResults.length} feature(s) for ${element} element`, elementResults);
|
|
93
93
|
// Rearrange data so that we get ordered arrays indexed by element
|
|
94
94
|
elementResults.forEach(function (result) {
|
|
95
95
|
result.time = { [element]: result.time };
|
|
@@ -262,27 +262,31 @@ function asGeoJson(options = {}) {
|
|
|
262
262
|
const params = hook.params;
|
|
263
263
|
const query = params.query;
|
|
264
264
|
if (!options.force && !params.asGeoJson) return;
|
|
265
|
-
if (query.$distinct) return; // Not applicable in this case
|
|
266
|
-
|
|
265
|
+
if (query.$distinct || query.$aggregation) return; // Not applicable in this case
|
|
266
|
+
const longitudeProperty = options.longitudeProperty || 'longitude';
|
|
267
|
+
const latitudeProperty = options.latitudeProperty || 'latitude';
|
|
268
|
+
const altitudeProperty = options.altitudeProperty || 'altitude';
|
|
269
|
+
const geometryProperty = options.geometryProperty || 'geometry';
|
|
270
|
+
let results = _lodash2.default.get(hook, options.dataPath || 'result');
|
|
267
271
|
// Already as GeoJson ?
|
|
268
272
|
if (results.type === 'FeatureCollection') return;
|
|
269
|
-
const
|
|
270
|
-
|
|
273
|
+
const isPaginated = !_lodash2.default.isNil(results.data);
|
|
274
|
+
const pagination = isPaginated ? _lodash2.default.pick(results, ['total', 'skip', 'limit']) : {};
|
|
275
|
+
results = isPaginated ? results.data : results;
|
|
271
276
|
results = results.filter(item => {
|
|
272
|
-
//
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
277
|
+
// Check if item is not already in GeoJson feature format and we can convert if required
|
|
278
|
+
return _lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty) ||
|
|
279
|
+
// When performing feature aggregation on geometries the result can be an array
|
|
280
|
+
Array.isArray(_lodash2.default.get(item, geometryProperty)) ||
|
|
281
|
+
// Check for a geometry property (previously provided or already transformed item)
|
|
282
|
+
_lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates');
|
|
278
283
|
}).map(item => {
|
|
279
284
|
let coordinates;
|
|
280
|
-
// Item locations are not already in GeoJson feature format so we need to convert
|
|
281
285
|
// Keep track of coordinates before picking properties
|
|
282
|
-
if (
|
|
283
|
-
coordinates = [_lodash2.default.get(item,
|
|
284
|
-
if (
|
|
285
|
-
coordinates.push(_lodash2.default.get(item,
|
|
286
|
+
if (_lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty)) {
|
|
287
|
+
coordinates = [_lodash2.default.get(item, longitudeProperty), _lodash2.default.get(item, latitudeProperty)];
|
|
288
|
+
if (_lodash2.default.has(item, altitudeProperty)) {
|
|
289
|
+
coordinates.push(_lodash2.default.get(item, altitudeProperty));
|
|
286
290
|
}
|
|
287
291
|
}
|
|
288
292
|
if (options.pick) {
|
|
@@ -291,11 +295,26 @@ function asGeoJson(options = {}) {
|
|
|
291
295
|
if (options.omit) {
|
|
292
296
|
item = _lodash2.default.omit(item, options.omit);
|
|
293
297
|
}
|
|
294
|
-
// Item locations are
|
|
295
|
-
if (
|
|
296
|
-
return Object.assign({
|
|
297
|
-
|
|
298
|
-
|
|
298
|
+
// Item locations are already in GeoJson format
|
|
299
|
+
if (_lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates')) {
|
|
300
|
+
return Object.assign({
|
|
301
|
+
type: 'Feature',
|
|
302
|
+
geometry: _lodash2.default.get(item, geometryProperty),
|
|
303
|
+
properties: {}
|
|
304
|
+
}, _lodash2.default.omit(item, [geometryProperty]));
|
|
305
|
+
} else if (Array.isArray(_lodash2.default.get(item, geometryProperty))) {
|
|
306
|
+
return Object.assign({
|
|
307
|
+
type: 'Feature',
|
|
308
|
+
geometry: { type: 'GeometryCollection', geometries: _lodash2.default.get(item, geometryProperty) },
|
|
309
|
+
properties: {}
|
|
310
|
+
}, _lodash2.default.omit(item, [geometryProperty]));
|
|
311
|
+
} else if (coordinates) {
|
|
312
|
+
// Item locations are not already in GeoJson feature format so we need to convert
|
|
313
|
+
return Object.assign({
|
|
314
|
+
type: 'Feature',
|
|
315
|
+
geometry: { type: 'Point', coordinates },
|
|
316
|
+
properties: {}
|
|
317
|
+
}, _lodash2.default.omit(item, [longitudeProperty, latitudeProperty]));
|
|
299
318
|
}
|
|
300
319
|
});
|
|
301
320
|
// Move some data to properties ?
|
|
@@ -307,16 +326,18 @@ function asGeoJson(options = {}) {
|
|
|
307
326
|
});
|
|
308
327
|
});
|
|
309
328
|
}
|
|
310
|
-
// Copy pagination information so that client can use it anyway
|
|
329
|
+
// Copy pagination information if any so that client can use it anyway
|
|
311
330
|
if (_lodash2.default.get(options, 'asFeatureCollection', true)) {
|
|
312
|
-
hook.result
|
|
331
|
+
_lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
|
|
313
332
|
type: 'FeatureCollection',
|
|
314
333
|
features: results
|
|
315
|
-
}, pagination);
|
|
316
|
-
} else {
|
|
317
|
-
hook.result
|
|
334
|
+
}, pagination)); // If no pagination this merged object will be empty
|
|
335
|
+
} else if (isPaginated) {
|
|
336
|
+
_lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
|
|
318
337
|
data: results
|
|
319
|
-
}, pagination);
|
|
338
|
+
}, pagination));
|
|
339
|
+
} else {
|
|
340
|
+
_lodash2.default.set(hook, options.dataPath || 'result', results);
|
|
320
341
|
}
|
|
321
342
|
};
|
|
322
343
|
}
|