geonetwork-ui 2.4.0-dev.6c8dcba0 → 2.4.0-dev.78565730

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 (379) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/index.mjs +2 -1
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.mjs +2 -0
  5. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +1 -1
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +1 -1
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +1 -1
  9. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +25 -5
  10. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.mjs +2 -1
  11. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +3 -1
  12. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +12 -4
  13. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +38 -14
  14. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/model/record/organization.model.mjs +1 -1
  16. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  17. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  19. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -6
  20. package/esm2022/libs/data-access/gn4/src/openapi/model/user.api.model.mjs +1 -1
  21. package/esm2022/libs/feature/catalog/src/index.mjs +2 -1
  22. package/esm2022/libs/feature/catalog/src/lib/feature-catalog.module.mjs +1 -1
  23. package/esm2022/libs/feature/catalog/src/lib/organisations/organisations.component.mjs +6 -6
  24. package/esm2022/libs/feature/catalog/src/lib/organization-url.token.mjs +4 -0
  25. package/esm2022/libs/feature/catalog/src/lib/records/records.service.mjs +4 -6
  26. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +4 -4
  27. package/esm2022/libs/feature/dataviz/src/lib/feature-dataviz.module.mjs +7 -4
  28. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +1 -1
  29. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +3 -1
  30. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +6 -4
  31. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +8 -2
  32. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
  33. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +7 -3
  34. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +16 -6
  35. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +59 -0
  36. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +64 -50
  37. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +17 -35
  38. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +2 -2
  39. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +11 -7
  40. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
  41. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +4 -3
  42. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +144 -54
  43. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +2 -0
  44. package/esm2022/libs/feature/editor/src/lib/models/index.mjs +2 -1
  45. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +15 -8
  46. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +42 -23
  47. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +13 -5
  48. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +49 -15
  49. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +7 -4
  50. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -3
  51. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +8 -12
  52. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +2 -1
  53. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  54. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +9 -2
  55. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +8 -1
  56. package/esm2022/libs/feature/search/src/index.mjs +2 -2
  57. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +7 -4
  58. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +3 -3
  59. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +55 -0
  60. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  61. package/esm2022/libs/feature/search/src/lib/state/selectors.mjs +4 -1
  62. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +7 -3
  63. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +5 -5
  64. package/esm2022/libs/ui/catalog/src/lib/ui-catalog.module.mjs +5 -2
  65. package/esm2022/libs/ui/dataviz/src/lib/figure/figure.component.mjs +5 -8
  66. package/esm2022/libs/ui/elements/src/index.mjs +1 -2
  67. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  68. package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +5 -3
  69. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +7 -7
  70. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +24 -5
  71. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +9 -11
  72. package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +3 -3
  73. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  74. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +59 -26
  75. package/esm2022/libs/ui/inputs/src/lib/badge/badge.component.mjs +28 -0
  76. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -10
  77. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  78. package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +71 -0
  79. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +1 -1
  80. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  81. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +29 -0
  82. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +128 -0
  83. package/esm2022/libs/ui/widgets/src/index.mjs +1 -2
  84. package/esm2022/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.mjs +5 -3
  85. package/esm2022/libs/ui/widgets/src/lib/ui-widgets.module.mjs +1 -6
  86. package/esm2022/translations/de.json +96 -34
  87. package/esm2022/translations/en.json +67 -5
  88. package/esm2022/translations/es.json +67 -5
  89. package/esm2022/translations/fr.json +68 -6
  90. package/esm2022/translations/it.json +67 -5
  91. package/esm2022/translations/nl.json +67 -5
  92. package/esm2022/translations/pt.json +67 -5
  93. package/fesm2022/geonetwork-ui.mjs +1615 -757
  94. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  95. package/libs/api/metadata-converter/src/index.d.ts +1 -0
  96. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  97. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  98. package/libs/api/metadata-converter/src/lib/gn4/types/index.d.ts +1 -0
  99. package/libs/api/metadata-converter/src/lib/gn4/types/index.d.ts.map +1 -1
  100. package/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.d.ts +31 -0
  101. package/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.d.ts.map +1 -0
  102. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +1 -0
  103. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  104. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +3 -2
  105. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  106. package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts +1 -1
  107. package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +1 -1
  108. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  109. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  110. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -0
  111. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  112. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.d.ts.map +1 -1
  113. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  114. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +3 -3
  115. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  116. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -5
  117. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  118. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +4 -7
  119. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  120. package/libs/common/domain/src/lib/model/record/organization.model.d.ts +1 -0
  121. package/libs/common/domain/src/lib/model/record/organization.model.d.ts.map +1 -1
  122. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +12 -5
  123. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  124. package/libs/common/domain/src/lib/platform.service.interface.d.ts +4 -3
  125. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  126. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +12 -1
  127. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  128. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  129. package/libs/data-access/gn4/src/openapi/model/user.api.model.d.ts +1 -1
  130. package/libs/feature/catalog/src/index.d.ts +1 -0
  131. package/libs/feature/catalog/src/index.d.ts.map +1 -1
  132. package/libs/feature/catalog/src/lib/feature-catalog.module.d.ts.map +1 -1
  133. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts.map +1 -1
  134. package/libs/feature/catalog/src/lib/organization-url.token.d.ts +3 -0
  135. package/libs/feature/catalog/src/lib/organization-url.token.d.ts.map +1 -0
  136. package/libs/feature/catalog/src/lib/records/records.service.d.ts.map +1 -1
  137. package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts +2 -1
  138. package/libs/feature/dataviz/src/lib/feature-dataviz.module.d.ts.map +1 -1
  139. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +6 -0
  140. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  141. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +1 -1
  142. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -1
  143. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +5 -4
  144. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  145. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +8 -0
  146. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
  147. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -3
  148. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  149. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +4 -8
  150. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  151. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts +25 -0
  152. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -0
  153. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +6 -6
  154. 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
  155. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +7 -11
  156. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  157. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +1 -1
  158. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  159. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +5 -7
  160. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  161. package/libs/feature/editor/src/lib/expressions.d.ts +1 -1
  162. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -1
  163. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  164. package/libs/feature/editor/src/lib/fields.config.d.ts +38 -2
  165. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  166. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +36 -0
  167. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -0
  168. package/libs/feature/editor/src/lib/models/index.d.ts +1 -0
  169. package/libs/feature/editor/src/lib/models/index.d.ts.map +1 -1
  170. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  171. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  172. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +4 -1
  173. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  174. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +4 -1
  175. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  176. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +4 -1
  177. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  178. package/libs/feature/record/src/lib/feature-record.module.d.ts +2 -1
  179. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  180. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  181. package/libs/feature/router/src/lib/default/constants.d.ts +1 -0
  182. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  183. package/libs/feature/router/src/lib/default/router.config.d.ts +1 -0
  184. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  185. package/libs/feature/router/src/lib/default/router.service.d.ts +1 -0
  186. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  187. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +1 -0
  188. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  189. package/libs/feature/search/src/index.d.ts +1 -1
  190. package/libs/feature/search/src/index.d.ts.map +1 -1
  191. package/libs/feature/search/src/lib/feature-search.module.d.ts +2 -1
  192. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  193. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  194. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +27 -0
  195. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -0
  196. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -0
  197. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  198. package/libs/feature/search/src/lib/state/selectors.d.ts +1 -0
  199. package/libs/feature/search/src/lib/state/selectors.d.ts.map +1 -1
  200. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  201. package/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.d.ts +2 -2
  202. package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts +2 -1
  203. package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts.map +1 -1
  204. package/libs/ui/dataviz/src/lib/figure/figure.component.d.ts +1 -2
  205. package/libs/ui/dataviz/src/lib/figure/figure.component.d.ts.map +1 -1
  206. package/libs/ui/elements/src/index.d.ts +0 -1
  207. package/libs/ui/elements/src/index.d.ts.map +1 -1
  208. package/libs/ui/elements/src/lib/error/error.component.d.ts +3 -1
  209. package/libs/ui/elements/src/lib/error/error.component.d.ts.map +1 -1
  210. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +5 -1
  211. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
  212. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +19 -19
  213. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  214. package/libs/ui/inputs/src/index.d.ts +1 -0
  215. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  216. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts +7 -4
  217. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts.map +1 -1
  218. package/libs/ui/inputs/src/lib/badge/badge.component.d.ts +11 -0
  219. package/libs/ui/inputs/src/lib/badge/badge.component.d.ts.map +1 -0
  220. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  221. package/libs/ui/layout/src/index.d.ts +1 -0
  222. package/libs/ui/layout/src/index.d.ts.map +1 -1
  223. package/libs/ui/{elements → layout}/src/lib/max-lines/max-lines.component.d.ts +2 -2
  224. package/libs/ui/layout/src/lib/max-lines/max-lines.component.d.ts.map +1 -0
  225. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  226. package/libs/ui/search/src/index.d.ts +1 -0
  227. package/libs/ui/search/src/index.d.ts.map +1 -1
  228. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +11 -0
  229. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  230. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +32 -0
  231. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  232. package/libs/ui/widgets/src/index.d.ts +0 -1
  233. package/libs/ui/widgets/src/index.d.ts.map +1 -1
  234. package/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.d.ts +1 -1
  235. package/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.d.ts.map +1 -1
  236. package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts +10 -11
  237. package/libs/ui/widgets/src/lib/ui-widgets.module.d.ts.map +1 -1
  238. package/package.json +1 -1
  239. package/src/libs/api/metadata-converter/src/index.ts +1 -0
  240. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +1 -0
  241. package/src/libs/api/metadata-converter/src/lib/gn4/types/index.ts +1 -0
  242. package/src/libs/api/metadata-converter/src/lib/gn4/types/keywords.model.ts +31 -0
  243. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  244. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  245. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.ts +1 -1
  246. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +2 -2
  247. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +41 -8
  248. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.ts +1 -0
  249. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +3 -1
  250. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +25 -4
  251. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +81 -21
  252. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +4 -9
  253. package/src/libs/common/domain/src/lib/model/record/organization.model.ts +1 -0
  254. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +13 -6
  255. package/src/libs/common/domain/src/lib/platform.service.interface.ts +7 -3
  256. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +16 -1
  257. package/src/libs/common/fixtures/src/index.ts +2 -0
  258. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +156 -0
  259. package/src/libs/common/fixtures/src/lib/editor/index.ts +1 -0
  260. package/src/libs/common/fixtures/src/lib/organisations.fixture.ts +28 -0
  261. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +8 -0
  262. package/src/libs/data-access/datafeeder/src/openapi/model/datasetMetadata.api.model.ts +4 -0
  263. package/src/libs/data-access/datafeeder/src/openapi/model/datasetUploadStatus.api.model.ts +2 -0
  264. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +1 -5
  265. package/src/libs/data-access/gn4/src/openapi/model/user.api.model.ts +1 -1
  266. package/src/libs/data-access/gn4/src/spec.yaml +0 -8
  267. package/src/libs/feature/catalog/src/index.ts +1 -0
  268. package/src/libs/feature/catalog/src/lib/feature-catalog.module.ts +0 -1
  269. package/src/libs/feature/catalog/src/lib/organisations/organisations.component.html +1 -1
  270. package/src/libs/feature/catalog/src/lib/organisations/organisations.component.ts +2 -2
  271. package/src/libs/feature/catalog/src/lib/organization-url.token.ts +6 -0
  272. package/src/libs/feature/catalog/src/lib/records/records.service.ts +6 -8
  273. package/src/libs/feature/dataviz/src/lib/feature-dataviz.module.ts +2 -1
  274. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +7 -0
  275. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +35 -29
  276. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +10 -1
  277. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +11 -0
  278. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +11 -5
  279. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +22 -8
  280. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.html +19 -0
  281. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +79 -0
  282. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +95 -86
  283. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +16 -31
  284. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +18 -45
  285. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +1 -2
  286. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +51 -11
  287. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +15 -8
  288. package/src/libs/feature/editor/src/lib/expressions.ts +1 -1
  289. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +2 -1
  290. package/src/libs/feature/editor/src/lib/fields.config.ts +176 -55
  291. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +53 -0
  292. package/src/libs/feature/editor/src/lib/models/index.ts +1 -0
  293. package/src/libs/feature/editor/src/lib/services/editor.service.ts +27 -9
  294. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +36 -19
  295. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +6 -2
  296. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +11 -0
  297. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +59 -12
  298. package/src/libs/feature/record/src/lib/feature-record.module.ts +3 -2
  299. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +42 -31
  300. package/src/libs/feature/router/src/lib/default/constants.ts +1 -0
  301. package/src/libs/feature/router/src/lib/default/router.config.ts +1 -0
  302. package/src/libs/feature/router/src/lib/default/router.service.ts +13 -1
  303. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +9 -1
  304. package/src/libs/feature/search/src/index.ts +1 -1
  305. package/src/libs/feature/search/src/lib/feature-search.module.ts +2 -1
  306. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +2 -2
  307. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +10 -0
  308. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +54 -0
  309. package/src/libs/feature/search/src/lib/state/search.facade.ts +5 -0
  310. package/src/libs/feature/search/src/lib/state/selectors.ts +7 -0
  311. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +16 -2
  312. package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.html +8 -6
  313. package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.ts +2 -2
  314. package/src/libs/ui/catalog/src/lib/ui-catalog.module.ts +2 -0
  315. package/src/libs/ui/dataviz/src/lib/figure/figure.component.html +11 -3
  316. package/src/libs/ui/dataviz/src/lib/figure/figure.component.ts +3 -7
  317. package/src/libs/ui/elements/src/index.ts +0 -1
  318. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +29 -29
  319. package/src/libs/ui/elements/src/lib/error/error.component.html +30 -6
  320. package/src/libs/ui/elements/src/lib/error/error.component.ts +2 -0
  321. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  322. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +22 -1
  323. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +4 -6
  324. package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -1
  325. package/src/libs/ui/inputs/src/index.ts +1 -0
  326. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.css +0 -1
  327. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +23 -19
  328. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +79 -27
  329. package/src/libs/ui/inputs/src/lib/badge/badge.component.html +18 -0
  330. package/src/libs/ui/inputs/src/lib/badge/badge.component.ts +27 -0
  331. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.css +31 -0
  332. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +15 -0
  333. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +38 -0
  334. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -3
  335. package/src/libs/ui/layout/src/index.ts +1 -0
  336. package/src/libs/ui/layout/src/lib/max-lines/max-lines.component.css +0 -0
  337. package/src/libs/ui/{elements → layout}/src/lib/max-lines/max-lines.component.html +1 -0
  338. package/src/libs/ui/{elements → layout}/src/lib/max-lines/max-lines.component.ts +9 -5
  339. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -1
  340. package/src/libs/ui/search/src/index.ts +1 -0
  341. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  342. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +17 -0
  343. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +22 -0
  344. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +0 -0
  345. package/src/libs/{feature → ui}/search/src/lib/results-table/results-table.component.html +17 -8
  346. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +152 -0
  347. package/src/libs/ui/widgets/src/index.ts +0 -1
  348. package/src/libs/ui/widgets/src/lib/popup-alert/popup-alert.component.ts +4 -0
  349. package/src/libs/ui/widgets/src/lib/ui-widgets.module.ts +0 -3
  350. package/translations/de.json +96 -34
  351. package/translations/en.json +67 -5
  352. package/translations/es.json +67 -5
  353. package/translations/fr.json +68 -6
  354. package/translations/it.json +67 -5
  355. package/translations/nl.json +67 -5
  356. package/translations/pt.json +67 -5
  357. package/translations/sk.json +68 -6
  358. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +0 -2
  359. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +0 -2
  360. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +0 -136
  361. package/esm2022/libs/ui/elements/src/lib/max-lines/max-lines.component.mjs +0 -69
  362. package/esm2022/libs/ui/widgets/src/lib/badge/badge.component.mjs +0 -18
  363. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts +0 -26
  364. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +0 -1
  365. package/libs/feature/editor/src/lib/models/fields.model.d.ts +0 -15
  366. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +0 -1
  367. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +0 -36
  368. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +0 -1
  369. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +0 -1
  370. package/libs/ui/widgets/src/lib/badge/badge.component.d.ts +0 -7
  371. package/libs/ui/widgets/src/lib/badge/badge.component.d.ts.map +0 -1
  372. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.ts +0 -43
  373. package/src/libs/feature/editor/src/lib/models/fields.model.ts +0 -29
  374. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +0 -172
  375. package/src/libs/ui/widgets/src/lib/badge/badge.component.html +0 -10
  376. package/src/libs/ui/widgets/src/lib/badge/badge.component.ts +0 -14
  377. /package/src/libs/feature/{search/src/lib/results-table/results-table.component.css → editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.css} +0 -0
  378. /package/src/libs/{ui/elements/src/lib/max-lines/max-lines.component.css → feature/search/src/lib/results-table/results-table-container.component.css} +0 -0
  379. /package/src/libs/ui/{widgets → inputs}/src/lib/badge/badge.component.css +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ui-widgets.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/widgets/src/lib/ui-widgets.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgBA,qBA4Ba,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAG"}
1
+ {"version":3,"file":"ui-widgets.module.d.ts","sourceRoot":"","sources":["../../../../../src/libs/ui/widgets/src/lib/ui-widgets.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAeA,qBA0Ba,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geonetwork-ui",
3
- "version": "2.4.0-dev.6c8dcba0",
3
+ "version": "2.4.0-dev.78565730",
4
4
  "engines": {
5
5
  "node": ">=14.17.0"
6
6
  },
@@ -1,3 +1,4 @@
1
+ export * from './lib/base.converter'
1
2
  export * from './lib/iso19139'
2
3
  export * from './lib/iso19115-3'
3
4
  export * from './lib/find-converter'
@@ -120,6 +120,7 @@ export const mapKeywords = (thesauri: Thesaurus[], language: string) => {
120
120
  keywords.push({
121
121
  label: selectTranslatedValue<string>(keyword, language),
122
122
  type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
123
+ ...(keyword.link && { key: keyword.link }),
123
124
  ...(thesaurus && { thesaurus }),
124
125
  })
125
126
  }
@@ -1,3 +1,4 @@
1
1
  export * from './elasticsearch.model'
2
2
  export * from './search.model'
3
3
  export * from './metadata.model'
4
+ export * from './keywords.model'
@@ -0,0 +1,31 @@
1
+ export interface KeywordApiResponse {
2
+ values?: {
3
+ eng: string
4
+ }
5
+ definitions?: {
6
+ eng: string
7
+ }
8
+ coordEast?: string
9
+ coordWest?: string
10
+ coordSouth?: string
11
+ coordNorth?: string
12
+ thesaurusKey?: string
13
+ definition?: string
14
+ value?: string
15
+ uri?: string
16
+ }
17
+
18
+ export interface ThesaurusApiResponse {
19
+ key?: string
20
+ dname?: string
21
+ description?: string[] | string
22
+ filename?: string
23
+ title?: string
24
+ multilingualTitles?: string[]
25
+ dublinCoreMultilinguals?: string[]
26
+ date?: string
27
+ url?: string
28
+ defaultNamespace?: string
29
+ type?: string
30
+ activated?: string
31
+ }
@@ -5,6 +5,7 @@ type MultilingualField = {
5
5
  [K in `lang${LangCode}`]: string
6
6
  } & {
7
7
  default: string
8
+ link?: string
8
9
  }
9
10
 
10
11
  type BooleanString = 'true' | 'false'
@@ -4,7 +4,6 @@ import {
4
4
  GraphicOverview,
5
5
  Individual,
6
6
  Keyword,
7
- KeywordThesaurus,
8
7
  Organization,
9
8
  RecordKind,
10
9
  RecordStatus,
@@ -41,6 +40,7 @@ import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper'
41
40
  import { getRoleFromRoleCode } from './utils/role.mapper'
42
41
  import { getStatusFromStatusCode } from './utils/status.mapper'
43
42
  import { getUpdateFrequencyFromFrequencyCode } from './utils/update-frequency.mapper'
43
+ import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
44
44
 
45
45
  export function extractCharacterString(): ChainableFunction<
46
46
  XmlElement,
@@ -609,7 +609,7 @@ export function readContactsForResource(rootEl: XmlElement): Individual[] {
609
609
  }
610
610
 
611
611
  // from gmd:thesaurusName
612
- export function readThesaurus(rootEl: XmlElement): KeywordThesaurus {
612
+ export function readThesaurus(rootEl: XmlElement): ThesaurusModel {
613
613
  if (!rootEl) return null
614
614
 
615
615
  const findIdentifier = findNestedElement(
@@ -1,4 +1,4 @@
1
- import { KeywordType } from '../../../../../../../libs/common/domain/src/lib/model/record'
1
+ import { KeywordType } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus'
2
2
 
3
3
  export function getKeywordTypeFromKeywordTypeCode(
4
4
  typeCode: string
@@ -6,7 +6,6 @@ import {
6
6
  DatasetServiceDistribution,
7
7
  Individual,
8
8
  Keyword,
9
- KeywordThesaurus,
10
9
  RecordStatus,
11
10
  Role,
12
11
  ServiceEndpoint,
@@ -46,6 +45,7 @@ import {
46
45
  } from '../xml-utils'
47
46
  import { readKind } from './read-parts'
48
47
  import { namePartsToFull } from './utils/individual-name'
48
+ import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
49
49
 
50
50
  export function writeCharacterString(
51
51
  text: string
@@ -367,7 +367,7 @@ export function removeKeywords() {
367
367
  }
368
368
 
369
369
  // returns a <gmd:thesaurusName> element
370
- export function createThesaurus(thesaurus: KeywordThesaurus) {
370
+ export function createThesaurus(thesaurus: ThesaurusModel) {
371
371
  return pipe(
372
372
  createElement('gmd:thesaurusName'),
373
373
  createChild('gmd:CI_Citation'),
@@ -24,6 +24,7 @@ import {
24
24
  } from '../../../../../../libs/common/domain/src/lib/model/search'
25
25
  import { catchError, map, tap } from 'rxjs/operators'
26
26
  import {
27
+ BaseConverter,
27
28
  findConverterForDocument,
28
29
  Gn4Converter,
29
30
  Gn4SearchResults,
@@ -230,6 +231,25 @@ export class Gn4Repository implements RecordsRepositoryInterface {
230
231
  )
231
232
  }
232
233
 
234
+ openRecordForDuplication(
235
+ uniqueIdentifier: string
236
+ ): Observable<[CatalogRecord, string, false] | null> {
237
+ return this.loadRecordAsXml(uniqueIdentifier).pipe(
238
+ switchMap(async (recordAsXml) => {
239
+ const converter = findConverterForDocument(recordAsXml)
240
+ const record = await converter.readRecord(recordAsXml)
241
+ record.uniqueIdentifier = `TEMP-ID-${Date.now()}`
242
+ record.title = `${record.title} (Copy)`
243
+ const xml = await converter.writeRecord(record, recordAsXml)
244
+ window.localStorage.setItem(
245
+ this.getLocalStorageKeyForRecord(record.uniqueIdentifier),
246
+ xml
247
+ )
248
+ return [record, xml, false] as [CatalogRecord, string, false]
249
+ })
250
+ )
251
+ }
252
+
233
253
  private serializeRecordToXml(
234
254
  record: CatalogRecord,
235
255
  referenceRecordSource?: string
@@ -265,14 +285,13 @@ export class Gn4Repository implements RecordsRepositoryInterface {
265
285
  undefined,
266
286
  recordXml
267
287
  )
268
- .pipe(map(() => recordXml))
269
- ),
270
- tap(() => {
271
- // if saving was successful, the associated draft can be discarded
272
- window.localStorage.removeItem(
273
- this.getLocalStorageKeyForRecord(record.uniqueIdentifier)
274
- )
275
- })
288
+ .pipe(
289
+ map((response) => {
290
+ const metadataId = Object.keys(response.metadataInfos)[0]
291
+ return response.metadataInfos[metadataId][0].uuid
292
+ })
293
+ )
294
+ )
276
295
  )
277
296
  }
278
297
 
@@ -303,4 +322,18 @@ export class Gn4Repository implements RecordsRepositoryInterface {
303
322
  ) !== null
304
323
  )
305
324
  }
325
+
326
+ // generated by copilot
327
+ getAllDrafts(): Observable<CatalogRecord[]> {
328
+ const items = { ...window.localStorage }
329
+ const drafts = Object.keys(items)
330
+ .filter((key) => key.startsWith('geonetwork-ui-draft-'))
331
+ .map((key) => window.localStorage.getItem(key))
332
+ .filter((draft) => draft !== null)
333
+ return from(
334
+ Promise.all(
335
+ drafts.map((draft) => findConverterForDocument(draft).readRecord(draft))
336
+ )
337
+ )
338
+ }
306
339
  }
@@ -76,6 +76,7 @@ export class OrganizationsFromGroupsService
76
76
  return {
77
77
  name: group.label[lang3],
78
78
  ...(group.description && { description: group.description }),
79
+ ...(group.email && { email: group.email }),
79
80
  ...(group.logo && {
80
81
  logoUrl: getAsUrl(`${IMAGE_URL}${group.logo}`),
81
82
  }),
@@ -230,10 +230,12 @@ export class OrganizationsFromMetadataService
230
230
  if (!group) return fullOrg
231
231
  return {
232
232
  ...fullOrg,
233
+ email: emails[0],
233
234
  ...(group.description && { description: group.description }),
234
235
  ...(group.logo && { logoUrl: getAsUrl(`${IMAGE_URL}${group.logo}`) }),
235
236
  ...(group.website && { website: getAsUrl(group.website) }),
236
- }
237
+ ...(group.email && { email: group.email }),
238
+ } as Organization
237
239
  })
238
240
  }
239
241
 
@@ -8,11 +8,16 @@ import { Injectable } from '@angular/core'
8
8
  import { AvatarServiceInterface } from '../auth'
9
9
  import { map } from 'rxjs/operators'
10
10
  import { Observable, of } from 'rxjs'
11
- import { ThesaurusModel } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus/thesaurus.model'
12
11
  import {
12
+ Keyword,
13
13
  UserFeedback,
14
14
  UserFeedbackViewModel,
15
15
  } from '../../../../../../../libs/common/domain/src/lib/model/record'
16
+ import {
17
+ KeywordApiResponse,
18
+ ThesaurusApiResponse,
19
+ } from '../../../../../../../libs/api/metadata-converter/src'
20
+ import { KeywordType } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus'
16
21
 
17
22
  @Injectable()
18
23
  export class Gn4PlatformMapper {
@@ -40,7 +45,7 @@ export class Gn4PlatformMapper {
40
45
  const {
41
46
  enabled,
42
47
  emailAddresses,
43
- organisation,
48
+ organization,
44
49
  kind,
45
50
  lastLoginDate,
46
51
  accountNonExpired,
@@ -52,8 +57,12 @@ export class Gn4PlatformMapper {
52
57
  return { ...apiUser, id: id.toString() } as UserModel
53
58
  }
54
59
 
55
- thesaurusFromApi(thesaurus: any[], lang3?: string): ThesaurusModel {
56
- return thesaurus.map((keyword) => {
60
+ keywordsFromApi(
61
+ keywords: KeywordApiResponse[],
62
+ thesaurus: ThesaurusApiResponse[],
63
+ lang3?: string
64
+ ): Keyword[] {
65
+ return keywords.map((keyword): Keyword => {
57
66
  let key = keyword.uri
58
67
  // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
59
68
  if (key.indexOf('@@@') > -1) {
@@ -65,10 +74,22 @@ export class Gn4PlatformMapper {
65
74
  lang3 && lang3 in keyword.definitions
66
75
  ? keyword.definitions[lang3]
67
76
  : keyword.definition
77
+
78
+ const matchedThesaurus = thesaurus.find(
79
+ (thes) => keyword.thesaurusKey === thes.key
80
+ )
81
+
68
82
  return {
69
83
  key,
70
84
  label,
71
85
  description,
86
+ type: matchedThesaurus?.dname as KeywordType,
87
+ thesaurus: {
88
+ id: matchedThesaurus?.key,
89
+ name: matchedThesaurus?.title,
90
+ url: new URL(matchedThesaurus?.url),
91
+ type: matchedThesaurus?.dname as KeywordType,
92
+ },
72
93
  }
73
94
  })
74
95
  }
@@ -1,5 +1,5 @@
1
1
  import { Injectable } from '@angular/core'
2
- import { Observable, of, switchMap } from 'rxjs'
2
+ import { Observable, combineLatest, of, switchMap } from 'rxjs'
3
3
  import { catchError, map, shareReplay, tap } from 'rxjs/operators'
4
4
  import {
5
5
  MeApiService,
@@ -12,13 +12,19 @@ import {
12
12
  import { PlatformServiceInterface } from '../../../../../../../libs/common/domain/src/lib/platform.service.interface'
13
13
  import { UserModel } from '../../../../../../../libs/common/domain/src/lib/model/user/user.model'
14
14
  import {
15
+ Keyword,
15
16
  Organization,
16
17
  UserFeedback,
17
18
  } from '../../../../../../../libs/common/domain/src/lib/model/record'
18
19
  import { Gn4PlatformMapper } from './gn4-platform.mapper'
19
20
  import { ltr } from 'semver'
20
- import { ThesaurusModel } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus/thesaurus.model'
21
21
  import { LangService } from '../../../../../../../libs/util/i18n/src'
22
+ import { HttpClient } from '@angular/common/http'
23
+ import {
24
+ KeywordApiResponse,
25
+ ThesaurusApiResponse,
26
+ } from '../../../../../../../libs/api/metadata-converter/src'
27
+ import { KeywordType } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus'
22
28
 
23
29
  const minApiVersion = '4.2.2'
24
30
 
@@ -60,7 +66,7 @@ export class Gn4PlatformService implements PlatformServiceInterface {
60
66
  * A map of already loaded thesauri (groups of keywords); the key is a URI
61
67
  * @private
62
68
  */
63
- private thesauri: Record<string, Observable<ThesaurusModel>> = {}
69
+ private keywordsByThesauri: Record<string, Observable<Keyword[]>> = {}
64
70
 
65
71
  constructor(
66
72
  private siteApiService: SiteApiService,
@@ -70,7 +76,8 @@ export class Gn4PlatformService implements PlatformServiceInterface {
70
76
  private toolsApiService: ToolsApiService,
71
77
  private registriesApiService: RegistriesApiService,
72
78
  private langService: LangService,
73
- private userfeedbackApiService: UserfeedbackApiService
79
+ private userfeedbackApiService: UserfeedbackApiService,
80
+ private httpClient: HttpClient
74
81
  ) {
75
82
  this.me$ = this.meApi.getMe().pipe(
76
83
  switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)),
@@ -121,7 +128,7 @@ export class Gn4PlatformService implements PlatformServiceInterface {
121
128
  // the thesaurus URI is inferred by removing a part of the keyword URI
122
129
  // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
123
130
  const thesaurusUri = key.replace(/\/([^/]+)$/, '/')
124
- return this.getThesaurusByUri(thesaurusUri).pipe(
131
+ return this.getKeywordsByUri(thesaurusUri).pipe(
125
132
  map((thesaurus) => {
126
133
  for (const item of thesaurus) {
127
134
  if (item.key === key) return item.label
@@ -133,12 +140,60 @@ export class Gn4PlatformService implements PlatformServiceInterface {
133
140
  return this.keyTranslations$.pipe(map((translations) => translations[key]))
134
141
  }
135
142
 
136
- getThesaurusByUri(uri: string): Observable<ThesaurusModel> {
137
- if (this.thesauri[uri]) {
138
- return this.thesauri[uri]
143
+ private allThesaurus$ = this.httpClient
144
+ .get(
145
+ `${this.registriesApiService.configuration.basePath}/thesaurus?_content_type=json`
146
+ )
147
+ .pipe(
148
+ map((thesaurus) => {
149
+ return thesaurus[0] as ThesaurusApiResponse[]
150
+ }),
151
+ shareReplay(1)
152
+ )
153
+
154
+ searchKeywords(
155
+ query: string,
156
+ keywordTypes: KeywordType[]
157
+ ): Observable<Keyword[]> {
158
+ const keywords$: Observable<KeywordApiResponse[]> = this.allThesaurus$.pipe(
159
+ switchMap((thesaurus) => {
160
+ const selectedThesauri = []
161
+ keywordTypes.map((keywordType) => {
162
+ selectedThesauri.push(
163
+ ...thesaurus.filter((thes) => thes.dname === keywordType)
164
+ )
165
+ })
166
+
167
+ return this.registriesApiService.searchKeywords(
168
+ query,
169
+ this.langService.iso3,
170
+ 10,
171
+ 0,
172
+ null,
173
+ selectedThesauri.map((thes) => thes.key),
174
+ null,
175
+ `*${query}*`
176
+ ) as Observable<KeywordApiResponse[]>
177
+ })
178
+ )
179
+
180
+ return combineLatest([keywords$, this.allThesaurus$]).pipe(
181
+ map(([keywords, thesaurus]) => {
182
+ return this.mapper.keywordsFromApi(
183
+ keywords,
184
+ thesaurus,
185
+ this.langService.iso3
186
+ )
187
+ })
188
+ )
189
+ }
190
+
191
+ getKeywordsByUri(uri: string): Observable<Keyword[]> {
192
+ if (this.keywordsByThesauri[uri]) {
193
+ return this.keywordsByThesauri[uri]
139
194
  }
140
- this.thesauri[uri] = this.registriesApiService
141
- .searchKeywords(
195
+ const keywords$: Observable<KeywordApiResponse[]> =
196
+ this.registriesApiService.searchKeywords(
142
197
  null,
143
198
  this.langService.iso3,
144
199
  1000,
@@ -147,18 +202,23 @@ export class Gn4PlatformService implements PlatformServiceInterface {
147
202
  null,
148
203
  null,
149
204
  `${uri}*`
150
- )
151
- .pipe(
152
- map((thesaurus) =>
153
- this.mapper.thesaurusFromApi(
154
- thesaurus as any[],
155
- this.langService.iso3
156
- )
157
- ),
158
- shareReplay(1)
159
- )
205
+ ) as Observable<KeywordApiResponse[]>
206
+
207
+ this.keywordsByThesauri[uri] = combineLatest([
208
+ keywords$,
209
+ this.allThesaurus$,
210
+ ]).pipe(
211
+ map(([keywords, thesaurus]) => {
212
+ return this.mapper.keywordsFromApi(
213
+ keywords,
214
+ thesaurus,
215
+ this.langService.iso3
216
+ )
217
+ }),
218
+ shareReplay(1)
219
+ )
160
220
 
161
- return this.thesauri[uri]
221
+ return this.keywordsByThesauri[uri]
162
222
  }
163
223
 
164
224
  getUserFeedbacks(uuid: string): Observable<UserFeedback[]> {
@@ -2,6 +2,7 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
2
2
  import type { Individual } from './contact.model'
3
3
  import type { Organization } from './organization.model'
4
4
  import type { Geometry } from 'geojson'
5
+ import { KeywordType, ThesaurusModel } from '../thesaurus'
5
6
 
6
7
  type Uuid = string
7
8
 
@@ -60,18 +61,12 @@ export type SpatialRepresentationType =
60
61
  | 'table'
61
62
  | 'point'
62
63
 
63
- export type KeywordType = 'place' | 'temporal' | 'theme' | 'other'
64
-
65
- export type KeywordThesaurus = {
66
- id: string
67
- name?: string
68
- url?: URL
69
- }
70
-
71
64
  export interface Keyword {
65
+ key?: string
72
66
  label: string
67
+ description?: string
73
68
  type: KeywordType
74
- thesaurus?: KeywordThesaurus
69
+ thesaurus?: ThesaurusModel
75
70
  }
76
71
  // languages should be expressed using two-letters ISO 639-1 codes
77
72
  export type LanguageCode = string
@@ -1,5 +1,6 @@
1
1
  export interface Organization {
2
2
  name: string
3
+ email?: string
3
4
  description?: string
4
5
  website?: URL
5
6
  logoUrl?: URL
@@ -1,7 +1,14 @@
1
- export interface ThesaurusItemModel {
2
- key: string
3
- label: string
4
- description?: string
5
- }
1
+ export type KeywordType = 'place' | 'temporal' | 'theme' | 'other'
6
2
 
7
- export type ThesaurusModel = ThesaurusItemModel[]
3
+ export interface ThesaurusModel {
4
+ id: string
5
+ name?: string
6
+ url?: URL
7
+ thesaurusKey?: string
8
+ definition?: string
9
+ definitions?: object
10
+ uri?: string
11
+ value?: string
12
+ values?: object
13
+ type?: KeywordType
14
+ }
@@ -1,8 +1,8 @@
1
1
  import type { Observable } from 'rxjs'
2
2
  import type { UserModel } from './model/user/user.model'
3
3
  import type { Organization } from './model/record/organization.model'
4
- import type { ThesaurusModel } from './model/thesaurus/'
5
- import { UserFeedback } from './model/record'
4
+ import { Keyword, UserFeedback } from './model/record'
5
+ import { KeywordType } from './model/thesaurus'
6
6
 
7
7
  export abstract class PlatformServiceInterface {
8
8
  abstract getType(): string
@@ -16,7 +16,11 @@ export abstract class PlatformServiceInterface {
16
16
  ): Observable<UserModel[]>
17
17
  abstract getOrganizations(): Observable<Organization[]>
18
18
  abstract translateKey(key: string): Observable<string>
19
- abstract getThesaurusByUri(uri: string): Observable<ThesaurusModel>
19
+ abstract searchKeywords(
20
+ query: string,
21
+ keywordTypes: KeywordType[]
22
+ ): Observable<Keyword[]>
23
+ abstract getKeywordsByUri(uri: string): Observable<Keyword[]>
20
24
  abstract getUserFeedbacks(recordUuid: string): Observable<UserFeedback[]>
21
25
  abstract postUserFeedbacks(recordUuid: UserFeedback): Observable<void>
22
26
  }
@@ -30,10 +30,22 @@ 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
36
- * @returns Observable<string> Returns the source of the record as it was serialized when saved
48
+ * @returns Observable<string> Returns the unique identifier of the record as it was when saved
37
49
  */
38
50
  abstract saveRecord(
39
51
  record: CatalogRecord,
@@ -52,4 +64,7 @@ export abstract class RecordsRepositoryInterface {
52
64
 
53
65
  abstract clearRecordDraft(uniqueIdentifier: string): void
54
66
  abstract recordHasDraft(uniqueIdentifier: string): boolean
67
+
68
+ /** will return all pending drafts, both published and not published */
69
+ abstract getAllDrafts(): Observable<CatalogRecord[]>
55
70
  }
@@ -11,3 +11,5 @@ export * from './lib/records.fixtures'
11
11
  export * from './lib/repository.fixtures'
12
12
  export * from './lib/user.fixtures'
13
13
  export * from './lib/user-feedbacks.fixtures'
14
+
15
+ export * from './lib/editor'