@kalisio/kdk 2.2.2 → 2.3.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 (388) 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/hooks/hooks.query.js +15 -2
  6. package/core/api/marshall.js +35 -4
  7. package/core/client/api.js +1 -1
  8. package/core/client/components/KActivity.vue +73 -0
  9. package/core/client/components/KContent.vue +1 -1
  10. package/core/client/components/KSponsor.vue +2 -13
  11. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  12. package/core/client/components/account/KPasswordManager.vue +1 -1
  13. package/core/client/components/action/KAction.vue +294 -0
  14. package/core/client/components/action/KBugReportAction.vue +37 -0
  15. package/core/client/components/action/index.js +7 -0
  16. package/core/client/components/app/KAbout.vue +16 -63
  17. package/core/client/components/app/KPlatform.vue +1 -1
  18. package/core/client/components/app/KSettings.vue +14 -14
  19. package/core/client/components/app/KTour.vue +6 -8
  20. package/core/client/components/app/KWelcome.vue +1 -1
  21. package/core/client/components/app/index.js +4 -0
  22. package/core/client/components/chart/KDataTable.vue +40 -25
  23. package/core/client/components/chart/KTimeSeriesChart.vue +20 -12
  24. package/core/client/components/collection/KCard.vue +1 -1
  25. package/core/client/components/collection/KCardSection.vue +3 -2
  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 +6 -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 +16 -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 +4 -1
  56. package/core/client/i18n/core_fr.json +8 -5
  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/services/index.js +27 -26
  61. package/core/client/services/local-settings.service.js +2 -3
  62. package/core/client/units.js +6 -1
  63. package/core/client/utils/index.js +3 -0
  64. package/core/client/utils/utils.actions.js +93 -0
  65. package/core/client/utils/utils.colors.js +1 -1
  66. package/core/client/utils/utils.data.js +22 -0
  67. package/core/client/utils/utils.shapes.js +16 -6
  68. package/coverage/base.css +224 -0
  69. package/coverage/block-navigation.js +87 -0
  70. package/coverage/core/api/application.js.html +1870 -0
  71. package/coverage/core/api/authentication.js.html +742 -0
  72. package/coverage/core/api/db.js.html +778 -0
  73. package/coverage/core/api/hooks/hooks.authentication.js.html +313 -0
  74. package/coverage/core/api/hooks/hooks.authorisations.js.html +1243 -0
  75. package/coverage/core/api/hooks/hooks.groups.js.html +229 -0
  76. package/coverage/core/api/hooks/hooks.logger.js.html +163 -0
  77. package/coverage/core/api/hooks/hooks.model.js.html +955 -0
  78. package/coverage/core/api/hooks/hooks.organisations.js.html +541 -0
  79. package/coverage/core/api/hooks/hooks.push.js.html +253 -0
  80. package/coverage/core/api/hooks/hooks.query.js.html +862 -0
  81. package/coverage/core/api/hooks/hooks.schemas.js.html +304 -0
  82. package/coverage/core/api/hooks/hooks.service.js.html +319 -0
  83. package/coverage/core/api/hooks/hooks.storage.js.html +193 -0
  84. package/coverage/core/api/hooks/hooks.users.js.html +868 -0
  85. package/coverage/core/api/hooks/index.html +296 -0
  86. package/coverage/core/api/hooks/index.js.html +121 -0
  87. package/coverage/core/api/index.html +191 -0
  88. package/coverage/core/api/index.js.html +148 -0
  89. package/coverage/core/api/marshall.js.html +448 -0
  90. package/coverage/core/api/models/groups.model.mongodb.js.html +109 -0
  91. package/coverage/core/api/models/index.html +161 -0
  92. package/coverage/core/api/models/organisations.model.mongodb.js.html +94 -0
  93. package/coverage/core/api/models/tags.model.mongodb.js.html +115 -0
  94. package/coverage/core/api/models/users.model.mongodb.js.html +115 -0
  95. package/coverage/core/api/services/account/account.hooks.js.html +208 -0
  96. package/coverage/core/api/services/account/account.service.js.html +436 -0
  97. package/coverage/core/api/services/account/index.html +131 -0
  98. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  99. package/coverage/core/api/services/authorisations/authorisations.service.js.html +502 -0
  100. package/coverage/core/api/services/authorisations/index.html +131 -0
  101. package/coverage/core/api/services/databases/databases.hooks.js.html +193 -0
  102. package/coverage/core/api/services/databases/databases.service.js.html +100 -0
  103. package/coverage/core/api/services/databases/index.html +131 -0
  104. package/coverage/core/api/services/groups/groups.hooks.js.html +178 -0
  105. package/coverage/core/api/services/groups/index.html +116 -0
  106. package/coverage/core/api/services/import-export/import-export.hooks.js.html +184 -0
  107. package/coverage/core/api/services/import-export/import-export.service.js.html +118 -0
  108. package/coverage/core/api/services/import-export/index.html +131 -0
  109. package/coverage/core/api/services/index.html +116 -0
  110. package/coverage/core/api/services/index.js.html +499 -0
  111. package/coverage/core/api/services/mailer/index.html +131 -0
  112. package/coverage/core/api/services/mailer/mailer.hooks.js.html +190 -0
  113. package/coverage/core/api/services/mailer/mailer.service.js.html +118 -0
  114. package/coverage/core/api/services/organisations/index.html +131 -0
  115. package/coverage/core/api/services/organisations/organisations.hooks.js.html +178 -0
  116. package/coverage/core/api/services/organisations/organisations.service.js.html +343 -0
  117. package/coverage/core/api/services/push/index.html +131 -0
  118. package/coverage/core/api/services/push/push.hooks.js.html +190 -0
  119. package/coverage/core/api/services/push/push.service.js.html +121 -0
  120. package/coverage/core/api/services/storage/index.html +131 -0
  121. package/coverage/core/api/services/storage/storage.hooks.js.html +190 -0
  122. package/coverage/core/api/services/storage/storage.service.js.html +172 -0
  123. package/coverage/core/api/services/tags/index.html +116 -0
  124. package/coverage/core/api/services/tags/tags.hooks.js.html +178 -0
  125. package/coverage/core/api/services/users/index.html +116 -0
  126. package/coverage/core/api/services/users/users.hooks.js.html +307 -0
  127. package/coverage/core/api/utils.js.html +118 -0
  128. package/coverage/core/common/errors.js.html +88 -0
  129. package/coverage/core/common/index.html +176 -0
  130. package/coverage/core/common/index.js.html +115 -0
  131. package/coverage/core/common/permissions.js.html +1048 -0
  132. package/coverage/core/common/schema.js.html +190 -0
  133. package/coverage/core/common/utils.js.html +220 -0
  134. package/coverage/favicon.png +0 -0
  135. package/coverage/index.html +491 -0
  136. package/coverage/lcov-report/base.css +224 -0
  137. package/coverage/lcov-report/block-navigation.js +87 -0
  138. package/coverage/lcov-report/core/api/application.js.html +1870 -0
  139. package/coverage/lcov-report/core/api/authentication.js.html +742 -0
  140. package/coverage/lcov-report/core/api/db.js.html +778 -0
  141. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +313 -0
  142. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +1243 -0
  143. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +229 -0
  144. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +163 -0
  145. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +955 -0
  146. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +541 -0
  147. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +253 -0
  148. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +862 -0
  149. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +304 -0
  150. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +319 -0
  151. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +193 -0
  152. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +868 -0
  153. package/coverage/lcov-report/core/api/hooks/index.html +296 -0
  154. package/coverage/lcov-report/core/api/hooks/index.js.html +121 -0
  155. package/coverage/lcov-report/core/api/index.html +191 -0
  156. package/coverage/lcov-report/core/api/index.js.html +148 -0
  157. package/coverage/lcov-report/core/api/marshall.js.html +448 -0
  158. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +109 -0
  159. package/coverage/lcov-report/core/api/models/index.html +161 -0
  160. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +94 -0
  161. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +115 -0
  162. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +115 -0
  163. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +208 -0
  164. package/coverage/lcov-report/core/api/services/account/account.service.js.html +436 -0
  165. package/coverage/lcov-report/core/api/services/account/index.html +131 -0
  166. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  167. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +502 -0
  168. package/coverage/lcov-report/core/api/services/authorisations/index.html +131 -0
  169. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +193 -0
  170. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +100 -0
  171. package/coverage/lcov-report/core/api/services/databases/index.html +131 -0
  172. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +178 -0
  173. package/coverage/lcov-report/core/api/services/groups/index.html +116 -0
  174. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +184 -0
  175. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +118 -0
  176. package/coverage/lcov-report/core/api/services/import-export/index.html +131 -0
  177. package/coverage/lcov-report/core/api/services/index.html +116 -0
  178. package/coverage/lcov-report/core/api/services/index.js.html +499 -0
  179. package/coverage/lcov-report/core/api/services/mailer/index.html +131 -0
  180. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +190 -0
  181. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +118 -0
  182. package/coverage/lcov-report/core/api/services/organisations/index.html +131 -0
  183. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +178 -0
  184. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +343 -0
  185. package/coverage/lcov-report/core/api/services/push/index.html +131 -0
  186. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +190 -0
  187. package/coverage/lcov-report/core/api/services/push/push.service.js.html +121 -0
  188. package/coverage/lcov-report/core/api/services/storage/index.html +131 -0
  189. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +190 -0
  190. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +172 -0
  191. package/coverage/lcov-report/core/api/services/tags/index.html +116 -0
  192. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +178 -0
  193. package/coverage/lcov-report/core/api/services/users/index.html +116 -0
  194. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +307 -0
  195. package/coverage/lcov-report/core/api/utils.js.html +118 -0
  196. package/coverage/lcov-report/core/common/errors.js.html +88 -0
  197. package/coverage/lcov-report/core/common/index.html +176 -0
  198. package/coverage/lcov-report/core/common/index.js.html +115 -0
  199. package/coverage/lcov-report/core/common/permissions.js.html +1048 -0
  200. package/coverage/lcov-report/core/common/schema.js.html +190 -0
  201. package/coverage/lcov-report/core/common/utils.js.html +220 -0
  202. package/coverage/lcov-report/favicon.png +0 -0
  203. package/coverage/lcov-report/index.html +491 -0
  204. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +457 -0
  205. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +397 -0
  206. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +1309 -0
  207. package/coverage/lcov-report/map/api/hooks/index.html +161 -0
  208. package/coverage/lcov-report/map/api/hooks/index.js.html +94 -0
  209. package/coverage/lcov-report/map/api/index.html +131 -0
  210. package/coverage/lcov-report/map/api/index.js.html +139 -0
  211. package/coverage/lcov-report/map/api/marshall.js.html +178 -0
  212. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +106 -0
  213. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +127 -0
  214. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +196 -0
  215. package/coverage/lcov-report/map/api/models/index.html +161 -0
  216. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +109 -0
  217. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +274 -0
  218. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +610 -0
  219. package/coverage/lcov-report/map/api/services/alerts/index.html +131 -0
  220. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +316 -0
  221. package/coverage/lcov-report/map/api/services/catalog/index.html +116 -0
  222. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  223. package/coverage/lcov-report/map/api/services/daptiles/index.html +116 -0
  224. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +241 -0
  225. package/coverage/lcov-report/map/api/services/features/features.service.js.html +241 -0
  226. package/coverage/lcov-report/map/api/services/features/index.html +131 -0
  227. package/coverage/lcov-report/map/api/services/index.html +116 -0
  228. package/coverage/lcov-report/map/api/services/index.js.html +817 -0
  229. package/coverage/lcov-report/map/api/services/projects/index.html +116 -0
  230. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +439 -0
  231. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +466 -0
  232. package/coverage/lcov-report/map/common/errors.js.html +94 -0
  233. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +541 -0
  234. package/coverage/lcov-report/map/common/grid.js.html +1612 -0
  235. package/coverage/lcov-report/map/common/index.html +371 -0
  236. package/coverage/lcov-report/map/common/index.js.html +172 -0
  237. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +556 -0
  238. package/coverage/lcov-report/map/common/moment-utils.js.html +157 -0
  239. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +868 -0
  240. package/coverage/lcov-report/map/common/opendap-utils.js.html +826 -0
  241. package/coverage/lcov-report/map/common/permissions.js.html +124 -0
  242. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +418 -0
  243. package/coverage/lcov-report/map/common/tms-utils.js.html +274 -0
  244. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +364 -0
  245. package/coverage/lcov-report/map/common/wcs-utils.js.html +586 -0
  246. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1033 -0
  247. package/coverage/lcov-report/map/common/wfs-utils.js.html +574 -0
  248. package/coverage/lcov-report/map/common/wms-utils.js.html +451 -0
  249. package/coverage/lcov-report/map/common/wmts-utils.js.html +547 -0
  250. package/coverage/lcov-report/prettify.css +1 -0
  251. package/coverage/lcov-report/prettify.js +2 -0
  252. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  253. package/coverage/lcov-report/sorter.js +196 -0
  254. package/coverage/lcov.info +11128 -0
  255. package/coverage/map/api/hooks/hooks.catalog.js.html +457 -0
  256. package/coverage/map/api/hooks/hooks.features.js.html +397 -0
  257. package/coverage/map/api/hooks/hooks.query.js.html +1309 -0
  258. package/coverage/map/api/hooks/index.html +161 -0
  259. package/coverage/map/api/hooks/index.js.html +94 -0
  260. package/coverage/map/api/index.html +131 -0
  261. package/coverage/map/api/index.js.html +139 -0
  262. package/coverage/map/api/marshall.js.html +178 -0
  263. package/coverage/map/api/models/alerts.model.mongodb.js.html +106 -0
  264. package/coverage/map/api/models/catalog.model.mongodb.js.html +127 -0
  265. package/coverage/map/api/models/features.model.mongodb.js.html +196 -0
  266. package/coverage/map/api/models/index.html +161 -0
  267. package/coverage/map/api/models/projects.model.mongodb.js.html +109 -0
  268. package/coverage/map/api/services/alerts/alerts.hooks.js.html +274 -0
  269. package/coverage/map/api/services/alerts/alerts.service.js.html +610 -0
  270. package/coverage/map/api/services/alerts/index.html +131 -0
  271. package/coverage/map/api/services/catalog/catalog.hooks.js.html +316 -0
  272. package/coverage/map/api/services/catalog/index.html +116 -0
  273. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  274. package/coverage/map/api/services/daptiles/index.html +116 -0
  275. package/coverage/map/api/services/features/features.hooks.js.html +241 -0
  276. package/coverage/map/api/services/features/features.service.js.html +241 -0
  277. package/coverage/map/api/services/features/index.html +131 -0
  278. package/coverage/map/api/services/index.html +116 -0
  279. package/coverage/map/api/services/index.js.html +817 -0
  280. package/coverage/map/api/services/projects/index.html +116 -0
  281. package/coverage/map/api/services/projects/projects.hooks.js.html +439 -0
  282. package/coverage/map/common/dynamic-grid-source.js.html +466 -0
  283. package/coverage/map/common/errors.js.html +94 -0
  284. package/coverage/map/common/geotiff-grid-source.js.html +541 -0
  285. package/coverage/map/common/grid.js.html +1612 -0
  286. package/coverage/map/common/index.html +371 -0
  287. package/coverage/map/common/index.js.html +172 -0
  288. package/coverage/map/common/meteo-model-grid-source.js.html +556 -0
  289. package/coverage/map/common/moment-utils.js.html +157 -0
  290. package/coverage/map/common/opendap-grid-source.js.html +868 -0
  291. package/coverage/map/common/opendap-utils.js.html +826 -0
  292. package/coverage/map/common/permissions.js.html +124 -0
  293. package/coverage/map/common/time-based-grid-source.js.html +418 -0
  294. package/coverage/map/common/tms-utils.js.html +274 -0
  295. package/coverage/map/common/wcs-grid-source.js.html +364 -0
  296. package/coverage/map/common/wcs-utils.js.html +586 -0
  297. package/coverage/map/common/weacast-grid-source.js.html +1033 -0
  298. package/coverage/map/common/wfs-utils.js.html +574 -0
  299. package/coverage/map/common/wms-utils.js.html +451 -0
  300. package/coverage/map/common/wmts-utils.js.html +547 -0
  301. package/coverage/prettify.css +1 -0
  302. package/coverage/prettify.js +2 -0
  303. package/coverage/sort-arrow-sprite.png +0 -0
  304. package/coverage/sorter.js +196 -0
  305. package/coverage/tmp/coverage-137435-1719398750767-0.json +1 -0
  306. package/coverage/tmp/coverage-137447-1719398750752-0.json +1 -0
  307. package/coverage/tmp/coverage-137458-1719398750740-0.json +1 -0
  308. package/coverage/tmp/coverage-137470-1719398750728-0.json +1 -0
  309. package/coverage/tmp/coverage-137477-1719398750691-0.json +1 -0
  310. package/map/api/hooks/hooks.query.js +5 -2
  311. package/map/api/services/catalog/catalog.hooks.js +4 -5
  312. package/map/client/cesium/utils/index.js +2 -1
  313. package/map/client/cesium/utils/utils.cesium.js +8 -0
  314. package/map/client/cesium/utils/utils.features.js +2 -2
  315. package/map/client/cesium/utils/utils.style.js +19 -17
  316. package/map/client/components/KCompass.vue +25 -3
  317. package/map/client/components/KEditLayerData.vue +1 -1
  318. package/map/client/components/KPositionIndicator.vue +1 -1
  319. package/map/client/components/catalog/KConnectLayer.vue +2 -2
  320. package/map/client/components/catalog/KCreateView.vue +2 -2
  321. package/map/client/components/form/KDirectionField.vue +4 -0
  322. package/map/client/components/form/KOwsLayerField.vue +4 -4
  323. package/map/client/components/form/KOwsServiceField.vue +3 -4
  324. package/map/client/components/legend/KLegend.vue +13 -15
  325. package/map/client/components/tools/KGeolocateTool.vue +1 -1
  326. package/map/client/components/widget/KStackableTimeSeries.vue +3 -0
  327. package/map/client/composables/highlight.js +4 -1
  328. package/map/client/elevation-utils.js +2 -2
  329. package/map/client/i18n/map_en.json +3 -1
  330. package/map/client/i18n/map_fr.json +3 -1
  331. package/map/client/mixins/globe/mixin.base-globe.js +121 -80
  332. package/map/client/mixins/globe/mixin.file-layers.js +2 -2
  333. package/map/client/mixins/globe/mixin.geojson-layers.js +24 -19
  334. package/map/client/mixins/globe/mixin.globe-activity.js +3 -3
  335. package/map/client/mixins/globe/mixin.opendap-layers.js +3 -3
  336. package/map/client/mixins/globe/mixin.style.js +5 -5
  337. package/map/client/mixins/globe/mixin.tooltip.js +5 -3
  338. package/map/client/mixins/map/mixin.base-map.js +42 -4
  339. package/map/client/mixins/map/mixin.canvas-layers.js +0 -1
  340. package/map/client/mixins/map/mixin.geojson-layers.js +10 -5
  341. package/map/client/mixins/mixin.activity.js +2 -2
  342. package/map/client/mixins/mixin.feature-selection.js +7 -5
  343. package/map/client/mixins/mixin.levels.js +1 -1
  344. package/map/client/utils/utils.catalog.js +15 -0
  345. package/map/client/utils/utils.location.js +2 -1
  346. package/map/client/utils/utils.style.js +1 -1
  347. package/map/common/geotiff-grid-source.js +5 -3
  348. package/map/common/grid.js +2 -2
  349. package/map/common/meteo-model-grid-source.js +1 -1
  350. package/map/common/time-based-grid-source.js +1 -1
  351. package/map/common/wmts-utils.js +11 -11
  352. package/package.json +12 -8
  353. package/scripts/build_docs.sh +37 -0
  354. package/scripts/init_runner.sh +30 -0
  355. package/scripts/kash/.github/workflows/run_tests.yaml +33 -0
  356. package/scripts/kash/README.md +2 -0
  357. package/scripts/kash/kash.sh +1657 -0
  358. package/scripts/kash/scripts/run_tests.sh +151 -0
  359. package/scripts/run_tests.sh +48 -0
  360. package/scripts/setup_workspace.sh +42 -0
  361. package/test/api/core/hooks.test.js +31 -0
  362. package/test/api/core/test-log-2023-12-19.log +7 -0
  363. package/test/api/core/test-log-2024-01-04.log +14 -0
  364. package/test/api/core/test-log-2024-05-14.log +6 -0
  365. package/test/api/core/test-log-2024-06-06.log +23 -0
  366. package/test/api/core/test-log-2024-06-26.log +25 -0
  367. package/test/api/core/test-log-2024-06-28.log +2 -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-2023-11-24.log +121 -0
  371. package/test/api/map/test-log-2023-12-12.log +29 -0
  372. package/test/api/map/test-log-2023-12-13.log +5 -0
  373. package/test/api/map/test-log-2024-01-04.log +2 -0
  374. package/test/api/map/test-log-2024-01-11.log +1 -0
  375. package/test/api/map/test-log-2024-01-25.log +19 -0
  376. package/test/api/map/test-log-2024-06-06.log +39 -0
  377. package/test/client/core/collection.js +2 -2
  378. package/test/client/core/dialogs.js +13 -0
  379. package/test/client/core/index.js +6 -5
  380. package/test/client/core/layout.js +1 -13
  381. package/test/client/core/runner.js +41 -20
  382. package/test/client/core/screens.js +6 -0
  383. package/test/client/core/utils.js +23 -19
  384. package/.travis.doc.sh +0 -8
  385. package/.travis.test.sh +0 -72
  386. package/core/client/components/KAction.vue +0 -393
  387. package/core/client/components/KBlock.vue +0 -67
  388. package/core/client/components/app/KTerms.vue +0 -41
@@ -5,7 +5,6 @@ import sift from 'sift'
5
5
  import { Store } from './store.js'
6
6
  import { bindContent } from './utils/utils.content.js'
7
7
 
8
- const placements = ['top', 'right', 'bottom', 'left']
9
8
  const layoutPath = 'layout'
10
9
  const contentDefaults = { content: undefined, filter: {}, mode: undefined, visible: false }
11
10
  const windowDefaultContols = { pin: true, unpin: true, maximize: true, restore: true, close: true, resize: true }
@@ -42,6 +41,7 @@ const defaults = {
42
41
 
43
42
  // Export singleton
44
43
  export const Layout = {
44
+ placements: ['top', 'right', 'bottom', 'left'],
45
45
  paths: {
46
46
  layout: layoutPath,
47
47
  header: layoutPath + '.header',
@@ -68,7 +68,7 @@ export const Layout = {
68
68
  Store.set(this.paths.footer, this.getElementDefaults('footer'))
69
69
  Store.set(this.paths.page, this.getElementDefaults('page'))
70
70
  Store.set(this.paths.fab, this.getElementDefaults('fab'))
71
- placements.forEach(placement => {
71
+ this.placements.forEach(placement => {
72
72
  Store.set(_.get(this.paths.panes, placement), this.getElementDefaults(`panes.${placement}`))
73
73
  Store.set(_.get(this.paths.windows, placement), this.getElementDefaults(`windows.${placement}`))
74
74
  })
@@ -81,16 +81,6 @@ export const Layout = {
81
81
  getLayoutDefaults () {
82
82
  return Object.assign({}, defaults.options, _.pick(_.get(config, this.paths.layout), _.keys(defaults.layout)))
83
83
  },
84
- set (layout) {
85
- if (layout.header) this.setHeader(layout.header)
86
- if (layout.footer) this.setFooter(layout.footer)
87
- if (layout.page) this.setPage(layout.page)
88
- if (layout.fab) this.setFab(layout.fab)
89
- placements.forEach(placement => {
90
- if (_.has(layout, `panes.${placement}`)) this.setPane(placement, _.get(layout, `panes.${placement}`))
91
- if (_.has(layout, `windows.${placement}`)) this.setWindow(placement, _.get(layout, `windows.${placement}`))
92
- })
93
- },
94
84
  setView (view) {
95
85
  Store.patch(this.paths.layout, { view })
96
86
  },
@@ -99,7 +89,7 @@ export const Layout = {
99
89
  this.setFooterMode(mode)
100
90
  this.setPageMode(mode)
101
91
  this.setFabMode(mode)
102
- placements.forEach(placement => {
92
+ this.placements.forEach(placement => {
103
93
  this.setPaneMode(placement, mode)
104
94
  this.setWindowMode(placement, mode)
105
95
  })
@@ -156,6 +146,9 @@ export const Layout = {
156
146
  if (props.visible === visible) return
157
147
  Store.patch(this.getElementPath(element), { visible })
158
148
  },
149
+ clearElement (element) {
150
+ this.setElement(element, null)
151
+ },
159
152
  getHeader () {
160
153
  return this.getElement('header')
161
154
  },
@@ -171,6 +164,9 @@ export const Layout = {
171
164
  setHeaderVisible (visible) {
172
165
  this.setElementVisible('header', visible)
173
166
  },
167
+ clearHeader () {
168
+ this.clearElement('header')
169
+ },
174
170
  getFooter () {
175
171
  return this.getElement('footer')
176
172
  },
@@ -186,6 +182,9 @@ export const Layout = {
186
182
  setFooterVisible (visible) {
187
183
  this.setElementVisible('footer', visible)
188
184
  },
185
+ clearFooter () {
186
+ this.clearElement('footer')
187
+ },
189
188
  getPage () {
190
189
  return this.getElement('page')
191
190
  },
@@ -201,6 +200,9 @@ export const Layout = {
201
200
  setPageVisible (visible) {
202
201
  this.setElementVisible('page', visible)
203
202
  },
203
+ clearPage () {
204
+ this.clearElement('page')
205
+ },
204
206
  getFab () {
205
207
  return this.getElement('fab')
206
208
  },
@@ -239,6 +241,9 @@ export const Layout = {
239
241
  if (props.offset === offset) return
240
242
  Store.patch(this.getElementPath('fab'), { offset })
241
243
  },
244
+ clearFab () {
245
+ this.clearElement('fab')
246
+ },
242
247
  getPane (placement) {
243
248
  return this.getElement(`panes.${placement}`)
244
249
  },
@@ -259,6 +264,9 @@ export const Layout = {
259
264
  if (props.opener === opener) return
260
265
  Store.patch(this.getElementPath(`panes.${placement}`), { opener })
261
266
  },
267
+ clearPane (placement) {
268
+ this.clearElement(`panes.${placement}`)
269
+ },
262
270
  getWindow (placement) {
263
271
  return this.getElement(`windows.${placement}`)
264
272
  },
@@ -330,8 +338,11 @@ export const Layout = {
330
338
  if (!widget) current = _.get(props.components, '[0].id')
331
339
  Store.patch(this.getElementPath(`windows.${placement}`), { current })
332
340
  },
341
+ clearWindow (placement) {
342
+ this.clearElement(`windows.${placement}`)
343
+ },
333
344
  findWindow (widget) {
334
- for (const placement of placements) {
345
+ for (const placement of this.placements) {
335
346
  const window = this.getWindow(placement)
336
347
  if (_.find(window.components, { id: widget })) {
337
348
  return { placement, window }
@@ -8,6 +8,18 @@ export function baseActivity (name) {
8
8
  getAppName () {
9
9
  return this.$config('appName')
10
10
  },
11
+ configureHeader () {
12
+ Layout.setHeader(_.get(this.activityOptions, 'header'), this)
13
+ },
14
+ clearHeader () {
15
+ Layout.setHeader(null)
16
+ },
17
+ configureFooter () {
18
+ Layout.setFooter(_.get(this.activityOptions, 'footer'), this)
19
+ },
20
+ clearFooter () {
21
+ Layout.setFooter(null)
22
+ },
11
23
  getTopPane () {
12
24
  return Layout.getPane('top')
13
25
  },
@@ -174,6 +186,8 @@ export function baseActivity (name) {
174
186
  Layout.setWindowVisible(result.placement, false)
175
187
  },
176
188
  clearActivity () {
189
+ this.clearHeader()
190
+ this.clearFooter()
177
191
  this.clearTopPane()
178
192
  this.clearBottomPane()
179
193
  this.clearLeftPane()
@@ -183,6 +197,8 @@ export function baseActivity (name) {
183
197
  this.clearWindows()
184
198
  },
185
199
  configureActivity () {
200
+ this.configureHeader()
201
+ this.configureFooter()
186
202
  this.configureTopPane()
187
203
  this.configureLeftPane()
188
204
  this.configureBottomPane()
@@ -20,31 +20,32 @@ export default function init () {
20
20
  api.createService('account', { methods: ['create', 'verifyEmail'] })
21
21
 
22
22
  // Setup service for settings edition
23
- api.createService('settings', _.merge(config.settings || {}, {
23
+ const propertyMapping = _.get(config, 'settings.propertyMapping', {
24
+ shortTime: 'time.format.time.short',
25
+ longTime: 'time.format.time.long',
26
+ shortDate: 'time.format.date.short',
27
+ longDate: 'time.format.date.long',
28
+ shortYear: 'time.format.year.short',
29
+ longYear: 'time.format.year.long',
30
+ timezone: 'time.format.timezone',
31
+ timelineStep: 'time.step',
32
+ timelineInterval: 'time.interval',
33
+ timeseriesSpan: 'timeseries.span',
34
+ location: 'locationFormat',
35
+ restoreView: 'restore.view',
36
+ restoreLayers: 'restore.layers',
37
+ defaultLength: 'units.default.length',
38
+ defaultAltitude: 'units.default.altitude',
39
+ defaultArea: 'units.default.area',
40
+ defaultVelocity: 'units.default.velocity',
41
+ defaultTemperature: 'units.default.temperature',
42
+ defaultAngle: 'units.default.angle',
43
+ defaultEquivalentDoseRate: 'units.default.equivalentDoseRate',
44
+ defaultNotation: 'units.default.notation',
45
+ defaultPrecision: 'units.default.precision'
46
+ })
47
+ api.createService('settings', {
24
48
  service: LocalSettingsService,
25
- propertyMapping: {
26
- shortTime: 'time.format.time.short',
27
- longTime: 'time.format.time.long',
28
- shortDate: 'time.format.date.short',
29
- longDate: 'time.format.date.long',
30
- shortYear: 'time.format.year.short',
31
- longYear: 'time.format.year.long',
32
- timezone: 'time.format.timezone',
33
- timelineStep: 'time.step',
34
- timelineInterval: 'time.interval',
35
- timeseriesSpan: 'timeseries.span',
36
- location: 'locationFormat',
37
- restoreView: 'restore.view',
38
- restoreLayers: 'restore.layers',
39
- defaultLength: 'units.default.length',
40
- defaultAltitude: 'units.default.altitude',
41
- defaultArea: 'units.default.area',
42
- defaultVelocity: 'units.default.velocity',
43
- defaultTemperature: 'units.default.temperature',
44
- defaultAngle: 'units.default.angle',
45
- defaultEquivalentDoseRate: 'units.default.equivalentDoseRate',
46
- defaultNotation: 'units.default.notation',
47
- defaultPrecision: 'units.default.precision'
48
- }
49
- })) // Default options can be overriden from app config
49
+ propertyMapping
50
+ }) // Default options can be overriden from app config
50
51
  }
@@ -1,8 +1,7 @@
1
1
  import _ from 'lodash'
2
- import config from 'config'
3
2
  import { Store } from '../store.js'
4
3
  import { Events } from '../events.js'
5
- import { LocalStorage } from '../local-storage.js'
4
+ import { LocalStorage } from '../local-storage.js'
6
5
 
7
6
  export default function (name, api, options) {
8
7
  const mapping = options.propertyMapping
@@ -43,7 +42,7 @@ export default function (name, api, options) {
43
42
  _.set(data, key, Store.get(value))
44
43
  }
45
44
  })
46
-  LocalStorage.set(settingsKey, data)
45
+ LocalStorage.set(settingsKey, data)
47
46
  },
48
47
 
49
48
  restoreSettings () {
@@ -303,6 +303,9 @@ export const Units = {
303
303
  }
304
304
  return defaultUnit
305
305
  },
306
+ setDefaultUnit (quantity, unit) {
307
+ Store.set(`units.default.${quantity}`, unit)
308
+ },
306
309
  // Get symbol of default unit (if any) for a given quantity/unit name
307
310
  getDefaultUnitSymbol (quantityOrUnit) {
308
311
  return this.getUnitSymbol(this.getDefaultUnit(quantityOrUnit))
@@ -319,10 +322,12 @@ export const Units = {
319
322
  // If target unit is not specified will use default unit (if any) for source unit
320
323
  convert (value, sourceUnit, targetUnit) {
321
324
  if (_.isNil(value)) {
322
- logger.warn('[KDK] cannont convert an nil value')
325
+ logger.warn('[KDK] cannont convert a nil value')
323
326
  return
324
327
  }
325
328
  if (value === Number.MIN_VALUE || value === Number.MAX_VALUE) return value
329
+ // If target unit is same as source unit does nothing
330
+ if (targetUnit === sourceUnit) return value
326
331
  // If target unit is not given use default one
327
332
  if (!targetUnit) targetUnit = this.getDefaultUnit(sourceUnit)
328
333
  // Check if the target unit does exist
@@ -6,8 +6,10 @@ import { Notify, Dialog, Loading, exportFile } from 'quasar'
6
6
  import { defineAsyncComponent, markRaw } from 'vue'
7
7
 
8
8
  export * from './utils.account.js'
9
+ export * from './utils.actions.js'
9
10
  export * from './utils.colors.js'
10
11
  export * from './utils.content.js'
12
+ export * from './utils.data.js'
11
13
  export * from './utils.locale.js'
12
14
  export * from './utils.platform.js'
13
15
  export * from './utils.push.js'
@@ -16,6 +18,7 @@ export * from './utils.shapes.js'
16
18
  export * from './utils.session.js'
17
19
  export * from './utils.time.js'
18
20
 
21
+
19
22
  Notify.setDefaults({
20
23
  position: 'bottom-left',
21
24
  timeout: 5000,
@@ -0,0 +1,93 @@
1
+ export const actionProps = {
2
+ id: {
3
+ type: String,
4
+ required: true
5
+ },
6
+ label: {
7
+ type: String,
8
+ default: null
9
+ },
10
+ icon: {
11
+ type: String,
12
+ default: undefined
13
+ },
14
+ iconRight: {
15
+ type: Boolean,
16
+ default: false
17
+ },
18
+ color: {
19
+ type: String,
20
+ default: 'grey-9'
21
+ },
22
+ size: {
23
+ type: String,
24
+ default: 'md'
25
+ },
26
+ outline: {
27
+ type: Boolean,
28
+ default: false
29
+ },
30
+ badge: {
31
+ type: Object,
32
+ default: () => null
33
+ },
34
+ tooltip: {
35
+ type: String,
36
+ default: ''
37
+ },
38
+ disabled: {
39
+ type: [Boolean, Function],
40
+ default: false
41
+ },
42
+ toggled: {
43
+ type: Boolean,
44
+ default: false
45
+ },
46
+ toggle: {
47
+ type: Object,
48
+ default: () => {}
49
+ },
50
+ stack: {
51
+ type: Boolean,
52
+ default: false
53
+ },
54
+ loading: {
55
+ type: Boolean,
56
+ default: false
57
+ },
58
+ propagate: {
59
+ type: Boolean,
60
+ default: true
61
+ },
62
+ context: {
63
+ type: Object,
64
+ default: () => null
65
+ },
66
+ handler: {
67
+ type: Function,
68
+ default: null
69
+ },
70
+ closePopup: {
71
+ type: [Boolean, Number, String],
72
+ default: false
73
+ },
74
+ dialog: {
75
+ type: Object,
76
+ default: null
77
+ },
78
+ route: {
79
+ type: Object,
80
+ default: () => null
81
+ },
82
+ url: {
83
+ type: String,
84
+ default: null
85
+ },
86
+ renderer: {
87
+ type: String,
88
+ default: 'button',
89
+ validator: (value) => {
90
+ return ['button', 'form-button', 'item', 'fab', 'fab-action', 'tab'].includes(value)
91
+ }
92
+ }
93
+ }
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash'
2
2
  import logger from 'loglevel'
3
- import { getCssVar } from 'quasar'
3
+ import { getCssVar } from 'quasar'
4
4
  import chroma from 'chroma-js'
5
5
 
6
6
  export const Colors = {
@@ -0,0 +1,22 @@
1
+ import _ from 'lodash'
2
+ import { Units } from '../units.js'
3
+
4
+ export function convertData (data, valuePaths, sourceUnit, targetUnit) {
5
+ if (!Array.isArray(valuePaths)) valuePaths = [valuePaths]
6
+ _.forEach(data, document => {
7
+ _.forEach(valuePaths, valuePath => {
8
+ const value = _.get(document, valuePath)
9
+ if (value) _.set(document, valuePath, Units.convert(value, sourceUnit, targetUnit))
10
+ })
11
+ })
12
+ }
13
+
14
+ export function convertTimeSerie (data, variable, valuePaths) {
15
+ if (!Array.isArray(valuePaths)) valuePaths = [valuePaths]
16
+ const unit = variable.unit
17
+ if (unit) {
18
+ const targetUnit = Units.getDefaultUnit(unit)
19
+ convertData(data, valuePaths, unit, targetUnit)
20
+ variable.unit = targetUnit
21
+ }
22
+ }
@@ -100,7 +100,11 @@ function getSize (size) {
100
100
 
101
101
  /*
102
102
  Utility to create a shape with the following options:
103
- - shape: String | Object - name of the predefined shape or object specifyinfg the viewBox and the content
103
+ - shape: String | Object - name of the predefined shape or object specifying the following
104
+ - viewBox: svg viewport definition
105
+ - content: svg shape
106
+ - translation: Array - the translation to apply from the center of the shape ['-50%', '-50%']
107
+ - rotation: Number - the rotation to apply in degree
104
108
  - size : Array - [width, height] of the maker
105
109
  - radius: Number - the radius to compute a "visual" size. If the size is defined, the radius is omitted.
106
110
  - color: String - the fill color
@@ -128,7 +132,7 @@ function getSize (size) {
128
132
  - size: Number - the font size in pixel - 14
129
133
  - translation: Array - the translation to apply from the center of the shape ['-50%', '-50%']
130
134
  - rotation: Number - the rotation to apply in degree
131
- - html: Object specifyinng an html overlay
135
+ - html: Object specifying an html overlay
132
136
 
133
137
  */
134
138
  export function createShape (options) {
@@ -163,7 +167,8 @@ export function createShape (options) {
163
167
  }
164
168
  }
165
169
  // Set div container vars
166
- const beginDivTag = `<div style="position: relative; width: ${size.width}px; height: ${size.height}px;">`
170
+ const extraStyle = _.get(options, 'extraStyle', '')
171
+ const beginDivTag = `<div style="position: relative; width: ${size.width}px; height: ${size.height}px; ${extraStyle}">`
167
172
  const endDivTag = '</div>'
168
173
  // Render shape
169
174
  let beginSvgTag = ''
@@ -171,7 +176,11 @@ export function createShape (options) {
171
176
  let svgClipPath = ''
172
177
  let endSvgTag = ''
173
178
  if (shape) {
174
- beginSvgTag = `<svg xmlns="http://www.w3.org/2000/svg" width="${size.width}" height="${size.height}" preserveAspectRatio="none">`
179
+ const extraShapeStyle = shape.extraStyle || ''
180
+ const translation = shape.translation || [0, 0]
181
+ const rotation = shape.rotation || 0
182
+ beginSvgTag = `<svg xmlns="http://www.w3.org/2000/svg" width="${size.width}" height="${size.height}" preserveAspectRatio="none"
183
+ style="transform: translate(${translation[0]},${translation[1]}) rotate(${rotation}deg); ${extraShapeStyle}">`
175
184
  beginSvgTag = addTagAttribute(beginSvgTag, 'viewBox', _.join(shape.viewBox, ' '))
176
185
  svgShapeContent = shape.content
177
186
  svgClipPath = ''
@@ -179,7 +188,7 @@ export function createShape (options) {
179
188
  // Apply fill style
180
189
  const color = getHtmlColor(options.color, defaultColor)
181
190
  svgShapeContent = addSvgAttribute(svgShapeContent, 'fill', color)
182
- if (options.opacity) svgShapeContent = addSvgAttribute(svgShapeContent, 'fill-opacity', options.opacity)
191
+ if (!_.isNil(options.opacity)) svgShapeContent = addSvgAttribute(svgShapeContent, 'fill-opacity', options.opacity)
183
192
  // Aply stroke style
184
193
  if (options.stroke) {
185
194
  // Ensure the stroke color is defined and not transparent
@@ -245,7 +254,8 @@ export function createShape (options) {
245
254
  const textSize = options.text.size || defaultTextSize
246
255
  const translation = options.text.translation || _.get(shape, 'text.translation', ['-50%', '-50%'])
247
256
  const rotation = options.text.rotation || _.get(shape, 'icon.rotation', 0)
248
- textTag += `style="position: absolute; top: 50%; left: 50%; transform: translate(${translation[0]},${translation[1]}) rotate(${rotation}deg); color: ${color}; font-size: ${textSize}px;"`
257
+ const extraTextStyle = options.text.extraStyle || ''
258
+ textTag += `style="position: absolute; 5px; top: 50%; left: 50%; transform: translate(${translation[0]},${translation[1]}) rotate(${rotation}deg); color: ${color}; font-size: ${textSize}px; ${extraTextStyle}"`
249
259
  textTag += '>'
250
260
  textTag += options.text.label
251
261
  textTag += '</span>'
@@ -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
+ }