@kalisio/kdk 2.0.1 → 2.1.1

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 (471) hide show
  1. package/.codeclimate.yml +0 -1
  2. package/.travis.test.sh +3 -0
  3. package/core/api/application.js +13 -9
  4. package/core/api/db.js +34 -30
  5. package/core/api/hooks/hooks.authentication.js +11 -0
  6. package/core/api/hooks/hooks.authorisations.js +7 -3
  7. package/core/api/hooks/hooks.model.js +32 -43
  8. package/core/api/hooks/hooks.organisations.js +26 -116
  9. package/core/api/hooks/hooks.push.js +56 -0
  10. package/core/api/hooks/hooks.query.js +0 -5
  11. package/core/api/hooks/hooks.schemas.js +23 -3
  12. package/core/api/hooks/hooks.users.js +15 -22
  13. package/core/api/hooks/index.js +1 -4
  14. package/core/api/services/account/account.hooks.js +3 -3
  15. package/core/api/services/account/account.service.js +6 -7
  16. package/core/api/services/groups/groups.hooks.js +2 -4
  17. package/core/api/services/index.js +11 -16
  18. package/core/api/services/{devices/devices.hooks.js → push/push.hooks.js} +5 -5
  19. package/core/api/services/push/push.service.js +12 -0
  20. package/core/api/services/tags/tags.hooks.js +6 -20
  21. package/core/api/services/users/users.hooks.js +12 -13
  22. package/core/api/utils.js +11 -0
  23. package/core/client/api.js +6 -0
  24. package/core/client/capabilities.js +8 -12
  25. package/core/client/components/KAction.vue +10 -3
  26. package/core/client/components/KAvatar.vue +31 -35
  27. package/core/client/components/KChipsPane.vue +23 -0
  28. package/core/client/components/account/KAccount.vue +68 -0
  29. package/core/client/components/account/KDeleteAccountManager.vue +62 -0
  30. package/core/client/components/account/KEmailManager.vue +128 -0
  31. package/core/client/components/account/KPasswordManager.vue +90 -0
  32. package/core/client/components/account/KProfile.vue +109 -0
  33. package/core/client/components/account/KResetPassword.vue +100 -111
  34. package/core/client/components/account/KSendResetPassword.vue +71 -87
  35. package/core/client/components/account/KSubscription.vue +71 -0
  36. package/core/client/components/account/KSubscriptionsManager.vue +46 -0
  37. package/core/client/components/account/KVerifyEmailManager.vue +105 -0
  38. package/core/client/components/account/index.js +4 -2
  39. package/core/client/components/app/KAbout.vue +27 -14
  40. package/core/client/components/app/KPlatform.vue +2 -2
  41. package/core/client/components/app/KWelcome.vue +71 -45
  42. package/core/client/components/collection/KBoard.vue +50 -40
  43. package/core/client/components/collection/KCard.vue +16 -7
  44. package/core/client/components/collection/KColumn.vue +146 -111
  45. package/core/client/components/collection/KGrid.vue +77 -58
  46. package/core/client/components/collection/KHistory.vue +19 -3
  47. package/core/client/components/collection/KItem.vue +5 -1
  48. package/core/client/components/collection/KList.vue +80 -56
  49. package/core/client/components/collection/KTable.vue +181 -142
  50. package/core/client/components/editor/KEditor.vue +10 -3
  51. package/core/client/components/form/KFileField.vue +22 -8
  52. package/core/client/components/form/KForm.vue +27 -14
  53. package/core/client/components/form/KItemField.vue +2 -2
  54. package/core/client/components/form/KOptionsField.vue +11 -2
  55. package/core/client/components/form/KSelectField.vue +12 -3
  56. package/core/client/components/form/KTextField.vue +6 -0
  57. package/core/client/components/form/KTokenField.vue +80 -0
  58. package/core/client/components/layout/KOpener.vue +8 -8
  59. package/core/client/components/layout/KPage.vue +8 -4
  60. package/core/client/components/layout/KWindow.vue +172 -141
  61. package/core/client/components/media/KMediaBrowser.vue +28 -12
  62. package/core/client/components/media/KShape.vue +58 -56
  63. package/core/client/components/menu/KMenu.vue +22 -13
  64. package/core/client/components/menu/KRadialFab.vue +83 -56
  65. package/core/client/components/menu/KRadialFabItem.vue +39 -19
  66. package/core/client/components/screen/KLoginScreen.vue +0 -17
  67. package/core/client/components/screen/KScreen.vue +3 -3
  68. package/core/client/components/screen/KScreenFooter.vue +0 -3
  69. package/core/client/components/team/KAddMember.vue +1 -1
  70. package/core/client/components/team/KAddTag.vue +121 -0
  71. package/core/client/components/team/KMemberCard.vue +42 -13
  72. package/core/client/components/team/KMembersActivity.vue +9 -3
  73. package/core/client/components/team/KTagCard.vue +16 -1
  74. package/core/client/composables/collection.js +181 -0
  75. package/core/client/composables/index.js +2 -0
  76. package/core/client/composables/pwa.js +71 -0
  77. package/core/client/composables/session.js +6 -9
  78. package/core/client/composables/version.js +1 -22
  79. package/core/client/i18n/core_en.json +124 -153
  80. package/core/client/i18n/core_fr.json +124 -155
  81. package/core/client/index.js +37 -110
  82. package/core/client/layout.js +37 -14
  83. package/core/client/local-storage.js +4 -3
  84. package/core/client/mixins/mixin.account.js +9 -5
  85. package/core/client/mixins/mixin.base-editor.js +19 -3
  86. package/core/client/mixins/mixin.base-item.js +3 -3
  87. package/core/client/mixins/mixin.base-viewer.js +14 -0
  88. package/core/client/mixins/mixin.object-proxy.js +2 -21
  89. package/core/client/services/index.js +0 -1
  90. package/core/client/storage.js +19 -16
  91. package/core/client/theme.js +11 -5
  92. package/core/client/utils/index.js +5 -13
  93. package/core/client/utils/utils.account.js +47 -0
  94. package/core/client/utils/utils.colors.js +6 -2
  95. package/core/client/utils/utils.content.js +7 -5
  96. package/core/client/utils/utils.platform.js +1 -20
  97. package/core/client/utils/utils.push.js +53 -0
  98. package/core/client/utils/utils.pwa.js +63 -0
  99. package/core/client/utils/utils.session.js +27 -12
  100. package/core/common/permissions.js +12 -4
  101. package/core/common/schemas/tags.create.json +35 -0
  102. package/core/common/schemas/users.update-profile.json +1 -1
  103. package/coverage/base.css +224 -0
  104. package/coverage/block-navigation.js +87 -0
  105. package/coverage/core/api/application.js.html +1849 -0
  106. package/coverage/core/api/authentication.js.html +694 -0
  107. package/coverage/core/api/db.js.html +763 -0
  108. package/coverage/core/api/hooks/hooks.account.js.html +169 -0
  109. package/coverage/core/api/hooks/hooks.authentication.js.html +274 -0
  110. package/coverage/core/api/hooks/hooks.authorisations.js.html +1213 -0
  111. package/coverage/core/api/hooks/hooks.groups.js.html +229 -0
  112. package/coverage/core/api/hooks/hooks.logger.js.html +163 -0
  113. package/coverage/core/api/hooks/hooks.model.js.html +994 -0
  114. package/coverage/core/api/hooks/hooks.organisations.js.html +553 -0
  115. package/coverage/core/api/hooks/hooks.push.js.html +232 -0
  116. package/coverage/core/api/hooks/hooks.query.js.html +838 -0
  117. package/coverage/core/api/hooks/hooks.schemas.js.html +304 -0
  118. package/coverage/core/api/hooks/hooks.service.js.html +319 -0
  119. package/coverage/core/api/hooks/hooks.storage.js.html +193 -0
  120. package/coverage/core/api/hooks/hooks.tags.js.html +850 -0
  121. package/coverage/core/api/hooks/hooks.users.js.html +826 -0
  122. package/coverage/core/api/hooks/index.html +296 -0
  123. package/coverage/core/api/hooks/index.js.html +121 -0
  124. package/coverage/core/api/index.html +191 -0
  125. package/coverage/core/api/index.js.html +148 -0
  126. package/coverage/core/api/marshall.js.html +355 -0
  127. package/coverage/core/api/models/groups.model.mongodb.js.html +109 -0
  128. package/coverage/core/api/models/index.html +161 -0
  129. package/coverage/core/api/models/organisations.model.mongodb.js.html +94 -0
  130. package/coverage/core/api/models/tags.model.mongodb.js.html +115 -0
  131. package/coverage/core/api/models/users.model.mongodb.js.html +115 -0
  132. package/coverage/core/api/services/account/account.hooks.js.html +196 -0
  133. package/coverage/core/api/services/account/account.service.js.html +445 -0
  134. package/coverage/core/api/services/account/index.html +131 -0
  135. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  136. package/coverage/core/api/services/authorisations/authorisations.service.js.html +502 -0
  137. package/coverage/core/api/services/authorisations/index.html +131 -0
  138. package/coverage/core/api/services/databases/databases.hooks.js.html +193 -0
  139. package/coverage/core/api/services/databases/databases.service.js.html +100 -0
  140. package/coverage/core/api/services/databases/index.html +131 -0
  141. package/coverage/core/api/services/groups/groups.hooks.js.html +178 -0
  142. package/coverage/core/api/services/groups/index.html +116 -0
  143. package/coverage/core/api/services/index.html +116 -0
  144. package/coverage/core/api/services/index.js.html +475 -0
  145. package/coverage/core/api/services/mailer/index.html +131 -0
  146. package/coverage/core/api/services/mailer/mailer.hooks.js.html +190 -0
  147. package/coverage/core/api/services/mailer/mailer.service.js.html +118 -0
  148. package/coverage/core/api/services/organisations/index.html +131 -0
  149. package/coverage/core/api/services/organisations/organisations.hooks.js.html +178 -0
  150. package/coverage/core/api/services/organisations/organisations.service.js.html +343 -0
  151. package/coverage/core/api/services/push/index.html +131 -0
  152. package/coverage/core/api/services/push/push.hooks.js.html +193 -0
  153. package/coverage/core/api/services/push/push.service.js.html +121 -0
  154. package/coverage/core/api/services/storage/index.html +131 -0
  155. package/coverage/core/api/services/storage/storage.hooks.js.html +190 -0
  156. package/coverage/core/api/services/storage/storage.service.js.html +172 -0
  157. package/coverage/core/api/services/tags/index.html +116 -0
  158. package/coverage/core/api/services/tags/tags.hooks.js.html +178 -0
  159. package/coverage/core/api/services/users/index.html +116 -0
  160. package/coverage/core/api/services/users/users.hooks.js.html +313 -0
  161. package/coverage/core/api/utils.js.html +118 -0
  162. package/coverage/core/common/errors.js.html +88 -0
  163. package/coverage/core/common/index.html +176 -0
  164. package/coverage/core/common/index.js.html +115 -0
  165. package/coverage/core/common/permissions.js.html +1039 -0
  166. package/coverage/core/common/schema.js.html +190 -0
  167. package/coverage/core/common/utils.js.html +220 -0
  168. package/coverage/favicon.png +0 -0
  169. package/coverage/index.html +476 -0
  170. package/coverage/lcov-report/base.css +224 -0
  171. package/coverage/lcov-report/block-navigation.js +87 -0
  172. package/coverage/lcov-report/core/api/application.js.html +1849 -0
  173. package/coverage/lcov-report/core/api/authentication.js.html +694 -0
  174. package/coverage/lcov-report/core/api/db.js.html +763 -0
  175. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +169 -0
  176. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +274 -0
  177. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +1213 -0
  178. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +229 -0
  179. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +163 -0
  180. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +994 -0
  181. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +553 -0
  182. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +232 -0
  183. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +838 -0
  184. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +304 -0
  185. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +319 -0
  186. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +193 -0
  187. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +850 -0
  188. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +826 -0
  189. package/coverage/lcov-report/core/api/hooks/index.html +296 -0
  190. package/coverage/lcov-report/core/api/hooks/index.js.html +121 -0
  191. package/coverage/lcov-report/core/api/index.html +191 -0
  192. package/coverage/lcov-report/core/api/index.js.html +148 -0
  193. package/coverage/lcov-report/core/api/marshall.js.html +355 -0
  194. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +109 -0
  195. package/coverage/lcov-report/core/api/models/index.html +161 -0
  196. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +94 -0
  197. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +115 -0
  198. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +115 -0
  199. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +196 -0
  200. package/coverage/lcov-report/core/api/services/account/account.service.js.html +445 -0
  201. package/coverage/lcov-report/core/api/services/account/index.html +131 -0
  202. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  203. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +502 -0
  204. package/coverage/lcov-report/core/api/services/authorisations/index.html +131 -0
  205. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +193 -0
  206. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +100 -0
  207. package/coverage/lcov-report/core/api/services/databases/index.html +131 -0
  208. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +178 -0
  209. package/coverage/lcov-report/core/api/services/groups/index.html +116 -0
  210. package/coverage/lcov-report/core/api/services/index.html +116 -0
  211. package/coverage/lcov-report/core/api/services/index.js.html +475 -0
  212. package/coverage/lcov-report/core/api/services/mailer/index.html +131 -0
  213. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +190 -0
  214. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +118 -0
  215. package/coverage/lcov-report/core/api/services/organisations/index.html +131 -0
  216. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +178 -0
  217. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +343 -0
  218. package/coverage/lcov-report/core/api/services/push/index.html +131 -0
  219. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +193 -0
  220. package/coverage/lcov-report/core/api/services/push/push.service.js.html +121 -0
  221. package/coverage/lcov-report/core/api/services/storage/index.html +131 -0
  222. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +190 -0
  223. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +172 -0
  224. package/coverage/lcov-report/core/api/services/tags/index.html +116 -0
  225. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +178 -0
  226. package/coverage/lcov-report/core/api/services/users/index.html +116 -0
  227. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +313 -0
  228. package/coverage/lcov-report/core/api/utils.js.html +118 -0
  229. package/coverage/lcov-report/core/common/errors.js.html +88 -0
  230. package/coverage/lcov-report/core/common/index.html +176 -0
  231. package/coverage/lcov-report/core/common/index.js.html +115 -0
  232. package/coverage/lcov-report/core/common/permissions.js.html +1039 -0
  233. package/coverage/lcov-report/core/common/schema.js.html +190 -0
  234. package/coverage/lcov-report/core/common/utils.js.html +220 -0
  235. package/coverage/lcov-report/favicon.png +0 -0
  236. package/coverage/lcov-report/index.html +476 -0
  237. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +340 -0
  238. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +337 -0
  239. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +1168 -0
  240. package/coverage/lcov-report/map/api/hooks/index.html +161 -0
  241. package/coverage/lcov-report/map/api/hooks/index.js.html +94 -0
  242. package/coverage/lcov-report/map/api/index.html +131 -0
  243. package/coverage/lcov-report/map/api/index.js.html +139 -0
  244. package/coverage/lcov-report/map/api/marshall.js.html +178 -0
  245. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +106 -0
  246. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +127 -0
  247. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +196 -0
  248. package/coverage/lcov-report/map/api/models/index.html +146 -0
  249. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +274 -0
  250. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +610 -0
  251. package/coverage/lcov-report/map/api/services/alerts/index.html +131 -0
  252. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +313 -0
  253. package/coverage/lcov-report/map/api/services/catalog/index.html +116 -0
  254. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  255. package/coverage/lcov-report/map/api/services/daptiles/index.html +116 -0
  256. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +205 -0
  257. package/coverage/lcov-report/map/api/services/features/features.service.js.html +241 -0
  258. package/coverage/lcov-report/map/api/services/features/index.html +131 -0
  259. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +178 -0
  260. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +322 -0
  261. package/coverage/lcov-report/map/api/services/geocoder/index.html +131 -0
  262. package/coverage/lcov-report/map/api/services/index.html +116 -0
  263. package/coverage/lcov-report/map/api/services/index.js.html +769 -0
  264. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +466 -0
  265. package/coverage/lcov-report/map/common/errors.js.html +94 -0
  266. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +535 -0
  267. package/coverage/lcov-report/map/common/grid.js.html +1612 -0
  268. package/coverage/lcov-report/map/common/index.html +371 -0
  269. package/coverage/lcov-report/map/common/index.js.html +172 -0
  270. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +556 -0
  271. package/coverage/lcov-report/map/common/moment-utils.js.html +157 -0
  272. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +868 -0
  273. package/coverage/lcov-report/map/common/opendap-utils.js.html +826 -0
  274. package/coverage/lcov-report/map/common/permissions.js.html +118 -0
  275. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +418 -0
  276. package/coverage/lcov-report/map/common/tms-utils.js.html +274 -0
  277. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +364 -0
  278. package/coverage/lcov-report/map/common/wcs-utils.js.html +586 -0
  279. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1033 -0
  280. package/coverage/lcov-report/map/common/wfs-utils.js.html +574 -0
  281. package/coverage/lcov-report/map/common/wms-utils.js.html +436 -0
  282. package/coverage/lcov-report/map/common/wmts-utils.js.html +547 -0
  283. package/coverage/lcov-report/prettify.css +1 -0
  284. package/coverage/lcov-report/prettify.js +2 -0
  285. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  286. package/coverage/lcov-report/sorter.js +196 -0
  287. package/coverage/lcov.info +10742 -0
  288. package/coverage/map/api/hooks/hooks.catalog.js.html +340 -0
  289. package/coverage/map/api/hooks/hooks.features.js.html +337 -0
  290. package/coverage/map/api/hooks/hooks.query.js.html +1168 -0
  291. package/coverage/map/api/hooks/index.html +161 -0
  292. package/coverage/map/api/hooks/index.js.html +94 -0
  293. package/coverage/map/api/index.html +131 -0
  294. package/coverage/map/api/index.js.html +139 -0
  295. package/coverage/map/api/marshall.js.html +178 -0
  296. package/coverage/map/api/models/alerts.model.mongodb.js.html +106 -0
  297. package/coverage/map/api/models/catalog.model.mongodb.js.html +127 -0
  298. package/coverage/map/api/models/features.model.mongodb.js.html +196 -0
  299. package/coverage/map/api/models/index.html +146 -0
  300. package/coverage/map/api/services/alerts/alerts.hooks.js.html +274 -0
  301. package/coverage/map/api/services/alerts/alerts.service.js.html +610 -0
  302. package/coverage/map/api/services/alerts/index.html +131 -0
  303. package/coverage/map/api/services/catalog/catalog.hooks.js.html +313 -0
  304. package/coverage/map/api/services/catalog/index.html +116 -0
  305. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  306. package/coverage/map/api/services/daptiles/index.html +116 -0
  307. package/coverage/map/api/services/features/features.hooks.js.html +205 -0
  308. package/coverage/map/api/services/features/features.service.js.html +241 -0
  309. package/coverage/map/api/services/features/index.html +131 -0
  310. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +178 -0
  311. package/coverage/map/api/services/geocoder/geocoder.service.js.html +322 -0
  312. package/coverage/map/api/services/geocoder/index.html +131 -0
  313. package/coverage/map/api/services/index.html +116 -0
  314. package/coverage/map/api/services/index.js.html +769 -0
  315. package/coverage/map/common/dynamic-grid-source.js.html +466 -0
  316. package/coverage/map/common/errors.js.html +94 -0
  317. package/coverage/map/common/geotiff-grid-source.js.html +535 -0
  318. package/coverage/map/common/grid.js.html +1612 -0
  319. package/coverage/map/common/index.html +371 -0
  320. package/coverage/map/common/index.js.html +172 -0
  321. package/coverage/map/common/meteo-model-grid-source.js.html +556 -0
  322. package/coverage/map/common/moment-utils.js.html +157 -0
  323. package/coverage/map/common/opendap-grid-source.js.html +868 -0
  324. package/coverage/map/common/opendap-utils.js.html +826 -0
  325. package/coverage/map/common/permissions.js.html +118 -0
  326. package/coverage/map/common/time-based-grid-source.js.html +418 -0
  327. package/coverage/map/common/tms-utils.js.html +274 -0
  328. package/coverage/map/common/wcs-grid-source.js.html +364 -0
  329. package/coverage/map/common/wcs-utils.js.html +586 -0
  330. package/coverage/map/common/weacast-grid-source.js.html +1033 -0
  331. package/coverage/map/common/wfs-utils.js.html +574 -0
  332. package/coverage/map/common/wms-utils.js.html +436 -0
  333. package/coverage/map/common/wmts-utils.js.html +547 -0
  334. package/coverage/prettify.css +1 -0
  335. package/coverage/prettify.js +2 -0
  336. package/coverage/sort-arrow-sprite.png +0 -0
  337. package/coverage/sorter.js +196 -0
  338. package/coverage/tmp/coverage-59096-1692631696256-0.json +1 -0
  339. package/coverage/tmp/coverage-59108-1692631696233-0.json +1 -0
  340. package/coverage/tmp/coverage-59119-1692631696222-0.json +1 -0
  341. package/coverage/tmp/coverage-59131-1692631696200-0.json +1 -0
  342. package/coverage/tmp/coverage-59138-1692631696175-0.json +1 -0
  343. package/extras/css/core.variables.scss +5 -1
  344. package/extras/tours/core/account-profile.js +14 -31
  345. package/extras/tours/core/account.js +143 -0
  346. package/extras/tours/core/add-member.js +7 -6
  347. package/extras/tours/core/add-tag.js +13 -0
  348. package/extras/tours/core/create-tag.js +26 -0
  349. package/extras/tours/core/edit-member-role.js +13 -0
  350. package/extras/tours/core/join-group.js +0 -12
  351. package/extras/tours/core/login.js +0 -7
  352. package/extras/tours/core/members.js +13 -26
  353. package/extras/tours/core/send-reset-password.js +1 -1
  354. package/extras/tours/core/tags.js +17 -4
  355. package/extras/tours/map/navigation-bar.js +1 -1
  356. package/extras/tours/map/side-nav.js +3 -2
  357. package/map/api/hooks/hooks.query.js +5 -3
  358. package/map/client/cesium/utils.js +68 -0
  359. package/map/client/components/KFeatureActionButton.vue +27 -27
  360. package/map/client/components/KFeaturesChart.vue +1 -1
  361. package/map/client/components/KFeaturesTable.vue +2 -2
  362. package/map/client/components/KLayerEditionToolbar.vue +1 -0
  363. package/map/client/components/KPositionIndicator.vue +1 -1
  364. package/map/client/components/catalog/KViewSelector.vue +1 -2
  365. package/map/client/components/catalog/KViewsPanel.vue +17 -15
  366. package/map/client/components/form/KDirectionField.vue +0 -1
  367. package/map/client/components/form/KLocationField.vue +16 -29
  368. package/map/client/components/legend/KSymbolsLegend.vue +2 -1
  369. package/map/client/components/location/KLocationCardSection.vue +61 -0
  370. package/map/client/components/location/KLocationMap.vue +24 -13
  371. package/map/client/components/location/KLocationSearch.vue +144 -0
  372. package/map/client/components/location/KLocationTip.vue +29 -0
  373. package/map/client/components/tools/KGeolocateTool.vue +46 -0
  374. package/map/client/components/tools/KSearchTool.vue +93 -0
  375. package/map/client/components/widget/KElevationProfile.vue +2 -2
  376. package/map/client/components/widget/KInformationBox.vue +3 -3
  377. package/map/client/composables/location.js +35 -43
  378. package/map/client/geolocation.js +65 -8
  379. package/map/client/i18n/map_en.json +15 -13
  380. package/map/client/i18n/map_fr.json +15 -13
  381. package/map/client/init.js +10 -18
  382. package/map/client/leaflet/GradientPath.js +2 -1
  383. package/map/client/leaflet/utils.js +61 -0
  384. package/map/client/mixins/globe/mixin.base-globe.js +6 -5
  385. package/map/client/mixins/globe/mixin.popup.js +3 -0
  386. package/map/client/mixins/globe/mixin.style.js +9 -64
  387. package/map/client/mixins/globe/mixin.tooltip.js +3 -0
  388. package/map/client/mixins/index.js +0 -1
  389. package/map/client/mixins/map/mixin.base-map.js +13 -9
  390. package/map/client/mixins/map/mixin.edit-layers.js +82 -15
  391. package/map/client/mixins/map/mixin.geojson-layers.js +8 -1
  392. package/map/client/mixins/map/mixin.style.js +8 -56
  393. package/map/client/mixins/mixin.activity.js +20 -12
  394. package/map/client/mixins/mixin.feature-service.js +34 -1
  395. package/map/client/readers/reader.geojson.js +1 -1
  396. package/map/client/utils/utils.location.js +45 -0
  397. package/package.json +13 -14
  398. package/test/api/core/account.test.js +162 -153
  399. package/test/api/core/config/default.cjs +7 -11
  400. package/test/api/core/config/email-templates/confirmInvitation/html.ejs +1 -1
  401. package/test/api/core/config/email-templates/identityChange/html.ejs +6 -4
  402. package/test/api/core/config/email-templates/newDevice/html.ejs +1 -1
  403. package/test/api/core/config/email-templates/newSubscription/html.ejs +7 -0
  404. package/test/api/core/config/email-templates/passwordChange/html.ejs +1 -1
  405. package/test/api/core/config/email-templates/resendVerifySignup/html.ejs +6 -4
  406. package/test/api/core/config/email-templates/resetPwd/html.ejs +1 -1
  407. package/test/api/core/config/email-templates/sendResetPwd/html.ejs +8 -4
  408. package/test/api/core/hooks.test.js +166 -18
  409. package/test/api/core/index.test.js +32 -70
  410. package/test/api/core/push.test.js +197 -0
  411. package/test/api/core/team.test.js +38 -32
  412. package/test/api/core/test-log-2023-07-04.log +0 -0
  413. package/test/api/core/test-log-2023-07-10.log +2 -0
  414. package/test/api/core/test-log-2023-07-12.log +0 -0
  415. package/test/api/core/test-log-2023-07-18.log +78 -0
  416. package/test/api/core/test-log-2023-07-19.log +44 -0
  417. package/test/api/core/test-log-2023-08-01.log +162 -0
  418. package/test/api/core/test-log-2023-08-21.log +66 -0
  419. package/test/api/core/test-log-2023-08-22.log +96 -0
  420. package/test/api/core/test-log-2023-08-23.log +22 -0
  421. package/test/api/core/test-log-2023-09-20.log +22 -0
  422. package/test/api/core/test-log-2023-09-21.log +105 -0
  423. package/test/api/core/utils.js +11 -2
  424. package/test/api/map/alerts.test.js +1 -1
  425. package/test/api/map/test-log-2023-07-18.log +62 -0
  426. package/test/api/map/test-log-2023-07-19.log +13 -0
  427. package/test/api/map/test-log-2023-08-21.log +65 -0
  428. package/test/api/map/test-log-2023-09-20.log +60 -0
  429. package/test/api/map/test-log-2023-09-21.log +12 -0
  430. package/test/client/core/account.js +15 -32
  431. package/test/client/core/api.js +99 -44
  432. package/test/client/core/layout.js +4 -0
  433. package/test/client/core/runner.js +66 -14
  434. package/test/client/core/time.js +1 -1
  435. package/test/client/map/controls.js +17 -3
  436. package/core/api/hooks/hooks.account.js +0 -28
  437. package/core/api/hooks/hooks.devices.js +0 -42
  438. package/core/api/hooks/hooks.pusher.js +0 -215
  439. package/core/api/hooks/hooks.tags.js +0 -255
  440. package/core/api/services/devices/devices.service.js +0 -99
  441. package/core/api/services/pusher/pusher.channels.js +0 -3
  442. package/core/api/services/pusher/pusher.hooks.js +0 -36
  443. package/core/api/services/pusher/pusher.service.js +0 -449
  444. package/core/client/components/KInstallApp.vue +0 -43
  445. package/core/client/components/account/KAccountActivity.vue +0 -58
  446. package/core/client/components/account/KAccountDZ.vue +0 -66
  447. package/core/client/components/account/KAccountDevices.vue +0 -56
  448. package/core/client/components/account/KAccountSecurity.vue +0 -87
  449. package/core/client/components/account/KChangeIdentity.vue +0 -102
  450. package/core/client/components/account/KChangePassword.vue +0 -132
  451. package/core/client/components/account/KDeviceCard.vue +0 -75
  452. package/core/client/components/account/KIdentityPanel.vue +0 -34
  453. package/core/client/components/account/KResendVerifySignup.vue +0 -108
  454. package/core/client/components/account/KSendChangeIdentity.vue +0 -115
  455. package/core/client/components/account/KSignupAlert.vue +0 -63
  456. package/core/client/components/account/KVerifySignup.vue +0 -102
  457. package/core/client/components/form/KTagField.vue +0 -148
  458. package/core/common/schemas/members.update.json +0 -18
  459. package/extras/tours/core/account-dz.js +0 -37
  460. package/extras/tours/core/account-security.js +0 -52
  461. package/extras/tours/core/change-password.js +0 -34
  462. package/extras/tours/core/edit-member-tags.js +0 -18
  463. package/extras/tours/core/send-change-identity.js +0 -28
  464. package/map/client/components/KLocateUser.vue +0 -36
  465. package/map/client/components/KLocationInput.vue +0 -217
  466. package/map/client/components/KLocationMap.vue +0 -301
  467. package/map/client/components/KSearchLocation.vue +0 -88
  468. package/map/client/components/input/KPlaceChooser.vue +0 -78
  469. package/map/client/components/location/KLocation.vue +0 -24
  470. package/map/client/mixins/mixin.navigator.js +0 -36
  471. package/test/api/core/notifications.test.js +0 -502
@@ -0,0 +1,47 @@
1
+ import { api } from '../api.js'
2
+
3
+ export function resendVerifySignup (email) {
4
+ return api.getService('account').create({
5
+ action: 'resendVerifySignup',
6
+ value: { email }
7
+ })
8
+ }
9
+
10
+ export function verifySignup (token, email) {
11
+ return api.getService('account').create({
12
+ action: 'verifySignupShort',
13
+ value: { user: { email }, token }
14
+ })
15
+ }
16
+
17
+ export function sendResetPassword (email) {
18
+ return api.getService('account').create({
19
+ action: 'sendResetPwd',
20
+ value: { email }
21
+ })
22
+ }
23
+
24
+ export function resetPassword (email, token, password) {
25
+ return api.getService('account').create({
26
+ action: 'resetPwdShort',
27
+ value: { user: { email }, token, password }
28
+ })
29
+ }
30
+
31
+ export function changePassword (email, oldPassword, password) {
32
+ return api.getService('account').create({
33
+ action: 'passwordChange',
34
+ value: { user: { email }, oldPassword, password }
35
+ })
36
+ }
37
+
38
+ export function sendChangeIdentity (oldEmail, email, password) {
39
+ return api.getService('account').create({
40
+ action: 'identityChange',
41
+ value: { user: { email: oldEmail }, changes: { email }, password }
42
+ })
43
+ }
44
+
45
+ export function changeIdentity (token) {
46
+ return verifySignup(token)
47
+ }
@@ -24,9 +24,13 @@ export const Colors = {
24
24
  }
25
25
 
26
26
  export function getPaletteFromColor (color) {
27
- return _.findKey(Colors, item => item === color)
27
+ // Check if already a color of the palette
28
+ if (Colors[color]) return color
29
+ else return _.findKey(Colors, item => item === color) || 'white'
28
30
  }
29
31
 
30
32
  export function getColorFromPalette (color) {
31
- return Colors[color]
33
+ // Check if already a RGB color
34
+ if (color.startsWith('#')) return color
35
+ else return Colors[color] || '#ffffff'
32
36
  }
@@ -55,7 +55,7 @@ export function filterContent (content, filter) {
55
55
  }
56
56
 
57
57
  // Perform binding between a configuration object and a given context object
58
- export function bindContent (content, context) {
58
+ export function bindContent (content, context, omit = []) {
59
59
  const components = _.flatMapDeep(content)
60
60
  _.forEach(components, (component) => {
61
61
  // Process component handlers
@@ -63,14 +63,14 @@ export function bindContent (content, context) {
63
63
  // Then process component props
64
64
  // It allows to write any property like { label: ':xxx' } and bind it
65
65
  // to a component property from the context like we do for handler
66
- bindProperties(component, context)
66
+ bindProperties(component, context, omit)
67
67
  // Recursively bind the props/handlers on the sub content object
68
- if (component.content) bindContent(component.content, context)
68
+ if (component.content) bindContent(component.content, context, omit)
69
69
  })
70
70
  return content
71
71
  }
72
72
 
73
- export function bindProperties (item, context) {
73
+ export function bindProperties (item, context, omit = []) {
74
74
  if (Array.isArray(item)) {
75
75
  for (let i = 0; i < item.length; i++) {
76
76
  item[i] = bindProperties(item[i], context)
@@ -78,7 +78,7 @@ export function bindProperties (item, context) {
78
78
  } else if (typeof item === 'object') {
79
79
  _.forOwn(item, (value, key) => {
80
80
  // Bind required properties only
81
- if (!ReservedBindings.includes(key)) {
81
+ if (!ReservedBindings.includes(key) && !omit.includes(key)) {
82
82
  if (typeof value === 'string') {
83
83
  item[key] = getBoundValue(value, context)
84
84
  } else {
@@ -178,6 +178,8 @@ export function getBoundValue (value, context) {
178
178
  // const result = _.get(context, path)
179
179
  // if (!_.isNil(result)) return result
180
180
  }
181
+ // Bound value not found
182
+ return undefined
181
183
  }
182
184
  return value
183
185
  }
@@ -1,5 +1,4 @@
1
- import { Platform, Notify } from 'quasar'
2
- import { i18n } from '../i18n.js'
1
+ import { Platform } from 'quasar'
3
2
 
4
3
  export function getPlatform () {
5
4
  return Object.assign(Platform.is, {
@@ -10,21 +9,3 @@ export function getPlatform () {
10
9
  })
11
10
  }
12
11
 
13
- export function updatePwa (registration) {
14
- // Refresh the page once the update has been applied
15
- registration.waiting.addEventListener('statechange', (event) => {
16
- if (event.target.state === 'activated') {
17
- window.location.reload()
18
- }
19
- })
20
- // Notify when a new version is available
21
- Notify.create({
22
- type: 'warning',
23
- timeout: 0,
24
- message: i18n.t('pwa.VERSION_MISMATCH'),
25
- actions: [
26
- { label: i18n.t('pwa.BUTTON_REFRESH'), color: 'white', handler: () => registration.waiting.postMessage({ type: 'SKIP_WAITING' }) },
27
- { label: i18n.t('pwa.BUTTON_DISMISS'), color: 'white' }
28
- ]
29
- })
30
- }
@@ -0,0 +1,53 @@
1
+ import {
2
+ checkPrerequisites,
3
+ getPushSubscription,
4
+ subscribePushNotifications,
5
+ requestNotificationPermission,
6
+ addSubscription
7
+ } from '@kalisio/feathers-webpush/client.js'
8
+ import { Notify } from 'quasar'
9
+ import logger from 'loglevel'
10
+ import _ from 'lodash'
11
+ import moment from 'moment'
12
+ import { i18n } from '../i18n.js'
13
+ import { Store } from '../store.js'
14
+ import { api } from '../api.js'
15
+ import { getPlatform } from './utils.platform.js'
16
+
17
+ export async function subscribeToPushNotifications () {
18
+ // Check prerequisites & notification permission
19
+ try {
20
+ await checkPrerequisites()
21
+ await requestNotificationPermission()
22
+ } catch (error) {
23
+ Notify.create({ type: 'negative', message: i18n.t(`errors.${error.code}`) })
24
+ return
25
+ }
26
+ // Data
27
+ const userService = api.service('api/users')
28
+ const platform = getPlatform()
29
+ const date = moment.utc().toISOString()
30
+ const currentSubscription = await getPushSubscription()
31
+ const user = Store.get('user')
32
+ // Check if user is already subscribed
33
+ if (currentSubscription && _.find(_.get(user, 'subscriptions', []), subscription => subscription.endpoint === currentSubscription.endpoint)) {
34
+ // Patch subscription connection date
35
+ const subscriptions = _.map(user.subscriptions, subscription => {
36
+ if (subscription.endpoint === currentSubscription.endpoint) subscription.lastActivity = date
37
+ return subscription
38
+ })
39
+ userService.patch(Store.user._id, { subscriptions: subscriptions })
40
+ logger.debug(`New connection date registered on ${date} with subscription endpoint: ${currentSubscription.endpoint}`)
41
+ return
42
+ }
43
+ // Subscribe to web webpush notifications
44
+ const subscription = await subscribePushNotifications(Store.get('capabilities.api.vapidPublicKey'))
45
+ // Set platform informations
46
+ subscription.browser = { name: platform.name, version: platform.version }
47
+ subscription.platform = platform.platform
48
+ subscription.lastActivity = date
49
+ // Patch user subscriptions
50
+ await addSubscription(user, subscription, 'subscriptions')
51
+ userService.patch(Store.user._id, { subscriptions: user.subscriptions })
52
+ logger.debug(`New webpush subscription registered with endpoint: ${subscription.endpoint}`)
53
+ }
@@ -0,0 +1,63 @@
1
+ import { useQuasar } from 'quasar'
2
+ import { i18n } from '../i18n.js'
3
+
4
+ export let InstallPwaPrompt = null
5
+
6
+ window.addEventListener('beforeinstallprompt', (e) => {
7
+ e.preventDefault()
8
+ // Stash the event so it can be triggered later
9
+ InstallPwaPrompt = e
10
+ })
11
+
12
+ export function installDefaultPrompt () {
13
+ useQuasar().dialog({
14
+ title: i18n.t('composables.pwa.INSTALL_TITLE'),
15
+ message: i18n.t('composables.pwa.INSTALL_MESSAGE'),
16
+ cancel: {
17
+ id: 'ignore-button',
18
+ label: i18n.t('composables.pwa.IGNORE'),
19
+ color: 'primary',
20
+ outline: true
21
+ },
22
+ ok: {
23
+ id: 'install-button',
24
+ label: i18n.t('composables.pwa.INSTALL'),
25
+ color: 'primary'
26
+ },
27
+ persistent: true,
28
+ position: 'bottom',
29
+ html: true
30
+ }).onOk(async () => {
31
+ InstallPwaPrompt.prompt()
32
+ // Wait for the user to respond to the prompt
33
+ const { outcome } = await InstallPwaPrompt.userChoice
34
+ // Refresh page
35
+ if (outcome === 'accepted') location.reload()
36
+ })
37
+ }
38
+
39
+ export function installSafariPrompt () {
40
+ useQuasar().dialog({
41
+ title: i18n.t('composables.pwa.INSTALL_TITLE'),
42
+ message: i18n.t('composables.pwa.IOS_INSTALL_MESSAGE'),
43
+ ok: {
44
+ color: 'primary'
45
+ },
46
+ persistent: true,
47
+ position: 'bottom',
48
+ html: true
49
+ })
50
+ }
51
+
52
+ export function installFFDesktopPrompt () {
53
+ useQuasar().dialog({
54
+ title: i18n.t('composables.pwa.INSTALL_TITLE'),
55
+ message: i18n.t('composables.pwa.FIREFOX_DESKTOP_INSTALL_MESSAGE'),
56
+ ok: {
57
+ color: 'primary'
58
+ },
59
+ persistent: true,
60
+ position: 'bottom',
61
+ html: true
62
+ })
63
+ }
@@ -14,6 +14,7 @@ export async function login (email, password) {
14
14
  // Anonymous user or service account ?
15
15
  const user = response.user ? response.user : { name: i18n.t('composables.ANONYMOUS'), anonymous: true }
16
16
  Store.set('user', user)
17
+ await updateAbilities()
17
18
  }
18
19
 
19
20
  export async function register (user) {
@@ -23,8 +24,17 @@ export async function register (user) {
23
24
  }
24
25
 
25
26
  export async function logout () {
26
- await api.logout()
27
- Store.set('user', null)
27
+ try {
28
+ await api.logout()
29
+ Store.set('user', null)
30
+ } catch (error) {
31
+ // This ensure user is unset and an old token is not kept e.g. when the user has been deleted
32
+ Store.set('user', null)
33
+ await api.authentication.removeAccessToken()
34
+ // Rethrow for caller to handle
35
+ throw error
36
+ }
37
+
28
38
  }
29
39
 
30
40
  export async function restoreSession () {
@@ -32,12 +42,13 @@ export async function restoreSession () {
32
42
  const response = await api.reAuthenticate()
33
43
  const user = response.user ? response.user : { name: i18n.t('composables.ANONYMOUS'), anonymous: true }
34
44
  Store.set('user', user)
45
+ await updateAbilities()
35
46
  } catch (error) {
36
- // This ensure an old token is not kept when the user has been deleted
37
- if (error.code === 404) {
38
- await api.authentication.removeAccessToken()
39
- await logout()
40
- }
47
+ // This ensure an old token is not kept e.g. when the user has been deleted
48
+ // await logout()
49
+ // It actually causes a call to the remove method on the authentication service, which fails due to missing access token
50
+ // See https://github.com/kalisio/kdk/issues/757, as a consequence we prefer to clean the token manually instead
51
+ await api.authentication.removeAccessToken()
41
52
  // Rethrow for caller to handle
42
53
  throw error
43
54
  }
@@ -46,18 +57,22 @@ export async function restoreSession () {
46
57
  export async function updateAbilities () {
47
58
  const user = Store.get('user')
48
59
  if (!user) return
49
- if (user.abilities) return
50
60
  const abilities = await defineAbilities(user, api)
51
- Store.set('user.abilities', abilities)
52
- if (abilities) {
53
- logger.debug('New user abilities: ', abilities.rules)
61
+ const previousAbilities = Store.get('user.abilities')
62
+ const rules = _.get(abilities, 'rules')
63
+ const previousRules = _.get(previousAbilities, 'rules')
64
+ // Update only whenever required, eg updating user profile should not change abilities
65
+ if (!_.isEqual(rules, previousRules)) {
66
+ Store.set('user.abilities', abilities)
67
+ logger.debug('[KDK] New user abilities: ', abilities.rules)
54
68
  }
55
69
  }
56
70
 
57
- function updateUser (user) {
71
+ export async function updateUser (user) {
58
72
  // Check whether we need to update the current user
59
73
  if (user._id === Store.get('user._id')) {
60
74
  Store.patch('user', user)
75
+ await updateAbilities()
61
76
  }
62
77
  }
63
78
 
@@ -52,10 +52,9 @@ export function defineUserAbilities (subject, can, cannot) {
52
52
  // Verification email, reset password, etc.
53
53
  can('service', 'account')
54
54
  can('create', 'account')
55
- can('service', 'devices')
56
- can('update', 'devices')
57
- can('remove', 'devices')
58
-
55
+ // Allow push registration
56
+ can('service', 'push')
57
+ can('create', 'push')
59
58
  if (subject && subject._id) {
60
59
  // Read user profiles for authorizing
61
60
  can('read', 'users')
@@ -273,6 +272,15 @@ export function countMembersOfGroup (membersService, groupId, role) {
273
272
  return countSubjectsForResource(membersService, 'groups', groupId, role)
274
273
  }
275
274
 
275
+ // Helper functions to find the members with a given tag
276
+ export function findMembersWithTag (membersService, tagId) {
277
+ return findSubjectsForResource(membersService, 'tags', tagId)
278
+ }
279
+
280
+ export function countMembersWithTag (membersService, tagId) {
281
+ return countSubjectsForResource(membersService, 'tags', tagId)
282
+ }
283
+
276
284
  export function getRoleForOrganisation (user, organisationId) {
277
285
  const result = _.find(user.organisations, { _id: organisationId })
278
286
  if (!_.isUndefined(result)) return result.permissions
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "http://www.kalisio.xyz/schemas/tags.create.json#",
4
+ "title": "schemas.TAGS_CREATE_TITLE",
5
+ "description": "Tag creation schema",
6
+ "type": "object",
7
+ "properties": {
8
+ "value": {
9
+ "type": "string",
10
+ "maxLength": 128,
11
+ "field": {
12
+ "component": "form/KTextField",
13
+ "label": "schemas.TAGS_NAME_FIELD_LABEL"
14
+ }
15
+ },
16
+ "icon": {
17
+ "type": "object",
18
+ "default": { "name": "", "color": "" },
19
+ "field": {
20
+ "component": "form/KIconField",
21
+ "label": "schemas.TAGS_ICON_FIELD_LABEL"
22
+ }
23
+ },
24
+ "description": {
25
+ "type": "string",
26
+ "maxLength": 2048,
27
+ "field": {
28
+ "component": "form/KTextField",
29
+ "label": "schemas.TAGS_DESCRIPTION_FIELD_LABEL"
30
+ }
31
+ }
32
+ },
33
+ "required": ["value"]
34
+ }
35
+
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "http://kalisio.xyz/schemas/users.update-profile.json#",
4
4
  "title": "schemas.OBJECT_NAME",
5
- "description": "User profile perspective",
5
+ "description": "User profile",
6
6
  "type": "object",
7
7
  "properties": {
8
8
  "name": {
@@ -0,0 +1,224 @@
1
+ body, html {
2
+ margin:0; padding: 0;
3
+ height: 100%;
4
+ }
5
+ body {
6
+ font-family: Helvetica Neue, Helvetica, Arial;
7
+ font-size: 14px;
8
+ color:#333;
9
+ }
10
+ .small { font-size: 12px; }
11
+ *, *:after, *:before {
12
+ -webkit-box-sizing:border-box;
13
+ -moz-box-sizing:border-box;
14
+ box-sizing:border-box;
15
+ }
16
+ h1 { font-size: 20px; margin: 0;}
17
+ h2 { font-size: 14px; }
18
+ pre {
19
+ font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
+ margin: 0;
21
+ padding: 0;
22
+ -moz-tab-size: 2;
23
+ -o-tab-size: 2;
24
+ tab-size: 2;
25
+ }
26
+ a { color:#0074D9; text-decoration:none; }
27
+ a:hover { text-decoration:underline; }
28
+ .strong { font-weight: bold; }
29
+ .space-top1 { padding: 10px 0 0 0; }
30
+ .pad2y { padding: 20px 0; }
31
+ .pad1y { padding: 10px 0; }
32
+ .pad2x { padding: 0 20px; }
33
+ .pad2 { padding: 20px; }
34
+ .pad1 { padding: 10px; }
35
+ .space-left2 { padding-left:55px; }
36
+ .space-right2 { padding-right:20px; }
37
+ .center { text-align:center; }
38
+ .clearfix { display:block; }
39
+ .clearfix:after {
40
+ content:'';
41
+ display:block;
42
+ height:0;
43
+ clear:both;
44
+ visibility:hidden;
45
+ }
46
+ .fl { float: left; }
47
+ @media only screen and (max-width:640px) {
48
+ .col3 { width:100%; max-width:100%; }
49
+ .hide-mobile { display:none!important; }
50
+ }
51
+
52
+ .quiet {
53
+ color: #7f7f7f;
54
+ color: rgba(0,0,0,0.5);
55
+ }
56
+ .quiet a { opacity: 0.7; }
57
+
58
+ .fraction {
59
+ font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
+ font-size: 10px;
61
+ color: #555;
62
+ background: #E8E8E8;
63
+ padding: 4px 5px;
64
+ border-radius: 3px;
65
+ vertical-align: middle;
66
+ }
67
+
68
+ div.path a:link, div.path a:visited { color: #333; }
69
+ table.coverage {
70
+ border-collapse: collapse;
71
+ margin: 10px 0 0 0;
72
+ padding: 0;
73
+ }
74
+
75
+ table.coverage td {
76
+ margin: 0;
77
+ padding: 0;
78
+ vertical-align: top;
79
+ }
80
+ table.coverage td.line-count {
81
+ text-align: right;
82
+ padding: 0 5px 0 20px;
83
+ }
84
+ table.coverage td.line-coverage {
85
+ text-align: right;
86
+ padding-right: 10px;
87
+ min-width:20px;
88
+ }
89
+
90
+ table.coverage td span.cline-any {
91
+ display: inline-block;
92
+ padding: 0 5px;
93
+ width: 100%;
94
+ }
95
+ .missing-if-branch {
96
+ display: inline-block;
97
+ margin-right: 5px;
98
+ border-radius: 3px;
99
+ position: relative;
100
+ padding: 0 4px;
101
+ background: #333;
102
+ color: yellow;
103
+ }
104
+
105
+ .skip-if-branch {
106
+ display: none;
107
+ margin-right: 10px;
108
+ position: relative;
109
+ padding: 0 4px;
110
+ background: #ccc;
111
+ color: white;
112
+ }
113
+ .missing-if-branch .typ, .skip-if-branch .typ {
114
+ color: inherit !important;
115
+ }
116
+ .coverage-summary {
117
+ border-collapse: collapse;
118
+ width: 100%;
119
+ }
120
+ .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
+ .keyline-all { border: 1px solid #ddd; }
122
+ .coverage-summary td, .coverage-summary th { padding: 10px; }
123
+ .coverage-summary tbody { border: 1px solid #bbb; }
124
+ .coverage-summary td { border-right: 1px solid #bbb; }
125
+ .coverage-summary td:last-child { border-right: none; }
126
+ .coverage-summary th {
127
+ text-align: left;
128
+ font-weight: normal;
129
+ white-space: nowrap;
130
+ }
131
+ .coverage-summary th.file { border-right: none !important; }
132
+ .coverage-summary th.pct { }
133
+ .coverage-summary th.pic,
134
+ .coverage-summary th.abs,
135
+ .coverage-summary td.pct,
136
+ .coverage-summary td.abs { text-align: right; }
137
+ .coverage-summary td.file { white-space: nowrap; }
138
+ .coverage-summary td.pic { min-width: 120px !important; }
139
+ .coverage-summary tfoot td { }
140
+
141
+ .coverage-summary .sorter {
142
+ height: 10px;
143
+ width: 7px;
144
+ display: inline-block;
145
+ margin-left: 0.5em;
146
+ background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
+ }
148
+ .coverage-summary .sorted .sorter {
149
+ background-position: 0 -20px;
150
+ }
151
+ .coverage-summary .sorted-desc .sorter {
152
+ background-position: 0 -10px;
153
+ }
154
+ .status-line { height: 10px; }
155
+ /* yellow */
156
+ .cbranch-no { background: yellow !important; color: #111; }
157
+ /* dark red */
158
+ .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
159
+ .low .chart { border:1px solid #C21F39 }
160
+ .highlighted,
161
+ .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
162
+ background: #C21F39 !important;
163
+ }
164
+ /* medium red */
165
+ .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
166
+ /* light red */
167
+ .low, .cline-no { background:#FCE1E5 }
168
+ /* light green */
169
+ .high, .cline-yes { background:rgb(230,245,208) }
170
+ /* medium green */
171
+ .cstat-yes { background:rgb(161,215,106) }
172
+ /* dark green */
173
+ .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
174
+ .high .chart { border:1px solid rgb(77,146,33) }
175
+ /* dark yellow (gold) */
176
+ .status-line.medium, .medium .cover-fill { background: #f9cd0b; }
177
+ .medium .chart { border:1px solid #f9cd0b; }
178
+ /* light yellow */
179
+ .medium { background: #fff4c2; }
180
+
181
+ .cstat-skip { background: #ddd; color: #111; }
182
+ .fstat-skip { background: #ddd; color: #111 !important; }
183
+ .cbranch-skip { background: #ddd !important; color: #111; }
184
+
185
+ span.cline-neutral { background: #eaeaea; }
186
+
187
+ .coverage-summary td.empty {
188
+ opacity: .5;
189
+ padding-top: 4px;
190
+ padding-bottom: 4px;
191
+ line-height: 1;
192
+ color: #888;
193
+ }
194
+
195
+ .cover-fill, .cover-empty {
196
+ display:inline-block;
197
+ height: 12px;
198
+ }
199
+ .chart {
200
+ line-height: 0;
201
+ }
202
+ .cover-empty {
203
+ background: white;
204
+ }
205
+ .cover-full {
206
+ border-right: none !important;
207
+ }
208
+ pre.prettyprint {
209
+ border: none !important;
210
+ padding: 0 !important;
211
+ margin: 0 !important;
212
+ }
213
+ .com { color: #999 !important; }
214
+ .ignore-none { color: #999; font-weight: normal; }
215
+
216
+ .wrapper {
217
+ min-height: 100%;
218
+ height: auto !important;
219
+ height: 100%;
220
+ margin: 0 auto -48px;
221
+ }
222
+ .footer, .push {
223
+ height: 48px;
224
+ }