geonetwork-ui 2.4.0-dev.00c93bef → 2.4.0-dev.0925104f

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 (404) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.mjs +1 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +7 -5
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +30 -2
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.mjs +31 -0
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +23 -1
  6. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +10 -3
  7. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +31 -3
  8. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +11 -1
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +11 -1
  10. package/esm2022/libs/common/domain/src/lib/model/record/contact.model.mjs +28 -1
  11. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  12. package/esm2022/libs/common/domain/src/lib/model/user/user.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  15. package/esm2022/libs/data-access/gn4/src/fixtures/site.fixtures.mjs +5 -5
  16. package/esm2022/libs/data-access/gn4/src/fixtures/ui.fixtures.mjs +3 -3
  17. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -6
  18. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  19. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +6 -1
  20. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +4 -1
  21. package/esm2022/libs/feature/editor/src/lib/components/contact-card/contact-card.component.mjs +29 -0
  22. package/esm2022/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.mjs +78 -0
  23. package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +96 -0
  24. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.mjs +164 -0
  25. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +19 -41
  26. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +10 -8
  27. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +101 -0
  28. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.mjs +44 -0
  29. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +28 -0
  30. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +10 -6
  31. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +11 -11
  32. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.mjs +9 -8
  33. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +111 -5
  34. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.mjs +49 -52
  35. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +16 -14
  36. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +37 -43
  37. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +5 -3
  38. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +8 -8
  39. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +6 -4
  40. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +37 -4
  41. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +5 -1
  42. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +6 -6
  43. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +6 -5
  44. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +8 -5
  45. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +6 -7
  46. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +8 -7
  47. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +7 -6
  48. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +7 -26
  49. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +29 -13
  50. package/esm2022/libs/feature/map/src/lib/style/map-style.fixtures.mjs +3 -3
  51. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +10 -5
  52. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +3 -3
  53. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +48 -8
  54. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +6 -2
  55. package/esm2022/libs/ui/dataviz/src/lib/table/table.fixtures.mjs +3 -3
  56. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  57. package/esm2022/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.mjs +27 -0
  58. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +4 -3
  59. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  60. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  61. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +5 -11
  62. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +3 -3
  63. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +5 -5
  64. package/esm2022/libs/ui/elements/src/lib/sortable-list/sortable-list.component.mjs +6 -10
  65. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +11 -5
  66. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  67. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +19 -5
  68. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +26 -24
  69. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +17 -14
  70. package/esm2022/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.mjs +32 -0
  71. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +6 -21
  72. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +6 -17
  73. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +3 -7
  74. package/esm2022/libs/ui/inputs/src/lib/url-input/url-input.component.mjs +43 -0
  75. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
  76. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
  77. package/esm2022/libs/ui/map/src/lib/ui-map.module.mjs +3 -3
  78. package/esm2022/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.mjs +7 -7
  79. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +67 -0
  80. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +31 -11
  81. package/esm2022/libs/ui/widgets/src/index.mjs +2 -1
  82. package/esm2022/libs/ui/widgets/src/lib/popover/popover.component.mjs +68 -0
  83. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +10 -10
  84. package/esm2022/translations/de.json +64 -19
  85. package/esm2022/translations/en.json +57 -12
  86. package/esm2022/translations/es.json +54 -9
  87. package/esm2022/translations/fr.json +68 -23
  88. package/esm2022/translations/it.json +57 -12
  89. package/esm2022/translations/nl.json +54 -9
  90. package/esm2022/translations/pt.json +54 -9
  91. package/fesm2022/geonetwork-ui.mjs +4665 -3305
  92. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  93. package/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.d.ts +2 -6
  94. package/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.d.ts.map +1 -1
  95. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  96. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
  97. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  98. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
  99. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
  100. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
  101. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  102. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
  103. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  104. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +7 -1
  105. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  106. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  107. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +1 -0
  108. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  109. package/libs/common/domain/src/lib/model/record/contact.model.d.ts +1 -0
  110. package/libs/common/domain/src/lib/model/record/contact.model.d.ts.map +1 -1
  111. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +3 -1
  112. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  113. package/libs/common/domain/src/lib/model/user/user.model.d.ts +1 -1
  114. package/libs/common/domain/src/lib/model/user/user.model.d.ts.map +1 -1
  115. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -0
  116. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  117. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +17 -0
  118. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  119. package/libs/data-access/gn4/src/fixtures/site.fixtures.d.ts +2 -2
  120. package/libs/data-access/gn4/src/fixtures/site.fixtures.d.ts.map +1 -1
  121. package/libs/data-access/gn4/src/fixtures/ui.fixtures.d.ts +1 -1
  122. package/libs/data-access/gn4/src/fixtures/ui.fixtures.d.ts.map +1 -1
  123. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  124. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +1 -0
  125. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  126. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +5 -0
  127. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -1
  128. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +1 -0
  129. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  130. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts +12 -0
  131. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts.map +1 -0
  132. package/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.d.ts +32 -0
  133. package/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.d.ts.map +1 -0
  134. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +27 -0
  135. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +1 -0
  136. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts +44 -0
  137. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts.map +1 -0
  138. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts +8 -19
  139. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  140. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +6 -4
  141. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -1
  142. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +22 -0
  143. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts.map +1 -0
  144. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.d.ts +15 -0
  145. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.d.ts.map +1 -0
  146. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +13 -0
  147. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -0
  148. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +4 -3
  149. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -1
  150. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts +4 -4
  151. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts.map +1 -1
  152. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts +4 -3
  153. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts.map +1 -1
  154. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +23 -0
  155. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
  156. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts +15 -15
  157. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts.map +1 -1
  158. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +5 -5
  159. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts.map +1 -1
  160. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +15 -19
  161. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  162. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +3 -2
  163. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  164. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +2 -1
  165. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  166. package/libs/feature/editor/src/lib/fields.config.d.ts +8 -0
  167. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  168. package/libs/feature/editor/src/lib/services/editor.service.d.ts +1 -0
  169. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  170. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.d.ts +1 -1
  171. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.d.ts.map +1 -1
  172. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts +1 -1
  173. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
  174. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +1 -1
  175. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -1
  176. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +1 -1
  177. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  178. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +1 -1
  179. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -1
  180. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +1 -1
  181. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -1
  182. package/libs/feature/map/src/lib/feature-map.module.d.ts +16 -21
  183. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  184. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +1 -1
  185. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
  186. package/libs/feature/map/src/lib/style/map-style.fixtures.d.ts +2 -2
  187. package/libs/feature/map/src/lib/style/map-style.fixtures.d.ts.map +1 -1
  188. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  189. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +15 -4
  190. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  191. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -0
  192. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  193. package/libs/ui/dataviz/src/lib/table/table.fixtures.d.ts +2 -2
  194. package/libs/ui/dataviz/src/lib/table/table.fixtures.d.ts.map +1 -1
  195. package/libs/ui/elements/src/index.d.ts +1 -0
  196. package/libs/ui/elements/src/index.d.ts.map +1 -1
  197. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts +18 -0
  198. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts.map +1 -0
  199. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  200. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -3
  201. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  202. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  203. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts +5 -10
  204. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts.map +1 -1
  205. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +8 -6
  206. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  207. package/libs/ui/inputs/src/index.d.ts +1 -0
  208. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  209. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts +9 -1
  210. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts.map +1 -1
  211. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +5 -3
  212. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -1
  213. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +3 -4
  214. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -1
  215. package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts +17 -0
  216. package/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.d.ts.map +1 -0
  217. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +0 -4
  218. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  219. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -4
  220. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  221. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +34 -35
  222. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  223. package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts +18 -0
  224. package/libs/ui/inputs/src/lib/url-input/url-input.component.d.ts.map +1 -0
  225. package/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.d.ts +3 -3
  226. package/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.d.ts.map +1 -1
  227. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +20 -0
  228. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  229. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  230. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  231. package/libs/ui/widgets/src/index.d.ts +1 -0
  232. package/libs/ui/widgets/src/index.d.ts.map +1 -1
  233. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts +19 -0
  234. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts.map +1 -0
  235. package/libs/util/app-config/src/lib/fixtures.d.ts +8 -8
  236. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  237. package/package.json +1 -1
  238. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -1
  239. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
  240. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
  241. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
  242. package/src/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.ts +2 -6
  243. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +6 -2
  244. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
  245. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
  246. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
  247. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +13 -5
  248. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +42 -2
  249. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +12 -1
  250. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +43 -12
  251. package/src/libs/common/domain/src/lib/model/record/contact.model.ts +28 -0
  252. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +3 -1
  253. package/src/libs/common/domain/src/lib/model/user/user.model.ts +1 -1
  254. package/src/libs/common/domain/src/lib/platform.service.interface.ts +4 -0
  255. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +22 -0
  256. package/src/libs/common/fixtures/src/index.ts +1 -1
  257. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +37 -37
  258. package/src/libs/common/fixtures/src/lib/elasticsearch/{aggregations-request.ts → aggregations-request.fixtures.ts} +1 -3
  259. package/src/libs/common/fixtures/src/lib/elasticsearch/{aggregations-response.ts → aggregations-response.fixtures.ts} +6 -8
  260. package/src/libs/common/fixtures/src/lib/elasticsearch/{full-response.ts → full-response.fixtures.ts} +1 -3
  261. package/src/libs/common/fixtures/src/lib/elasticsearch/index.ts +5 -5
  262. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +1 -3
  263. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata.fixtures.ts +1739 -1742
  264. package/src/libs/common/fixtures/src/lib/elasticsearch/{search-requests.ts → search-requests.fixtures.ts} +1 -3
  265. package/src/libs/common/fixtures/src/lib/elasticsearch/{search-responses.ts → search-responses.fixtures.ts} +4 -6
  266. package/src/libs/common/fixtures/src/lib/geojson.fixtures.ts +57178 -57195
  267. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +2 -4
  268. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +84 -56
  269. package/src/libs/common/fixtures/src/lib/ol-feature.fixtures.ts +10 -0
  270. package/src/libs/common/fixtures/src/lib/organisations.fixture.ts +37 -3
  271. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +9 -7
  272. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -6
  273. package/src/libs/common/fixtures/src/lib/repository.fixtures.ts +4 -4
  274. package/src/libs/common/fixtures/src/lib/search/aggregations.ts +2 -3
  275. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +14 -15
  276. package/src/libs/common/fixtures/src/lib/user.fixtures.ts +32 -15
  277. package/src/libs/data-access/gn4/src/fixtures/site.fixtures.ts +4 -4
  278. package/src/libs/data-access/gn4/src/fixtures/ui.fixtures.ts +2 -2
  279. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +1 -5
  280. package/src/libs/data-access/gn4/src/spec.yaml +0 -8
  281. package/src/libs/feature/catalog/src/lib/sources/sources.fixture.ts +1 -1
  282. package/src/libs/feature/dataviz/src/lib/figure/figure.fixtures.ts +2 -2
  283. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +2 -0
  284. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +15 -0
  285. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +4 -0
  286. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.css +0 -0
  287. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.html +27 -0
  288. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.ts +30 -0
  289. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.css +0 -0
  290. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.html +26 -0
  291. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.ts +89 -0
  292. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +2 -1
  293. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +74 -31
  294. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.css +0 -0
  295. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.html +76 -0
  296. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.ts +249 -0
  297. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.html +7 -17
  298. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +18 -51
  299. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +13 -5
  300. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.css +0 -0
  301. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +4 -0
  302. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.ts +128 -0
  303. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.css +0 -0
  304. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.html +6 -0
  305. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-open-data/form-field-open-data.component.ts +48 -0
  306. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.css +0 -0
  307. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +5 -0
  308. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +33 -0
  309. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +2 -2
  310. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +9 -3
  311. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +2 -2
  312. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +13 -7
  313. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.html +5 -3
  314. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.ts +11 -4
  315. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +15 -1
  316. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +156 -1
  317. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.html +9 -2
  318. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.ts +59 -70
  319. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +17 -15
  320. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +103 -68
  321. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +43 -43
  322. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +2 -1
  323. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +7 -2
  324. package/src/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.html +1 -1
  325. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +2 -1
  326. package/src/libs/feature/editor/src/lib/fields.config.ts +40 -3
  327. package/src/libs/feature/editor/src/lib/services/editor.service.ts +7 -0
  328. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.ts +3 -0
  329. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +5 -1
  330. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +5 -0
  331. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +1 -1
  332. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +10 -7
  333. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +1 -1
  334. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +5 -0
  335. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +1 -1
  336. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +6 -1
  337. package/src/libs/feature/map/src/lib/feature-map.module.ts +2 -15
  338. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +24 -1
  339. package/src/libs/feature/map/src/lib/map-context/map-context.fixtures.ts +26 -22
  340. package/src/libs/feature/map/src/lib/style/map-style.fixtures.ts +29 -27
  341. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -4
  342. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  343. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +4 -1
  344. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +66 -3
  345. package/src/libs/feature/search/src/lib/state/fixtures/search-state.fixtures.ts +2 -2
  346. package/src/libs/feature/search/src/lib/state/search.facade.ts +6 -0
  347. package/src/libs/ui/dataviz/src/lib/chart/chart.fixtures.ts +2 -2
  348. package/src/libs/ui/dataviz/src/lib/table/table.fixtures.ts +2 -2
  349. package/src/libs/ui/elements/src/index.ts +1 -0
  350. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.css +0 -0
  351. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.html +12 -0
  352. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.ts +37 -0
  353. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +4 -1
  354. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -1
  355. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +12 -8
  356. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +14 -20
  357. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -10
  358. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.html +1 -1
  359. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +2 -2
  360. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.html +3 -10
  361. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.ts +7 -7
  362. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +8 -2
  363. package/src/libs/ui/inputs/src/index.ts +1 -0
  364. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +15 -3
  365. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +40 -26
  366. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.css +0 -0
  367. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.html +85 -0
  368. package/src/libs/ui/inputs/src/lib/file-input/file-input.component.ts +91 -0
  369. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +49 -49
  370. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +15 -13
  371. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  372. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +2 -27
  373. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +4 -3
  374. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +4 -16
  375. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +0 -3
  376. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.css +9 -0
  377. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.html +37 -0
  378. package/src/libs/ui/inputs/src/lib/url-input/url-input.component.ts +33 -0
  379. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
  380. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
  381. package/src/libs/ui/map/src/lib/ui-map.module.ts +1 -1
  382. package/src/libs/ui/search/src/lib/facets/fixtures/aggregations-model-response.ts +7 -6
  383. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  384. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +26 -0
  385. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +74 -0
  386. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +24 -3
  387. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +27 -16
  388. package/src/libs/ui/widgets/src/index.ts +1 -0
  389. package/src/libs/ui/widgets/src/lib/popover/popover.component.css +0 -0
  390. package/src/libs/ui/widgets/src/lib/popover/popover.component.html +3 -0
  391. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +85 -0
  392. package/src/libs/util/app-config/src/lib/fixtures.ts +9 -9
  393. package/tailwind.base.css +18 -5
  394. package/translations/de.json +64 -19
  395. package/translations/en.json +57 -12
  396. package/translations/es.json +54 -9
  397. package/translations/fr.json +68 -23
  398. package/translations/it.json +57 -12
  399. package/translations/nl.json +54 -9
  400. package/translations/pt.json +54 -9
  401. package/translations/sk.json +55 -10
  402. package/src/libs/common/fixtures/src/lib/ol-feature.fixture.ts +0 -7
  403. package/src/libs/common/fixtures/src/lib/utils/freeze.ts +0 -10
  404. package/src/libs/common/fixtures/src/lib/utils/index.ts +0 -1
@@ -13,6 +13,8 @@ import {
13
13
  UpdateFrequency,
14
14
  UpdateFrequencyCustom,
15
15
  } from '../../../../../../libs/common/domain/src/lib/model/record'
16
+ import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
17
+ import { Geometry } from 'geojson'
16
18
  import { matchMimeType, matchProtocol } from '../common/distribution.mapper'
17
19
  import {
18
20
  ChainableFunction,
@@ -26,21 +28,22 @@ import {
26
28
  pipe,
27
29
  } from '../function-utils'
28
30
  import {
29
- XmlElement,
30
31
  findChildElement,
31
32
  findChildrenElement,
32
33
  findNestedElement,
33
34
  findNestedElements,
34
35
  findParent,
36
+ firstChildElement,
35
37
  readAttribute,
36
38
  readText,
39
+ XmlElement,
37
40
  } from '../xml-utils'
41
+ import { readGeometry } from './utils/geometry'
38
42
  import { fullNameToParts } from './utils/individual-name'
39
43
  import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper'
40
44
  import { getRoleFromRoleCode } from './utils/role.mapper'
41
45
  import { getStatusFromStatusCode } from './utils/status.mapper'
42
46
  import { getUpdateFrequencyFromFrequencyCode } from './utils/update-frequency.mapper'
43
- import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
44
47
 
45
48
  export function extractCharacterString(): ChainableFunction<
46
49
  XmlElement,
@@ -66,6 +69,14 @@ export function extractDateTime(): ChainableFunction<XmlElement, Date> {
66
69
  )
67
70
  }
68
71
 
72
+ export function extractDecimal(): ChainableFunction<XmlElement, number> {
73
+ return pipe(
74
+ findChildElement('gco:Decimal', false),
75
+ readText(),
76
+ map((numberStr) => (numberStr ? Number(numberStr) : null))
77
+ )
78
+ }
79
+
69
80
  export function extractUrl(): ChainableFunction<XmlElement, URL> {
70
81
  const getUrl = pipe(findChildElement('gmd:URL', false), readText())
71
82
  const getCharacterString = pipe(
@@ -895,3 +906,62 @@ export function readTemporalExtents(rootEl: XmlElement) {
895
906
  })
896
907
  )(rootEl)
897
908
  }
909
+
910
+ export function readSpatialExtents(rootEl: XmlElement) {
911
+ const extractGeometry = (rootEl: XmlElement): Geometry => {
912
+ if (!rootEl) return null
913
+ return pipe(
914
+ findChildElement('gmd:polygon', false),
915
+ firstChildElement,
916
+ map((el) => readGeometry(el))
917
+ )(rootEl)
918
+ }
919
+
920
+ const extractBBox = (
921
+ rootEl: XmlElement
922
+ ): [number, number, number, number] => {
923
+ if (!rootEl) return null
924
+ return pipe(
925
+ combine(
926
+ pipe(findChildElement('gmd:westBoundLongitude'), extractDecimal()),
927
+ pipe(findChildElement('gmd:southBoundLatitude'), extractDecimal()),
928
+ pipe(findChildElement('gmd:eastBoundLongitude'), extractDecimal()),
929
+ pipe(findChildElement('gmd:northBoundLatitude'), extractDecimal())
930
+ )
931
+ )(rootEl)
932
+ }
933
+
934
+ const extractDescription = (rootEl: XmlElement): string => {
935
+ if (!rootEl) return null
936
+ return pipe(
937
+ findNestedElement(
938
+ 'gmd:geographicIdentifier',
939
+ 'gmd:MD_Identifier',
940
+ 'gmd:code'
941
+ ),
942
+ extractCharacterString()
943
+ )(rootEl)
944
+ }
945
+
946
+ return pipe(
947
+ findIdentification(),
948
+ findNestedElements('gmd:extent', 'gmd:EX_Extent', 'gmd:geographicElement'),
949
+ mapArray(
950
+ combine(
951
+ pipe(findChildElement('gmd:EX_BoundingPolygon'), extractGeometry),
952
+ pipe(findChildElement('gmd:EX_GeographicBoundingBox'), extractBBox),
953
+ pipe(
954
+ findChildElement('gmd:EX_GeographicDescription'),
955
+ extractDescription
956
+ )
957
+ )
958
+ ),
959
+ mapArray(([geometry, bbox, description]) => {
960
+ return {
961
+ ...(geometry && { geometry }),
962
+ ...(bbox && { bbox }),
963
+ ...(description && { description }),
964
+ }
965
+ })
966
+ )(rootEl)
967
+ }
@@ -0,0 +1,39 @@
1
+ import { XmlElement } from '@rgrove/parse-xml'
2
+ import { Geometry } from 'geojson'
3
+ import GML32 from 'ol/format/GML32'
4
+ import GeoJSON from 'ol/format/GeoJSON'
5
+ import { parse } from 'ol/xml'
6
+ import {
7
+ createDocument,
8
+ getRootElement,
9
+ parseXmlString,
10
+ xmlToString,
11
+ } from '../../xml-utils'
12
+
13
+ export function readGeometry(el: XmlElement): Geometry {
14
+ const xmlDoc = createDocument(el)
15
+ xmlDoc.root.attributes['xmlns'] = 'http://www.opengis.net/gml/3.2'
16
+ const gmlString = xmlToString(xmlDoc)
17
+ const doc = parse(gmlString)
18
+ // we need an intermediate node to be able to parse the GML
19
+ const node = document.createElement('pre')
20
+ node.appendChild(doc.documentElement)
21
+ const gml32Format = new GML32()
22
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
23
+ // @ts-ignore
24
+ const geometry = gml32Format.readGeometryFromNode(node)
25
+ const geojsonFormat = new GeoJSON()
26
+ return geojsonFormat.writeGeometryObject(geometry)
27
+ }
28
+
29
+ export function writeGeometry(geometryObject: Geometry): XmlElement {
30
+ const geojsonFormat = new GeoJSON()
31
+ const geometry = geojsonFormat.readGeometry(geometryObject)
32
+ const gml32Format = new GML32()
33
+ const node = gml32Format.writeGeometryNode(geometry)
34
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
35
+ // @ts-ignore
36
+ const element = node.firstElementChild as HTMLElement
37
+ const gmlString = new XMLSerializer().serializeToString(element)
38
+ return getRootElement(parseXmlString(gmlString))
39
+ }
@@ -14,7 +14,9 @@ import {
14
14
  UpdateFrequencyCode,
15
15
  UpdateFrequencyCustom,
16
16
  } from '../../../../../../libs/common/domain/src/lib/model/record'
17
+ import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
17
18
  import format from 'date-fns/format'
19
+ import { Geometry } from 'geojson'
18
20
  import {
19
21
  ChainableFunction,
20
22
  fallback,
@@ -44,8 +46,8 @@ import {
44
46
  setTextContent,
45
47
  } from '../xml-utils'
46
48
  import { readKind } from './read-parts'
49
+ import { writeGeometry } from './utils/geometry'
47
50
  import { namePartsToFull } from './utils/individual-name'
48
- import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
49
51
 
50
52
  export function writeCharacterString(
51
53
  text: string
@@ -101,6 +103,14 @@ export function writeDate(
101
103
  )
102
104
  }
103
105
 
106
+ export function writeDecimal(
107
+ decimal: number
108
+ ): ChainableFunction<XmlElement, XmlElement> {
109
+ return tap(
110
+ pipe(findChildOrCreate('gco:Decimal'), setTextContent(decimal.toString()))
111
+ )
112
+ }
113
+
104
114
  export function getProgressCode(status: RecordStatus): string {
105
115
  switch (status) {
106
116
  case 'completed':
@@ -1184,3 +1194,62 @@ export function writeTemporalExtents(
1184
1194
  )
1185
1195
  )(rootEl)
1186
1196
  }
1197
+
1198
+ export function writeSpatialExtents(record: DatasetRecord, rootEl: XmlElement) {
1199
+ const appendBoundingPolygon = (geometry?: Geometry) => {
1200
+ if (!geometry) return null
1201
+ return pipe(
1202
+ createElement('gmd:EX_BoundingPolygon'),
1203
+ appendChildren(
1204
+ pipe(
1205
+ createElement('gmd:polygon'),
1206
+ appendChildren(() => writeGeometry(geometry))
1207
+ )
1208
+ )
1209
+ )
1210
+ }
1211
+
1212
+ const appendGeographicBoundingBox = (
1213
+ bbox?: [number, number, number, number]
1214
+ ) => {
1215
+ if (!bbox) return null
1216
+ return pipe(
1217
+ createElement('gmd:EX_GeographicBoundingBox'),
1218
+ appendChildren(
1219
+ pipe(createElement('gmd:westBoundLongitude'), writeDecimal(bbox[0])),
1220
+ pipe(createElement('gmd:eastBoundLongitude'), writeDecimal(bbox[2])),
1221
+ pipe(createElement('gmd:southBoundLatitude'), writeDecimal(bbox[1])),
1222
+ pipe(createElement('gmd:northBoundLatitude'), writeDecimal(bbox[3]))
1223
+ )
1224
+ )
1225
+ }
1226
+
1227
+ const appendGeographicDescription = (description?: string) => {
1228
+ if (!description) return null
1229
+ return pipe(
1230
+ createElement('gmd:EX_GeographicDescription'),
1231
+ createChild('gmd:geographicIdentifier'),
1232
+ createChild('gmd:MD_Identifier'),
1233
+ createChild('gmd:code'),
1234
+ writeCharacterString(description)
1235
+ )
1236
+ }
1237
+
1238
+ pipe(
1239
+ findOrCreateIdentification(),
1240
+ findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'),
1241
+ removeChildrenByName('gmd:geographicElement'),
1242
+ appendChildren(
1243
+ ...record.spatialExtents.map((extent) =>
1244
+ pipe(
1245
+ createElement('gmd:geographicElement'),
1246
+ appendChildren(
1247
+ appendBoundingPolygon(extent.geometry),
1248
+ appendGeographicBoundingBox(extent.bbox),
1249
+ appendGeographicDescription(extent.description)
1250
+ )
1251
+ )
1252
+ )
1253
+ )
1254
+ )(rootEl)
1255
+ }
@@ -6,6 +6,7 @@ import {
6
6
  XmlText,
7
7
  } from '@rgrove/parse-xml'
8
8
  import { ChainableFunction, fallback } from './function-utils'
9
+
9
10
  export { XmlDocument, XmlElement } from '@rgrove/parse-xml'
10
11
 
11
12
  export class XmlParseError extends Error {
@@ -115,6 +116,10 @@ export function allChildrenElement(element: XmlElement): Array<XmlElement> {
115
116
  ] as Array<XmlElement>
116
117
  }
117
118
 
119
+ export function firstChildElement(element: XmlElement): XmlElement {
120
+ return allChildrenElement(element)[0] ?? null
121
+ }
122
+
118
123
  /**
119
124
  * Will return all matching elements nested according to the given
120
125
  * names (similar to a path), starting form the input element;
@@ -175,11 +180,11 @@ export function findParent(
175
180
 
176
181
  export function readText(): ChainableFunction<XmlElement, string> {
177
182
  return (el) => {
178
- const textNode =
179
- el && Array.isArray(el.children)
180
- ? (el.children.find((node) => node.type === 'text') as XmlText)
181
- : null
182
- return textNode ? textNode.text : null
183
+ if (!el) return null
184
+ const textNode = Array.isArray(el.children)
185
+ ? (el.children.find((node) => node.type === 'text') as XmlText)
186
+ : null
187
+ return textNode ? textNode.text : ''
183
188
  }
184
189
  }
185
190
 
@@ -228,6 +233,7 @@ export function xmlToString(
228
233
  ${padding}<${el.name}${attrs}/>
229
234
  ${parentPadding}`
230
235
  }
236
+
231
237
  return `
232
238
  ${padding}<${el.name}${attrs}>${children}</${el.name}>
233
239
  ${parentPadding}`
@@ -307,11 +313,13 @@ function getTreeRoot(element: XmlElement): XmlElement {
307
313
 
308
314
  // stays on the parent element
309
315
  // if the given elements are part of a subtree, will add the root of subtree
316
+ // will filter out falsy elements
310
317
  export function appendChildren(
311
318
  ...childrenFns: Array<ChainableFunction<void, XmlElement>>
312
319
  ): ChainableFunction<XmlElement, XmlElement> {
313
320
  return (element) => {
314
321
  if (!element) return null
322
+ childrenFns = childrenFns.filter((fn) => fn)
315
323
  element.children.push(...childrenFns.map((fn) => fn()).map(getTreeRoot))
316
324
  element.children.forEach((el) => (el.parent = element))
317
325
  return element
@@ -9,6 +9,7 @@ import {
9
9
  from,
10
10
  Observable,
11
11
  of,
12
+ Subject,
12
13
  switchMap,
13
14
  throwError,
14
15
  } from 'rxjs'
@@ -32,8 +33,13 @@ import {
32
33
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
33
34
  import { HttpErrorResponse } from '@angular/common/http'
34
35
 
36
+ const TEMPORARY_ID_PREFIX = 'TEMP-ID-'
37
+
35
38
  @Injectable()
36
39
  export class Gn4Repository implements RecordsRepositoryInterface {
40
+ _draftsChanged = new Subject<void>()
41
+ draftsChanged$ = this._draftsChanged.asObservable()
42
+
37
43
  constructor(
38
44
  private gn4SearchApi: SearchApiService,
39
45
  private gn4SearchHelper: ElasticsearchService,
@@ -230,6 +236,26 @@ export class Gn4Repository implements RecordsRepositoryInterface {
230
236
  )
231
237
  }
232
238
 
239
+ openRecordForDuplication(
240
+ uniqueIdentifier: string
241
+ ): Observable<[CatalogRecord, string, false] | null> {
242
+ return this.loadRecordAsXml(uniqueIdentifier).pipe(
243
+ switchMap(async (recordAsXml) => {
244
+ const converter = findConverterForDocument(recordAsXml)
245
+ const record = await converter.readRecord(recordAsXml)
246
+ record.uniqueIdentifier = `${TEMPORARY_ID_PREFIX}${Date.now()}`
247
+ record.title = `${record.title} (Copy)`
248
+ const xml = await converter.writeRecord(record, recordAsXml)
249
+ window.localStorage.setItem(
250
+ this.getLocalStorageKeyForRecord(record.uniqueIdentifier),
251
+ xml
252
+ )
253
+ this._draftsChanged.next()
254
+ return [record, xml, false] as [CatalogRecord, string, false]
255
+ })
256
+ )
257
+ }
258
+
233
259
  private serializeRecordToXml(
234
260
  record: CatalogRecord,
235
261
  referenceRecordSource?: string
@@ -275,17 +301,26 @@ export class Gn4Repository implements RecordsRepositoryInterface {
275
301
  )
276
302
  }
277
303
 
304
+ deleteRecord(uniqueIdentifier: string): Observable<void> {
305
+ return this.gn4RecordsApi.deleteRecord(uniqueIdentifier)
306
+ }
307
+
308
+ generateTemporaryId(): string {
309
+ return `${TEMPORARY_ID_PREFIX}${Date.now()}`
310
+ }
311
+
278
312
  saveRecordAsDraft(
279
313
  record: CatalogRecord,
280
314
  referenceRecordSource?: string
281
315
  ): Observable<string> {
282
316
  return this.serializeRecordToXml(record, referenceRecordSource).pipe(
283
- tap((recordXml) =>
317
+ tap((recordXml) => {
284
318
  window.localStorage.setItem(
285
319
  this.getLocalStorageKeyForRecord(record.uniqueIdentifier),
286
320
  recordXml
287
321
  )
288
- )
322
+ this._draftsChanged.next()
323
+ })
289
324
  )
290
325
  }
291
326
 
@@ -293,6 +328,7 @@ export class Gn4Repository implements RecordsRepositoryInterface {
293
328
  window.localStorage.removeItem(
294
329
  this.getLocalStorageKeyForRecord(uniqueIdentifier)
295
330
  )
331
+ this._draftsChanged.next()
296
332
  }
297
333
 
298
334
  recordHasDraft(uniqueIdentifier: string): boolean {
@@ -303,6 +339,10 @@ export class Gn4Repository implements RecordsRepositoryInterface {
303
339
  )
304
340
  }
305
341
 
342
+ isRecordNotYetSaved(uniqueIdentifier: string): boolean {
343
+ return uniqueIdentifier.startsWith(TEMPORARY_ID_PREFIX)
344
+ }
345
+
306
346
  // generated by copilot
307
347
  getAllDrafts(): Observable<CatalogRecord[]> {
308
348
  const items = { ...window.localStorage }
@@ -79,6 +79,16 @@ export class Gn4PlatformMapper {
79
79
  (thes) => keyword.thesaurusKey === thes.key
80
80
  )
81
81
 
82
+ let bbox: [number, number, number, number]
83
+ if (keyword.coordWest) {
84
+ bbox = [
85
+ parseFloat(keyword.coordWest),
86
+ parseFloat(keyword.coordSouth),
87
+ parseFloat(keyword.coordEast),
88
+ parseFloat(keyword.coordNorth),
89
+ ]
90
+ }
91
+
82
92
  return {
83
93
  key,
84
94
  label,
@@ -90,7 +100,8 @@ export class Gn4PlatformMapper {
90
100
  url: new URL(matchedThesaurus?.url),
91
101
  type: matchedThesaurus?.dname as KeywordType,
92
102
  },
93
- }
103
+ ...(bbox && { bbox }),
104
+ } as Keyword
94
105
  })
95
106
  }
96
107
 
@@ -1,5 +1,5 @@
1
1
  import { Injectable } from '@angular/core'
2
- import { Observable, combineLatest, of, switchMap } from 'rxjs'
2
+ import { combineLatest, Observable, of, switchMap } from 'rxjs'
3
3
  import { catchError, map, shareReplay, tap } from 'rxjs/operators'
4
4
  import {
5
5
  MeApiService,
@@ -192,17 +192,16 @@ export class Gn4PlatformService implements PlatformServiceInterface {
192
192
  if (this.keywordsByThesauri[uri]) {
193
193
  return this.keywordsByThesauri[uri]
194
194
  }
195
- const keywords$: Observable<KeywordApiResponse[]> =
196
- this.registriesApiService.searchKeywords(
197
- null,
198
- this.langService.iso3,
199
- 1000,
200
- 0,
201
- null,
202
- null,
203
- null,
204
- `${uri}*`
205
- ) as Observable<KeywordApiResponse[]>
195
+ const keywords$ = this.registriesApiService.searchKeywords(
196
+ null,
197
+ this.langService.iso3,
198
+ 1000,
199
+ 0,
200
+ null,
201
+ null,
202
+ null,
203
+ `${uri}*`
204
+ ) as Observable<KeywordApiResponse[]>
206
205
 
207
206
  this.keywordsByThesauri[uri] = combineLatest([
208
207
  keywords$,
@@ -221,6 +220,38 @@ export class Gn4PlatformService implements PlatformServiceInterface {
221
220
  return this.keywordsByThesauri[uri]
222
221
  }
223
222
 
223
+ searchKeywordsInThesaurus(query: string, thesaurusId: string) {
224
+ return this.allThesaurus$.pipe(
225
+ switchMap((thesauri) => {
226
+ const strippedThesaurusId = thesaurusId.replace(
227
+ 'geonetwork.thesaurus.',
228
+ ''
229
+ )
230
+ if (!thesauri.find((thes) => thes.key === strippedThesaurusId))
231
+ return of([])
232
+ return this.registriesApiService
233
+ .searchKeywords(
234
+ query,
235
+ this.langService.iso3,
236
+ 100,
237
+ 0,
238
+ null,
239
+ [strippedThesaurusId],
240
+ null
241
+ )
242
+ .pipe(
243
+ map((keywords: KeywordApiResponse[]) =>
244
+ this.mapper.keywordsFromApi(
245
+ keywords,
246
+ thesauri,
247
+ this.langService.iso3
248
+ )
249
+ )
250
+ )
251
+ })
252
+ )
253
+ }
254
+
224
255
  getUserFeedbacks(uuid: string): Observable<UserFeedback[]> {
225
256
  return this.userfeedbackApiService.getUserComments(uuid).pipe(
226
257
  map((userFeedbacks) =>
@@ -1,4 +1,5 @@
1
1
  import { Organization } from './organization.model'
2
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
2
3
 
3
4
  export const RoleValues = [
4
5
  'unspecified',
@@ -24,6 +25,33 @@ export const RoleValues = [
24
25
  'user', // Party who uses the resource
25
26
  ]
26
27
 
28
+ export const RoleLabels = new Map<Role, string>([
29
+ ['unspecified', marker('domain.contact.role.unspecified')],
30
+ ['other', marker('domain.contact.role.other')],
31
+ ['author', marker('domain.contact.role.author')],
32
+ ['collaborator', marker('domain.contact.role.collaborator')],
33
+ ['contributor', marker('domain.contact.role.contributor')],
34
+ ['custodian', marker('domain.contact.role.custodian')],
35
+ ['distributor', marker('domain.contact.role.distributor')],
36
+ ['editor', marker('domain.contact.role.editor')],
37
+ ['funder', marker('domain.contact.role.funder')],
38
+ ['mediator', marker('domain.contact.role.mediator')],
39
+ ['originator', marker('domain.contact.role.originator')],
40
+ ['owner', marker('domain.contact.role.owner')],
41
+ ['point_of_contact', marker('domain.contact.role.point_of_contact')],
42
+ [
43
+ 'principal_investigator',
44
+ marker('domain.contact.role.principal_investigator'),
45
+ ],
46
+ ['processor', marker('domain.contact.role.processor')],
47
+ ['publisher', marker('domain.contact.role.publisher')],
48
+ ['resource_provider', marker('domain.contact.role.resource_provider')],
49
+ ['rights_holder', marker('domain.contact.role.rights_holder')],
50
+ ['sponsor', marker('domain.contact.role.sponsor')],
51
+ ['stakeholder', marker('domain.contact.role.stakeholder')],
52
+ ['user', marker('domain.contact.role.user')],
53
+ ])
54
+
27
55
  export type Role = typeof RoleValues[number]
28
56
 
29
57
  export interface Individual {
@@ -67,6 +67,7 @@ export interface Keyword {
67
67
  description?: string
68
68
  type: KeywordType
69
69
  thesaurus?: ThesaurusModel
70
+ bbox?: [number, number, number, number]
70
71
  }
71
72
  // languages should be expressed using two-letters ISO 639-1 codes
72
73
  export type LanguageCode = string
@@ -159,7 +160,8 @@ export interface GraphicOverview {
159
160
  }
160
161
 
161
162
  export interface DatasetSpatialExtent {
162
- geometry: Geometry
163
+ bbox?: [number, number, number, number]
164
+ geometry?: Geometry
163
165
  description?: string
164
166
  }
165
167
 
@@ -5,6 +5,6 @@ export interface UserModel {
5
5
  name: string
6
6
  surname: string
7
7
  email: string
8
- organisation: string
8
+ organisation?: string
9
9
  profileIcon?: string
10
10
  }
@@ -21,6 +21,10 @@ export abstract class PlatformServiceInterface {
21
21
  keywordTypes: KeywordType[]
22
22
  ): Observable<Keyword[]>
23
23
  abstract getKeywordsByUri(uri: string): Observable<Keyword[]>
24
+ abstract searchKeywordsInThesaurus(
25
+ query: string,
26
+ thesaurusId: string
27
+ ): Observable<Keyword[]>
24
28
  abstract getUserFeedbacks(recordUuid: string): Observable<UserFeedback[]>
25
29
  abstract postUserFeedbacks(recordUuid: UserFeedback): Observable<void>
26
30
  }
@@ -30,6 +30,18 @@ export abstract class RecordsRepositoryInterface {
30
30
  uniqueIdentifier: string
31
31
  ): Observable<[CatalogRecord, string, boolean] | null>
32
32
 
33
+ /**
34
+ * This emits once:
35
+ * - record object with a new unique identifier and suffixed title
36
+ * - serialized representation of the record as text
37
+ * - false, as the duplicated record is always a draft
38
+ * @param uniqueIdentifier
39
+ * @returns Observable<[CatalogRecord, string, false] | null>
40
+ */
41
+ abstract openRecordForDuplication(
42
+ uniqueIdentifier: string
43
+ ): Observable<[CatalogRecord, string, false] | null>
44
+
33
45
  /**
34
46
  * @param record
35
47
  * @param referenceRecordSource
@@ -40,6 +52,14 @@ export abstract class RecordsRepositoryInterface {
40
52
  referenceRecordSource?: string
41
53
  ): Observable<string>
42
54
 
55
+ /**
56
+ * @param uniqueIdentifier
57
+ * @returns Observable<void> Returns when record is deleted
58
+ */
59
+ abstract deleteRecord(uniqueIdentifier: string): Observable<void>
60
+
61
+ abstract generateTemporaryId(): string
62
+
43
63
  /**
44
64
  * @param record
45
65
  * @param referenceRecordSource
@@ -52,7 +72,9 @@ export abstract class RecordsRepositoryInterface {
52
72
 
53
73
  abstract clearRecordDraft(uniqueIdentifier: string): void
54
74
  abstract recordHasDraft(uniqueIdentifier: string): boolean
75
+ abstract isRecordNotYetSaved(uniqueIdentifier: string): boolean
55
76
 
56
77
  /** will return all pending drafts, both published and not published */
57
78
  abstract getAllDrafts(): Observable<CatalogRecord[]>
79
+ abstract draftsChanged$: Observable<void>
58
80
  }
@@ -4,7 +4,7 @@ export * from './lib/search'
4
4
 
5
5
  export * from './lib/geojson.fixtures'
6
6
  export * from './lib/link.fixtures'
7
- export * from './lib/ol-feature.fixture'
7
+ export * from './lib/ol-feature.fixtures'
8
8
  export * from './lib/organisations.fixture'
9
9
  export * from './lib/record-link.fixtures'
10
10
  export * from './lib/records.fixtures'