geonetwork-ui 2.3.0-dev.376e0e90 → 2.3.0-dev.3efe236f

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 (361) hide show
  1. package/esm2022/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +6 -2
  3. package/esm2022/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.mjs +1 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +12 -1
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +36 -3
  6. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +19 -7
  7. package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
  8. package/esm2022/libs/common/domain/src/lib/model/record/user-feedbacks.model.mjs +2 -0
  9. package/esm2022/libs/common/domain/src/lib/model/user/index.mjs +2 -0
  10. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  11. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +35 -7
  12. package/esm2022/libs/data-access/gn4/src/openapi/model/models.mjs +1 -2
  13. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +2 -2
  14. package/esm2022/libs/feature/editor/src/index.mjs +2 -2
  15. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +6 -2
  16. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.mjs +11 -0
  17. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.mjs +28 -0
  18. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.mjs +11 -0
  19. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +45 -0
  20. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.mjs +50 -0
  21. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +11 -0
  22. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +11 -0
  23. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +107 -0
  24. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +2 -0
  25. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +10 -0
  26. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +29 -0
  27. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  28. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +10 -10
  29. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +1 -1
  30. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +6 -2
  31. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +3 -3
  32. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +72 -0
  33. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  34. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  35. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +7 -3
  36. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +12 -7
  37. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +2 -1
  38. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +52 -25
  39. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +12 -49
  40. package/esm2022/libs/feature/notifications/src/index.mjs +4 -0
  41. package/esm2022/libs/feature/notifications/src/lib/feature-notifications.module.mjs +18 -0
  42. package/esm2022/libs/feature/notifications/src/lib/notification.model.mjs +2 -0
  43. package/esm2022/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.mjs +49 -0
  44. package/esm2022/libs/feature/notifications/src/lib/notifications.service.mjs +29 -0
  45. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +4 -4
  46. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +6 -2
  47. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
  48. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
  49. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +22 -7
  50. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +52 -17
  51. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
  52. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
  53. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +3 -3
  54. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +3 -3
  55. package/esm2022/libs/ui/elements/src/index.mjs +15 -15
  56. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +5 -5
  57. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +45 -0
  58. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  59. package/esm2022/libs/ui/elements/src/lib/notification/notification.component.mjs +34 -0
  60. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +3 -3
  61. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +4 -3
  62. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +14 -5
  63. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
  64. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +62 -0
  65. package/esm2022/libs/ui/inputs/src/index.mjs +1 -2
  66. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -1
  67. package/esm2022/libs/ui/inputs/src/lib/files-drop/files-drop.directive.mjs +59 -0
  68. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +183 -0
  69. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
  70. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +19 -3
  71. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +10 -23
  72. package/esm2022/libs/ui/layout/src/index.mjs +6 -5
  73. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +18 -0
  74. package/esm2022/libs/util/shared/src/lib/utils/bytes-convert.mjs +4 -0
  75. package/esm2022/libs/util/shared/src/lib/utils/image-resize.mjs +60 -0
  76. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +8 -6
  77. package/esm2022/translations/de.json +35 -0
  78. package/esm2022/translations/en.json +35 -0
  79. package/esm2022/translations/es.json +35 -0
  80. package/esm2022/translations/fr.json +35 -0
  81. package/esm2022/translations/it.json +35 -0
  82. package/esm2022/translations/nl.json +35 -0
  83. package/esm2022/translations/pt.json +35 -0
  84. package/fesm2022/geonetwork-ui.mjs +3988 -2856
  85. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  86. package/index.d.ts +1 -0
  87. package/index.d.ts.map +1 -1
  88. package/index.ts +1 -0
  89. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  90. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  91. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  92. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  93. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  94. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  95. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  96. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  97. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  98. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  99. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  100. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  101. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  102. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  103. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  104. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  105. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  106. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts +9 -5
  107. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  108. package/libs/data-access/gn4/src/openapi/model/models.d.ts +0 -1
  109. package/libs/data-access/gn4/src/openapi/model/models.d.ts.map +1 -1
  110. package/libs/feature/editor/src/index.d.ts +1 -1
  111. package/libs/feature/editor/src/index.d.ts.map +1 -1
  112. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +8 -5
  113. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  114. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.d.ts +1 -1
  115. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.d.ts.map +1 -0
  116. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.d.ts +1 -1
  117. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.d.ts.map +1 -0
  118. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.d.ts +1 -1
  119. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.d.ts.map +1 -0
  120. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts +16 -0
  121. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts.map +1 -0
  122. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.d.ts +2 -2
  123. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts.map +1 -0
  124. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +1 -1
  125. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -0
  126. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts +1 -1
  127. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +1 -0
  128. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.d.ts +9 -4
  129. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -0
  130. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +1 -0
  131. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -0
  132. package/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.d.ts +3 -3
  133. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -0
  134. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +1 -1
  135. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  136. package/libs/feature/editor/src/lib/models/fields.model.d.ts +1 -1
  137. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
  138. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +23 -0
  139. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -0
  140. package/libs/feature/map/src/lib/feature-map.module.d.ts +2 -1
  141. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  142. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +2 -0
  143. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
  144. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +10 -5
  145. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  146. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  147. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +2 -3
  148. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  149. package/libs/feature/notifications/src/index.d.ts +4 -0
  150. package/libs/feature/notifications/src/index.d.ts.map +1 -0
  151. package/libs/feature/notifications/src/lib/feature-notifications.module.d.ts +7 -0
  152. package/libs/feature/notifications/src/lib/feature-notifications.module.d.ts.map +1 -0
  153. package/libs/feature/notifications/src/lib/notification.model.d.ts +7 -0
  154. package/libs/feature/notifications/src/lib/notification.model.d.ts.map +1 -0
  155. package/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.d.ts +12 -0
  156. package/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.d.ts.map +1 -0
  157. package/libs/feature/notifications/src/lib/notifications.service.d.ts +15 -0
  158. package/libs/feature/notifications/src/lib/notifications.service.d.ts.map +1 -0
  159. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  160. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  161. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  162. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  163. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  164. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  165. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
  166. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  167. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  168. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  169. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  170. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  171. package/libs/ui/elements/src/index.d.ts +14 -14
  172. package/libs/ui/elements/src/index.d.ts.map +1 -1
  173. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts +13 -0
  174. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts.map +1 -0
  175. package/libs/ui/elements/src/lib/notification/notification.component.d.ts +13 -0
  176. package/libs/ui/elements/src/lib/notification/notification.component.d.ts.map +1 -0
  177. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +1 -1
  178. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  179. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +10 -8
  180. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  181. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  182. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  183. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +22 -0
  184. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  185. package/libs/ui/inputs/src/index.d.ts +0 -1
  186. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  187. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  188. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts +14 -0
  189. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts.map +1 -0
  190. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +44 -0
  191. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -0
  192. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  193. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  194. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +4 -1
  195. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  196. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +26 -33
  197. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  198. package/libs/ui/layout/src/index.d.ts +5 -4
  199. package/libs/ui/layout/src/index.d.ts.map +1 -1
  200. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts +8 -0
  201. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts.map +1 -0
  202. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts +2 -0
  203. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts.map +1 -0
  204. package/libs/util/shared/src/lib/utils/image-resize.d.ts +3 -0
  205. package/libs/util/shared/src/lib/utils/image-resize.d.ts.map +1 -0
  206. package/libs/util/shared/src/lib/utils/index.d.ts +7 -5
  207. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  208. package/package.json +2 -2
  209. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +7 -1
  210. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  211. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  212. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  213. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +34 -7
  214. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  215. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  216. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  217. package/src/libs/common/fixtures/src/index.ts +8 -6
  218. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +1 -1
  219. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  220. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +43 -12
  221. package/src/libs/data-access/gn4/src/openapi/model/models.ts +0 -1
  222. package/src/libs/data-access/gn4/src/spec.yaml +1 -1
  223. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +1 -1
  224. package/src/libs/feature/editor/src/index.ts +1 -1
  225. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +8 -1
  226. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +8 -0
  227. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +70 -0
  228. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.ts +1 -0
  229. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.ts +4 -1
  230. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.ts +1 -0
  231. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +20 -0
  232. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +44 -0
  233. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.ts +4 -1
  234. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +1 -0
  235. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.ts +1 -0
  236. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.html +28 -4
  237. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +121 -0
  238. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.css +0 -0
  239. package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.html +1 -0
  240. package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.ts +4 -4
  241. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +9 -9
  242. package/src/libs/feature/editor/src/lib/models/fields.model.ts +1 -1
  243. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +5 -1
  244. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +1 -1
  245. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +0 -0
  246. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +36 -0
  247. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +80 -0
  248. package/src/libs/feature/map/src/lib/feature-map.module.ts +2 -0
  249. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +8 -0
  250. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +5 -0
  251. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +10 -3
  252. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +60 -32
  253. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +17 -61
  254. package/src/libs/feature/notifications/src/index.ts +3 -0
  255. package/src/libs/feature/notifications/src/lib/feature-notifications.module.ts +10 -0
  256. package/src/libs/feature/notifications/src/lib/notification.model.ts +6 -0
  257. package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.css +0 -0
  258. package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.html +17 -0
  259. package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.ts +44 -0
  260. package/src/libs/feature/notifications/src/lib/notifications.service.ts +27 -0
  261. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  262. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +5 -1
  263. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  264. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  265. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +49 -8
  266. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
  267. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  268. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  269. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +3 -3
  270. package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.html +5 -5
  271. package/src/libs/ui/elements/src/index.ts +14 -14
  272. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +1 -1
  273. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +0 -5
  274. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +0 -21
  275. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +1 -14
  276. package/src/libs/ui/elements/src/lib/notification/notification.component.css +0 -0
  277. package/src/libs/ui/elements/src/lib/notification/notification.component.html +52 -0
  278. package/src/libs/ui/elements/src/lib/notification/notification.component.ts +31 -0
  279. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +1 -1
  280. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +5 -3
  281. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -1
  282. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  283. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  284. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  285. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +63 -0
  286. package/src/libs/ui/inputs/src/index.ts +0 -1
  287. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -1
  288. package/src/libs/ui/inputs/src/lib/files-drop/files-drop.directive.ts +45 -0
  289. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.css +0 -0
  290. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +146 -0
  291. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +193 -0
  292. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  293. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  294. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -1
  295. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +16 -1
  296. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -19
  297. package/src/libs/ui/layout/src/index.ts +5 -4
  298. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.css +0 -0
  299. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +18 -0
  300. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +16 -0
  301. package/src/libs/util/shared/src/lib/utils/bytes-convert.ts +3 -0
  302. package/src/libs/util/shared/src/lib/utils/image-resize.ts +72 -0
  303. package/src/libs/util/shared/src/lib/utils/index.ts +7 -5
  304. package/tailwind.base.css +36 -0
  305. package/translations/de.json +35 -0
  306. package/translations/en.json +35 -0
  307. package/translations/es.json +35 -0
  308. package/translations/fr.json +35 -0
  309. package/translations/it.json +35 -0
  310. package/translations/nl.json +35 -0
  311. package/translations/pt.json +35 -0
  312. package/translations/sk.json +35 -0
  313. package/esm2022/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.mjs +0 -13
  314. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +0 -30
  315. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.mjs +0 -11
  316. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.mjs +0 -27
  317. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.mjs +0 -11
  318. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.mjs +0 -27
  319. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.mjs +0 -49
  320. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +0 -11
  321. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +0 -11
  322. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.component.mjs +0 -76
  323. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.model.mjs +0 -2
  324. package/esm2022/libs/ui/inputs/src/lib/form-field/index.mjs +0 -10
  325. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts +0 -18
  326. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts.map +0 -1
  327. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +0 -1
  328. package/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.d.ts.map +0 -1
  329. package/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.d.ts.map +0 -1
  330. package/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.d.ts.map +0 -1
  331. package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts +0 -11
  332. package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts.map +0 -1
  333. package/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.d.ts.map +0 -1
  334. package/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +0 -1
  335. package/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +0 -1
  336. package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +0 -1
  337. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +0 -1
  338. package/libs/ui/inputs/src/lib/form-field/index.d.ts.map +0 -1
  339. package/src/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.ts +0 -18
  340. package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.html +0 -11
  341. package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.ts +0 -15
  342. package/src/libs/ui/inputs/src/lib/form-field/form-field.component.ts +0 -80
  343. /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.d.ts +0 -0
  344. /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.d.ts +0 -0
  345. /package/src/libs/feature/editor/src/lib/{record-form/record-form.component.css → components/overview-upload/overview-upload.component.css} +0 -0
  346. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.css +0 -0
  347. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.html +0 -0
  348. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.css +0 -0
  349. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.html +0 -0
  350. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.css +0 -0
  351. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.html +0 -0
  352. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-rich/form-field-rich.component.css +0 -0
  353. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.css +0 -0
  354. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.html +0 -0
  355. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.css +0 -0
  356. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +0 -0
  357. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.css +0 -0
  358. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.html +0 -0
  359. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.css +0 -0
  360. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.ts +0 -0
  361. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.ts +0 -0
@@ -22,9 +22,9 @@ import { LayerConfig, MapConfig } from '../../../../../../libs/util/app-config/s
22
22
  import { FeatureCollection } from 'geojson'
23
23
  import { fromLonLat } from 'ol/proj'
24
24
  import WMTS from 'ol/source/WMTS'
25
- import { removeSearchParams } from '../../../../../../libs/util/shared/src'
26
25
  import { Geometry } from 'ol/geom'
27
26
  import Feature from 'ol/Feature'
27
+ import { WfsEndpoint, WmtsEndpoint } from '@camptocamp/ogc-client'
28
28
 
29
29
  export const DEFAULT_BASELAYER_CONTEXT: MapContextLayerXyzModel = {
30
30
  type: MapContextLayerTypeEnum.XYZ,
@@ -77,6 +77,15 @@ export class MapContextService {
77
77
  const { type } = layerModel
78
78
  const style = this.styleService.styles.default
79
79
  switch (type) {
80
+ case MapContextLayerTypeEnum.OGCAPI:
81
+ return new VectorLayer({
82
+ source: new VectorSource({
83
+ format: new GeoJSON(),
84
+ url: layerModel.url,
85
+ }),
86
+ style,
87
+ })
88
+
80
89
  case MapContextLayerTypeEnum.XYZ:
81
90
  return new TileLayer({
82
91
  source: new XYZ({
@@ -87,44 +96,63 @@ export class MapContextService {
87
96
  case MapContextLayerTypeEnum.WMS:
88
97
  return new TileLayer({
89
98
  source: new TileWMS({
90
- url: removeSearchParams(layerModel.url, ['request', 'service']),
99
+ url: layerModel.url,
91
100
  params: { LAYERS: layerModel.name },
92
101
  gutter: 20,
93
102
  }),
94
103
  })
95
- case MapContextLayerTypeEnum.WMTS:
96
- return new TileLayer({
97
- source: new WMTS(layerModel.options),
104
+ case MapContextLayerTypeEnum.WMTS: {
105
+ // TODO: isolate this in utils service
106
+ const olLayer = new TileLayer({})
107
+ const endpoint = new WmtsEndpoint(layerModel.url)
108
+ endpoint.isReady().then(async (endpoint) => {
109
+ const layerName = endpoint.getSingleLayerName() ?? layerModel.name
110
+ const layer = endpoint.getLayerByName(layerName)
111
+ const matrixSet = layer.matrixSets[0]
112
+ const tileGrid = await endpoint.getOpenLayersTileGrid(layer.name)
113
+ const resourceUrl = layer.resourceLinks[0]
114
+ const dimensions = endpoint.getDefaultDimensions(layer.name)
115
+ olLayer.setSource(
116
+ new WMTS({
117
+ layer: layer.name,
118
+ style: layer.defaultStyle,
119
+ matrixSet: matrixSet.identifier,
120
+ format: resourceUrl.format,
121
+ url: resourceUrl.url,
122
+ requestEncoding: resourceUrl.encoding,
123
+ tileGrid,
124
+ projection: matrixSet.crs,
125
+ dimensions,
126
+ })
127
+ )
98
128
  })
99
- case MapContextLayerTypeEnum.WFS:
100
- return new VectorLayer({
101
- source: new VectorSource({
102
- format: new GeoJSON(),
103
- url: function (extent) {
104
- const urlObj = new URL(
105
- removeSearchParams(layerModel.url, [
106
- 'service',
107
- 'version',
108
- 'request',
109
- ])
110
- )
111
- urlObj.searchParams.set('service', 'WFS')
112
- urlObj.searchParams.set('version', '1.1.0')
113
- urlObj.searchParams.set('request', 'GetFeature')
114
- urlObj.searchParams.set('outputFormat', 'application/json')
115
- urlObj.searchParams.set('typename', layerModel.name)
116
- urlObj.searchParams.set('srsname', 'EPSG:3857')
117
- urlObj.searchParams.set('bbox', `${extent.join(',')},EPSG:3857`)
118
- urlObj.searchParams.set(
119
- 'maxFeatures',
120
- WFS_MAX_FEATURES.toString()
121
- )
122
- return urlObj.toString()
123
- },
124
- strategy: bboxStrategy,
125
- }),
129
+ return olLayer
130
+ }
131
+ case MapContextLayerTypeEnum.WFS: {
132
+ const olLayer = new VectorLayer({
126
133
  style,
127
134
  })
135
+ new WfsEndpoint(layerModel.url).isReady().then((endpoint) => {
136
+ const featureType =
137
+ endpoint.getSingleFeatureTypeName() ?? layerModel.name
138
+ olLayer.setSource(
139
+ new VectorSource({
140
+ format: new GeoJSON(),
141
+ url: function (extent: [number, number, number, number]) {
142
+ return endpoint.getFeatureUrl(featureType, {
143
+ maxFeatures: WFS_MAX_FEATURES,
144
+ asJson: true,
145
+ outputCrs: 'EPSG:3857',
146
+ extent,
147
+ extentCrs: 'EPSG:3857',
148
+ })
149
+ },
150
+ strategy: bboxStrategy,
151
+ })
152
+ )
153
+ })
154
+ return olLayer
155
+ }
128
156
  case MapContextLayerTypeEnum.GEOJSON: {
129
157
  if ('url' in layerModel) {
130
158
  return new VectorLayer({
@@ -12,7 +12,6 @@ import Source from 'ol/source/Source'
12
12
  import ImageWMS from 'ol/source/ImageWMS'
13
13
  import TileWMS from 'ol/source/TileWMS'
14
14
  import VectorSource from 'ol/source/Vector'
15
- import { optionsFromCapabilities } from 'ol/source/WMTS'
16
15
  import { defaults, DragPan, Interaction, MouseWheelZoom } from 'ol/interaction'
17
16
  import {
18
17
  mouseOnly,
@@ -20,23 +19,17 @@ import {
20
19
  platformModifierKeyOnly,
21
20
  primaryAction,
22
21
  } from 'ol/events/condition'
23
- import WMTSCapabilities from 'ol/format/WMTSCapabilities'
24
- import { from, Observable } from 'rxjs'
22
+ import { Observable } from 'rxjs'
25
23
  import { map } from 'rxjs/operators'
26
24
  import {
27
25
  MapContextLayerModel,
28
- MapContextLayerTypeEnum,
29
26
  MapContextLayerWmsModel,
30
- MapContextLayerWmtsModel,
31
27
  } from '../map-context/map-context.model'
32
28
  import Collection from 'ol/Collection'
33
29
  import MapBrowserEvent from 'ol/MapBrowserEvent'
34
- import {
35
- CatalogRecord,
36
- DatasetDistribution,
37
- } from '../../../../../../libs/common/domain/src/lib/model/record'
30
+ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
38
31
  import { ProxyService } from '../../../../../../libs/util/shared/src'
39
- import { WmsEndpoint } from '@camptocamp/ogc-client'
32
+ import { WmsEndpoint, WmtsEndpoint } from '@camptocamp/ogc-client'
40
33
  import { LONLAT_CRS_CODES } from '../constant/projections'
41
34
  import { fromEPSGCode, register } from 'ol/proj/proj4'
42
35
  import proj4 from 'proj4/dist/proj4'
@@ -152,11 +145,14 @@ export class MapUtilsService {
152
145
  } else if (layer && layer.type === 'wms') {
153
146
  latLonExtent = await this.getWmsLayerExtent(layer)
154
147
  } else if (layer && layer.type === 'wmts') {
155
- if (layer.extent) {
156
- latLonExtent = layer.extent
157
- } else {
158
- return layer.options.tileGrid.getExtent()
159
- }
148
+ // TODO: isolate this in utils service
149
+ latLonExtent = await new WmtsEndpoint(layer.url)
150
+ .isReady()
151
+ .then((endpoint) => {
152
+ const layerName = endpoint.getSingleLayerName() ?? layer.name
153
+ const wmtsLayer = endpoint.getLayerByName(layerName)
154
+ return wmtsLayer.latLonBoundingBox
155
+ })
160
156
  } else {
161
157
  return null
162
158
  }
@@ -180,59 +176,19 @@ export class MapUtilsService {
180
176
  LONLAT_CRS_CODES.includes(crs)
181
177
  )
182
178
  if (lonLatCRS) {
183
- return boundingBoxes[lonLatCRS].map(parseFloat)
179
+ return boundingBoxes[lonLatCRS]
184
180
  } else {
185
181
  const availableEPSGCode = Object.keys(boundingBoxes)[0]
186
182
  register(proj4)
187
183
  const proj = await fromEPSGCode(availableEPSGCode)
188
- const bboxWithFiniteNumbers =
189
- boundingBoxes[availableEPSGCode].map(parseFloat)
190
- return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326')
184
+ return transformExtent(
185
+ boundingBoxes[availableEPSGCode],
186
+ proj,
187
+ 'EPSG:4326'
188
+ )
191
189
  }
192
190
  }
193
191
 
194
- getWmtsLayerFromCapabilities(
195
- link: DatasetDistribution
196
- ): Observable<MapContextLayerWmtsModel> {
197
- const getCapabilitiesUrl = new URL(link.url, window.location.toString())
198
- getCapabilitiesUrl.searchParams.set('SERVICE', 'WMTS')
199
- getCapabilitiesUrl.searchParams.set('REQUEST', 'GetCapabilities')
200
- return from(
201
- fetch(getCapabilitiesUrl.toString())
202
- .then(async function (response) {
203
- if (!response.ok) {
204
- throw new Error(`WMTS GetCapabilities HTTP request failed with code ${
205
- response.status
206
- } and body:
207
- ${await response.text()}`)
208
- }
209
- return response.text()
210
- })
211
- .then(function (text) {
212
- try {
213
- const result = new WMTSCapabilities().read(text)
214
- const options = optionsFromCapabilities(result, {
215
- layer: link.name,
216
- matrixSet: 'EPSG:3857',
217
- })
218
- const layerCap = result?.Contents?.Layer.find(
219
- (layer) => layer.Identifier === link.name
220
- )
221
- return {
222
- options,
223
- type: MapContextLayerTypeEnum.WMTS as 'wmts',
224
- ...(layerCap?.WGS84BoundingBox
225
- ? { extent: layerCap.WGS84BoundingBox }
226
- : {}),
227
- }
228
- } catch (e: any) {
229
- throw new Error(`WMTS GetCapabilities parsing failed:
230
- ${e.stack || e.message || e}`)
231
- }
232
- })
233
- )
234
- }
235
-
236
192
  prioritizePageScroll(interactions: Collection<Interaction>) {
237
193
  interactions.clear()
238
194
  interactions.extend(
@@ -0,0 +1,3 @@
1
+ export * from './lib/feature-notifications.module'
2
+ export * from './lib/notifications.service'
3
+ export * from './lib/notifications-container/notifications-container.component'
@@ -0,0 +1,10 @@
1
+ import { NotificationsService } from './notifications.service'
2
+ import { NgModule } from '@angular/core'
3
+
4
+ @NgModule({
5
+ declarations: [],
6
+ exports: [],
7
+ imports: [],
8
+ providers: [NotificationsService],
9
+ })
10
+ export class FeatureNotificationsModule {}
@@ -0,0 +1,6 @@
1
+ export interface NotificationContent {
2
+ type: 'info' | 'warning' | 'error' | 'success'
3
+ title: string
4
+ text: string
5
+ closeMessage?: string
6
+ }
@@ -0,0 +1,17 @@
1
+ <div class="flex flex-col gap-6 p-6 items-start pointer-events-none">
2
+ <gn-ui-notification
3
+ *ngFor="
4
+ let notification of notificationsService.notifications$ | async;
5
+ trackBy: trackById
6
+ "
7
+ class="max-w-full pointer-events-auto"
8
+ [text]="notification.text"
9
+ [type]="notification.type"
10
+ [title]="notification.title"
11
+ [closeMessage]="notification.closeMessage"
12
+ (notificationClose)="
13
+ notificationsService.removeNotificationById(notification.id)
14
+ "
15
+ [@enterExit]
16
+ ></gn-ui-notification>
17
+ </div>
@@ -0,0 +1,44 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core'
2
+ import { CommonModule } from '@angular/common'
3
+ import { NotificationsService } from '../notifications.service'
4
+ import { NotificationComponent } from '../../../../../../libs/ui/elements/src'
5
+ import {
6
+ animate,
7
+ keyframes,
8
+ style,
9
+ transition,
10
+ trigger,
11
+ } from '@angular/animations'
12
+
13
+ @Component({
14
+ selector: 'gn-ui-notifications-container',
15
+ standalone: true,
16
+ imports: [CommonModule, NotificationComponent],
17
+ templateUrl: './notifications-container.component.html',
18
+ styleUrls: ['./notifications-container.component.css'],
19
+ changeDetection: ChangeDetectionStrategy.OnPush,
20
+ animations: [
21
+ trigger('enterExit', [
22
+ transition(':enter', [
23
+ animate(
24
+ '150ms',
25
+ keyframes([
26
+ style({ transform: 'scale(1)', opacity: 0 }),
27
+ style({ transform: 'scale(1.03)', opacity: 0.5 }),
28
+ style({ transform: 'scale(1)', opacity: 1 }),
29
+ ])
30
+ ),
31
+ ]),
32
+ transition(':leave', [
33
+ animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
34
+ ]),
35
+ ]),
36
+ ],
37
+ })
38
+ export class NotificationsContainerComponent {
39
+ constructor(protected notificationsService: NotificationsService) {}
40
+
41
+ trackById(index: number, notification: { id: number }) {
42
+ return notification.id
43
+ }
44
+ }
@@ -0,0 +1,27 @@
1
+ import { Injectable } from '@angular/core'
2
+ import { NotificationContent } from './notification.model'
3
+ import { BehaviorSubject } from 'rxjs'
4
+
5
+ type NotificationWithIdentity = NotificationContent & { id: number }
6
+
7
+ @Injectable({
8
+ providedIn: 'root',
9
+ })
10
+ export class NotificationsService {
11
+ notifications$ = new BehaviorSubject<NotificationWithIdentity[]>([])
12
+
13
+ showNotification(content: NotificationContent, timeoutMs?: number) {
14
+ const id = Math.floor(Math.random() * 1000000)
15
+ this.notifications$.next([...this.notifications$.value, { ...content, id }])
16
+ if (typeof timeoutMs === 'undefined') return
17
+ setTimeout(() => {
18
+ this.removeNotificationById(id)
19
+ }, timeoutMs)
20
+ }
21
+
22
+ removeNotificationById(id: number) {
23
+ this.notifications$.next(
24
+ this.notifications$.value.filter((n) => n.id !== id)
25
+ )
26
+ }
27
+ }
@@ -11,7 +11,10 @@ import { MdViewFacade } from './state'
11
11
  import { MdViewEffects } from './state/mdview.effects'
12
12
  import { MapViewComponent } from './map-view/map-view.component'
13
13
  import { DataViewComponent } from './data-view/data-view.component'
14
- import { MD_VIEW_FEATURE_STATE_KEY, reducer } from './state/mdview.reducer'
14
+ import {
15
+ METADATA_VIEW_FEATURE_STATE_KEY,
16
+ reducer,
17
+ } from './state/mdview.reducer'
15
18
  import { MatTabsModule } from '@angular/material/tabs'
16
19
  import { MatIconModule } from '@angular/material/icon'
17
20
  import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
@@ -35,7 +38,7 @@ import { DataViewShareComponent } from './data-view-share/data-view-share.compon
35
38
  ],
36
39
  imports: [
37
40
  CommonModule,
38
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
41
+ StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer),
39
42
  EffectsModule.forFeature([MdViewEffects]),
40
43
  UiLayoutModule,
41
44
  FeatureMapModule,
@@ -188,7 +188,11 @@ export class MapViewComponent implements OnInit, OnDestroy {
188
188
  link.type === 'service' &&
189
189
  link.accessServiceProtocol === 'wmts'
190
190
  ) {
191
- return this.mapUtils.getWmtsLayerFromCapabilities(link)
191
+ return of({
192
+ url: link.url.toString(),
193
+ type: MapContextLayerTypeEnum.WMTS,
194
+ name: link.name,
195
+ })
192
196
  } else if (
193
197
  (link.type === 'service' &&
194
198
  (link.accessServiceProtocol === 'wfs' ||
@@ -1,7 +1,13 @@
1
1
  import { DatavizConfigurationModel } from '../../../../../../libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model'
2
2
  import { createAction, props } from '@ngrx/store'
3
- import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
3
+ import {
4
+ CatalogRecord,
5
+ UserFeedback,
6
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
4
7
 
8
+ /*
9
+ Metadata actions
10
+ */
5
11
  export const loadFullMetadata = createAction(
6
12
  '[Metadata view] Load full metadata',
7
13
  props<{ uuid: string }>()
@@ -12,24 +18,63 @@ export const setIncompleteMetadata = createAction(
12
18
  props<{ incomplete: Partial<CatalogRecord> }>()
13
19
  )
14
20
 
15
- export const loadFullSuccess = createAction(
16
- '[Metadata view] Load full success',
21
+ export const loadFullMetadataSuccess = createAction(
22
+ '[Metadata view] Load full metadata success',
17
23
  props<{ full: CatalogRecord }>()
18
24
  )
19
25
 
20
- export const loadFullFailure = createAction(
21
- '[Metadata view] Load full failure',
26
+ export const loadFullMetadataFailure = createAction(
27
+ '[Metadata view] Load full metadata failure',
22
28
  props<{ otherError?: string; notFound?: boolean }>()
23
29
  )
24
30
 
31
+ export const closeMetadata = createAction('[Metadata view] close')
32
+
33
+ /*
34
+ Related actions
35
+ */
25
36
  export const setRelated = createAction(
26
37
  '[Metadata view] Set related records',
27
38
  props<{ related: CatalogRecord[] }>()
28
39
  )
29
40
 
41
+ /*
42
+ ChartConfig actions
43
+ */
30
44
  export const setChartConfig = createAction(
31
45
  '[Metadata view] Set chart config',
32
46
  props<{ chartConfig: DatavizConfigurationModel }>()
33
47
  )
34
48
 
35
- export const close = createAction('[Metadata view] close')
49
+ /*
50
+ User Feedbacks actions
51
+ */
52
+ export const addUserFeedback = createAction(
53
+ '[Metadata view] Add UserFeedback',
54
+ props<{ userFeedback: UserFeedback }>()
55
+ )
56
+
57
+ export const addUserFeedbackSuccess = createAction(
58
+ '[Metadata view] Add UserFeedback Success',
59
+ props<{ datasetUuid: string }>()
60
+ )
61
+
62
+ export const addUserFeedbackFailure = createAction(
63
+ '[Metadata view] Add UserFeedback Failure',
64
+ props<{ otherError?: string; notFound?: boolean }>()
65
+ )
66
+
67
+ export const loadUserFeedbacks = createAction(
68
+ '[Metadata view] Load UserFeedbacks',
69
+ props<{ datasetUuid: string }>()
70
+ )
71
+
72
+ export const loadUserFeedbacksSuccess = createAction(
73
+ '[Metadata view] Load UserFeedbacks Success',
74
+ props<{ userFeedbacks: UserFeedback[] }>()
75
+ )
76
+
77
+ export const loadUserFeedbacksFailure = createAction(
78
+ '[Metadata view] Load UserFeedbacks Failure',
79
+ props<{ otherError?: string; notFound?: boolean }>()
80
+ )
@@ -1,18 +1,23 @@
1
1
  import { Injectable } from '@angular/core'
2
2
  import { Actions, createEffect, ofType } from '@ngrx/effects'
3
- import { of } from 'rxjs'
3
+ import { exhaustMap, mergeMap, of } from 'rxjs'
4
4
  import { catchError, map, switchMap } from 'rxjs/operators'
5
5
  import * as MdViewActions from './mdview.actions'
6
6
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
7
+ import { PlatformServiceInterface } from '../../../../../../libs/common/domain/src/lib/platform.service.interface'
7
8
 
8
9
  @Injectable()
9
10
  export class MdViewEffects {
10
11
  constructor(
11
12
  private actions$: Actions,
12
- private recordsRepository: RecordsRepositoryInterface
13
+ private recordsRepository: RecordsRepositoryInterface,
14
+ private platformServiceInterface: PlatformServiceInterface
13
15
  ) {}
14
16
 
15
- loadFull$ = createEffect(() =>
17
+ /*
18
+ Metadata effects
19
+ */
20
+ loadFullMetadata$ = createEffect(() =>
16
21
  this.actions$.pipe(
17
22
  ofType(MdViewActions.loadFullMetadata),
18
23
  switchMap(({ uuid }) =>
@@ -20,19 +25,22 @@ export class MdViewEffects {
20
25
  ),
21
26
  map((record) => {
22
27
  if (record === null) {
23
- return MdViewActions.loadFullFailure({ notFound: true })
28
+ return MdViewActions.loadFullMetadataFailure({ notFound: true })
24
29
  }
25
- return MdViewActions.loadFullSuccess({ full: record })
30
+ return MdViewActions.loadFullMetadataSuccess({ full: record })
26
31
  }),
27
32
  catchError((error) =>
28
- of(MdViewActions.loadFullFailure({ otherError: error.message }))
33
+ of(MdViewActions.loadFullMetadataFailure({ otherError: error.message }))
29
34
  )
30
35
  )
31
36
  )
32
37
 
38
+ /*
39
+ Related effects
40
+ */
33
41
  loadRelatedRecords$ = createEffect(() =>
34
42
  this.actions$.pipe(
35
- ofType(MdViewActions.loadFullSuccess),
43
+ ofType(MdViewActions.loadFullMetadataSuccess),
36
44
  switchMap(({ full }) => this.recordsRepository.getSimilarRecords(full)),
37
45
  map((related) => {
38
46
  return MdViewActions.setRelated({ related })
@@ -40,4 +48,71 @@ export class MdViewEffects {
40
48
  catchError((error) => of(MdViewActions.setRelated({ related: null })))
41
49
  )
42
50
  )
51
+
52
+ /*
53
+ UserFeedback effects
54
+ */
55
+ loadUserFeedbacks$ = createEffect(() =>
56
+ this.actions$.pipe(
57
+ ofType(MdViewActions.loadUserFeedbacks),
58
+ exhaustMap(({ datasetUuid }) =>
59
+ this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(
60
+ map((userFeedbacks) =>
61
+ MdViewActions.loadUserFeedbacksSuccess({ userFeedbacks })
62
+ ),
63
+ catchError((error) =>
64
+ of(
65
+ MdViewActions.loadUserFeedbacksFailure({
66
+ otherError: error.message,
67
+ })
68
+ )
69
+ )
70
+ )
71
+ )
72
+ )
73
+ )
74
+
75
+ reloadUserFeedbacks$ = createEffect(() =>
76
+ this.actions$.pipe(
77
+ ofType(MdViewActions.addUserFeedbackSuccess),
78
+ exhaustMap(({ datasetUuid }) =>
79
+ this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(
80
+ map((userFeedbacks) =>
81
+ MdViewActions.loadUserFeedbacksSuccess({ userFeedbacks })
82
+ ),
83
+ catchError((error) =>
84
+ of(
85
+ MdViewActions.loadUserFeedbacksFailure({
86
+ otherError: error.message,
87
+ })
88
+ )
89
+ )
90
+ )
91
+ )
92
+ )
93
+ )
94
+
95
+ addUserFeedback$ = createEffect(() =>
96
+ this.actions$.pipe(
97
+ ofType(MdViewActions.addUserFeedback),
98
+ mergeMap((action) =>
99
+ this.platformServiceInterface
100
+ .postUserFeedbacks(action.userFeedback)
101
+ .pipe(
102
+ map(() =>
103
+ MdViewActions.addUserFeedbackSuccess({
104
+ datasetUuid: action.userFeedback.metadataUUID,
105
+ })
106
+ ),
107
+ catchError((error) => {
108
+ return of(
109
+ MdViewActions.addUserFeedbackFailure({
110
+ otherError: error.message,
111
+ })
112
+ )
113
+ })
114
+ )
115
+ )
116
+ )
117
+ )
43
118
  }