geonetwork-ui 2.6.0-dev.3e7617888 → 2.6.0-dev.4a61a87f9

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 (339) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +3 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +40 -4
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +8 -4
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +5 -2
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +4 -4
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
  8. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +2 -1
  9. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +3 -3
  10. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +66 -12
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  12. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  13. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  15. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +45 -9
  16. package/esm2022/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.mjs +2 -2
  17. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +32 -2
  18. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +25 -6
  19. package/esm2022/libs/feature/editor/src/index.mjs +2 -1
  20. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +273 -0
  21. package/esm2022/libs/feature/record/src/index.mjs +2 -3
  22. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +3 -3
  23. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +3 -3
  24. package/esm2022/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.mjs +6 -3
  25. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +33 -7
  26. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
  27. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
  28. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +13 -13
  29. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
  30. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
  31. package/esm2022/libs/feature/search/src/lib/constants.mjs +2 -1
  32. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +6 -2
  33. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  34. package/esm2022/libs/ui/dataviz/src/lib/chart/chart.component.mjs +5 -3
  35. package/esm2022/libs/ui/dataviz/src/lib/data-table/data-table.component.mjs +11 -6
  36. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  37. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  38. package/esm2022/libs/ui/elements/src/lib/download-item/download-item.component.mjs +3 -3
  39. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +18 -7
  40. package/esm2022/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.mjs +55 -0
  41. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  42. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +42 -83
  43. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  44. package/esm2022/libs/ui/elements/src/lib/kind-badge/kind-badge.component.mjs +22 -5
  45. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +3 -3
  46. package/esm2022/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.mjs +3 -3
  47. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  48. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  49. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  50. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +51 -0
  51. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +17 -7
  52. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +12 -4
  53. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
  54. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  55. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  56. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  57. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +3 -3
  58. package/esm2022/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.mjs +68 -0
  59. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +3 -3
  60. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +2 -8
  61. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  62. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +48 -11
  63. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  64. package/esm2022/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.mjs +34 -13
  65. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  66. package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +3 -3
  67. package/esm2022/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +6 -6
  68. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +107 -0
  69. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +4 -12
  70. package/esm2022/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.mjs +29 -4
  71. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +2 -1
  72. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  73. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +4 -8
  74. package/esm2022/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.mjs +3 -3
  75. package/esm2022/libs/ui/search/src/lib/results-list/results-layout.config.mjs +2 -2
  76. package/esm2022/libs/ui/search/src/lib/results-list/results-list.component.mjs +3 -3
  77. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +21 -12
  78. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +39 -18
  79. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  80. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  81. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  82. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +4 -1
  83. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -1
  84. package/esm2022/translations/de.json +44 -11
  85. package/esm2022/translations/en.json +44 -11
  86. package/esm2022/translations/es.json +43 -10
  87. package/esm2022/translations/fr.json +45 -12
  88. package/esm2022/translations/it.json +70 -37
  89. package/esm2022/translations/nl.json +43 -10
  90. package/esm2022/translations/pt.json +43 -10
  91. package/fesm2022/geonetwork-ui.mjs +2027 -813
  92. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  93. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  94. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  95. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  96. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  97. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  98. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  99. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  100. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  101. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  102. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  103. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
  104. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  105. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +13 -2
  106. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  107. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  108. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  109. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  110. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  111. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +4 -1
  112. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  113. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +6 -0
  114. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  115. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts +12 -8
  116. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  117. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +1 -0
  118. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  119. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +5 -2
  120. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
  121. package/libs/feature/editor/src/index.d.ts +1 -0
  122. package/libs/feature/editor/src/index.d.ts.map +1 -1
  123. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +52 -0
  124. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -0
  125. package/libs/feature/record/src/index.d.ts +1 -2
  126. package/libs/feature/record/src/index.d.ts.map +1 -1
  127. package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts +2 -1
  128. package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts.map +1 -1
  129. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  130. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
  131. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  132. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
  133. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  134. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +28 -21
  135. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  136. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
  137. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  138. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
  139. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  140. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  141. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +1 -1
  142. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  143. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  144. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  145. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +2 -1
  146. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts.map +1 -1
  147. package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts +6 -1
  148. package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts.map +1 -1
  149. package/libs/ui/elements/src/index.d.ts +2 -0
  150. package/libs/ui/elements/src/index.d.ts.map +1 -1
  151. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts +1 -1
  152. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts.map +1 -1
  153. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +7 -1
  154. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts.map +1 -1
  155. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts +15 -0
  156. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts.map +1 -0
  157. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +6 -13
  158. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  159. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  160. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  161. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts +3 -1
  162. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts.map +1 -1
  163. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +1 -1
  164. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  165. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +16 -0
  166. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -0
  167. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +8 -1
  168. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
  169. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +1 -0
  170. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -1
  171. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  172. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  173. package/libs/ui/inputs/src/index.d.ts +1 -0
  174. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  175. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  176. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  177. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts +17 -0
  178. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts.map +1 -0
  179. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  180. package/libs/ui/layout/src/index.d.ts +1 -0
  181. package/libs/ui/layout/src/index.d.ts.map +1 -1
  182. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +9 -2
  183. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -1
  184. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts +15 -8
  185. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts.map +1 -1
  186. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  187. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  188. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +27 -0
  189. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -0
  190. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  191. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts +6 -2
  192. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts.map +1 -1
  193. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -1
  194. package/libs/ui/search/src/index.d.ts +1 -0
  195. package/libs/ui/search/src/index.d.ts.map +1 -1
  196. package/libs/ui/search/src/lib/results-list/results-list.component.d.ts.map +1 -1
  197. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +4 -3
  198. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  199. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  200. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  201. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  202. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  203. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  204. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  205. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  206. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  207. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  208. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  209. package/package.json +2 -2
  210. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
  211. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  212. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +62 -4
  213. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  214. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  215. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  216. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +8 -4
  217. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  218. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  219. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
  220. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +105 -12
  221. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  222. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  223. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -2
  224. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +6 -0
  225. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +10 -0
  226. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +14 -0
  227. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +50 -1
  228. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +12 -9
  229. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +54 -10
  230. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +37 -0
  231. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.html +1 -0
  232. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +27 -1
  233. package/src/libs/feature/editor/src/index.ts +1 -0
  234. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.css +0 -0
  235. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +120 -0
  236. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +325 -0
  237. package/src/libs/feature/record/src/index.ts +1 -2
  238. package/src/libs/feature/record/src/lib/data-view/data-view.component.html +16 -10
  239. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +1 -1
  240. package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.html +2 -2
  241. package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +1 -0
  242. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +25 -16
  243. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +35 -4
  244. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
  245. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
  246. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +22 -15
  247. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
  248. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
  249. package/src/libs/feature/search/src/lib/constants.ts +1 -0
  250. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +2 -0
  251. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  252. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  253. package/src/libs/ui/dataviz/src/lib/chart/chart.component.ts +2 -1
  254. package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.html +6 -3
  255. package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.ts +5 -4
  256. package/src/libs/ui/elements/src/index.ts +2 -0
  257. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +4 -4
  258. package/src/libs/ui/elements/src/lib/download-item/download-item.component.html +8 -5
  259. package/src/libs/ui/elements/src/lib/download-item/download-item.component.ts +2 -2
  260. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +38 -7
  261. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +29 -2
  262. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.css +4 -0
  263. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.html +13 -0
  264. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.ts +54 -0
  265. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +1 -1
  266. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +68 -141
  267. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +38 -97
  268. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  269. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  270. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.html +7 -5
  271. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.ts +21 -2
  272. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +5 -2
  273. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +3 -7
  274. package/src/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.html +3 -5
  275. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +12 -9
  276. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +1 -1
  277. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +11 -3
  278. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +2 -3
  279. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +48 -0
  280. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +52 -0
  281. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +8 -29
  282. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +14 -1
  283. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +16 -2
  284. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +9 -1
  285. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -1
  286. package/src/libs/ui/inputs/src/index.ts +1 -0
  287. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  288. package/src/libs/ui/inputs/src/lib/button/button.component.ts +2 -2
  289. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -1
  290. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.css +0 -0
  291. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.html +43 -0
  292. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.ts +77 -0
  293. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +3 -4
  294. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +0 -3
  295. package/src/libs/ui/layout/src/index.ts +1 -0
  296. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +22 -0
  297. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +2 -2
  298. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +43 -5
  299. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +0 -1
  300. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -1
  301. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.html +24 -8
  302. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.ts +36 -10
  303. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -2
  304. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  305. package/src/libs/ui/layout/src/lib/max-lines/max-lines.component.html +1 -1
  306. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.html +17 -5
  307. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.ts +3 -3
  308. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +44 -0
  309. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +130 -0
  310. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -5
  311. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.html +3 -3
  312. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.ts +27 -3
  313. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.ts +1 -0
  314. package/src/libs/ui/search/src/index.ts +1 -0
  315. package/src/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.html +9 -81
  316. package/src/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.html +1 -0
  317. package/src/libs/ui/search/src/lib/results-list/results-layout.config.ts +2 -2
  318. package/src/libs/ui/search/src/lib/results-list/results-list.component.html +1 -0
  319. package/src/libs/ui/search/src/lib/results-list/results-list.component.ts +0 -1
  320. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +16 -6
  321. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +15 -11
  322. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  323. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +31 -27
  324. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +33 -15
  325. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  326. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  327. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  328. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +3 -0
  329. package/src/libs/util/shared/src/lib/links/link-utils.ts +3 -0
  330. package/tailwind.base.config.js +3 -0
  331. package/tailwind.base.css +2 -14
  332. package/translations/de.json +44 -11
  333. package/translations/en.json +44 -11
  334. package/translations/es.json +43 -10
  335. package/translations/fr.json +45 -12
  336. package/translations/it.json +70 -37
  337. package/translations/nl.json +43 -10
  338. package/translations/pt.json +43 -10
  339. package/translations/sk.json +43 -10
@@ -617,7 +617,7 @@ Die Quelle ist zu bezeichnen: „Quelle: Stadt Zürich“.`,
617
617
  status: 'completed',
618
618
  updateFrequency: 'asNeeded',
619
619
  defaultLanguage: 'de',
620
- otherLanguages: ['fr', 'it', 'en', 'rm'],
620
+ otherLanguages: ['fr', 'it', 'en', 'rm', 'aar'],
621
621
  translations: {
622
622
  abstract: {
623
623
  en: 'The perimeters of the Alpine Convention in Switzerland. The Alpine Convention is an international treaty between the eight Alpine countries: Germany, France, Italy, Liechtenstein, Monaco, Austria, Switzerland and Slovenia, plus the European Union. The aim of the treaty is to protect the Alps by means of cross-sectoral, integrated and sustainable policies.',
@@ -152,12 +152,22 @@ export class Gn4FieldMapper {
152
152
  )
153
153
  const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang])
154
154
  const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null // set the first language as main one as fallback
155
+
156
+ return {
157
+ ...output,
158
+ defaultLanguage,
159
+ }
160
+ },
161
+ otherLanguage: (output, source) => {
162
+ const langList = getAsArray(selectField<string>(source, 'otherLanguage'))
163
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang])
164
+ const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null
155
165
  const otherLanguages = languages.filter(
156
166
  (lang) => lang !== defaultLanguage
157
167
  )
168
+
158
169
  return {
159
170
  ...output,
160
- defaultLanguage,
161
171
  otherLanguages,
162
172
  }
163
173
  },
@@ -294,12 +304,52 @@ export class Gn4FieldMapper {
294
304
  ) ?? {},
295
305
  '_source'
296
306
  )
297
- const featureCatalogIdentifier = selectField(
307
+ const featureCatalogIdentifier: string = selectField(
298
308
  <SourceWithUnknownProps>fcatSource,
299
309
  'uuid'
300
310
  )
301
- return featureCatalogIdentifier
302
- ? this.addExtra({ featureCatalogIdentifier }, output)
311
+ const sourceOfLinks = getAsArray(
312
+ selectField(
313
+ <SourceWithUnknownProps>selectField(source, 'related'),
314
+ 'hassources'
315
+ )
316
+ )
317
+ const sourceOfIdentifiers: string[] = sourceOfLinks
318
+ .filter((link) => link['origin'] === 'catalog')
319
+ .map((link) => {
320
+ return selectField(
321
+ selectField(<SourceWithUnknownProps>link, '_source'),
322
+ 'uuid'
323
+ )
324
+ })
325
+ const extraValues: Record<string, string | string[]> = {}
326
+ if (featureCatalogIdentifier) {
327
+ extraValues.featureCatalogIdentifier = featureCatalogIdentifier
328
+ }
329
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
330
+ extraValues.sourceOfIdentifiers = sourceOfIdentifiers
331
+ }
332
+ return Object.keys(extraValues).length > 0
333
+ ? this.addExtra(extraValues, output)
334
+ : output
335
+ },
336
+ recordLink: (output, source) => {
337
+ const recordLinks = getAsArray(
338
+ selectField<SourceWithUnknownProps[]>(source, 'recordLink')
339
+ )
340
+ const sourcesIdentifiers: string[] = recordLinks
341
+ .filter(
342
+ (link) => link['origin'] === 'catalog' && link['type'] === 'sources'
343
+ )
344
+ .map((link) => selectField(<SourceWithUnknownProps>link, 'to'))
345
+
346
+ return sourcesIdentifiers && sourcesIdentifiers.length > 0
347
+ ? this.addExtra(
348
+ {
349
+ sourcesIdentifiers,
350
+ },
351
+ output
352
+ )
303
353
  : output
304
354
  },
305
355
  isPublishedToAll: (output, source) =>
@@ -309,6 +359,13 @@ export class Gn4FieldMapper {
309
359
  },
310
360
  output
311
361
  ),
362
+ isHarvested: (output, source) =>
363
+ this.addExtra(
364
+ {
365
+ isHarvested: selectField(source, 'isHarvested') !== 'false',
366
+ },
367
+ output
368
+ ),
312
369
  edit: (output, source) =>
313
370
  this.addExtra(
314
371
  {
@@ -430,6 +487,7 @@ export class Gn4FieldMapper {
430
487
  /^OGC:WMS/.test(protocol) ||
431
488
  /^OGC:WFS/.test(protocol) ||
432
489
  /^OGC:WMTS/.test(protocol) ||
490
+ /TMS/i.test(protocol) ||
433
491
  /ogc\W*api\W*features/i.test(protocol) ||
434
492
  (/^WWW:DOWNLOAD-/.test(protocol) && /data.geopf.fr/.test(url)) // TO DO : change with the good protocol when decided
435
493
  ) {
@@ -164,7 +164,6 @@ export type MetadataObject = Partial<{
164
164
  resourceDate: ResourceDate[]
165
165
  resourceEdition: string
166
166
  resourceIdentifier: ResourceIdentifier[]
167
- resourceLanguage: string[]
168
167
  resourceTemporalDateRange: ResourceTemporalDateRange[]
169
168
  resourceTemporalExtentDateRange: ResourceTemporalDateRange[]
170
169
  resourceTitleObject: MultilingualField
@@ -363,11 +363,18 @@ export function readOnlineResources(rootEl: XmlElement): OnlineResource[] {
363
363
  )(rootEl)
364
364
  }
365
365
 
366
- function readLocaleElement(): ChainableFunction<XmlElement, LanguageCode> {
366
+ export function readLocaleElement(): ChainableFunction<
367
+ XmlElement,
368
+ LanguageCode
369
+ > {
367
370
  return pipe(
368
371
  findChildElement('lan:LanguageCode'),
369
372
  readAttribute('codeListValue'),
370
- map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null))
373
+ map((lang) => {
374
+ const normalized = lang?.toLowerCase()
375
+ const iso2Lang = LANG_3_TO_2_MAPPER[normalized]
376
+ return iso2Lang ?? lang
377
+ })
371
378
  )
372
379
  }
373
380
 
@@ -381,6 +388,9 @@ export function readDefaultLanguage(rootEl: XmlElement): LanguageCode {
381
388
  export function readOtherLanguages(rootEl: XmlElement): LanguageCode[] {
382
389
  return pipe(
383
390
  findChildrenElement('mdb:otherLocale', false),
384
- mapArray(readLocaleElement())
391
+ mapArray(readLocaleElement()),
392
+ map((languages) =>
393
+ languages.filter((lang): lang is LanguageCode => lang !== null)
394
+ )
385
395
  )(rootEl)
386
396
  }
@@ -529,7 +529,11 @@ export function writeOnlineResources(
529
529
  }
530
530
 
531
531
  function writeLocaleElement(language: LanguageCode) {
532
- const lang3 = LANG_2_TO_3_MAPPER[language.toLowerCase()]
532
+ const normalizedLang = language.toLowerCase()
533
+ const lang3 =
534
+ normalizedLang.length === 2
535
+ ? LANG_2_TO_3_MAPPER[normalizedLang]
536
+ : normalizedLang
533
537
  return pipe(
534
538
  findChildOrCreate('lan:PT_Locale'),
535
539
  writeAttribute('id', language.toUpperCase()),
@@ -65,7 +65,8 @@ export function extractCharacterString(): ChainableFunction<
65
65
  return pipe(
66
66
  fallback(
67
67
  findChildElement('gco:CharacterString', false),
68
- findChildElement('gmx:Anchor', false)
68
+ findChildElement('gmx:Anchor', false),
69
+ findChildElement('gmx:MimeFileType', false)
69
70
  ),
70
71
  readText()
71
72
  )
@@ -1161,11 +1162,14 @@ export function readOtherLanguages(rootEl: XmlElement): LanguageCode[] {
1161
1162
  findChildrenElement('gmd:locale', false),
1162
1163
  mapArray(
1163
1164
  pipe(
1164
- findChildElement('gmd:LanguageCode'),
1165
+ findChildElement('lan:LanguageCode'),
1165
1166
  readAttribute('codeListValue'),
1166
- map((lang) => LANG_3_TO_2_MAPPER[lang.toLowerCase()])
1167
+ map((lang) => LANG_3_TO_2_MAPPER[lang.toLowerCase()] ?? lang)
1167
1168
  )
1168
1169
  ),
1170
+ map((languages) =>
1171
+ languages.filter((lang): lang is LanguageCode => lang !== null)
1172
+ ),
1169
1173
  map((languages) => (languages.length ? languages : [defaultLanguage]))
1170
1174
  )(rootEl)
1171
1175
  }
@@ -1173,7 +1177,7 @@ export function readOtherLanguages(rootEl: XmlElement): LanguageCode[] {
1173
1177
  export function readDefaultLanguage(rootEl: XmlElement): LanguageCode {
1174
1178
  return pipe(
1175
1179
  findChildElement('gmd:language', false),
1176
- findChildElement('gmd:LanguageCode'),
1180
+ findChildElement('lan:LanguageCode'),
1177
1181
  readAttribute('codeListValue'),
1178
1182
  map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null))
1179
1183
  )(rootEl)
@@ -1471,7 +1471,10 @@ export function writeLanguages(record: DatasetRecord, rootEl: XmlElement) {
1471
1471
  writeAttribute('id', lang.toUpperCase()),
1472
1472
  createNestedChild('gmd:languageCode', 'gmd:LanguageCode'),
1473
1473
  writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'),
1474
- writeAttribute('codeListValue', LANG_2_TO_3_MAPPER[lang])
1474
+ writeAttribute(
1475
+ 'codeListValue',
1476
+ lang.length === 2 ? LANG_2_TO_3_MAPPER[lang] : lang
1477
+ )
1475
1478
  )
1476
1479
 
1477
1480
  // add new languages (only if other than default one)
@@ -8,6 +8,7 @@ export const ES_SOURCE_SUMMARY = [
8
8
  'overview',
9
9
  'logo',
10
10
  'codelist_status_text',
11
+ 'link',
11
12
  'linkProtocol',
12
13
  'contactForResource.organisation',
13
14
  'contact.organisation',
@@ -124,11 +124,11 @@ export class ElasticsearchService {
124
124
  this.runtimeFields[fieldName] = expression
125
125
  }
126
126
 
127
- getMetadataByIdPayload(uuid: string): EsSearchParams {
127
+ getMetadataByIdsPayload(uuids: string[]): EsSearchParams {
128
128
  return {
129
129
  query: {
130
130
  ids: {
131
- values: [uuid],
131
+ values: uuids,
132
132
  },
133
133
  },
134
134
  }
@@ -14,8 +14,8 @@ import {
14
14
  import { PublicationVersionError } from '../../../../../../libs/common/domain/src/lib/model/error'
15
15
  import {
16
16
  CatalogRecord,
17
- DatasetFeatureType,
18
17
  DatasetFeatureCatalog,
18
+ DatasetFeatureType,
19
19
  } from '../../../../../../libs/common/domain/src/lib/model/record'
20
20
  import {
21
21
  Aggregations,
@@ -29,10 +29,11 @@ import {
29
29
  import { PlatformServiceInterface } from '../../../../../../libs/common/domain/src/lib/platform.service.interface'
30
30
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
31
31
  import {
32
+ LanguagesApiService,
32
33
  RecordsApiService,
33
34
  SearchApiService,
34
- FeatureResponseApiModel,
35
35
  } from '../../../../../../libs/data-access/gn4/src'
36
+ import { LANG_3_TO_2_MAPPER } from '../../../../../../libs/util/i18n/src'
36
37
  import {
37
38
  combineLatest,
38
39
  exhaustMap,
@@ -47,6 +48,7 @@ import {
47
48
  import { catchError, map, tap } from 'rxjs/operators'
48
49
  import { lt } from 'semver'
49
50
  import { ElasticsearchService } from './elasticsearch'
51
+ import { Gn4SettingsService } from './settings/gn4-settings.service'
50
52
 
51
53
  const minPublicationApiVersion = '4.2.5'
52
54
 
@@ -65,7 +67,9 @@ export class Gn4Repository implements RecordsRepositoryInterface {
65
67
  private gn4SearchHelper: ElasticsearchService,
66
68
  private gn4Mapper: Gn4Converter,
67
69
  private gn4RecordsApi: RecordsApiService,
68
- private platformService: PlatformServiceInterface
70
+ private platformService: PlatformServiceInterface,
71
+ private gn4LanguagesApi: LanguagesApiService,
72
+ private settingsService: Gn4SettingsService
69
73
  ) {}
70
74
 
71
75
  search({
@@ -129,9 +133,9 @@ export class Gn4Repository implements RecordsRepositoryInterface {
129
133
  return this.gn4SearchApi
130
134
  .search(
131
135
  'bucket',
132
- ['fcats'],
136
+ ['fcats', 'hassources'],
133
137
  JSON.stringify(
134
- this.gn4SearchHelper.getMetadataByIdPayload(uniqueIdentifier)
138
+ this.gn4SearchHelper.getMetadataByIdsPayload([uniqueIdentifier])
135
139
  )
136
140
  )
137
141
  .pipe(
@@ -142,6 +146,27 @@ export class Gn4Repository implements RecordsRepositoryInterface {
142
146
  )
143
147
  }
144
148
 
149
+ getMultipleRecords(
150
+ uniqueIdentifiers: string[]
151
+ ): Observable<CatalogRecord[] | null> {
152
+ return this.gn4SearchApi
153
+ .search(
154
+ 'bucket',
155
+ undefined,
156
+ JSON.stringify(
157
+ this.gn4SearchHelper.getMetadataByIdsPayload(uniqueIdentifiers)
158
+ )
159
+ )
160
+ .pipe(
161
+ map((results: Gn4SearchResults) => results.hits.hits),
162
+ switchMap((records) =>
163
+ records && records.length > 0
164
+ ? this.gn4Mapper.readRecords(records)
165
+ : of(null)
166
+ )
167
+ )
168
+ }
169
+
145
170
  private mapEmbeddedFeatureCatalog(
146
171
  featureTypes: Array<DatasetFeatureType>
147
172
  ): DatasetFeatureCatalog {
@@ -152,7 +177,9 @@ export class Gn4Repository implements RecordsRepositoryInterface {
152
177
  attributes: Array.isArray(featureType.attributeTable)
153
178
  ? featureType.attributeTable.map((attr) => ({
154
179
  name: attr.name,
180
+ code: attr.code,
155
181
  title: attr.definition,
182
+ type: attr.type,
156
183
  }))
157
184
  : [],
158
185
  })),
@@ -164,7 +191,8 @@ export class Gn4Repository implements RecordsRepositoryInterface {
164
191
  ): Observable<DatasetFeatureCatalog | null> {
165
192
  if (
166
193
  record.extras?.['featureTypes'] &&
167
- Array.isArray(record.extras['featureTypes'])
194
+ Array.isArray(record.extras['featureTypes']) &&
195
+ record.extras['featureTypes'].length > 0
168
196
  ) {
169
197
  return of(this.mapEmbeddedFeatureCatalog(record.extras['featureTypes']))
170
198
  }
@@ -200,6 +228,24 @@ export class Gn4Repository implements RecordsRepositoryInterface {
200
228
  )
201
229
  }
202
230
 
231
+ getSources(record: CatalogRecord): Observable<CatalogRecord[]> {
232
+ const sourcesIdentifiers = record.extras?.['sourcesIdentifiers'] as string[]
233
+ if (sourcesIdentifiers && sourcesIdentifiers.length > 0) {
234
+ return this.getMultipleRecords(sourcesIdentifiers)
235
+ }
236
+ return of(null)
237
+ }
238
+
239
+ getSourceOf(record: CatalogRecord): Observable<CatalogRecord[]> {
240
+ const sourceOfIdentifiers = record.extras?.[
241
+ 'sourceOfIdentifiers'
242
+ ] as string[]
243
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
244
+ return this.getMultipleRecords(sourceOfIdentifiers)
245
+ }
246
+ return of(null)
247
+ }
248
+
203
249
  aggregate(params: AggregationsParams): Observable<Aggregations> {
204
250
  // if aggregations are empty, return an empty object right away
205
251
  if (Object.keys(params).length === 0) return of({})
@@ -252,14 +298,46 @@ export class Gn4Repository implements RecordsRepositoryInterface {
252
298
  : of(true)
253
299
  }
254
300
 
255
- canEditRecord(uniqueIdentifier: string): Observable<boolean> {
256
- return this.getRecord(uniqueIdentifier).pipe(
257
- map((record) => {
258
- return record.extras['edit'] as boolean
301
+ canDuplicate(record: CatalogRecord): boolean {
302
+ return record.kind === 'dataset'
303
+ }
304
+
305
+ canDelete(record: CatalogRecord): Observable<boolean> {
306
+ return this.settingsService.allowEditHarvested$.pipe(
307
+ map((allowEditHarvested) => {
308
+ return (
309
+ record.extras['edit'] &&
310
+ (!record.extras['isHarvested'] || allowEditHarvested)
311
+ )
259
312
  })
260
313
  )
261
314
  }
262
315
 
316
+ private canEdit(record: CatalogRecord, allowEditHarvested: boolean): boolean {
317
+ return (
318
+ record.kind === 'dataset' &&
319
+ record.extras['edit'] &&
320
+ (!record.extras['isHarvested'] || allowEditHarvested)
321
+ )
322
+ }
323
+
324
+ canEditRecord(uniqueIdentifier: string): Observable<boolean> {
325
+ return combineLatest([
326
+ this.getRecord(uniqueIdentifier),
327
+ this.settingsService.allowEditHarvested$,
328
+ ]).pipe(
329
+ map(([record, allowEditHarvested]) =>
330
+ record ? this.canEdit(record, allowEditHarvested) : false
331
+ )
332
+ )
333
+ }
334
+
335
+ canEditIndexedRecord(record: CatalogRecord): Observable<boolean> {
336
+ return this.settingsService.allowEditHarvested$.pipe(
337
+ map((allowEditHarvested) => this.canEdit(record, allowEditHarvested))
338
+ )
339
+ }
340
+
263
341
  openRecordForEdition(
264
342
  uniqueIdentifier: string
265
343
  ): Observable<[CatalogRecord, string, boolean] | null> {
@@ -362,9 +440,12 @@ export class Gn4Repository implements RecordsRepositoryInterface {
362
440
  const record = await converter.readRecord(fetchedRecordAsXml)
363
441
 
364
442
  record.title = `${record.title} (Copy)`
365
- await converter.writeRecord(record, fetchedRecordAsXml)
443
+ const recordAsXml = await converter.writeRecord(
444
+ record,
445
+ fetchedRecordAsXml
446
+ )
366
447
 
367
- return this.saveRecord(record, '', false)
448
+ return this.saveRecord(record, recordAsXml, false)
368
449
  }),
369
450
  exhaustMap((uuidObservable: Observable<string>) => uuidObservable),
370
451
  catchError((error: HttpErrorResponse) => {
@@ -465,6 +546,18 @@ export class Gn4Repository implements RecordsRepositoryInterface {
465
546
  )
466
547
  }
467
548
 
549
+ getApplicationLanguages(): Observable<string[]> {
550
+ return this.gn4LanguagesApi
551
+ .getApplicationLanguages()
552
+ .pipe(
553
+ map((languages) =>
554
+ languages
555
+ .map((lang) => LANG_3_TO_2_MAPPER[lang.id ?? ''])
556
+ .filter((code): code is string => !!code)
557
+ )
558
+ )
559
+ }
560
+
468
561
  private getRecordAsXml(uniqueIdentifier: string): Observable<string | null> {
469
562
  return this.gn4RecordsApi
470
563
  .getRecordAs(
@@ -82,6 +82,13 @@ export class Gn4PlatformService implements PlatformServiceInterface {
82
82
  shareReplay(1)
83
83
  )
84
84
 
85
+ private readonly allowEditHarvestedMd$ = this.settings$.pipe(
86
+ map((info) => {
87
+ return info['system/harvester/enableEditing'] as boolean
88
+ }),
89
+ shareReplay(1)
90
+ )
91
+
85
92
  /**
86
93
  * A map of already loaded thesauri (groups of keywords); the key is a URI
87
94
  * @private
@@ -123,6 +130,10 @@ export class Gn4PlatformService implements PlatformServiceInterface {
123
130
  return this.apiVersion$
124
131
  }
125
132
 
133
+ getAllowEditHarvestedMd(): Observable<boolean> {
134
+ return this.allowEditHarvestedMd$
135
+ }
136
+
126
137
  getMe(): Observable<UserModel> {
127
138
  return this.me$
128
139
  }
@@ -11,6 +11,9 @@ export class Gn4SettingsService {
11
11
  'system/users/identicon'
12
12
  )
13
13
 
14
+ public allowEditHarvested$: Observable<boolean> =
15
+ this.getSettingsSetValueByKey('system/harvester/enableEditing')
16
+
14
17
  constructor(private siteApiService: SiteApiService) {}
15
18
 
16
19
  private getSettingsSetValueByKey(key: string) {
@@ -152,6 +152,8 @@ export type ServiceProtocol =
152
152
  | 'esriRest'
153
153
  | 'ogcFeatures'
154
154
  | 'GPFDL'
155
+ | 'tms'
156
+ | 'maplibre-style'
155
157
  | 'other'
156
158
 
157
159
  export type OnlineResourceType = 'service' | 'download' | 'link' | 'endpoint'
@@ -235,7 +237,7 @@ export type DatasetFeatureCatalog = {
235
237
  featureTypes: Array<{
236
238
  name: string
237
239
  definition: string
238
- attributes: Array<{ name: string; title: string }>
240
+ attributes: Array<{ name: string; title: string; code: string }>
239
241
  }>
240
242
  }
241
243
 
@@ -272,7 +274,12 @@ export interface DatasetFeatureType {
272
274
  isAbstract: string
273
275
  typeName: string
274
276
  definition: string
275
- attributeTable: Array<{ name: string; definition: string }>
277
+ attributeTable: Array<{
278
+ name: string
279
+ definition: string
280
+ type: string
281
+ code: string
282
+ }>
276
283
  }
277
284
 
278
285
  export type ReuseType = 'application' | 'map' | 'other'
@@ -19,8 +19,13 @@ export abstract class RecordsRepositoryInterface {
19
19
  abstract getSimilarRecords(
20
20
  similarTo: CatalogRecord
21
21
  ): Observable<CatalogRecord[]>
22
+ abstract getSources(record: CatalogRecord): Observable<CatalogRecord[]>
23
+ abstract getSourceOf(record: CatalogRecord): Observable<CatalogRecord[]>
22
24
  abstract fuzzySearch(query: string): Observable<SearchResults>
25
+ abstract canDuplicate(record: CatalogRecord): boolean
26
+ abstract canDelete(record: CatalogRecord): Observable<boolean>
23
27
  abstract canEditRecord(uniqueIdentifier: string): Observable<boolean>
28
+ abstract canEditIndexedRecord(record: CatalogRecord): Observable<boolean>
24
29
  /**
25
30
  * This emits once:
26
31
  * - record object; if a draft exists, this will return it
@@ -95,4 +100,5 @@ export abstract class RecordsRepositoryInterface {
95
100
  localRecord: CatalogRecord
96
101
  ): Observable<{ user: string; date: Date }>
97
102
  abstract getRecordPublicationStatus(uuid: string): Observable<boolean>
103
+ abstract getApplicationLanguages(): Observable<string[]>
98
104
  }
@@ -144,4 +144,14 @@ export const elasticLinkFixture = (): Record<string, unknown> => ({
144
144
  name: 'ogcapi features layer',
145
145
  url: 'https://mel.integration.apps.gs-fr-prod.camptocamp.com/data/ogcapi/collections/comptages_velo/items?',
146
146
  },
147
+ maplayerTms: {
148
+ accessServiceProtocol: 'TMS',
149
+ name: 'mytmslayer',
150
+ url: 'https://my.tms.server/MapServer',
151
+ },
152
+ maplayerTms2: {
153
+ accessServiceProtocol: 'OSGeo:TMS',
154
+ name: 'myothertmslayer',
155
+ url: 'https://my.tms.server/MapServer',
156
+ },
147
157
  })
@@ -185,6 +185,20 @@ export const aSetOfLinksFixture = () => ({
185
185
  url: new URL('https://my.ogc.server/wms'),
186
186
  accessServiceProtocol: 'wms',
187
187
  }) as DatasetServiceDistribution,
188
+ geodataTms: () =>
189
+ ({
190
+ name: 'mytmslayer',
191
+ type: 'service',
192
+ url: new URL('https://my.ogc.server/tms'),
193
+ accessServiceProtocol: 'tms',
194
+ }) as DatasetServiceDistribution,
195
+ geodataAsMaplibreStyle: () =>
196
+ ({
197
+ name: 'mytmslayerAsMaplibreJson',
198
+ type: 'service',
199
+ url: new URL('https://my.ogc.server/tms/layer/style.json'),
200
+ accessServiceProtocol: 'maplibre-style',
201
+ }) as DatasetServiceDistribution,
188
202
  geodataWfs2: () =>
189
203
  ({
190
204
  name: 'myotherlayer',
@@ -3,6 +3,7 @@ import {
3
3
  DatasetRecord,
4
4
  DatasetSpatialExtent,
5
5
  Keyword,
6
+ ServiceRecord,
6
7
  } from '../../../../../libs/common/domain/src/lib/model/record'
7
8
 
8
9
  export const datasetRecordsFixture: () => CatalogRecord[] = () => [
@@ -231,7 +232,7 @@ As such, **it is not very interesting at all.**`,
231
232
  recordUpdated: new Date('2022-04-15T14:18:19'),
232
233
  resourceUpdated: new Date('2022-03-29'),
233
234
  title:
234
- "Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022",
235
+ "Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022 (Ce lot informe du droit à bâtir sur la commune d'Avrigny)",
235
236
  abstract: `Plan local d'urbanisme (PLU) dématérialisé - commune d'Avrigny - approbation du 29/03/2022.
236
237
 
237
238
  Ce lot informe du droit à bâtir sur la commune d'Avrigny.
@@ -811,6 +812,54 @@ export const importDatasetRecordAsXmlFixture = (): string => `
811
812
  </gmd:identificationInfo>
812
813
  </gmd:MD_Metadata>`
813
814
 
815
+ export const simpleServiceRecordFixture = (): ServiceRecord => ({
816
+ kind: 'service',
817
+ status: null,
818
+ lineage: null,
819
+ recordUpdated: new Date('2023-03-17T07:38:08.875Z'),
820
+ recordPublished: null,
821
+ ownerOrganization: null,
822
+ licenses: [],
823
+ legalConstraints: [],
824
+ securityConstraints: [],
825
+ otherConstraints: [],
826
+ contacts: [],
827
+ contactsForResource: [],
828
+ keywords: [],
829
+ topics: [],
830
+ spatialExtents: [],
831
+ temporalExtents: [],
832
+ overviews: [],
833
+ defaultLanguage: null,
834
+ otherLanguages: [],
835
+ title: 'Sites de gestion des déchets miniers - Service de visualisation WMS',
836
+ onlineResources: [
837
+ {
838
+ name: 'Service de visualisation WMS',
839
+ description:
840
+ 'Adresse de connexion au service de visualisation WMS de la série de couches de données "Sites de gestion des déchets miniers"',
841
+ type: 'service',
842
+ url: new URL(
843
+ 'https://geoservices.wallonie.be/arcgis/services/SOL_SOUS_SOL/DECHETS_MINIERS/MapServer/WMSServer?request=GetCapabilities&service=WMS'
844
+ ),
845
+ accessServiceProtocol: 'wms',
846
+ accessRestricted: false,
847
+ },
848
+ ],
849
+ uniqueIdentifier: '00b22798-ec8e-4500-89e8-90eeeda45919',
850
+ landingPage: new URL(
851
+ 'http://localhost:4200/geonetwork/srv/fre/catalog.search#/metadata/00b22798-ec8e-4500-89e8-90eeeda45919'
852
+ ),
853
+ extras: {
854
+ isPublishedToAll: true,
855
+ id: '723',
856
+ isHarvested: true,
857
+ ownerInfo: 'admin|admin|admin|Administrator',
858
+ edit: true,
859
+ },
860
+ recordCreated: new Date('2023-03-17T07:38:08.875Z'),
861
+ })
862
+
814
863
  export const NATIONAL_KEYWORD = {
815
864
  key: 'http://inspire.ec.europa.eu/metadata-codelist/SpatialScope/national',
816
865
  label: 'National',