@kalisio/kdk 1.4.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nyc_output/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
- package/.nyc_output/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
- package/.nyc_output/{2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json → 27401f21-8ccf-42fa-8230-4232189d86b3.json} +0 -0
- package/.nyc_output/{81d21e46-766a-46bc-b1b7-143ca577347a.json → 52278ef5-c337-4724-97be-e2e4416847c5.json} +0 -0
- package/.nyc_output/{aaf3ebbb-f895-4d7b-9255-bc5dee832570.json → 5dd49b8a-4c84-42f9-a3d5-712247a84775.json} +0 -0
- package/.nyc_output/{dbeb2602-0ac2-4e66-978b-0d29548359ca.json → 612b4859-9645-45c1-a41e-1fae420518c4.json} +0 -0
- package/.nyc_output/{e47d1e4c-2fff-4dcb-908f-d3081162547c.json → bab87fe9-d99a-4759-99e6-3fc4622eeca0.json} +0 -0
- package/.nyc_output/processinfo/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
- package/.nyc_output/processinfo/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
- package/.nyc_output/processinfo/27401f21-8ccf-42fa-8230-4232189d86b3.json +1 -0
- package/.nyc_output/processinfo/52278ef5-c337-4724-97be-e2e4416847c5.json +1 -0
- package/.nyc_output/processinfo/5dd49b8a-4c84-42f9-a3d5-712247a84775.json +1 -0
- package/.nyc_output/processinfo/612b4859-9645-45c1-a41e-1fae420518c4.json +1 -0
- package/.nyc_output/processinfo/bab87fe9-d99a-4759-99e6-3fc4622eeca0.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/CHANGELOG.md +69 -10
- package/coverage/core/api/application.js.html +500 -422
- package/coverage/core/api/authentication.js.html +119 -119
- package/coverage/core/api/db.js.html +172 -172
- package/coverage/core/api/hooks/hooks.account.js.html +45 -45
- package/coverage/core/api/hooks/hooks.authentication.js.html +71 -71
- package/coverage/core/api/hooks/hooks.authorisations.js.html +368 -353
- 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 +190 -190
- package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
- package/coverage/core/api/hooks/hooks.query.js.html +277 -211
- 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 +263 -263
- 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 +76 -76
- package/coverage/core/api/index.js.html +30 -30
- 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 +104 -104
- 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 +156 -132
- 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 +118 -118
- 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 +320 -290
- package/coverage/index.html +181 -181
- package/coverage/lcov-report/core/api/application.js.html +500 -422
- package/coverage/lcov-report/core/api/authentication.js.html +119 -119
- package/coverage/lcov-report/core/api/db.js.html +172 -172
- package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +45 -45
- package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +71 -71
- package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +368 -353
- 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 +190 -190
- package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
- package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +277 -211
- 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 +263 -263
- 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 +76 -76
- package/coverage/lcov-report/core/api/index.js.html +30 -30
- 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 +104 -104
- 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 +156 -132
- 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 +118 -118
- 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 +320 -290
- package/coverage/lcov-report/index.html +181 -181
- package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
- package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +25 -7
- 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 +14 -5
- package/coverage/lcov-report/map/api/models/index.html +7 -7
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
- package/coverage/lcov.info +3683 -3825
- package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
- package/coverage/map/api/hooks/hooks.query.js.html +25 -7
- 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 +14 -5
- package/coverage/map/api/models/index.html +7 -7
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/coverage/map/common/wms-utils.js.html +1 -1
- package/coverage/map/common/wmts-utils.js.html +1 -1
- package/extras/tours/map/navigation-bar.js +49 -1
- package/lib/core/api/application.js +35 -9
- package/lib/core/api/application.js.map +1 -1
- package/lib/core/api/hooks/hooks.authorisations.js +8 -1
- package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
- package/lib/core/api/hooks/hooks.query.js +135 -100
- package/lib/core/api/hooks/hooks.query.js.map +1 -1
- package/lib/core/api/services/authorisations/authorisations.service.js +13 -1
- package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
- package/lib/core/api/services/pusher/pusher.service.js +40 -16
- package/lib/core/api/services/pusher/pusher.service.js.map +1 -1
- package/lib/core/client/components/collection/KColumn.vue +29 -28
- package/lib/core/client/components/collection/KFilter.vue +97 -72
- package/lib/core/client/components/editor/KModalEditor.vue +3 -4
- package/lib/core/client/components/editor/KSettingsEditor.vue +6 -2
- package/lib/core/client/components/form/KFileField.vue +14 -36
- package/lib/core/client/components/form/KRoleField.vue +5 -2
- package/lib/core/client/components/form/KTextField.vue +12 -2
- package/lib/core/client/components/form/KUnitField.vue +57 -0
- package/lib/core/client/components/form/KUrlField.vue +1 -1
- package/lib/core/client/components/frame/KAction.vue +1 -2
- package/lib/core/client/components/frame/KModal.vue +66 -20
- package/lib/core/client/components/frame/KScrollArea.vue +65 -0
- package/lib/core/client/components/frame/index.js +6 -1
- package/lib/core/client/components/frame/index.js.map +1 -1
- package/lib/core/client/components/input/KColorChooser.vue +3 -5
- package/lib/core/client/components/input/KIconChooser.vue +38 -40
- package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
- package/lib/core/client/components/layout/KAbout.vue +47 -49
- package/lib/core/client/components/team/KAddMember.vue +1 -1
- package/lib/core/client/components/team/KChangeRole.vue +11 -14
- package/lib/core/client/components/team/KGroupCard.vue +12 -5
- package/lib/core/client/components/team/KGroupsActivity.vue +1 -1
- package/lib/core/client/components/team/KJoinGroup.vue +22 -22
- package/lib/core/client/components/team/KMemberCard.vue +19 -4
- package/lib/core/client/components/viewer/KModalViewer.vue +10 -9
- package/lib/core/client/i18n/core_en.json +72 -8
- package/lib/core/client/i18n/core_fr.json +66 -8
- package/lib/core/client/index.js +31 -0
- 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.base-widget.js +5 -3
- package/lib/core/client/mixins/mixin.base-widget.js.map +1 -1
- package/lib/core/client/reader.js +85 -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 +54 -0
- package/lib/core/client/readers/reader.csv.js.map +1 -0
- package/lib/core/client/readers/reader.json.js +49 -0
- package/lib/core/client/readers/reader.json.js.map +1 -0
- package/lib/core/client/services/index.js +14 -3
- package/lib/core/client/services/index.js.map +1 -1
- package/lib/core/client/services/local-settings.service.js +6 -4
- package/lib/core/client/services/local-settings.service.js.map +1 -1
- package/lib/core/client/time.js +4 -3
- package/lib/core/client/time.js.map +1 -1
- package/lib/core/client/units.js +195 -0
- package/lib/core/client/units.js.map +1 -0
- package/lib/core/common/permissions.js +44 -34
- package/lib/core/common/permissions.js.map +1 -1
- package/lib/core/common/schemas/settings.update.json +72 -0
- package/lib/map/api/hooks/hooks.query.js +7 -2
- package/lib/map/api/hooks/hooks.query.js.map +1 -1
- package/lib/map/api/models/features.model.mongodb.js +3 -0
- package/lib/map/api/models/features.model.mongodb.js.map +1 -1
- package/lib/map/client/components/KCaptureToolbar.vue +151 -0
- package/lib/map/client/components/KColorLegend.vue +16 -4
- package/lib/map/client/components/KFeaturesChart.vue +10 -11
- package/lib/map/client/components/KFeaturesFilter.vue +40 -39
- package/lib/map/client/components/KFeaturesTable.vue +15 -16
- package/lib/map/client/components/KLayerEditionToolbar.vue +19 -11
- package/lib/map/client/components/KLayerStyleEditor.vue +3 -2
- package/lib/map/client/components/KLayerStyleForm.vue +38 -27
- package/lib/map/client/components/KMeasureTool.vue +337 -0
- package/lib/map/client/components/KTimeline.vue +5 -9
- package/lib/map/client/components/catalog/KAddLayer.vue +3 -2
- package/lib/map/client/components/catalog/KCatalog.vue +26 -7
- package/lib/map/client/components/catalog/KImportLayer.vue +8 -35
- package/lib/map/client/components/catalog/KLayerCategories.vue +3 -2
- package/lib/map/client/components/catalog/KLayersSelector.vue +8 -6
- package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +1 -1
- package/lib/map/client/components/widget/KInformationBox.vue +8 -17
- package/lib/map/client/components/widget/KMapillaryViewer.vue +5 -1
- package/lib/map/client/components/widget/KTimeSeries.vue +92 -9
- package/lib/map/client/i18n/map_en.json +51 -20
- package/lib/map/client/i18n/map_fr.json +51 -20
- package/lib/map/client/init.js +7 -1
- package/lib/map/client/init.js.map +1 -1
- package/lib/map/client/leaflet/MaskLayer.js +9 -0
- package/lib/map/client/leaflet/MaskLayer.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.base-globe.js +3 -5
- package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js +16 -21
- package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.popup.js +7 -1
- package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/globe/mixin.tooltip.js +7 -1
- package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.base-map.js +54 -9
- package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.canvas-layers.js +2 -0
- package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.file-layers.js +51 -97
- package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.geojson-layers.js +43 -11
- package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.popup.js +7 -1
- package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.style.js +1 -1
- package/lib/map/client/mixins/map/mixin.style.js.map +1 -1
- package/lib/map/client/mixins/map/mixin.tooltip.js +7 -1
- package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
- package/lib/map/client/mixins/mixin.activity.js +2 -0
- 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-service.js +3 -3
- 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 +7 -5
- package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
- package/lib/map/client/readers/index.js +54 -0
- package/lib/map/client/readers/index.js.map +1 -0
- package/lib/map/client/readers/reader.geojson.js +87 -0
- package/lib/map/client/readers/reader.geojson.js.map +1 -0
- package/lib/map/client/readers/reader.gpx.js +52 -0
- package/lib/map/client/readers/reader.gpx.js.map +1 -0
- package/lib/map/client/readers/reader.kml.js +52 -0
- package/lib/map/client/readers/reader.kml.js.map +1 -0
- package/lib/map/client/readers/reader.shp.js +116 -0
- package/lib/map/client/readers/reader.shp.js.map +1 -0
- package/lib/map/client/utils.js +0 -7
- package/lib/map/client/utils.js.map +1 -1
- package/lib/test/client/core/account.js +1 -1
- package/lib/test/client/core/account.js.map +1 -1
- package/lib/test/client/core/runner.js +1 -2
- package/lib/test/client/core/runner.js.map +1 -1
- package/lib/test/client/core/screens.js +1 -1
- package/lib/test/client/core/screens.js.map +1 -1
- package/lib/test/client/core/utils.js +2 -2
- package/lib/test/client/core/utils.js.map +1 -1
- package/lib/test/client/map/catalog.js +50 -49
- package/lib/test/client/map/catalog.js.map +1 -1
- package/package.json +3 -3
- package/.nyc_output/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
- package/.nyc_output/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
- package/.nyc_output/processinfo/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
- package/.nyc_output/processinfo/2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json +0 -1
- package/.nyc_output/processinfo/81d21e46-766a-46bc-b1b7-143ca577347a.json +0 -1
- package/.nyc_output/processinfo/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
- package/.nyc_output/processinfo/aaf3ebbb-f895-4d7b-9255-bc5dee832570.json +0 -1
- package/.nyc_output/processinfo/dbeb2602-0ac2-4e66-978b-0d29548359ca.json +0 -1
- package/.nyc_output/processinfo/e47d1e4c-2fff-4dcb-908f-d3081162547c.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../core/client/services/local-settings.service.js"],"names":["name","api","options","mapping","propertyMapping","rootPaths","_","uniq","values","map","path","split","settingsKey","config","appName","toLowerCase","get","id","data","forOwn","value","key","set","Store","patch","previousRootValues","rootPath","
|
|
1
|
+
{"version":3,"sources":["../../../../core/client/services/local-settings.service.js"],"names":["name","api","options","mapping","propertyMapping","rootPaths","_","uniq","values","map","path","split","settingsKey","config","appName","toLowerCase","get","id","data","forOwn","value","key","set","Store","patch","previousRootValues","rootPath","forEach","index","eventName","kebabCase","Events","$emit","saveSettings","has","window","localStorage","setItem","JSON","stringify","restoreSettings","settings","getItem","parse","getSettingsMapping"],"mappings":";;;;;;kBAKe,UAAUA,IAAV,EAAgBC,GAAhB,EAAqBC,OAArB,EAA8B;AAC3C,QAAMC,UAAUD,QAAQE,eAAxB;AACA;AACA;AACA,QAAMC,YAAYC,iBAAEC,IAAF,CAAOD,iBAAEE,MAAF,CAASL,OAAT,EAAkBM,GAAlB,CAAsBC,QAAQA,KAAKC,KAAL,CAAW,GAAX,EAAgB,CAAhB,CAA9B,CAAP,CAAlB;AACA,QAAMC,cAAcC,iBAAOC,OAAP,CAAeC,WAAf,KAA+B,GAA/B,IAAsCb,QAAQU,WAAR,IAAuB,UAA7D,CAApB;AACA,SAAO;;AAECI,OAAN,CAAWC,EAAX,EAAe;AAAA;AACb,cAAMC,OAAO,EAAb;AACAZ,yBAAEa,MAAF,CAAShB,OAAT,EAAkB,UAACiB,KAAD,EAAQC,GAAR,EAAgB;AAChC,cAAID,KAAJ,EAAW;AACTd,6BAAEgB,GAAF,CAAMJ,IAAN,EAAYG,GAAZ,EAAiBE,aAAMP,GAAN,CAAUI,KAAV,CAAjB;AACD;AACF,SAJD;AAKA,eAAOF,IAAP;AAPa;AAQd,KAVI;;AAYCM,SAAN,CAAaP,EAAb,EAAiBC,IAAjB,EAAuB;AAAA;;AAAA;AACrB,cAAMO,qBAAqBpB,UAAUI,GAAV,CAAc;AAAA,iBAAYc,aAAMP,GAAN,CAAUU,QAAV,CAAZ;AAAA,SAAd,CAA3B;AACApB,yBAAEa,MAAF,CAASD,IAAT,EAAe,UAACE,KAAD,EAAQC,GAAR,EAAgB;AAC7B,cAAIf,iBAAEU,GAAF,CAAMb,OAAN,EAAekB,GAAf,CAAJ,EAAyB;AACvBE,yBAAMD,GAAN,CAAUnB,QAAQkB,GAAR,CAAV,EAAwBD,KAAxB;AACD;AACF,SAJD;AAKAf,kBAAUsB,OAAV,CAAkB,UAACD,QAAD,EAAWE,KAAX,EAAqB;AACrC,gBAAMC,YAAYvB,iBAAEwB,SAAF,CAAa,GAAEJ,QAAS,UAAxB,CAAlB;AACAK,yBAAOC,KAAP,CAAaH,SAAb,EAAwBN,aAAMP,GAAN,CAAUU,QAAV,CAAxB,EAA6CD,mBAAmBG,KAAnB,CAA7C;AACD,SAHD;AAIA,cAAKK,YAAL;AAXqB;AAYtB,KAxBI;;AA0BLA,mBAAgB;AACd,YAAMf,OAAO,EAAb;AACAZ,uBAAEa,MAAF,CAAShB,OAAT,EAAkB,CAACiB,KAAD,EAAQC,GAAR,KAAgB;AAChC,YAAID,SAASG,aAAMW,GAAN,CAAUd,KAAV,CAAb,EAA+B;AAC7Bd,2BAAEgB,GAAF,CAAMJ,IAAN,EAAYG,GAAZ,EAAiBE,aAAMP,GAAN,CAAUI,KAAV,CAAjB;AACD;AACF,OAJD;AAKAe,aAAOC,YAAP,CAAoBC,OAApB,CAA4BzB,WAA5B,EAAyC0B,KAAKC,SAAL,CAAerB,IAAf,CAAzC;AACD,KAlCI;;AAoCLsB,sBAAmB;AACjB,UAAIC,WAAWN,OAAOC,YAAP,CAAoBM,OAApB,CAA4B9B,WAA5B,CAAf;AACA,UAAI,CAAC6B,QAAL,EAAe;AACfA,iBAAWH,KAAKK,KAAL,CAAWF,QAAX,CAAX;AACAnC,uBAAEa,MAAF,CAAShB,OAAT,EAAkB,CAACiB,KAAD,EAAQC,GAAR,KAAgB;AAChC,YAAID,SAASd,iBAAE4B,GAAF,CAAMO,QAAN,EAAgBpB,GAAhB,CAAb,EAAmC;AACjCE,uBAAMD,GAAN,CAAUF,KAAV,EAAiBd,iBAAEU,GAAF,CAAMyB,QAAN,EAAgBpB,GAAhB,CAAjB;AACD;AACF,OAJD;AAKD,KA7CI;;AA+CLuB,yBAAsB;AACpB,aAAOzC,OAAP;AACD;AAjDI,GAAP;AAmDD,C;;AA9DD;;;;AACA;;;;AACA;;AACA","file":"local-settings.service.js","sourcesContent":["import _ from 'lodash'\r\nimport config from 'config'\r\nimport { Store } from '../store'\r\nimport { Events } from '../events'\r\n\r\nexport default function (name, api, options) {\r\n const mapping = options.propertyMapping\r\n // We will emit also an event for all top level properties in case of nested ones\r\n // This simplifies event management for some listeners instead of listening to all nested properties\r\n const rootPaths = _.uniq(_.values(mapping).map(path => path.split('.')[0]))\r\n const settingsKey = config.appName.toLowerCase() + '-' + (options.settingsKey || 'settings')\r\n return {\r\n\r\n async get (id) {\r\n const data = {}\r\n _.forOwn(mapping, (value, key) => {\r\n if (value) {\r\n _.set(data, key, Store.get(value))\r\n }\r\n })\r\n return data\r\n },\r\n\r\n async patch (id, data) {\r\n const previousRootValues = rootPaths.map(rootPath => Store.get(rootPath))\r\n _.forOwn(data, (value, key) => {\r\n if (_.get(mapping, key)) {\r\n Store.set(mapping[key], value)\r\n }\r\n })\r\n rootPaths.forEach((rootPath, index) => {\r\n const eventName = _.kebabCase(`${rootPath}-changed`)\r\n Events.$emit(eventName, Store.get(rootPath), previousRootValues[index])\r\n })\r\n this.saveSettings()\r\n },\r\n\r\n saveSettings () {\r\n const data = {}\r\n _.forOwn(mapping, (value, key) => {\r\n if (value && Store.has(value)) {\r\n _.set(data, key, Store.get(value))\r\n }\r\n })\r\n window.localStorage.setItem(settingsKey, JSON.stringify(data))\r\n },\r\n\r\n restoreSettings () {\r\n let settings = window.localStorage.getItem(settingsKey)\r\n if (!settings) return\r\n settings = JSON.parse(settings)\r\n _.forOwn(mapping, (value, key) => {\r\n if (value && _.has(settings, key)) {\r\n Store.set(value, _.get(settings, key))\r\n }\r\n })\r\n },\r\n\r\n getSettingsMapping () {\r\n return mapping\r\n }\r\n }\r\n}\r\n"]}
|
package/lib/core/client/time.js
CHANGED
|
@@ -51,7 +51,8 @@ const Time = exports.Time = {
|
|
|
51
51
|
utc: false
|
|
52
52
|
},
|
|
53
53
|
currentTime: now,
|
|
54
|
-
step: 60 // 1H
|
|
54
|
+
step: 60, // 1H
|
|
55
|
+
interval: 60 // 1m
|
|
55
56
|
});
|
|
56
57
|
this.updateTimeRangeQuery();
|
|
57
58
|
// Make filter react to external changes to update the query
|
|
@@ -88,13 +89,13 @@ const Time = exports.Time = {
|
|
|
88
89
|
getFormat() {
|
|
89
90
|
return this.get().format;
|
|
90
91
|
},
|
|
91
|
-
format(datetime, format) {
|
|
92
|
+
format(datetime, format, options = { year: 'numeric', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' }) {
|
|
92
93
|
let currentTime = this.convertToMoment(datetime);
|
|
93
94
|
if (!this.getFormat().utc) {
|
|
94
95
|
// Convert to local time
|
|
95
96
|
currentTime = (0, _moment2.default)(currentTime.valueOf());
|
|
96
97
|
}
|
|
97
|
-
if (format === 'iso') return currentTime.format();
|
|
98
|
+
if (format === 'iso') return currentTime.format();else if (format === 'locale') return currentTime.toDate().toLocaleString((0, _utils.getLocale)(), options);
|
|
98
99
|
// Defaults to long mode if not given
|
|
99
100
|
else return currentTime.format(_lodash2.default.get(this.getFormat(), format, _lodash2.default.get(this.getFormat(), format + '.long')));
|
|
100
101
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../core/client/time.js"],"names":["Time","initialize","moment","locale","now","utc","Store","set","range","start","clone","subtract","startOf","end","endOf","field","query","format","time","short","long","date","year","currentTime","step","updateTimeRangeQuery","Events","$on","convertToMoment","datetime","isMoment","valueOf","get","getRange","patchRange","patch","getRangeQuery","$gte","$lte","_","isEqual","getFormat","getCurrentTime","setCurrentTime","isSame","getCurrentFormattedTime","iso","getStep"],"mappings":";;;;;;;AAAA;;;;AACA;;;;AACA;;AACA;;AACA;;;;AAEA;AACO,MAAMA,sBAAO;AAClBC,eAAc;AACZ;AACAC,qBAAOC,MAAP,CAAc,uBAAd;AACA;AACA,UAAMC,MAAMF,iBAAOG,GAAP,EAAZ;AACAC,iBAAMC,GAAN,CAAU,MAAV,EAAkB;AAChBC,aAAO;AACLC,eAAOL,IAAIM,KAAJ,GAAYC,QAAZ,CAAqB,CAArB,EAAwB,QAAxB,EAAkCC,OAAlC,CAA0C,KAA1C,CADF;AAELC,aAAKT,IAAIM,KAAJ,GAAYI,KAAZ,CAAkB,KAAlB,CAFA;AAGLC,eAAO,WAHF;AAILC,eAAO;AAJF,OADS;AAOhBC,cAAQ;AACNC,cAAM;AACJC,iBAAO,MADH;AAEJC,gBAAM;AAFF,SADA;AAKNC,cAAM;AACJF,iBAAO,OADH;AAEJC,gBAAM;AAFF,SALA;AASNE,cAAM;AACJH,iBAAO,IADH;AAEJC,gBAAM;AAFF,SATA;AAaNf,aAAK;AAbC,OAPQ;AAsBhBkB,mBAAanB,GAtBG;AAuBhBoB,YAAM,EAvBU,
|
|
1
|
+
{"version":3,"sources":["../../../core/client/time.js"],"names":["Time","initialize","moment","locale","now","utc","Store","set","range","start","clone","subtract","startOf","end","endOf","field","query","format","time","short","long","date","year","currentTime","step","interval","updateTimeRangeQuery","Events","$on","convertToMoment","datetime","isMoment","valueOf","get","getRange","patchRange","patch","getRangeQuery","$gte","$lte","_","isEqual","getFormat","options","month","day","hour","minute","toDate","toLocaleString","getCurrentTime","setCurrentTime","isSame","getCurrentFormattedTime","iso","getStep"],"mappings":"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","file":"time.js","sourcesContent":["import _ from 'lodash'\r\nimport moment from 'moment'\r\nimport { Events } from './events'\r\nimport { Store } from './store'\r\nimport { getLocale } from './utils'\r\n\r\n// Export singleton\r\nexport const Time = {\r\n initialize () {\r\n // Set locale globally\r\n moment.locale(getLocale())\r\n // Set the time object within the store\r\n const now = moment.utc()\r\n Store.set('time', {\r\n range: {\r\n start: now.clone().subtract(1, 'months').startOf('day'),\r\n end: now.clone().endOf('day'),\r\n field: 'createdAt',\r\n query: {}\r\n },\r\n format: {\r\n time: {\r\n short: 'H[h]',\r\n long: 'HH:mm'\r\n },\r\n date: {\r\n short: 'DD/MM',\r\n long: 'dddd D'\r\n },\r\n year: {\r\n short: 'YY',\r\n long: 'YYYY'\r\n },\r\n utc: false\r\n },\r\n currentTime: now,\r\n step: 60, // 1H\r\n interval: 60 // 1m\r\n })\r\n this.updateTimeRangeQuery()\r\n // Make filter react to external changes to update the query\r\n Events.$on('time-range-changed', () => this.updateTimeRangeQuery())\r\n },\r\n convertToMoment (datetime) {\r\n if (moment.isMoment(datetime)) {\r\n // Clone to avoid mutating and force UTC mode\r\n return moment.utc(datetime.valueOf())\r\n } else { // Convert from Date, string or milliseconds (ie EPOCH)\r\n return moment.utc(datetime)\r\n }\r\n },\r\n get () {\r\n return Store.get('time')\r\n },\r\n getRange () {\r\n return this.get().range\r\n },\r\n patchRange (range) {\r\n Store.patch('time.range', range)\r\n },\r\n getRangeQuery () {\r\n return Store.get('time.range.query')\r\n },\r\n // Build sort query\r\n updateTimeRangeQuery () {\r\n const query = {}\r\n query[this.getRange().field] = { $gte: this.getRange().start.format(), $lte: this.getRange().end.format() }\r\n // Avoid reentrance as we listen to other filter property changes\r\n if (!_.isEqual(query, this.getRangeQuery())) Store.patch('time.range', { query })\r\n },\r\n getFormat () {\r\n return this.get().format\r\n },\r\n format (datetime, format, options = { year: 'numeric', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' }) {\r\n let currentTime = this.convertToMoment(datetime)\r\n if (!this.getFormat().utc) {\r\n // Convert to local time\r\n currentTime = moment(currentTime.valueOf())\r\n }\r\n if (format === 'iso') return currentTime.format()\r\n else if (format === 'locale') return currentTime.toDate().toLocaleString(getLocale(), options)\r\n // Defaults to long mode if not given\r\n else return currentTime.format(_.get(this.getFormat(), format, _.get(this.getFormat(), format + '.long')))\r\n },\r\n getCurrentTime () {\r\n return this.get().currentTime\r\n },\r\n setCurrentTime (datetime) {\r\n const now = this.convertToMoment(datetime)\r\n if (this.getCurrentTime().isSame(now)) return\r\n Store.patch('time.currentTime', now)\r\n },\r\n getCurrentFormattedTime () {\r\n const currentTime = this.getCurrentTime()\r\n return {\r\n time: {\r\n short: this.format(currentTime, 'time.short'),\r\n long: this.format(currentTime, 'time.long')\r\n },\r\n date: {\r\n short: this.format(currentTime, 'date.short'),\r\n long: this.format(currentTime, 'date.long')\r\n },\r\n year: {\r\n short: this.format(currentTime, 'year.short'),\r\n long: this.format(currentTime, 'year.long')\r\n },\r\n iso: this.format(currentTime, 'iso')\r\n }\r\n },\r\n getStep () {\r\n return this.get().step\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Units = undefined;
|
|
7
|
+
|
|
8
|
+
var _lodash = require('lodash');
|
|
9
|
+
|
|
10
|
+
var _lodash2 = _interopRequireDefault(_lodash);
|
|
11
|
+
|
|
12
|
+
var _i18next = require('i18next');
|
|
13
|
+
|
|
14
|
+
var _i18next2 = _interopRequireDefault(_i18next);
|
|
15
|
+
|
|
16
|
+
var _mathjs = require('mathjs');
|
|
17
|
+
|
|
18
|
+
var math = _interopRequireWildcard(_mathjs);
|
|
19
|
+
|
|
20
|
+
var _config = require('config');
|
|
21
|
+
|
|
22
|
+
var _config2 = _interopRequireDefault(_config);
|
|
23
|
+
|
|
24
|
+
var _store = require('./store');
|
|
25
|
+
|
|
26
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
27
|
+
|
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
+
|
|
30
|
+
// Default units organised by physical quantity
|
|
31
|
+
// Each key is the internal mathjs "identifier" of the unit
|
|
32
|
+
const length = {
|
|
33
|
+
m: {
|
|
34
|
+
symbol: 'units.METER_SYMBOL',
|
|
35
|
+
label: 'units.METER_LABEL'
|
|
36
|
+
},
|
|
37
|
+
mi: {
|
|
38
|
+
symbol: 'units.MILE_SYMBOL',
|
|
39
|
+
label: 'units.MILE_LABEL'
|
|
40
|
+
},
|
|
41
|
+
NM: {
|
|
42
|
+
symbol: 'units.NAUTICAL_MILE_SYMBOL',
|
|
43
|
+
label: 'units.NAUTICAL_MILE_LABEL',
|
|
44
|
+
definition: '1852 m'
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const area = {
|
|
48
|
+
'm^2': {
|
|
49
|
+
symbol: 'units.SQUARED_METER_SYMBOL',
|
|
50
|
+
label: 'units.SQUARED_METER_LABEL'
|
|
51
|
+
},
|
|
52
|
+
'km^2': {
|
|
53
|
+
symbol: 'units.SQUARED_KILOMETER_SYMBOL',
|
|
54
|
+
label: 'units.SQUARED_KILOMETER_LABEL'
|
|
55
|
+
},
|
|
56
|
+
acre: {
|
|
57
|
+
symbol: 'units.ACRE_SYMBOL',
|
|
58
|
+
label: 'units.ACRE_LABEL'
|
|
59
|
+
},
|
|
60
|
+
hectare: {
|
|
61
|
+
symbol: 'units.HECTARE_SYMBOL',
|
|
62
|
+
label: 'units.HECTARE_LABEL'
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const velocity = {
|
|
66
|
+
'm/s': {
|
|
67
|
+
symbol: 'units.METER_PER_SECOND_SYMBOL',
|
|
68
|
+
label: 'units.METER_PER_SECOND_LABEL'
|
|
69
|
+
},
|
|
70
|
+
'km/h': {
|
|
71
|
+
symbol: 'units.KILOMETER_PER_HOUR_SYMBOL',
|
|
72
|
+
label: 'units.KILOMETER_PER_HOUR_LABEL'
|
|
73
|
+
},
|
|
74
|
+
kt: {
|
|
75
|
+
symbol: 'units.KNOT_SYMBOL',
|
|
76
|
+
label: 'units.KNOT_LABEL',
|
|
77
|
+
definition: '0.514444 m/s'
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const temperature = {
|
|
81
|
+
degC: {
|
|
82
|
+
symbol: 'units.CELSIUS_SYMBOL',
|
|
83
|
+
label: 'units.CELSIUS_LABEL'
|
|
84
|
+
},
|
|
85
|
+
degF: {
|
|
86
|
+
symbol: 'units.FAHRENHEIT_SYMBOL',
|
|
87
|
+
label: 'units.FAHRENHEIT_LABEL'
|
|
88
|
+
},
|
|
89
|
+
K: {
|
|
90
|
+
symbol: 'units.KELVIN_SYMBOL',
|
|
91
|
+
label: 'units.KELVIN_LABEL'
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const angle = {
|
|
95
|
+
deg: {
|
|
96
|
+
symbol: 'units.DEGREE_SYMBOL',
|
|
97
|
+
label: 'units.DEGREE_LABEL'
|
|
98
|
+
},
|
|
99
|
+
rad: {
|
|
100
|
+
symbol: 'units.RADIAN_SYMBOL',
|
|
101
|
+
label: 'units.RADIAN_LABEL'
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const quantities = {
|
|
106
|
+
length,
|
|
107
|
+
area,
|
|
108
|
+
velocity,
|
|
109
|
+
temperature,
|
|
110
|
+
angle
|
|
111
|
+
|
|
112
|
+
// Export singleton
|
|
113
|
+
};const Units = exports.Units = {
|
|
114
|
+
|
|
115
|
+
initialize() {
|
|
116
|
+
// Set the units object within the store
|
|
117
|
+
_store.Store.set('units', _lodash2.default.merge(_config2.default.units || {}, quantities, {
|
|
118
|
+
default: {
|
|
119
|
+
length: 'm',
|
|
120
|
+
area: 'm^2',
|
|
121
|
+
velocity: 'm/s',
|
|
122
|
+
temperature: 'degC',
|
|
123
|
+
angle: 'deg',
|
|
124
|
+
precision: 1
|
|
125
|
+
}
|
|
126
|
+
}));
|
|
127
|
+
// Create units not defined by default in mathjs
|
|
128
|
+
this.getQuantities().forEach(quantity => {
|
|
129
|
+
const units = this.getUnits(quantity);
|
|
130
|
+
units.forEach(unit => {
|
|
131
|
+
if (unit.definition) math.createUnit(unit.name, _lodash2.default.omit(unit, ['label']));
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
get() {
|
|
136
|
+
return _store.Store.get('units');
|
|
137
|
+
},
|
|
138
|
+
getDefaultPrecision() {
|
|
139
|
+
return _store.Store.get('units.default.precision', 1);
|
|
140
|
+
},
|
|
141
|
+
getQuantities() {
|
|
142
|
+
return _lodash2.default.keys(_lodash2.default.omit(this.get(), ['default']));
|
|
143
|
+
},
|
|
144
|
+
getUnits(quantity) {
|
|
145
|
+
// Get units for a given quantity
|
|
146
|
+
if (quantity) {
|
|
147
|
+
const units = _store.Store.get(`units.${quantity}`, {});
|
|
148
|
+
return _lodash2.default.values(_lodash2.default.mapValues(units, (value, key) => Object.assign({ name: key, quantity }, value)));
|
|
149
|
+
} else {
|
|
150
|
+
// Or all units
|
|
151
|
+
let units = [];
|
|
152
|
+
this.getQuantities().forEach(quantity => {
|
|
153
|
+
units = units.concat(this.getUnits(quantity));
|
|
154
|
+
});
|
|
155
|
+
return units;
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
getUnit(unit) {
|
|
159
|
+
return _lodash2.default.find(this.getUnits(), { name: unit });
|
|
160
|
+
},
|
|
161
|
+
getUnitSymbol(unit) {
|
|
162
|
+
const definition = this.getUnit(unit);
|
|
163
|
+
return definition ? _i18next2.default.t(definition.symbol) : unit;
|
|
164
|
+
},
|
|
165
|
+
getDefaultUnit(quantityOrUnit) {
|
|
166
|
+
// Check for quantity first
|
|
167
|
+
let defaultUnit = _store.Store.get(`units.default.${quantityOrUnit}`);
|
|
168
|
+
// If not check by matching quantity based on given unit
|
|
169
|
+
if (!defaultUnit) {
|
|
170
|
+
const baseUnit = Units.getUnit(quantityOrUnit);
|
|
171
|
+
// Get default unit for this quantity instead
|
|
172
|
+
if (baseUnit) defaultUnit = Units.getDefaultUnit(baseUnit.quantity);
|
|
173
|
+
}
|
|
174
|
+
return defaultUnit;
|
|
175
|
+
},
|
|
176
|
+
convert(value, sourceUnit, targetUnit) {
|
|
177
|
+
if (sourceUnit === targetUnit) return value;
|
|
178
|
+
let n = math.unit(value, sourceUnit);
|
|
179
|
+
n = n.toNumber(targetUnit);
|
|
180
|
+
// Remap from [-180,+180[ to [0,360[ for angles
|
|
181
|
+
n = targetUnit === 'deg' ? n < 0.0 ? n + 360.0 : n : n;
|
|
182
|
+
return n;
|
|
183
|
+
},
|
|
184
|
+
format(value, sourceUnit, targetUnit, options = { symbol: true }) {
|
|
185
|
+
// If target unit is not given use default one
|
|
186
|
+
if (!targetUnit) targetUnit = this.getDefaultUnit(sourceUnit);
|
|
187
|
+
const n = targetUnit ? this.convert(value, sourceUnit, targetUnit) : value;
|
|
188
|
+
let output = n.toFixed(options.precision || this.getDefaultPrecision());
|
|
189
|
+
if (options.symbol) {
|
|
190
|
+
output += ` ${targetUnit ? this.getUnitSymbol(targetUnit) : this.getUnitSymbol(sourceUnit)}`;
|
|
191
|
+
}
|
|
192
|
+
return output;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=units.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../core/client/units.js"],"names":["math","length","m","symbol","label","mi","NM","definition","area","acre","hectare","velocity","kt","temperature","degC","degF","K","angle","deg","rad","quantities","Units","initialize","Store","set","_","merge","config","units","default","precision","getQuantities","forEach","quantity","getUnits","unit","createUnit","name","omit","get","getDefaultPrecision","keys","values","mapValues","value","key","Object","assign","concat","getUnit","find","getUnitSymbol","i18next","t","getDefaultUnit","quantityOrUnit","defaultUnit","baseUnit","convert","sourceUnit","targetUnit","n","toNumber","format","options","output","toFixed"],"mappings":"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","file":"units.js","sourcesContent":["import _ from 'lodash'\r\nimport i18next from 'i18next'\r\nimport * as math from 'mathjs'\r\nimport config from 'config'\r\nimport { Store } from './store'\r\n\r\n// Default units organised by physical quantity\r\n// Each key is the internal mathjs \"identifier\" of the unit\r\nconst length = {\r\n m: {\r\n symbol: 'units.METER_SYMBOL',\r\n label: 'units.METER_LABEL'\r\n },\r\n mi: {\r\n symbol: 'units.MILE_SYMBOL',\r\n label: 'units.MILE_LABEL'\r\n },\r\n NM: {\r\n symbol: 'units.NAUTICAL_MILE_SYMBOL',\r\n label: 'units.NAUTICAL_MILE_LABEL',\r\n definition: '1852 m'\r\n }\r\n}\r\nconst area = {\r\n 'm^2': {\r\n symbol: 'units.SQUARED_METER_SYMBOL',\r\n label: 'units.SQUARED_METER_LABEL'\r\n },\r\n 'km^2': {\r\n symbol: 'units.SQUARED_KILOMETER_SYMBOL',\r\n label: 'units.SQUARED_KILOMETER_LABEL'\r\n },\r\n acre: {\r\n symbol: 'units.ACRE_SYMBOL',\r\n label: 'units.ACRE_LABEL'\r\n },\r\n hectare: {\r\n symbol: 'units.HECTARE_SYMBOL',\r\n label: 'units.HECTARE_LABEL'\r\n }\r\n}\r\nconst velocity = {\r\n 'm/s': {\r\n symbol: 'units.METER_PER_SECOND_SYMBOL',\r\n label: 'units.METER_PER_SECOND_LABEL'\r\n },\r\n 'km/h': {\r\n symbol: 'units.KILOMETER_PER_HOUR_SYMBOL',\r\n label: 'units.KILOMETER_PER_HOUR_LABEL'\r\n },\r\n kt: {\r\n symbol: 'units.KNOT_SYMBOL',\r\n label: 'units.KNOT_LABEL',\r\n definition: '0.514444 m/s'\r\n }\r\n}\r\nconst temperature = {\r\n degC: {\r\n symbol: 'units.CELSIUS_SYMBOL',\r\n label: 'units.CELSIUS_LABEL'\r\n },\r\n degF: {\r\n symbol: 'units.FAHRENHEIT_SYMBOL',\r\n label: 'units.FAHRENHEIT_LABEL'\r\n },\r\n K: {\r\n symbol: 'units.KELVIN_SYMBOL',\r\n label: 'units.KELVIN_LABEL'\r\n }\r\n}\r\nconst angle = {\r\n deg: {\r\n symbol: 'units.DEGREE_SYMBOL',\r\n label: 'units.DEGREE_LABEL'\r\n },\r\n rad: {\r\n symbol: 'units.RADIAN_SYMBOL',\r\n label: 'units.RADIAN_LABEL'\r\n }\r\n}\r\n\r\nconst quantities = {\r\n length,\r\n area,\r\n velocity,\r\n temperature,\r\n angle\r\n}\r\n\r\n// Export singleton\r\nexport const Units = {\r\n\r\n initialize () {\r\n // Set the units object within the store\r\n Store.set('units', _.merge(config.units || {},\r\n quantities, {\r\n default: {\r\n length: 'm',\r\n area: 'm^2',\r\n velocity: 'm/s',\r\n temperature: 'degC',\r\n angle: 'deg',\r\n precision: 1\r\n }\r\n }))\r\n // Create units not defined by default in mathjs\r\n this.getQuantities().forEach(quantity => {\r\n const units = this.getUnits(quantity)\r\n units.forEach(unit => {\r\n if (unit.definition) math.createUnit(unit.name, _.omit(unit, ['label']))\r\n })\r\n })\r\n },\r\n get () {\r\n return Store.get('units')\r\n },\r\n getDefaultPrecision () {\r\n return Store.get('units.default.precision', 1)\r\n },\r\n getQuantities () {\r\n return _.keys(_.omit(this.get(), ['default']))\r\n },\r\n getUnits (quantity) {\r\n // Get units for a given quantity\r\n if (quantity) {\r\n const units = Store.get(`units.${quantity}`, {})\r\n return _.values(_.mapValues(units, (value, key) => Object.assign({ name: key, quantity }, value)))\r\n } else { // Or all units\r\n let units = []\r\n this.getQuantities().forEach(quantity => {\r\n units = units.concat(this.getUnits(quantity))\r\n })\r\n return units\r\n }\r\n },\r\n getUnit (unit) {\r\n return _.find(this.getUnits(), { name: unit })\r\n },\r\n getUnitSymbol (unit) {\r\n const definition = this.getUnit(unit)\r\n return (definition ? i18next.t(definition.symbol) : unit)\r\n },\r\n getDefaultUnit (quantityOrUnit) {\r\n // Check for quantity first\r\n let defaultUnit = Store.get(`units.default.${quantityOrUnit}`)\r\n // If not check by matching quantity based on given unit\r\n if (!defaultUnit) {\r\n const baseUnit = Units.getUnit(quantityOrUnit)\r\n // Get default unit for this quantity instead\r\n if (baseUnit) defaultUnit = Units.getDefaultUnit(baseUnit.quantity)\r\n }\r\n return defaultUnit\r\n },\r\n convert (value, sourceUnit, targetUnit) {\r\n if (sourceUnit === targetUnit) return value\r\n let n = math.unit(value, sourceUnit)\r\n n = n.toNumber(targetUnit)\r\n // Remap from [-180,+180[ to [0,360[ for angles\r\n n = (targetUnit === 'deg' ? (n < 0.0 ? n + 360.0 : n) : n)\r\n return n\r\n },\r\n format (value, sourceUnit, targetUnit, options = { symbol: true }) {\r\n // If target unit is not given use default one\r\n if (!targetUnit) targetUnit = this.getDefaultUnit(sourceUnit)\r\n const n = (targetUnit ? this.convert(value, sourceUnit, targetUnit) : value)\r\n let output = n.toFixed(options.precision || this.getDefaultPrecision())\r\n if (options.symbol) {\r\n output += ` ${targetUnit ? this.getUnitSymbol(targetUnit) : this.getUnitSymbol(sourceUnit)}`\r\n }\r\n return output\r\n }\r\n}\r\n"]}
|
|
@@ -38,10 +38,6 @@ let defineAbilities = exports.defineAbilities = (() => {
|
|
|
38
38
|
};
|
|
39
39
|
})();
|
|
40
40
|
|
|
41
|
-
exports.isSeniorRole = isSeniorRole;
|
|
42
|
-
exports.isJuniorRole = isJuniorRole;
|
|
43
|
-
exports.getSeniorRoles = getSeniorRoles;
|
|
44
|
-
exports.getJuniorRoles = getJuniorRoles;
|
|
45
41
|
exports.defineResourceRules = defineResourceRules;
|
|
46
42
|
exports.defineUserAbilities = defineUserAbilities;
|
|
47
43
|
exports.hasServiceAbilities = hasServiceAbilities;
|
|
@@ -59,6 +55,10 @@ exports.countMembersOfGroup = countMembersOfGroup;
|
|
|
59
55
|
exports.getRoleForOrganisation = getRoleForOrganisation;
|
|
60
56
|
exports.getRoleForGroup = getRoleForGroup;
|
|
61
57
|
exports.findGroupsWithRole = findGroupsWithRole;
|
|
58
|
+
exports.isSeniorRole = isSeniorRole;
|
|
59
|
+
exports.isJuniorRole = isJuniorRole;
|
|
60
|
+
exports.getSeniorRoles = getSeniorRoles;
|
|
61
|
+
exports.getJuniorRoles = getJuniorRoles;
|
|
62
62
|
|
|
63
63
|
var _lodash = require('lodash');
|
|
64
64
|
|
|
@@ -84,30 +84,6 @@ const Roles = exports.Roles = {
|
|
|
84
84
|
|
|
85
85
|
const RoleNames = exports.RoleNames = ['member', 'manager', 'owner'];
|
|
86
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
|
-
|
|
111
87
|
// Hooks that can be added to customize abilities computation
|
|
112
88
|
let hooks = [];
|
|
113
89
|
|
|
@@ -184,6 +160,7 @@ function hasServiceAbilities(abilities, service) {
|
|
|
184
160
|
// Indeed we have for instance a 'groups' service in each organisation
|
|
185
161
|
// Take care that in client we have the service path while on server we have the actual object
|
|
186
162
|
const path = typeof service === 'string' ? service : service.getPath();
|
|
163
|
+
// */groups will allow to access any groups service in any context
|
|
187
164
|
return abilities.can('service', path) || abilities.can('service', _lodash2.default.replace(path, /^.*\//, '*/'));
|
|
188
165
|
}
|
|
189
166
|
|
|
@@ -278,16 +255,19 @@ function defineOrganisationAbilities(subject, can, cannot) {
|
|
|
278
255
|
can('service', organisation._id.toString() + '/members');
|
|
279
256
|
can('read', 'members', { context: organisation._id });
|
|
280
257
|
can('service', organisation._id.toString() + '/tags');
|
|
258
|
+
// Tags are public
|
|
281
259
|
can('read', 'tags', { context: organisation._id });
|
|
260
|
+
// Groups are private
|
|
282
261
|
can('service', organisation._id.toString() + '/groups');
|
|
283
262
|
can('service', organisation._id.toString() + '/storage');
|
|
284
263
|
can(['read', 'create', 'remove'], 'storage', { context: organisation._id });
|
|
285
264
|
}
|
|
286
265
|
if (role >= Roles.manager) {
|
|
287
266
|
can('update', 'members', { context: organisation._id });
|
|
288
|
-
|
|
289
|
-
can('
|
|
290
|
-
can(['create', 'remove'], '
|
|
267
|
+
// Managers can manage all groups/tags
|
|
268
|
+
can('all', 'groups', { context: organisation._id });
|
|
269
|
+
can(['create', 'remove'], 'authorisations', { resourcesService: organisation._id.toString() + '/groups', scope: 'groups' });
|
|
270
|
+
can('all', 'tags', { context: organisation._id });
|
|
291
271
|
// Remove invited members
|
|
292
272
|
can(['remove'], 'users', { 'sponsor.organisationId': organisation._id });
|
|
293
273
|
}
|
|
@@ -303,9 +283,15 @@ function defineGroupAbilities(subject, can, cannot) {
|
|
|
303
283
|
if (subject.groups) {
|
|
304
284
|
subject.groups.forEach(group => {
|
|
305
285
|
if (group._id) {
|
|
306
|
-
//
|
|
307
|
-
|
|
308
|
-
|
|
286
|
+
// Specific rules for groups
|
|
287
|
+
const role = Roles[group.permissions];
|
|
288
|
+
|
|
289
|
+
if (role >= Roles.member) {
|
|
290
|
+
can('read', 'groups', { _id: group._id });
|
|
291
|
+
}
|
|
292
|
+
if (role >= Roles.manager) {
|
|
293
|
+
can(['create', 'remove'], 'authorisations', { resource: group._id, permissions: 'member' });
|
|
294
|
+
}
|
|
309
295
|
}
|
|
310
296
|
});
|
|
311
297
|
}
|
|
@@ -345,4 +331,28 @@ function getRoleForGroup(user, organisationId, groupId) {
|
|
|
345
331
|
function findGroupsWithRole(user, organisationId, role) {
|
|
346
332
|
return _lodash2.default.filter(user.groups || [], { context: organisationId, permissions: typeof role === 'string' ? role : RoleNames[role] });
|
|
347
333
|
}
|
|
334
|
+
|
|
335
|
+
function isSeniorRole(roleName, juniorName) {
|
|
336
|
+
return Roles[roleName] >= Roles[juniorName];
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function isJuniorRole(roleName, seniorName) {
|
|
340
|
+
return Roles[roleName] < Roles[seniorName];
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function getSeniorRoles(roleName) {
|
|
344
|
+
const seniorRoles = [];
|
|
345
|
+
_lodash2.default.forEach(Roles, role => {
|
|
346
|
+
if (Roles[roleName] < role) seniorRoles.push(RoleNames[role]);
|
|
347
|
+
});
|
|
348
|
+
return seniorRoles;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function getJuniorRoles(roleName) {
|
|
352
|
+
const juniorRoles = [];
|
|
353
|
+
_lodash2.default.forEach(Roles, role => {
|
|
354
|
+
if (Roles[roleName] >= role) juniorRoles.push(RoleNames[role]);
|
|
355
|
+
});
|
|
356
|
+
return juniorRoles;
|
|
357
|
+
}
|
|
348
358
|
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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","defineResourceRules","defineUserAbilities","hasServiceAbilities","hasResourceAbilities","removeContext","getQueryForAbilities","findSubjectsForResource","countSubjectsForResource","defineOrganisationAbilities","defineGroupAbilities","findMembersOfOrganisation","countMembersOfOrganisation","findMembersOfGroup","countMembersOfGroup","getRoleForOrganisation","getRoleForGroup","findGroupsWithRole","isSeniorRole","isJuniorRole","getSeniorRoles","getJuniorRoles","addAlias","Roles","member","manager","owner","RoleNames","RESOURCE_TYPE","Symbol","for","resourceService","role","permissions","_id","id","toString","$regex","registerHook","includes","push","unregisterHook","filter","registeredHook","abilities","service","path","getPath","_","replace","operation","resourceType","context","object","Object","assign","result","query","forOwn","value","key","Array","isArray","forEach","item","isEmpty","rulesFor","cloneDeep","buildSubjectsQueryForResource","resourceScope","resourceId","$elemMatch","set","subjectService","find","$limit","organisations","organisation","resourcesService","scope","groups","group","usersService","organisationId","membersService","groupId","user","isUndefined","undefined","roleName","juniorName","seniorName","seniorRoles","juniorRoles"],"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 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 // */groups will allow to access any groups service in any context\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 // Tags are public\r\n can('read', 'tags', { context: organisation._id })\r\n // Groups are private\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 // Managers can manage all groups/tags\r\n can('all', 'groups', { context: organisation._id })\r\n can(['create', 'remove'], 'authorisations', { resourcesService: organisation._id.toString() + '/groups', scope: 'groups' })\r\n can('all', '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 // Specific rules for groups\r\n const role = Roles[group.permissions]\r\n\r\n if (role >= Roles.member) {\r\n can('read', 'groups', { _id: group._id })\r\n }\r\n if (role >= Roles.manager) {\r\n can(['create', 'remove'], 'authorisations', { resource: group._id, permissions: 'member' })\r\n }\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\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"]}
|