geonetwork-ui 2.3.0-dev.6083baae → 2.3.0-dev.6b7e19cb

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 (235) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
  2. package/esm2022/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.mjs +1 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +12 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +36 -3
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +19 -7
  6. package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/user-feedbacks.model.mjs +2 -0
  8. package/esm2022/libs/common/domain/src/lib/model/user/index.mjs +2 -0
  9. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  10. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +35 -2
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  13. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +3 -3
  14. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +38 -10
  15. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +3 -13
  16. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  17. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +16 -1
  18. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  19. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  20. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  21. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  22. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +29 -8
  23. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +4 -4
  24. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -2
  25. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
  26. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
  27. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +22 -7
  28. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +52 -17
  29. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
  30. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
  31. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  32. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  33. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  34. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  35. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  36. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +2 -2
  37. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +77 -15
  38. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -7
  39. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
  40. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +62 -0
  41. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  42. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  43. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  44. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
  45. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  46. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
  47. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +21 -3
  48. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -9
  49. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  50. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  51. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  52. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
  53. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  54. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  55. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  56. package/esm2022/translations/de.json +21 -0
  57. package/esm2022/translations/en.json +21 -0
  58. package/esm2022/translations/es.json +21 -0
  59. package/esm2022/translations/fr.json +21 -0
  60. package/esm2022/translations/it.json +21 -0
  61. package/esm2022/translations/nl.json +21 -0
  62. package/esm2022/translations/pt.json +21 -0
  63. package/fesm2022/geonetwork-ui.mjs +1693 -795
  64. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  65. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  66. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  67. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  68. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  69. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  70. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  71. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  72. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  73. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  74. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  75. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  76. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  77. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  78. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  79. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  80. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  81. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  82. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  83. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  84. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  85. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  86. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
  87. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +8 -1
  88. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  89. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  90. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  91. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  92. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  93. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +1 -0
  94. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  95. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  96. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  97. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  98. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  99. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  100. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  101. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  102. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
  103. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  104. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  105. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  106. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  107. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  108. package/libs/feature/search/src/index.d.ts +1 -0
  109. package/libs/feature/search/src/index.d.ts.map +1 -1
  110. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  111. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  112. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  113. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  114. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  115. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  116. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +12 -3
  117. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  118. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +16 -15
  119. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  120. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  121. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  122. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +22 -0
  123. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  124. package/libs/ui/inputs/src/index.d.ts +15 -14
  125. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  126. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  127. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  128. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  129. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  130. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
  131. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  132. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  133. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  134. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  135. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  136. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +5 -1
  137. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  138. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  139. package/libs/ui/layout/src/index.d.ts +1 -0
  140. package/libs/ui/layout/src/index.d.ts.map +1 -1
  141. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  142. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  143. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  144. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  145. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  146. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  147. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  148. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  149. package/package.json +1 -1
  150. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  151. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  152. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  153. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  154. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +34 -7
  155. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  156. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  157. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  158. package/src/libs/common/fixtures/src/index.ts +8 -6
  159. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  160. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +3 -3
  161. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  162. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
  163. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  164. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  165. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  166. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  167. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  168. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  169. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.css +0 -5
  170. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +1 -1
  171. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +57 -33
  172. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +35 -4
  173. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +2 -21
  174. package/src/libs/feature/editor/src/lib/fields.config.ts +15 -0
  175. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  176. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  177. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  178. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +1 -0
  179. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +26 -8
  180. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  181. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  182. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  183. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  184. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +48 -8
  185. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
  186. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  187. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  188. package/src/libs/feature/search/src/index.ts +1 -0
  189. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  190. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  191. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  192. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  193. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  194. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
  195. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +87 -8
  196. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -2
  197. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  198. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  199. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  200. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +63 -0
  201. package/src/libs/ui/inputs/src/index.ts +15 -14
  202. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  203. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  204. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  205. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  206. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
  207. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  208. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  209. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  210. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  211. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  212. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +2 -1
  213. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +17 -1
  214. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  215. package/src/libs/ui/layout/src/index.ts +1 -0
  216. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  217. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  218. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  219. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  220. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  221. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  222. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.css +0 -5
  223. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
  224. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  225. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  226. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  227. package/tailwind.base.css +7 -0
  228. package/translations/de.json +21 -0
  229. package/translations/en.json +21 -0
  230. package/translations/es.json +21 -0
  231. package/translations/fr.json +21 -0
  232. package/translations/it.json +21 -0
  233. package/translations/nl.json +21 -0
  234. package/translations/pt.json +21 -0
  235. package/translations/sk.json +21 -0
@@ -14,7 +14,7 @@ import {
14
14
  MapContextLayerTypeEnum,
15
15
  } from '../map-context/map-context.model'
16
16
  import { TranslateModule } from '@ngx-translate/core'
17
- import { UiInputsModule } from '../../../../../../libs/ui/inputs/src'
17
+ import { DropdownChoice, UiInputsModule } from '../../../../../../libs/ui/inputs/src'
18
18
  import { CommonModule } from '@angular/common'
19
19
  import { MapLayer } from '../+state/map.models'
20
20
 
@@ -30,18 +30,16 @@ export class AddLayerFromOgcApiComponent implements OnInit {
30
30
  @Output() layerAdded = new EventEmitter<MapLayer>()
31
31
 
32
32
  urlChange = new Subject<string>()
33
- layerUrl = ''
34
33
  loading = false
35
- layers: string[] = []
36
- ogcEndpoint: OgcApiEndpoint = null
34
+ layers: any[] = []
37
35
  errorMessage: string | null = null
36
+ selectedLayerTypes: { [key: string]: DropdownChoice['value'] } = {}
38
37
 
39
38
  constructor(private changeDetectorRef: ChangeDetectorRef) {}
40
39
 
41
40
  ngOnInit() {
42
41
  this.urlChange.pipe(debounceTime(700)).subscribe(() => {
43
42
  this.loadLayers()
44
- this.changeDetectorRef.detectChanges() // manually trigger change detection
45
43
  })
46
44
  }
47
45
 
@@ -49,14 +47,13 @@ export class AddLayerFromOgcApiComponent implements OnInit {
49
47
  this.errorMessage = null
50
48
  try {
51
49
  this.loading = true
52
- if (this.ogcUrl.trim() === '') {
50
+ if (!this.ogcUrl.trim()) {
53
51
  this.layers = []
54
52
  return
55
53
  }
56
- this.ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
57
-
58
- // Currently only supports feature collections
59
- this.layers = await this.ogcEndpoint.featureCollections
54
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
55
+ this.layers = await ogcEndpoint.allCollections
56
+ this.setDefaultLayerTypes()
60
57
  } catch (error) {
61
58
  const err = error as Error
62
59
  this.layers = []
@@ -67,14 +64,72 @@ export class AddLayerFromOgcApiComponent implements OnInit {
67
64
  }
68
65
  }
69
66
 
70
- async addLayer(layer: string) {
71
- this.layerUrl = await this.ogcEndpoint.getCollectionItemsUrl(layer)
67
+ setDefaultLayerTypes() {
68
+ this.layers.forEach((layer) => {
69
+ const choices = this.getLayerChoices(layer)
70
+ if (choices.length > 0) {
71
+ this.selectedLayerTypes[layer.name] = choices[0].value
72
+ }
73
+ })
74
+ }
72
75
 
73
- const layerToAdd: MapContextLayerModel = {
74
- name: layer,
75
- url: this.layerUrl,
76
- type: MapContextLayerTypeEnum.OGCAPI,
76
+ getLayerChoices(layer: any) {
77
+ const choices = []
78
+ if (layer.hasRecords) {
79
+ choices.push({ label: 'Records', value: 'record' })
80
+ }
81
+ if (layer.hasFeatures) {
82
+ choices.push({ label: 'Features', value: 'features' })
83
+ }
84
+ if (layer.hasVectorTiles) {
85
+ choices.push({ label: 'Vector Tiles', value: 'vectorTiles' })
86
+ }
87
+ if (layer.hasMapTiles) {
88
+ choices.push({ label: 'Map Tiles', value: 'mapTiles' })
89
+ }
90
+ return choices
91
+ }
92
+
93
+ shouldDisplayLayer(layer: any) {
94
+ return (
95
+ layer.hasRecords ||
96
+ layer.hasFeatures ||
97
+ layer.hasVectorTiles ||
98
+ layer.hasMapTiles
99
+ )
100
+ }
101
+
102
+ onLayerTypeSelect(layerName: string, selectedType: any) {
103
+ this.selectedLayerTypes[layerName] = selectedType
104
+ ? selectedType
105
+ : this.getLayerChoices(layerName)[0]?.value
106
+ }
107
+
108
+ async addLayer(layer: string, layerType: any) {
109
+ try {
110
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
111
+ let layerUrl: string
112
+
113
+ if (layerType === 'vectorTiles') {
114
+ layerUrl = await ogcEndpoint.getVectorTilesetUrl(layer)
115
+ } else if (layerType === 'mapTiles') {
116
+ layerUrl = await ogcEndpoint.getMapTilesetUrl(layer)
117
+ } else {
118
+ layerUrl = await ogcEndpoint.getCollectionItemsUrl(layer, {
119
+ outputFormat: 'json',
120
+ })
121
+ }
122
+
123
+ const layerToAdd: MapContextLayerModel = {
124
+ name: layer,
125
+ url: layerUrl,
126
+ type: MapContextLayerTypeEnum.OGCAPI,
127
+ layerType: layerType,
128
+ }
129
+ this.layerAdded.emit({ ...layerToAdd, title: layer })
130
+ } catch (error) {
131
+ const err = error as Error
132
+ console.error('Error adding layer:', err.message)
77
133
  }
78
- this.layerAdded.emit({ ...layerToAdd, title: layer })
79
134
  }
80
135
  }
@@ -38,6 +38,7 @@ export interface MapContextLayerOgcapiModel {
38
38
  type: 'ogcapi'
39
39
  url: string
40
40
  name: string
41
+ layerType: 'feature' | 'vectorTiles' | 'mapTiles' | 'record'
41
42
  }
42
43
 
43
44
  interface LayerXyzModel {
@@ -25,6 +25,10 @@ import WMTS from 'ol/source/WMTS'
25
25
  import { Geometry } from 'ol/geom'
26
26
  import Feature from 'ol/Feature'
27
27
  import { WfsEndpoint, WmtsEndpoint } from '@camptocamp/ogc-client'
28
+ import OGCVectorTile from 'ol/source/OGCVectorTile.js'
29
+ import { MVT } from 'ol/format'
30
+ import VectorTileLayer from 'ol/layer/VectorTile'
31
+ import OGCMapTile from 'ol/source/OGCMapTile.js'
28
32
 
29
33
  export const DEFAULT_BASELAYER_CONTEXT: MapContextLayerXyzModel = {
30
34
  type: MapContextLayerTypeEnum.XYZ,
@@ -78,14 +82,28 @@ export class MapContextService {
78
82
  const style = this.styleService.styles.default
79
83
  switch (type) {
80
84
  case MapContextLayerTypeEnum.OGCAPI:
81
- return new VectorLayer({
82
- source: new VectorSource({
83
- format: new GeoJSON(),
84
- url: layerModel.url,
85
- }),
86
- style,
87
- })
88
-
85
+ if (layerModel.layerType === 'vectorTiles') {
86
+ return new VectorTileLayer({
87
+ source: new OGCVectorTile({
88
+ url: layerModel.url,
89
+ format: new MVT(),
90
+ }),
91
+ })
92
+ } else if (layerModel.layerType === 'mapTiles') {
93
+ return new TileLayer({
94
+ source: new OGCMapTile({
95
+ url: layerModel.url,
96
+ }),
97
+ })
98
+ } else {
99
+ return new VectorLayer({
100
+ source: new VectorSource({
101
+ format: new GeoJSON(),
102
+ url: layerModel.url,
103
+ }),
104
+ style,
105
+ })
106
+ }
89
107
  case MapContextLayerTypeEnum.XYZ:
90
108
  return new TileLayer({
91
109
  source: new XYZ({
@@ -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,
@@ -196,7 +196,8 @@ export class MapViewComponent implements OnInit, OnDestroy {
196
196
  } else if (
197
197
  (link.type === 'service' &&
198
198
  (link.accessServiceProtocol === 'wfs' ||
199
- link.accessServiceProtocol === 'esriRest')) ||
199
+ link.accessServiceProtocol === 'esriRest' ||
200
+ link.accessServiceProtocol === 'ogcFeatures')) ||
200
201
  link.type === 'download'
201
202
  ) {
202
203
  return this.dataService.readAsGeoJson(link).pipe(
@@ -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
  }
@@ -5,7 +5,11 @@ import * as MdViewActions from './mdview.actions'
5
5
  import * as MdViewSelectors from './mdview.selectors'
6
6
  import { LinkClassifierService, LinkUsage } from '../../../../../../libs/util/shared/src'
7
7
  import { DatavizConfigurationModel } from '../../../../../../libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model'
8
- import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
8
+ import {
9
+ CatalogRecord,
10
+ UserFeedback,
11
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
12
+ import { AvatarServiceInterface } from '../../../../../../libs/api/repository/src'
9
13
 
10
14
  @Injectable()
11
15
  /**
@@ -15,19 +19,31 @@ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/mode
15
19
  * To clear the current record use the `close()` method.
16
20
  */
17
21
  export class MdViewFacade {
22
+ constructor(
23
+ private store: Store,
24
+ private linkClassifier: LinkClassifierService,
25
+ private avatarService: AvatarServiceInterface
26
+ ) {}
27
+
18
28
  isPresent$ = this.store.pipe(
19
29
  select(MdViewSelectors.getMetadataUuid),
20
30
  map((uuid) => !!uuid)
21
31
  )
22
- isLoading$ = this.store.pipe(select(MdViewSelectors.getMetadataIsLoading))
32
+
33
+ isMetadataLoading$ = this.store.pipe(
34
+ select(MdViewSelectors.getMetadataIsLoading)
35
+ )
36
+
23
37
  metadata$ = this.store.pipe(
24
38
  select(MdViewSelectors.getMetadata),
25
39
  filter((md) => !!md)
26
40
  )
41
+
27
42
  isIncomplete$ = this.store.pipe(
28
43
  select(MdViewSelectors.getMetadataIsIncomplete),
29
44
  filter((incomplete) => incomplete !== null)
30
45
  )
46
+
31
47
  error$ = this.store.pipe(select(MdViewSelectors.getMetadataError))
32
48
 
33
49
  related$ = this.store.pipe(select(MdViewSelectors.getRelated))
@@ -37,11 +53,13 @@ export class MdViewFacade {
37
53
  allLinks$ = this.metadata$.pipe(
38
54
  map((record) => ('distributions' in record ? record.distributions : []))
39
55
  )
56
+
40
57
  apiLinks$ = this.allLinks$.pipe(
41
58
  map((links) =>
42
59
  links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
43
60
  )
44
61
  )
62
+
45
63
  mapApiLinks$ = this.allLinks$.pipe(
46
64
  map((links) =>
47
65
  links.filter((link) =>
@@ -49,6 +67,7 @@ export class MdViewFacade {
49
67
  )
50
68
  )
51
69
  )
70
+
52
71
  downloadLinks$ = this.allLinks$.pipe(
53
72
  map((links) =>
54
73
  links.filter((link) =>
@@ -56,11 +75,13 @@ export class MdViewFacade {
56
75
  )
57
76
  )
58
77
  )
78
+
59
79
  dataLinks$ = this.allLinks$.pipe(
60
80
  map((links) =>
61
81
  links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.DATA))
62
82
  )
63
83
  )
84
+
64
85
  geoDataLinks$ = this.allLinks$.pipe(
65
86
  map((links) =>
66
87
  links.filter((link) =>
@@ -68,9 +89,11 @@ export class MdViewFacade {
68
89
  )
69
90
  )
70
91
  )
92
+
71
93
  landingPageLinks$ = this.metadata$.pipe(
72
94
  map((record) => ('landingPage' in record ? [record.landingPage] : []))
73
95
  )
96
+
74
97
  otherLinks$ = this.allLinks$.pipe(
75
98
  map((links) =>
76
99
  links.filter((link) =>
@@ -79,10 +102,13 @@ export class MdViewFacade {
79
102
  )
80
103
  )
81
104
 
82
- constructor(
83
- private store: Store,
84
- private linkClassifier: LinkClassifierService
85
- ) {}
105
+ userFeedbacks$ = this.store.pipe(select(MdViewSelectors.getUserFeedbacks))
106
+ isAllUserFeedbackLoading$ = this.store.pipe(
107
+ select(MdViewSelectors.getAllUserFeedbacksLoading)
108
+ )
109
+ isAddUserFeedbackLoading$ = this.store.pipe(
110
+ select(MdViewSelectors.getAddUserFeedbacksLoading)
111
+ )
86
112
 
87
113
  /**
88
114
  * This will show an incomplete record (e.g. from a search result) as a preview
@@ -91,16 +117,30 @@ export class MdViewFacade {
91
117
  setIncompleteMetadata(incomplete: CatalogRecord) {
92
118
  this.store.dispatch(MdViewActions.setIncompleteMetadata({ incomplete }))
93
119
  }
120
+
94
121
  /**
95
122
  * This will trigger the load of a full metadata record
96
123
  */
97
124
  loadFull(uuid: string) {
98
125
  this.store.dispatch(MdViewActions.loadFullMetadata({ uuid }))
99
126
  }
100
- close() {
101
- this.store.dispatch(MdViewActions.close())
127
+
128
+ closeMetadata() {
129
+ this.store.dispatch(MdViewActions.closeMetadata())
102
130
  }
131
+
103
132
  setChartConfig(chartConfig: DatavizConfigurationModel) {
104
133
  this.store.dispatch(MdViewActions.setChartConfig({ chartConfig }))
105
134
  }
135
+
136
+ /**
137
+ * UserFeedbacks
138
+ */
139
+ addUserFeedback(userFeedback: UserFeedback) {
140
+ this.store.dispatch(MdViewActions.addUserFeedback({ userFeedback }))
141
+ }
142
+
143
+ loadUserFeedbacks(datasetUuid: string) {
144
+ this.store.dispatch(MdViewActions.loadUserFeedbacks({ datasetUuid }))
145
+ }
106
146
  }