@kalisio/kdk 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/.eslintignore +1 -0
  2. package/.github/workflows/main.yaml +67 -0
  3. package/.gitmodules +3 -0
  4. package/README.md +1 -2
  5. package/core/api/application.js +1 -2
  6. package/core/api/hooks/hooks.query.js +15 -2
  7. package/core/api/marshall.js +35 -4
  8. package/core/client/api.js +1 -1
  9. package/core/client/components/KActivity.vue +73 -0
  10. package/core/client/components/KContent.vue +1 -1
  11. package/core/client/components/KSponsor.vue +2 -13
  12. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  13. package/core/client/components/account/KPasswordManager.vue +1 -1
  14. package/core/client/components/action/KAction.vue +294 -0
  15. package/core/client/components/action/KBugReportAction.vue +37 -0
  16. package/core/client/components/action/index.js +7 -0
  17. package/core/client/components/app/KAbout.vue +16 -63
  18. package/core/client/components/app/KPlatform.vue +1 -1
  19. package/core/client/components/app/KSettings.vue +14 -14
  20. package/core/client/components/app/KTour.vue +6 -8
  21. package/core/client/components/app/KWelcome.vue +1 -1
  22. package/core/client/components/app/index.js +4 -0
  23. package/core/client/components/chart/KDataTable.vue +40 -25
  24. package/core/client/components/chart/KTimeSeriesChart.vue +20 -12
  25. package/core/client/components/collection/KCard.vue +1 -1
  26. package/core/client/components/collection/KColumn.vue +1 -1
  27. package/core/client/components/collection/KFilter.vue +6 -1
  28. package/core/client/components/document/KDocument.vue +83 -0
  29. package/core/client/components/document/KHtml.vue +23 -0
  30. package/core/client/components/document/KMarkdown.vue +37 -0
  31. package/core/client/components/document/index.js +9 -0
  32. package/core/client/components/form/KForm.vue +11 -2
  33. package/core/client/components/form/KSelectField.vue +1 -1
  34. package/core/client/components/index.js +1 -4
  35. package/core/client/components/input/KOptionsChooser.vue +1 -1
  36. package/core/client/components/layout/KFab.vue +1 -1
  37. package/core/client/components/layout/KPage.vue +3 -2
  38. package/core/client/components/layout/KWindow.vue +1 -1
  39. package/core/client/components/media/KColorScale.vue +16 -6
  40. package/core/client/components/screen/KLoginScreen.vue +1 -1
  41. package/core/client/components/screen/KRegisterScreen.vue +1 -1
  42. package/core/client/components/team/KAddMember.vue +7 -7
  43. package/core/client/components/team/KGroupCard.vue +1 -1
  44. package/core/client/components/team/KMemberFilter.vue +1 -1
  45. package/core/client/components/team/KTagCard.vue +1 -1
  46. package/core/client/components/time/KRelativeTimeRanges.vue +1 -1
  47. package/core/client/components/time/KTimeControl.vue +1 -0
  48. package/core/client/components/tool/KExportTool.vue +1 -1
  49. package/core/client/composables/collection.js +1 -1
  50. package/core/client/composables/index.js +1 -0
  51. package/core/client/composables/layout.js +50 -0
  52. package/core/client/composables/session.js +6 -0
  53. package/core/client/filter.js +9 -6
  54. package/core/client/guards.js +29 -6
  55. package/core/client/i18n/core_en.json +1 -1
  56. package/core/client/i18n/core_fr.json +1 -1
  57. package/core/client/i18n.js +14 -0
  58. package/core/client/layout.js +25 -14
  59. package/core/client/mixins/mixin.base-activity.js +16 -0
  60. package/core/client/mixins/mixin.base-field.js +4 -1
  61. package/core/client/services/index.js +27 -26
  62. package/core/client/services/local-settings.service.js +2 -3
  63. package/core/client/units.js +6 -1
  64. package/core/client/utils/index.js +3 -0
  65. package/core/client/utils/utils.actions.js +93 -0
  66. package/core/client/utils/utils.colors.js +1 -1
  67. package/core/client/utils/utils.data.js +22 -0
  68. package/core/client/utils/utils.shapes.js +16 -6
  69. package/coverage/base.css +224 -0
  70. package/coverage/block-navigation.js +87 -0
  71. package/coverage/core/api/application.js.html +1870 -0
  72. package/coverage/core/api/authentication.js.html +742 -0
  73. package/coverage/core/api/db.js.html +778 -0
  74. package/coverage/core/api/hooks/hooks.authentication.js.html +313 -0
  75. package/coverage/core/api/hooks/hooks.authorisations.js.html +1243 -0
  76. package/coverage/core/api/hooks/hooks.groups.js.html +229 -0
  77. package/coverage/core/api/hooks/hooks.logger.js.html +163 -0
  78. package/coverage/core/api/hooks/hooks.model.js.html +955 -0
  79. package/coverage/core/api/hooks/hooks.organisations.js.html +541 -0
  80. package/coverage/core/api/hooks/hooks.push.js.html +253 -0
  81. package/coverage/core/api/hooks/hooks.query.js.html +862 -0
  82. package/coverage/core/api/hooks/hooks.schemas.js.html +304 -0
  83. package/coverage/core/api/hooks/hooks.service.js.html +319 -0
  84. package/coverage/core/api/hooks/hooks.storage.js.html +193 -0
  85. package/coverage/core/api/hooks/hooks.users.js.html +868 -0
  86. package/coverage/core/api/hooks/index.html +296 -0
  87. package/coverage/core/api/hooks/index.js.html +121 -0
  88. package/coverage/core/api/index.html +191 -0
  89. package/coverage/core/api/index.js.html +148 -0
  90. package/coverage/core/api/marshall.js.html +448 -0
  91. package/coverage/core/api/models/groups.model.mongodb.js.html +109 -0
  92. package/coverage/core/api/models/index.html +161 -0
  93. package/coverage/core/api/models/organisations.model.mongodb.js.html +94 -0
  94. package/coverage/core/api/models/tags.model.mongodb.js.html +115 -0
  95. package/coverage/core/api/models/users.model.mongodb.js.html +115 -0
  96. package/coverage/core/api/services/account/account.hooks.js.html +208 -0
  97. package/coverage/core/api/services/account/account.service.js.html +436 -0
  98. package/coverage/core/api/services/account/index.html +131 -0
  99. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  100. package/coverage/core/api/services/authorisations/authorisations.service.js.html +502 -0
  101. package/coverage/core/api/services/authorisations/index.html +131 -0
  102. package/coverage/core/api/services/databases/databases.hooks.js.html +193 -0
  103. package/coverage/core/api/services/databases/databases.service.js.html +100 -0
  104. package/coverage/core/api/services/databases/index.html +131 -0
  105. package/coverage/core/api/services/groups/groups.hooks.js.html +178 -0
  106. package/coverage/core/api/services/groups/index.html +116 -0
  107. package/coverage/core/api/services/import-export/import-export.hooks.js.html +184 -0
  108. package/coverage/core/api/services/import-export/import-export.service.js.html +118 -0
  109. package/coverage/core/api/services/import-export/index.html +131 -0
  110. package/coverage/core/api/services/index.html +116 -0
  111. package/coverage/core/api/services/index.js.html +499 -0
  112. package/coverage/core/api/services/mailer/index.html +131 -0
  113. package/coverage/core/api/services/mailer/mailer.hooks.js.html +190 -0
  114. package/coverage/core/api/services/mailer/mailer.service.js.html +118 -0
  115. package/coverage/core/api/services/organisations/index.html +131 -0
  116. package/coverage/core/api/services/organisations/organisations.hooks.js.html +178 -0
  117. package/coverage/core/api/services/organisations/organisations.service.js.html +343 -0
  118. package/coverage/core/api/services/push/index.html +131 -0
  119. package/coverage/core/api/services/push/push.hooks.js.html +190 -0
  120. package/coverage/core/api/services/push/push.service.js.html +121 -0
  121. package/coverage/core/api/services/storage/index.html +131 -0
  122. package/coverage/core/api/services/storage/storage.hooks.js.html +190 -0
  123. package/coverage/core/api/services/storage/storage.service.js.html +172 -0
  124. package/coverage/core/api/services/tags/index.html +116 -0
  125. package/coverage/core/api/services/tags/tags.hooks.js.html +178 -0
  126. package/coverage/core/api/services/users/index.html +116 -0
  127. package/coverage/core/api/services/users/users.hooks.js.html +307 -0
  128. package/coverage/core/api/utils.js.html +118 -0
  129. package/coverage/core/common/errors.js.html +88 -0
  130. package/coverage/core/common/index.html +176 -0
  131. package/coverage/core/common/index.js.html +115 -0
  132. package/coverage/core/common/permissions.js.html +1048 -0
  133. package/coverage/core/common/schema.js.html +190 -0
  134. package/coverage/core/common/utils.js.html +220 -0
  135. package/coverage/favicon.png +0 -0
  136. package/coverage/index.html +491 -0
  137. package/coverage/lcov-report/base.css +224 -0
  138. package/coverage/lcov-report/block-navigation.js +87 -0
  139. package/coverage/lcov-report/core/api/application.js.html +1870 -0
  140. package/coverage/lcov-report/core/api/authentication.js.html +742 -0
  141. package/coverage/lcov-report/core/api/db.js.html +778 -0
  142. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +313 -0
  143. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +1243 -0
  144. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +229 -0
  145. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +163 -0
  146. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +955 -0
  147. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +541 -0
  148. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +253 -0
  149. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +862 -0
  150. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +304 -0
  151. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +319 -0
  152. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +193 -0
  153. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +868 -0
  154. package/coverage/lcov-report/core/api/hooks/index.html +296 -0
  155. package/coverage/lcov-report/core/api/hooks/index.js.html +121 -0
  156. package/coverage/lcov-report/core/api/index.html +191 -0
  157. package/coverage/lcov-report/core/api/index.js.html +148 -0
  158. package/coverage/lcov-report/core/api/marshall.js.html +448 -0
  159. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +109 -0
  160. package/coverage/lcov-report/core/api/models/index.html +161 -0
  161. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +94 -0
  162. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +115 -0
  163. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +115 -0
  164. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +208 -0
  165. package/coverage/lcov-report/core/api/services/account/account.service.js.html +436 -0
  166. package/coverage/lcov-report/core/api/services/account/index.html +131 -0
  167. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  168. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +502 -0
  169. package/coverage/lcov-report/core/api/services/authorisations/index.html +131 -0
  170. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +193 -0
  171. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +100 -0
  172. package/coverage/lcov-report/core/api/services/databases/index.html +131 -0
  173. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +178 -0
  174. package/coverage/lcov-report/core/api/services/groups/index.html +116 -0
  175. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +184 -0
  176. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +118 -0
  177. package/coverage/lcov-report/core/api/services/import-export/index.html +131 -0
  178. package/coverage/lcov-report/core/api/services/index.html +116 -0
  179. package/coverage/lcov-report/core/api/services/index.js.html +499 -0
  180. package/coverage/lcov-report/core/api/services/mailer/index.html +131 -0
  181. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +190 -0
  182. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +118 -0
  183. package/coverage/lcov-report/core/api/services/organisations/index.html +131 -0
  184. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +178 -0
  185. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +343 -0
  186. package/coverage/lcov-report/core/api/services/push/index.html +131 -0
  187. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +190 -0
  188. package/coverage/lcov-report/core/api/services/push/push.service.js.html +121 -0
  189. package/coverage/lcov-report/core/api/services/storage/index.html +131 -0
  190. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +190 -0
  191. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +172 -0
  192. package/coverage/lcov-report/core/api/services/tags/index.html +116 -0
  193. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +178 -0
  194. package/coverage/lcov-report/core/api/services/users/index.html +116 -0
  195. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +307 -0
  196. package/coverage/lcov-report/core/api/utils.js.html +118 -0
  197. package/coverage/lcov-report/core/common/errors.js.html +88 -0
  198. package/coverage/lcov-report/core/common/index.html +176 -0
  199. package/coverage/lcov-report/core/common/index.js.html +115 -0
  200. package/coverage/lcov-report/core/common/permissions.js.html +1048 -0
  201. package/coverage/lcov-report/core/common/schema.js.html +190 -0
  202. package/coverage/lcov-report/core/common/utils.js.html +220 -0
  203. package/coverage/lcov-report/favicon.png +0 -0
  204. package/coverage/lcov-report/index.html +491 -0
  205. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +457 -0
  206. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +397 -0
  207. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +1309 -0
  208. package/coverage/lcov-report/map/api/hooks/index.html +161 -0
  209. package/coverage/lcov-report/map/api/hooks/index.js.html +94 -0
  210. package/coverage/lcov-report/map/api/index.html +131 -0
  211. package/coverage/lcov-report/map/api/index.js.html +139 -0
  212. package/coverage/lcov-report/map/api/marshall.js.html +178 -0
  213. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +106 -0
  214. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +127 -0
  215. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +196 -0
  216. package/coverage/lcov-report/map/api/models/index.html +161 -0
  217. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +109 -0
  218. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +274 -0
  219. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +610 -0
  220. package/coverage/lcov-report/map/api/services/alerts/index.html +131 -0
  221. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +316 -0
  222. package/coverage/lcov-report/map/api/services/catalog/index.html +116 -0
  223. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  224. package/coverage/lcov-report/map/api/services/daptiles/index.html +116 -0
  225. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +241 -0
  226. package/coverage/lcov-report/map/api/services/features/features.service.js.html +241 -0
  227. package/coverage/lcov-report/map/api/services/features/index.html +131 -0
  228. package/coverage/lcov-report/map/api/services/index.html +116 -0
  229. package/coverage/lcov-report/map/api/services/index.js.html +817 -0
  230. package/coverage/lcov-report/map/api/services/projects/index.html +116 -0
  231. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +439 -0
  232. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +466 -0
  233. package/coverage/lcov-report/map/common/errors.js.html +94 -0
  234. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +541 -0
  235. package/coverage/lcov-report/map/common/grid.js.html +1612 -0
  236. package/coverage/lcov-report/map/common/index.html +371 -0
  237. package/coverage/lcov-report/map/common/index.js.html +172 -0
  238. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +556 -0
  239. package/coverage/lcov-report/map/common/moment-utils.js.html +157 -0
  240. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +868 -0
  241. package/coverage/lcov-report/map/common/opendap-utils.js.html +826 -0
  242. package/coverage/lcov-report/map/common/permissions.js.html +124 -0
  243. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +418 -0
  244. package/coverage/lcov-report/map/common/tms-utils.js.html +274 -0
  245. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +364 -0
  246. package/coverage/lcov-report/map/common/wcs-utils.js.html +586 -0
  247. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1033 -0
  248. package/coverage/lcov-report/map/common/wfs-utils.js.html +574 -0
  249. package/coverage/lcov-report/map/common/wms-utils.js.html +451 -0
  250. package/coverage/lcov-report/map/common/wmts-utils.js.html +547 -0
  251. package/coverage/lcov-report/prettify.css +1 -0
  252. package/coverage/lcov-report/prettify.js +2 -0
  253. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  254. package/coverage/lcov-report/sorter.js +196 -0
  255. package/coverage/lcov.info +11128 -0
  256. package/coverage/map/api/hooks/hooks.catalog.js.html +457 -0
  257. package/coverage/map/api/hooks/hooks.features.js.html +397 -0
  258. package/coverage/map/api/hooks/hooks.query.js.html +1309 -0
  259. package/coverage/map/api/hooks/index.html +161 -0
  260. package/coverage/map/api/hooks/index.js.html +94 -0
  261. package/coverage/map/api/index.html +131 -0
  262. package/coverage/map/api/index.js.html +139 -0
  263. package/coverage/map/api/marshall.js.html +178 -0
  264. package/coverage/map/api/models/alerts.model.mongodb.js.html +106 -0
  265. package/coverage/map/api/models/catalog.model.mongodb.js.html +127 -0
  266. package/coverage/map/api/models/features.model.mongodb.js.html +196 -0
  267. package/coverage/map/api/models/index.html +161 -0
  268. package/coverage/map/api/models/projects.model.mongodb.js.html +109 -0
  269. package/coverage/map/api/services/alerts/alerts.hooks.js.html +274 -0
  270. package/coverage/map/api/services/alerts/alerts.service.js.html +610 -0
  271. package/coverage/map/api/services/alerts/index.html +131 -0
  272. package/coverage/map/api/services/catalog/catalog.hooks.js.html +316 -0
  273. package/coverage/map/api/services/catalog/index.html +116 -0
  274. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  275. package/coverage/map/api/services/daptiles/index.html +116 -0
  276. package/coverage/map/api/services/features/features.hooks.js.html +241 -0
  277. package/coverage/map/api/services/features/features.service.js.html +241 -0
  278. package/coverage/map/api/services/features/index.html +131 -0
  279. package/coverage/map/api/services/index.html +116 -0
  280. package/coverage/map/api/services/index.js.html +817 -0
  281. package/coverage/map/api/services/projects/index.html +116 -0
  282. package/coverage/map/api/services/projects/projects.hooks.js.html +439 -0
  283. package/coverage/map/common/dynamic-grid-source.js.html +466 -0
  284. package/coverage/map/common/errors.js.html +94 -0
  285. package/coverage/map/common/geotiff-grid-source.js.html +541 -0
  286. package/coverage/map/common/grid.js.html +1612 -0
  287. package/coverage/map/common/index.html +371 -0
  288. package/coverage/map/common/index.js.html +172 -0
  289. package/coverage/map/common/meteo-model-grid-source.js.html +556 -0
  290. package/coverage/map/common/moment-utils.js.html +157 -0
  291. package/coverage/map/common/opendap-grid-source.js.html +868 -0
  292. package/coverage/map/common/opendap-utils.js.html +826 -0
  293. package/coverage/map/common/permissions.js.html +124 -0
  294. package/coverage/map/common/time-based-grid-source.js.html +418 -0
  295. package/coverage/map/common/tms-utils.js.html +274 -0
  296. package/coverage/map/common/wcs-grid-source.js.html +364 -0
  297. package/coverage/map/common/wcs-utils.js.html +586 -0
  298. package/coverage/map/common/weacast-grid-source.js.html +1033 -0
  299. package/coverage/map/common/wfs-utils.js.html +574 -0
  300. package/coverage/map/common/wms-utils.js.html +451 -0
  301. package/coverage/map/common/wmts-utils.js.html +547 -0
  302. package/coverage/prettify.css +1 -0
  303. package/coverage/prettify.js +2 -0
  304. package/coverage/sort-arrow-sprite.png +0 -0
  305. package/coverage/sorter.js +196 -0
  306. package/coverage/tmp/coverage-137435-1719398750767-0.json +1 -0
  307. package/coverage/tmp/coverage-137447-1719398750752-0.json +1 -0
  308. package/coverage/tmp/coverage-137458-1719398750740-0.json +1 -0
  309. package/coverage/tmp/coverage-137470-1719398750728-0.json +1 -0
  310. package/coverage/tmp/coverage-137477-1719398750691-0.json +1 -0
  311. package/map/api/hooks/hooks.query.js +5 -2
  312. package/map/api/services/catalog/catalog.hooks.js +4 -5
  313. package/map/client/cesium/utils/index.js +2 -1
  314. package/map/client/cesium/utils/utils.cesium.js +8 -0
  315. package/map/client/cesium/utils/utils.features.js +2 -2
  316. package/map/client/cesium/utils/utils.style.js +19 -17
  317. package/map/client/components/KCompass.vue +25 -3
  318. package/map/client/components/KEditLayerData.vue +1 -1
  319. package/map/client/components/KFeatureEditor.vue +2 -3
  320. package/map/client/components/KPositionIndicator.vue +1 -1
  321. package/map/client/components/catalog/KConnectLayer.vue +2 -2
  322. package/map/client/components/catalog/KCreateView.vue +2 -2
  323. package/map/client/components/form/KDirectionField.vue +4 -0
  324. package/map/client/components/form/KOwsLayerField.vue +4 -4
  325. package/map/client/components/form/KOwsServiceField.vue +3 -4
  326. package/map/client/components/legend/KLegend.vue +13 -15
  327. package/map/client/components/tools/KGeolocateTool.vue +1 -1
  328. package/map/client/components/widget/KStackableTimeSeries.vue +3 -0
  329. package/map/client/composables/highlight.js +4 -1
  330. package/map/client/elevation-utils.js +2 -2
  331. package/map/client/i18n/map_en.json +3 -1
  332. package/map/client/i18n/map_fr.json +3 -1
  333. package/map/client/mixins/globe/mixin.base-globe.js +121 -80
  334. package/map/client/mixins/globe/mixin.file-layers.js +2 -2
  335. package/map/client/mixins/globe/mixin.geojson-layers.js +24 -19
  336. package/map/client/mixins/globe/mixin.globe-activity.js +3 -3
  337. package/map/client/mixins/globe/mixin.opendap-layers.js +3 -3
  338. package/map/client/mixins/globe/mixin.style.js +5 -5
  339. package/map/client/mixins/globe/mixin.tooltip.js +5 -3
  340. package/map/client/mixins/map/mixin.base-map.js +43 -5
  341. package/map/client/mixins/map/mixin.canvas-layers.js +0 -1
  342. package/map/client/mixins/map/mixin.geojson-layers.js +10 -5
  343. package/map/client/mixins/mixin.activity.js +2 -2
  344. package/map/client/mixins/mixin.feature-selection.js +7 -5
  345. package/map/client/mixins/mixin.levels.js +1 -1
  346. package/map/client/utils/utils.catalog.js +15 -0
  347. package/map/client/utils/utils.location.js +2 -1
  348. package/map/client/utils/utils.schema.js +0 -28
  349. package/map/client/utils/utils.style.js +1 -1
  350. package/map/common/geotiff-grid-source.js +5 -3
  351. package/map/common/grid.js +2 -2
  352. package/map/common/meteo-model-grid-source.js +1 -1
  353. package/map/common/time-based-grid-source.js +1 -1
  354. package/map/common/wmts-utils.js +11 -11
  355. package/package.json +12 -8
  356. package/scripts/build_docs.sh +37 -0
  357. package/scripts/init_runner.sh +30 -0
  358. package/scripts/kash/.github/workflows/run_tests.yaml +33 -0
  359. package/scripts/kash/README.md +2 -0
  360. package/scripts/kash/kash.sh +1657 -0
  361. package/scripts/kash/scripts/run_tests.sh +151 -0
  362. package/scripts/run_tests.sh +48 -0
  363. package/scripts/setup_workspace.sh +42 -0
  364. package/test/api/core/hooks.test.js +31 -0
  365. package/test/api/core/test-log-2024-05-14.log +6 -0
  366. package/test/api/core/test-log-2024-06-06.log +23 -0
  367. package/test/api/core/test-log-2024-06-26.log +25 -0
  368. package/test/api/map/grid-sources.test.js +3 -1
  369. package/test/api/map/hooks.test.js +58 -12
  370. package/test/api/map/test-log-2024-06-06.log +39 -0
  371. package/test/client/core/collection.js +2 -2
  372. package/test/client/core/dialogs.js +13 -0
  373. package/test/client/core/index.js +6 -5
  374. package/test/client/core/layout.js +1 -13
  375. package/test/client/core/runner.js +41 -20
  376. package/test/client/core/screens.js +6 -0
  377. package/test/client/core/utils.js +23 -19
  378. package/.travis.doc.sh +0 -8
  379. package/.travis.test.sh +0 -72
  380. package/core/client/components/KAction.vue +0 -393
  381. package/core/client/components/KBlock.vue +0 -67
  382. package/core/client/components/app/KTerms.vue +0 -41
package/.eslintignore ADDED
@@ -0,0 +1 @@
1
+ core/client/components/action/KAction.vue
@@ -0,0 +1,67 @@
1
+ name: ci
2
+ on: [ push, workflow_dispatch ]
3
+
4
+ jobs:
5
+ run_tests:
6
+ name: Run tests
7
+ runs-on: ubuntu-22.04
8
+ steps:
9
+ - name: Checkout repo
10
+ uses: actions/checkout@v4
11
+ with:
12
+ submodules: true
13
+ - name: Init runner
14
+ run: bash ./scripts/init_runner.sh ${{ github.job }}
15
+ - name: Setup workspace
16
+ env:
17
+ KALISIO_GITHUB_URL: ${{ secrets.KALISIO_GITHUB_URL }}
18
+ run: bash ./scripts/setup_workspace.sh
19
+ - name: Run tests
20
+ env:
21
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
22
+ run: bash ./scripts/run_tests.sh -c -r ${{ github.job }}
23
+
24
+ additional_tests:
25
+ strategy:
26
+ fail-fast: false
27
+ matrix:
28
+ node: [ 18, 20 ]
29
+ mongo: [ 5, 6, 7 ]
30
+ name: Additional tests
31
+ if: ${{ contains(github.event.head_commit.message, 'additional tests') }}
32
+ runs-on: ubuntu-22.04
33
+ steps:
34
+ - name: Checkout repo
35
+ uses: actions/checkout@v4
36
+ with:
37
+ submodules: true
38
+ - name: Init runner
39
+ run: bash ./scripts/init_runner.sh ${{ github.job }}
40
+ - name: Setup workspace
41
+ env:
42
+ KALISIO_GITHUB_URL: ${{ secrets.KALISIO_GITHUB_URL }}
43
+ run: bash ./scripts/setup_workspace.sh
44
+ - name: Run tests
45
+ env:
46
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
47
+ run: bash ./scripts/run_tests.sh -n ${{ matrix.node }} -m ${{ matrix.mongo }}
48
+
49
+ build_docs:
50
+ name: Build doc
51
+ if: ${{ startsWith(github.event.head_commit.message, 'docs:') || contains(github.event.head_commit.message, 'build doc') }}
52
+ runs-on: ubuntu-22.04
53
+ steps:
54
+ - name: Checkout repo
55
+ uses: actions/checkout@v4
56
+ with:
57
+ submodules: true
58
+ - name: Init runner
59
+ run: bash ./scripts/init_runner.sh ${{ github.job }}
60
+ - name: Setup workspace
61
+ env:
62
+ KALISIO_GITHUB_URL: ${{ secrets.KALISIO_GITHUB_URL }}
63
+ run: bash ./scripts/setup_workspace.sh
64
+ - name: Build docs
65
+ env:
66
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
67
+ run: bash ./scripts/build_docs.sh -p -r ${{ github.job }}
package/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "scripts/kash"]
2
+ path = scripts/kash
3
+ url = http://github.com/kalisio/kash
package/README.md CHANGED
@@ -1,10 +1,9 @@
1
1
  [![KDK](https://s3.eu-central-1.amazonaws.com/kalisioscope/kdk/kdk-logo-color-512x192.png)](https://kalisio.github.io/kdk/)
2
2
 
3
3
  [![Latest Release](https://img.shields.io/github/v/tag/kalisio/kdk?sort=semver&label=latest)](https://github.com/kalisio/kdk/releases)
4
- [![Build Status](https://app.travis-ci.com/kalisio/kdk.svg?branch=master)](https://app.travis-ci.com/kalisio/kdk)
4
+ [![CI](https://github.com/kalisio/kdk/actions/workflows/main.yaml/badge.svg)](https://github.com/kalisio/kdk/actions/workflows/main.yaml)
5
5
  [![Code Climate](https://codeclimate.com/github/kalisio/kdk/badges/gpa.svg)](https://codeclimate.com/github/kalisio/kdk)
6
6
  [![Test Coverage](https://codeclimate.com/github/kalisio/kdk/badges/coverage.svg)](https://codeclimate.com/github/kalisio/kdk/coverage)
7
- [![Dependency Status](https://img.shields.io/librariesio/github/kalisio/kdk?style=flat-square)](https://david-dm.org/kalisio/kdk)
8
7
  [![Documentation](https://img.shields.io/badge/documentation-available-brightgreen.svg)](https://kalisio.github.io/kdk/)
9
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
10
9
 
@@ -287,14 +287,13 @@ export function createWebhook (path, app, options = {}) {
287
287
  const payload = req.body
288
288
  const config = app.get('authentication')
289
289
  res.set('content-type', 'application/json')
290
- const params = {}
290
+ const params = _.get(req, 'feathers', {})
291
291
  try {
292
292
  if (options.preprocessor) {
293
293
  await options.preprocessor(req, res, payload)
294
294
  }
295
295
  // Authenticate when required
296
296
  if (config) {
297
- params.user = _.get(req, 'feathers.user')
298
297
  params.checkAuthorisation = true
299
298
  }
300
299
  if (req.headers['content-type'] !== 'application/json') {
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash'
2
- import { marshallComparisonFields, marshallSortFields, marshallTime } from '../marshall.js'
2
+ import { marshallComparisonFields, marshallTime, marshallBooleanFields, marshallNumberFields, marshallDateFields } from '../marshall.js'
3
3
  import mongodb from 'mongodb'
4
4
  import makeDebug from 'debug'
5
5
  import { makeDiacriticPattern } from '../../common/utils.js'
@@ -27,7 +27,7 @@ export function marshallSortQuery (hook) {
27
27
  const query = hook.params.query
28
28
  if (query && query.$sort) {
29
29
  // Complex queries might have nested objects so we call a recursive function to handle this
30
- marshallSortFields(query.$sort)
30
+ marshallNumberFields(query.$sort)
31
31
  }
32
32
  }
33
33
 
@@ -45,6 +45,19 @@ export function marshallCollationQuery (hook) {
45
45
  return hook
46
46
  }
47
47
 
48
+ export function marshallHttpQuery (hook) {
49
+ const provider = _.get(hook.params, 'provider')
50
+ if (provider !== 'rest') return hook
51
+ const query = hook.params.query
52
+ if (query) {
53
+ // Need to convert from client/server side types : numbers, boolean, dates, ...
54
+ // ORder matters here as a boolean can be converted to number (0/1)
55
+ marshallNumberFields(query)
56
+ marshallBooleanFields(query)
57
+ marshallDateFields(query)
58
+ }
59
+ }
60
+
48
61
  export async function aggregationQuery (hook) {
49
62
  const query = hook.params.query
50
63
  if (!query) return
@@ -23,21 +23,52 @@ export function marshallComparisonFields (queryObject) {
23
23
  })
24
24
  }
25
25
 
26
- // Helper function to convert sort operator values to numbers
27
- export function marshallSortFields (queryObject) {
26
+ // Helper function to convert query parameters to numbers
27
+ export function marshallNumberFields (queryObject) {
28
28
  _.forOwn(queryObject, (value, key) => {
29
29
  // Process current attributes or recurse
30
30
  if (typeof value === 'object') {
31
- marshallSortFields(value)
31
+ marshallNumberFields(value)
32
32
  } else {
33
33
  const number = _.toNumber(value)
34
34
  // Update from query string to number if required
35
- if (!Number.isNaN(number)) {
35
+ if (_.isFinite(number)) {
36
36
  queryObject[key] = number
37
37
  }
38
38
  }
39
39
  })
40
40
  }
41
+ // Helper function to convert query parameters to boolean
42
+ export function marshallBooleanFields (queryObject) {
43
+ _.forOwn(queryObject, (value, key) => {
44
+ // Process current attributes or recurse
45
+ if (typeof value === 'object') {
46
+ marshallBooleanFields(value)
47
+ } else if (typeof value === 'string') {
48
+ // Update from query string to boolean if required
49
+ if (value.toLowerCase() === 'true') {
50
+ queryObject[key] = true
51
+ } else if (value.toLowerCase() === 'false') {
52
+ queryObject[key] = false
53
+ }
54
+ }
55
+ })
56
+ }
57
+ // Helper function to convert query parameters to dates
58
+ export function marshallDateFields (queryObject) {
59
+ _.forOwn(queryObject, (value, key) => {
60
+ // Process current attributes or recurse
61
+ if (typeof value === 'object') {
62
+ marshallDateFields(value)
63
+ } else if (typeof value === 'string') {
64
+ // We use moment to validate the date
65
+ const date = moment.utc(value, moment.ISO_8601)
66
+ if (date.isValid()) {
67
+ queryObject[key] = date.toDate()
68
+ }
69
+ }
70
+ })
71
+ }
41
72
 
42
73
  // Helper function to convert time objects or array of time objects
43
74
  export function marshallTime (item, property) {
@@ -162,7 +162,7 @@ export function createClient (config) {
162
162
  // Get the base URL/domain to be used (useful for mobile apps)
163
163
  api.getBaseUrl = function () {
164
164
  // We can override the default app origin anyway
165
- const origin = config.origin || window.location.origin
165
+ const origin = config.domain || config.origin || window.location.origin
166
166
  // Check for registered custom base Url if any
167
167
  return LocalStorage.get(baseUrlStorageKey, origin)
168
168
  }
@@ -0,0 +1,73 @@
1
+ <template>
2
+ <KPage>
3
+ <template v-slot:page-content>
4
+ <slot />
5
+ </template>
6
+ </KPage>
7
+ </template>
8
+
9
+ <script>
10
+ import _ from 'lodash'
11
+ import logger from 'loglevel'
12
+ import config from 'config'
13
+ import { useActivity, useLayout } from '../composables'
14
+ import KPage from './layout/KPage.vue'
15
+
16
+ export default {
17
+ components: {
18
+ KPage
19
+ },
20
+ props: {
21
+ name: {
22
+ type: String,
23
+ required: true
24
+ },
25
+ layout: {
26
+ type: [Object, Function],
27
+ default: () => null
28
+ }
29
+ },
30
+ setup (props) {
31
+ const keyName = `${_.camelCase(props.name)}Activity`
32
+ logger.debug(`[KDK] Reading '${props.name}' activity options with key ${keyName}`)
33
+ const options = _.get(config, keyName, {})
34
+ const { setCurrentActivity } = useActivity(keyName, options)
35
+ const { configureLayout, clearLayout } = useLayout()
36
+ return {
37
+ options,
38
+ setCurrentActivity,
39
+ configureLayout,
40
+ clearLayout
41
+ }
42
+ },
43
+ methods: {
44
+ async configure () {
45
+ logger.debug(`[KDK] Configuring '${this.name}' activity`)
46
+ // because this component is wrapped within an AsyncComponent it returns the grand parent
47
+ const concreteActivity = this.$parent.$parent
48
+ // configure the layout
49
+ let customLayout = {}
50
+ if (this.layout) {
51
+ if (typeof this.layout === 'function') customLayout = await this.layout()
52
+ else customLayout = this.layout
53
+ }
54
+ this.configureLayout(_.merge({}, this.options, customLayout), concreteActivity)
55
+ // set the current activity
56
+ this.setCurrentActivity(concreteActivity)
57
+ }
58
+ },
59
+ async mounted () {
60
+ await this.configure()
61
+ // whenever the user abilities are updated, update activity as well
62
+ this.$events.on('user-abilities-changed', this.configure)
63
+ },
64
+ beforeUnmount () {
65
+ logger.debug(`[KDK] Clearing '${this.name}' activity`)
66
+ this.$events.off('user-abilities-changed', this.configure)
67
+ // clear the current activity
68
+ this.setCurrentActivity(null)
69
+ // Clear the layout
70
+ this.clearLayout()
71
+ }
72
+ }
73
+ </script>
@@ -103,7 +103,7 @@ function getComponents (content, mode) {
103
103
  // Then create component objects
104
104
  _.forEach(components, component => {
105
105
  // Get the component and add the required props
106
- component.name = _.get(component, 'component', 'KAction')
106
+ component.name = _.get(component, 'component', 'action/KAction')
107
107
  component.uid = uid()
108
108
  processedComponents.push(component)
109
109
  })
@@ -15,7 +15,7 @@
15
15
  </div>
16
16
  <!-- Kalisio logo -->
17
17
  <a href="https://kalisio.com" target="_blank">
18
- <q-img src="kalisio.png" :width="computedLogoWidth">
18
+ <q-img src="kalisio.png" width="64px">
19
19
  <q-tooltip>
20
20
  {{ $t('KSponsor.MORE_ABOUT_KALISIO') }}
21
21
  </q-tooltip>
@@ -25,16 +25,5 @@
25
25
  </template>
26
26
 
27
27
  <script setup>
28
- import { computed } from 'vue'
29
- import { useQuasar } from 'quasar'
30
- import KAction from './KAction.vue'
31
-
32
- // Data
33
- const $q = useQuasar()
34
-
35
- // Computed
36
- const computedLogoWidth = computed(() => {
37
- if ($q.screen.lt.sm) return '64px'
38
- return '72px'
39
- })
28
+ import KAction from './action/KAction.vue'
40
29
  </script>
@@ -18,7 +18,7 @@ import _ from 'lodash'
18
18
  import { useRouter } from 'vue-router'
19
19
  import { Dialog } from 'quasar'
20
20
  import { Store, i18n, api } from '../..'
21
- import KAction from '../KAction.vue'
21
+ import KAction from '../action/KAction.vue'
22
22
 
23
23
  // Data
24
24
  const router = useRouter()
@@ -26,7 +26,7 @@ import { ref } from 'vue'
26
26
  import { Notify } from 'quasar'
27
27
  import { Store, i18n, utils } from '../..'
28
28
  import KForm from '../form/KForm.vue'
29
- import KAction from '../KAction.vue'
29
+ import KAction from '../action/KAction.vue'
30
30
 
31
31
  // Data
32
32
  const formRef = ref(null)
@@ -0,0 +1,294 @@
1
+ <template>
2
+ <!--
3
+ Button renderer
4
+ -->
5
+ <q-btn v-if="renderer === 'button'"
6
+ :id="id"
7
+ no-caps
8
+ no-wrap
9
+ :color="computedColor"
10
+ :icon="!iconRight ? computedIcon : undefined"
11
+ :icon-right="iconRight ? computedIcon : undefined"
12
+ :size="size"
13
+ flat
14
+ :round="label === null"
15
+ :rounded="label !== null"
16
+ :stack="stack"
17
+ :dense="dense"
18
+ :disable="computedDisabled"
19
+ v-close-popup="closePopup"
20
+ @click="onClicked">
21
+ <!-- label -->
22
+ <div v-if="computedLabel" :class="{ 'ellipsis q-pr-md': iconRight, 'ellipsis q-pl-md': !iconRight }">
23
+ {{ computedLabel }}
24
+ </div>
25
+ <!-- tooltip -->
26
+ <q-tooltip v-if="computedTooltip">
27
+ {{ computedTooltip }}
28
+ </q-tooltip>
29
+ <!-- badge -->
30
+ <q-badge v-if="badge" v-bind="badge" :label="computedBadgeLabel">
31
+ <q-icon v-if="badge.icon" v-bind="badge.icon" />
32
+ </q-badge>
33
+ <!-- extra content -->
34
+ <slot>
35
+ </slot>
36
+ </q-btn>
37
+ <!--
38
+ Form button renderer
39
+ -->
40
+ <q-btn v-else-if="renderer === 'form-button'"
41
+ :id="id"
42
+ no-wrap
43
+ color="primary"
44
+ :outline="outline"
45
+ :size="size"
46
+ :disable="computedDisabled"
47
+ :loading="loading"
48
+ v-close-popup="closePopup"
49
+ @click="onClicked">
50
+ <div class="ellipsis">
51
+ {{ computedLabel }}
52
+ </div>
53
+ </q-btn>
54
+ <!--
55
+ Item renderer
56
+ -->
57
+ <q-item v-else-if="renderer === 'item'"
58
+ :id="id"
59
+ class="full-width"
60
+ clickable
61
+ :dense="dense"
62
+ :disable="computedDisabled"
63
+ v-close-popup="closePopup"
64
+ @click="onClicked">
65
+ <q-item-section v-if="computedIcon || badge" avatar>
66
+ <q-icon v-if="computedIcon" :name="computedIcon" :color="computedColor" :dense="dense" />
67
+ <!-- badge -->
68
+ <q-badge v-if="badge" v-bind="badge" :label="computedBadgeLabel">
69
+ <q-icon v-if="badge.icon" v-bind="badge.icon" />
70
+ </q-badge>
71
+ </q-item-section>
72
+ <q-item-section :class="'text-' + computedColor" no-wrap>
73
+ <q-item-label :lines="1">{{ computedLabel }}</q-item-label>
74
+ </q-item-section>
75
+ </q-item>
76
+ <!--
77
+ Fab renderer
78
+ -->
79
+ <q-btn v-else-if="renderer === 'fab'"
80
+ :id="id"
81
+ class="k-action-fab"
82
+ :icon="computedIcon"
83
+ :color="computedColor"
84
+ :size="size"
85
+ :round="true"
86
+ :dense="dense"
87
+ :disable="computedDisabled"
88
+ @click="onClicked">
89
+ <!-- tooltip -->
90
+ <q-tooltip v-if="computedTooltip" anchor="top middle" self="bottom right">
91
+ {{ computedTooltip }}
92
+ </q-tooltip>
93
+ <!-- badge -->
94
+ <q-badge v-if="badge" v-bind="badge" :label="computedBadgeLabel">
95
+ <q-icon v-if="badge.icon" v-bind="badge.icon" />
96
+ </q-badge>
97
+ </q-btn>
98
+ <!--
99
+ Fab action renderer
100
+ -->
101
+ <q-fab-action v-else-if="renderer === 'fab-action'"
102
+ :id="id"
103
+ class="k-action-fab-action"
104
+ no-caps
105
+ :icon="computedIcon"
106
+ :color="computedColor"
107
+ :label="computedLabel"
108
+ square
109
+ external-label
110
+ :label-position="iconRight ? 'left' : 'right'"
111
+ label-class="bg-primary text-white text-caption k-fab-action"
112
+ :disable="computedDisabled"
113
+ @click="onClicked">
114
+ <!-- badge -->
115
+ <q-badge v-if="badge" v-bind="badge">
116
+ <q-icon v-if="badge.icon" v-bind="badge.icon" />
117
+ </q-badge>
118
+ </q-fab-action>
119
+ <!--
120
+ Tab renderer
121
+ -->
122
+ <q-btn v-else-if="renderer === 'tab'"
123
+ :class="{'k-action-tab-active': isToggled }"
124
+ :id="id"
125
+ no-caps
126
+ no-wrap
127
+ :label="computedLabel"
128
+ :color="computedColor"
129
+ :size="size"
130
+ flat
131
+ square
132
+ :dense="dense"
133
+ :disable="computedDisabled"
134
+ @click="onClicked">
135
+ <!-- tooltip -->
136
+ <q-tooltip v-if="computedTooltip">
137
+ {{ computedTooltip }}
138
+ </q-tooltip>
139
+ <!-- badge -->
140
+ <q-badge v-if="badge" v-bind="badge" :label="computedBadgeLabel">
141
+ <q-icon v-if="badge.icon" v-bind="badge.icon" />
142
+ </q-badge>
143
+ <!-- extra content -->
144
+ <slot>
145
+ </slot>
146
+ </q-btn>
147
+ </template>
148
+
149
+ <script>
150
+ // WARNING for now we must declare the inheritAttrs this way. Lint will try to move it. Don't do it.
151
+ // TODO: need to updated when switch to vue > 3.3 to be able to declare options
152
+ export default {
153
+ inheritAttrs: false
154
+ }
155
+ </script>
156
+
157
+ <script setup>
158
+ import _ from 'lodash'
159
+ import { ref, toRef, computed, watch } from 'vue'
160
+ import { useRoute, useRouter } from 'vue-router'
161
+ import { useQuasar, openURL } from 'quasar'
162
+ import { i18n } from '../../i18n.js'
163
+ import { actionProps } from '../../utils/utils.actions'
164
+ import { bindParams } from '../../utils/utils.content.js'
165
+
166
+ // Data
167
+ const route = useRoute()
168
+ const router = useRouter()
169
+ const $q = useQuasar()
170
+ const props = defineProps(actionProps)
171
+ const isToggled = _.has(props, 'toggle.value') ? toRef(props.toggle, 'value') : ref(props.toggled)
172
+
173
+ // Emit
174
+ const emit = defineEmits(['triggered', 'toggled', 'dialog-confirmed', 'dialog-canceled'])
175
+
176
+ // Computed
177
+ const computedLabel = computed(() => {
178
+ // Check also for translation key or already translated message
179
+ if (isToggled.value && _.has(props.toggle, 'label')) return i18n.tie(props.toggle.label)
180
+ return i18n.tie(props.label)
181
+ })
182
+ const computedIcon = computed(() => {
183
+ if (isToggled.value && _.has(props.toggle, 'icon')) return props.toggle.icon
184
+ return props.icon
185
+ })
186
+ const computedColor = computed(() => {
187
+ if (isToggled.value) return _.get(props.toggle, 'color', 'accent')
188
+ return props.color
189
+ })
190
+ const computedDisabled = computed(() => {
191
+ if (!props.disabled) return false
192
+ if (typeof props.disabled === 'function') return props.disabled()
193
+ return props.disabled
194
+ })
195
+ const computedTooltip = computed(() => {
196
+ if (computedDisabled.value) return
197
+ // Check also for translation key or already translated message
198
+ if (isToggled.value && _.has(props.toggle, 'tooltip')) return i18n.tie(props.toggle.tooltip)
199
+ return i18n.tie(props.tooltip)
200
+ })
201
+ const computedBadgeLabel = computed(() => {
202
+ // Check also for translation key or already translated message
203
+ if (props.badge && _.has(props.badge, 'label')) return i18n.tie(props.badge.label)
204
+ // Take care that changing this to null or '' breaks the display in Quasar
205
+ return undefined
206
+ })
207
+ const dense = computed(() => {
208
+ return $q.screen.lt.sm
209
+ })
210
+
211
+ // Functions
212
+ function toggle () {
213
+ isToggled.value = !isToggled.value
214
+ emit('toggled', props.context, isToggled.value)
215
+ }
216
+ function bindRouteParams (path) {
217
+ // When action is created from code we can directly inject the params.
218
+ // However, when created from the config we need to manage dynamic values.
219
+ // A parameter like ':xxx' in config means xxx is a dynamic property of
220
+ // the current route or the context object, not a static value.
221
+ // We bind the target params object to both possible context.
222
+ const currentParams = _.get(route, path, {})
223
+ const targetParams = _.get(props.route, path, {})
224
+ const routeParams = bindParams(targetParams, currentParams)
225
+ const contextParams = bindParams(targetParams, props.context)
226
+ return _.merge(routeParams, contextParams)
227
+ }
228
+ async function onClicked (event) {
229
+ if (!props.propagate) event.stopPropagation()
230
+ // handle the toggle if needed
231
+ if (props.toggle) toggle()
232
+ // handle the URL case
233
+ if (props.url) openURL(props.url)
234
+ // handle the callback case
235
+ if (props.handler) {
236
+ try {
237
+ await props.handler(props.context, isToggled.value)
238
+ } catch (error) {
239
+ // in case an error is raised we assume toggling has failed
240
+ if (props.toggle) toggle()
241
+ throw error
242
+ }
243
+ return
244
+ }
245
+ // handle the route case
246
+ if (props.route) {
247
+ // allow to directly call a given URL, eg OAuth callback
248
+ if (props.route.url) {
249
+ location.href = props.route.url
250
+ } else {
251
+ // process route params
252
+ router.push(Object.assign({
253
+ query: bindRouteParams('query'),
254
+ params: bindRouteParams('params')
255
+ }, _.omit(props.route, ['query', 'params']))).catch(() => {})
256
+ }
257
+ return
258
+ }
259
+ // handle the dialog case
260
+ if (props.dialog) {
261
+ let dialog = props.dialog
262
+ const component = _.get(props.dialog, 'component')
263
+ if (component) {
264
+ dialog = {
265
+ component: 'KDialog',
266
+ componentProps: _.clone(dialog)
267
+ }
268
+ }
269
+ $q.dialog(dialog)
270
+ .onOk((result) => {
271
+ emit('dialog-confirmed', props.context, result)
272
+ })
273
+ .onCancel((result) => {
274
+ emit('dialog-canceled', props.context, result)
275
+ })
276
+ }
277
+ // notify listeners
278
+ emit('triggered', props.context, isToggled.value)
279
+ }
280
+
281
+ // Watch
282
+ watch(() => props.toggled, (value) => {
283
+ if (isToggled.value !== value) isToggled.value = value
284
+ })
285
+ </script>
286
+
287
+ <style lang="scss" scoped>
288
+ .k-action-fab, .k-action-fab-action {
289
+ border: 2px solid var(--q-secondary);
290
+ }
291
+ .k-action-tab-active {
292
+ border-bottom: solid 2px;
293
+ }
294
+ </style>
@@ -0,0 +1,37 @@
1
+ <template>
2
+ <KAction
3
+ v-bind="props"
4
+ :url="url"
5
+ />
6
+ </template>
7
+
8
+ <script setup>
9
+ import _ from 'lodash'
10
+ import config from 'config'
11
+ import { ref } from 'vue'
12
+ import { i18n } from '../../i18n'
13
+ import { getPlatform } from '../../utils/utils.platform'
14
+ import { actionProps } from '../../utils/utils.actions'
15
+ import { useVersion } from '../../composables'
16
+ import KAction from './/KAction.vue'
17
+
18
+ // Data
19
+ const props = defineProps(_.omit(actionProps, ['toggle', 'url', 'handler', 'route', 'dialog']))
20
+ const { clientVersionName, apiVersionName } = useVersion()
21
+ const platform = getPlatform()
22
+
23
+ // Setup bug report info
24
+ const bugReport = {
25
+ address: _.get(config, 'publisherContact'),
26
+ subject: i18n.t('KAbout.BUG_REPORT_SUBJECT', {
27
+ appName: _.get(config, 'appName'),
28
+ clientVersion: clientVersionName.value,
29
+ apiVersion: apiVersionName.value
30
+ }),
31
+ body: i18n.t('KAbout.BUG_REPORT_BODY')
32
+ }
33
+ _.forOwn(platform, (value, key) => { bugReport.body += `${key}: ${value}%0D%0A` })
34
+ bugReport.body += `domain: ${_.get(config, 'domain')}%0D%0A`
35
+ bugReport.body += `flavor: ${_.get(config, 'flavor')}%0D%0A`
36
+ const url = ref(`mailto:${bugReport.address}?subject=${bugReport.subject}&body=${bugReport.body}`)
37
+ </script>
@@ -0,0 +1,7 @@
1
+ import KAction from './KAction.vue'
2
+ import KBugReportAction from './KBugReportAction.vue'
3
+
4
+ export {
5
+ KAction,
6
+ KBugReportAction
7
+ }