geonetwork-ui 2.2.0 → 2.3.0-dev.179fba83

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 (218) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +5 -5
  2. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +14 -0
  3. package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +15 -0
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +3 -3
  5. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +52 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +7 -3
  7. package/esm2022/libs/api/metadata-converter/src/lib/gn4/index.mjs +4 -0
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/index.mjs +2 -0
  9. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +123 -0
  10. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +116 -0
  11. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +138 -0
  12. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/index.mjs +2 -0
  13. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +242 -0
  14. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +58 -62
  15. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.mjs +18 -0
  16. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +14 -0
  17. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +48 -0
  18. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +18 -0
  19. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +64 -0
  20. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +75 -58
  21. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +76 -14
  22. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +4 -4
  23. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  24. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +35 -7
  25. package/esm2022/libs/data-access/gn4/src/openapi/model/models.mjs +1 -2
  26. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +2 -2
  27. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +8 -8
  28. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +6 -2
  29. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +72 -0
  30. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +7 -3
  31. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +12 -7
  32. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +2 -1
  33. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +52 -25
  34. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +12 -49
  35. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +6 -2
  36. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  37. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  38. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +4 -3
  39. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +6 -5
  40. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -1
  41. package/esm2022/libs/ui/inputs/src/lib/files-drop/files-drop.directive.mjs +59 -0
  42. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +183 -0
  43. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +10 -4
  44. package/esm2022/libs/util/shared/src/lib/utils/bytes-convert.mjs +4 -0
  45. package/esm2022/libs/util/shared/src/lib/utils/image-resize.mjs +60 -0
  46. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +8 -6
  47. package/esm2022/translations/de.json +12 -0
  48. package/esm2022/translations/en.json +12 -0
  49. package/esm2022/translations/es.json +12 -0
  50. package/esm2022/translations/fr.json +12 -0
  51. package/esm2022/translations/it.json +12 -0
  52. package/esm2022/translations/nl.json +12 -0
  53. package/esm2022/translations/pt.json +12 -0
  54. package/fesm2022/geonetwork-ui.mjs +3910 -2866
  55. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  56. package/libs/api/metadata-converter/src/index.d.ts +4 -4
  57. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  58. package/libs/api/metadata-converter/src/lib/{metadata-base.mapper.d.ts → base.converter.d.ts} +3 -3
  59. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -0
  60. package/libs/api/metadata-converter/src/lib/find-converter.d.ts +3 -0
  61. package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +1 -0
  62. package/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.d.ts → gn4.converter.d.ts} +5 -5
  63. package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +1 -0
  64. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +4 -0
  66. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +1 -0
  67. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +2 -0
  68. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +1 -0
  69. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +9 -0
  70. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -0
  71. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +20 -0
  72. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -0
  73. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +21 -0
  74. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -0
  75. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +2 -0
  76. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +1 -0
  77. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +11 -0
  78. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -0
  79. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +34 -6
  80. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  81. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +8 -0
  82. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +1 -0
  83. package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +1 -0
  84. package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +1 -0
  85. package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -0
  86. package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +1 -0
  87. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +39 -3
  88. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  89. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +14 -1
  90. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  91. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
  92. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  93. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +6 -4
  94. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  95. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts +9 -5
  96. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  97. package/libs/data-access/gn4/src/openapi/model/models.d.ts +0 -1
  98. package/libs/data-access/gn4/src/openapi/model/models.d.ts.map +1 -1
  99. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  100. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
  101. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +23 -0
  102. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -0
  103. package/libs/feature/map/src/lib/feature-map.module.d.ts +2 -1
  104. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  105. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +2 -0
  106. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
  107. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +10 -5
  108. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  109. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  110. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +2 -3
  111. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  112. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  113. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +1 -1
  114. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  115. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +20 -20
  116. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  117. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts +14 -0
  118. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts.map +1 -0
  119. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +44 -0
  120. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -0
  121. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  122. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  123. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts +2 -0
  124. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts.map +1 -0
  125. package/libs/util/shared/src/lib/utils/image-resize.d.ts +3 -0
  126. package/libs/util/shared/src/lib/utils/image-resize.d.ts.map +1 -0
  127. package/libs/util/shared/src/lib/utils/index.d.ts +7 -5
  128. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  129. package/package.json +2 -2
  130. package/src/libs/api/metadata-converter/src/index.ts +4 -4
  131. package/src/libs/api/metadata-converter/src/lib/{metadata-base.mapper.ts → base.converter.ts} +2 -2
  132. package/src/libs/api/metadata-converter/src/lib/find-converter.ts +16 -0
  133. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +32 -5
  134. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +11 -4
  135. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +33 -7
  136. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +580 -0
  137. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
  138. package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.ts → gn4.converter.ts} +2 -2
  139. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +8 -2
  140. package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +3 -0
  141. package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +1 -0
  142. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +176 -0
  143. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +329 -0
  144. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +513 -0
  145. package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +1 -0
  146. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +327 -0
  147. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +121 -82
  148. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +20 -0
  149. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +175 -95
  150. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +84 -16
  151. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
  152. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -4
  153. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +43 -12
  154. package/src/libs/data-access/gn4/src/openapi/model/models.ts +0 -1
  155. package/src/libs/data-access/gn4/src/spec.yaml +1 -1
  156. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +1 -1
  157. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.css +0 -0
  158. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +8 -0
  159. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +70 -0
  160. package/src/libs/feature/editor/src/lib/services/editor.service.ts +27 -16
  161. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +5 -1
  162. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +0 -0
  163. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +36 -0
  164. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +80 -0
  165. package/src/libs/feature/map/src/lib/feature-map.module.ts +2 -0
  166. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +8 -0
  167. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +5 -0
  168. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +10 -3
  169. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +60 -32
  170. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +17 -61
  171. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +5 -1
  172. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +5 -3
  173. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  174. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -1
  175. package/src/libs/ui/inputs/src/lib/files-drop/files-drop.directive.ts +45 -0
  176. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.css +0 -0
  177. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +146 -0
  178. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +193 -0
  179. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  180. package/src/libs/util/shared/src/lib/utils/bytes-convert.ts +3 -0
  181. package/src/libs/util/shared/src/lib/utils/image-resize.ts +72 -0
  182. package/src/libs/util/shared/src/lib/utils/index.ts +7 -5
  183. package/translations/de.json +12 -0
  184. package/translations/en.json +12 -0
  185. package/translations/es.json +12 -0
  186. package/translations/fr.json +12 -0
  187. package/translations/it.json +12 -0
  188. package/translations/nl.json +12 -0
  189. package/translations/pt.json +12 -0
  190. package/translations/sk.json +12 -0
  191. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +0 -52
  192. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +0 -14
  193. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +0 -48
  194. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +0 -18
  195. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +0 -64
  196. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +0 -130
  197. package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +0 -14
  198. package/esm2022/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.mjs +0 -13
  199. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +0 -1
  200. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +0 -1
  201. package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +0 -1
  202. package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +0 -1
  203. package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +0 -1
  204. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +0 -4
  205. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +0 -1
  206. package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +0 -1
  207. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts +0 -18
  208. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts.map +0 -1
  209. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +0 -196
  210. package/src/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.ts +0 -18
  211. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.d.ts +0 -0
  212. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.d.ts +0 -0
  213. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.d.ts +0 -0
  214. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.d.ts +0 -0
  215. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.ts +0 -0
  216. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.ts +0 -0
  217. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.ts +0 -0
  218. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.ts +0 -0
@@ -0,0 +1,327 @@
1
+ import {
2
+ CatalogRecord,
3
+ CatalogRecordKeys,
4
+ DatasetRecord,
5
+ ServiceRecord,
6
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
7
+ import {
8
+ createDocument,
9
+ createElement,
10
+ getRootElement,
11
+ parseXmlString,
12
+ xmlToString,
13
+ } from '../xml-utils'
14
+ import {
15
+ writeAbstract,
16
+ writeContacts,
17
+ writeContactsForResource,
18
+ writeDistributions,
19
+ writeGraphicOverviews,
20
+ writeKeywords,
21
+ writeKind,
22
+ writeLegalConstraints,
23
+ writeLicenses,
24
+ writeLineage,
25
+ writeOnlineResources,
26
+ writeOtherConstraints,
27
+ writeOwnerOrganization,
28
+ writeRecordUpdated,
29
+ writeResourceCreated,
30
+ writeResourcePublished,
31
+ writeResourceUpdated,
32
+ writeSecurityConstraints,
33
+ writeSpatialRepresentation,
34
+ writeStatus,
35
+ writeTitle,
36
+ writeTopics,
37
+ writeUniqueIdentifier,
38
+ writeUpdateFrequency,
39
+ } from './write-parts'
40
+ import {
41
+ readAbstract,
42
+ readContacts,
43
+ readContactsForResource,
44
+ readDistributions,
45
+ readIsoTopics,
46
+ readKeywords,
47
+ readKind,
48
+ readLegalConstraints,
49
+ readLicenses,
50
+ readLineage,
51
+ readOnlineResources,
52
+ readOtherConstraints,
53
+ readOverviews,
54
+ readOwnerOrganization,
55
+ readRecordUpdated,
56
+ readResourceCreated,
57
+ readResourcePublished,
58
+ readResourceUpdated,
59
+ readSecurityConstraints,
60
+ readSpatialRepresentation,
61
+ readStatus,
62
+ readTitle,
63
+ readUniqueIdentifier,
64
+ readUpdateFrequency,
65
+ } from './read-parts'
66
+ import { isEqual } from '../convert-utils'
67
+ import { BaseConverter } from '../base.converter'
68
+ import { XmlElement } from '@rgrove/parse-xml'
69
+
70
+ export class Iso19139Converter extends BaseConverter<string> {
71
+ protected readers: Record<
72
+ CatalogRecordKeys,
73
+ (rootEl: XmlElement) => unknown
74
+ > = {
75
+ uniqueIdentifier: readUniqueIdentifier,
76
+ kind: readKind,
77
+ ownerOrganization: readOwnerOrganization,
78
+ recordUpdated: readRecordUpdated,
79
+ recordCreated: () => undefined, // not supported in ISO19139
80
+ recordPublished: () => undefined, // not supported in ISO19139
81
+ resourceUpdated: readResourceUpdated,
82
+ resourceCreated: readResourceCreated,
83
+ resourcePublished: readResourcePublished,
84
+ title: readTitle,
85
+ abstract: readAbstract,
86
+ contacts: readContacts,
87
+ contactsForResource: readContactsForResource,
88
+ keywords: readKeywords,
89
+ topics: readIsoTopics,
90
+ licenses: readLicenses,
91
+ legalConstraints: readLegalConstraints,
92
+ securityConstraints: readSecurityConstraints,
93
+ otherConstraints: readOtherConstraints,
94
+ status: readStatus,
95
+ updateFrequency: readUpdateFrequency,
96
+ spatialRepresentation: readSpatialRepresentation,
97
+ overviews: readOverviews,
98
+ lineage: readLineage,
99
+ distributions: readDistributions,
100
+ onlineResources: readOnlineResources,
101
+ // TODO
102
+ spatialExtents: () => [],
103
+ temporalExtents: () => [],
104
+ extras: () => undefined,
105
+ landingPage: () => undefined,
106
+ languages: () => [],
107
+ }
108
+
109
+ protected writers: Record<
110
+ CatalogRecordKeys,
111
+ (record: CatalogRecord, rootEl: XmlElement) => void
112
+ > = {
113
+ uniqueIdentifier: writeUniqueIdentifier,
114
+ kind: writeKind,
115
+ ownerOrganization: writeOwnerOrganization,
116
+ recordUpdated: writeRecordUpdated,
117
+ recordCreated: () => undefined, // not supported in ISO19139
118
+ recordPublished: () => undefined, // not supported in ISO19139
119
+ resourceUpdated: writeResourceUpdated,
120
+ resourceCreated: writeResourceCreated,
121
+ resourcePublished: writeResourcePublished,
122
+ title: writeTitle,
123
+ abstract: writeAbstract,
124
+ contacts: writeContacts,
125
+ contactsForResource: writeContactsForResource,
126
+ keywords: writeKeywords,
127
+ topics: writeTopics,
128
+ licenses: writeLicenses,
129
+ legalConstraints: writeLegalConstraints,
130
+ securityConstraints: writeSecurityConstraints,
131
+ otherConstraints: writeOtherConstraints,
132
+ status: writeStatus,
133
+ updateFrequency: writeUpdateFrequency,
134
+ spatialRepresentation: writeSpatialRepresentation,
135
+ overviews: writeGraphicOverviews,
136
+ lineage: writeLineage,
137
+ distributions: writeDistributions,
138
+ onlineResources: writeOnlineResources,
139
+ // TODO
140
+ spatialExtents: () => undefined,
141
+ temporalExtents: () => undefined,
142
+ extras: () => undefined,
143
+ landingPage: () => undefined,
144
+ languages: () => undefined,
145
+ }
146
+
147
+ protected beforeDocumentCreation(rootElement: XmlElement) {
148
+ // to override
149
+ }
150
+
151
+ async readRecord(document: string): Promise<CatalogRecord> {
152
+ const doc = parseXmlString(document)
153
+ const rootEl = getRootElement(doc)
154
+
155
+ const uniqueIdentifier = this.readers['uniqueIdentifier'](rootEl)
156
+ const kind = this.readers['kind'](rootEl)
157
+ const ownerOrganization = this.readers['ownerOrganization'](rootEl)
158
+ const title = this.readers['title'](rootEl)
159
+ const abstract = this.readers['abstract'](rootEl)
160
+ const contacts = this.readers['contacts'](rootEl)
161
+ const contactsForResource = this.readers['contactsForResource'](rootEl)
162
+ const recordUpdated = this.readers['recordUpdated'](rootEl)
163
+ const recordCreated = this.readers['recordCreated'](rootEl)
164
+ const recordPublished = this.readers['recordPublished'](rootEl)
165
+ const resourceCreated = this.readers['resourceCreated'](rootEl)
166
+ const resourceUpdated = this.readers['resourceUpdated'](rootEl)
167
+ const resourcePublished = this.readers['resourcePublished'](rootEl)
168
+ const keywords = this.readers['keywords'](rootEl)
169
+ const topics = this.readers['topics'](rootEl)
170
+ const legalConstraints = this.readers['legalConstraints'](rootEl)
171
+ const otherConstraints = this.readers['otherConstraints'](rootEl)
172
+ const securityConstraints = this.readers['securityConstraints'](rootEl)
173
+ const licenses = this.readers['licenses'](rootEl)
174
+ const overviews = this.readers['overviews'](rootEl)
175
+ const landingPage = this.readers['landingPage'](rootEl)
176
+
177
+ if (kind === 'dataset') {
178
+ const status = this.readers['status'](rootEl)
179
+ const spatialRepresentation =
180
+ this.readers['spatialRepresentation'](rootEl)
181
+ const spatialExtents = this.readers['spatialExtents'](rootEl)
182
+ const temporalExtents = this.readers['temporalExtents'](rootEl)
183
+ const lineage = this.readers['lineage'](rootEl)
184
+ const distributions = this.readers['distributions'](rootEl)
185
+ const updateFrequency = this.readers['updateFrequency'](rootEl)
186
+
187
+ return {
188
+ uniqueIdentifier,
189
+ kind,
190
+ languages: [],
191
+ ...(recordCreated && { recordCreated }),
192
+ ...(recordPublished && { recordPublished }),
193
+ recordUpdated,
194
+ ...(resourceCreated && { resourceCreated }),
195
+ ...(resourceUpdated && { resourceUpdated }),
196
+ ...(resourcePublished && { resourcePublished }),
197
+ status,
198
+ title,
199
+ abstract,
200
+ ownerOrganization,
201
+ contacts,
202
+ contactsForResource,
203
+ keywords,
204
+ topics,
205
+ licenses,
206
+ legalConstraints,
207
+ securityConstraints,
208
+ otherConstraints,
209
+ lineage,
210
+ ...(spatialRepresentation && { spatialRepresentation }),
211
+ overviews,
212
+ spatialExtents,
213
+ temporalExtents,
214
+ distributions,
215
+ updateFrequency,
216
+ ...(landingPage && { landingPage }),
217
+ } as DatasetRecord
218
+ } else {
219
+ const onlineResources = this.readers['onlineResources'](rootEl)
220
+ return {
221
+ uniqueIdentifier,
222
+ kind,
223
+ languages: [],
224
+ ...(recordCreated && { recordCreated }),
225
+ ...(recordPublished && { recordPublished }),
226
+ recordUpdated,
227
+ ...(resourceCreated && { resourceCreated }),
228
+ ...(resourceUpdated && { resourceUpdated }),
229
+ ...(resourcePublished && { resourcePublished }),
230
+ title,
231
+ abstract,
232
+ ownerOrganization,
233
+ contacts,
234
+ contactsForResource,
235
+ keywords,
236
+ topics,
237
+ licenses,
238
+ legalConstraints,
239
+ securityConstraints,
240
+ otherConstraints,
241
+ overviews,
242
+ onlineResources,
243
+ ...(landingPage && { landingPage }),
244
+ } as ServiceRecord
245
+ }
246
+ }
247
+
248
+ async writeRecord(
249
+ record: CatalogRecord,
250
+ reference?: string
251
+ ): Promise<string> {
252
+ let rootEl: XmlElement
253
+ let fieldChanged: (name: string) => boolean
254
+ if (reference) {
255
+ const originalDoc = parseXmlString(reference)
256
+ const originalRecord = await this.readRecord(reference)
257
+ rootEl = getRootElement(originalDoc)
258
+
259
+ fieldChanged = (name: string) => {
260
+ return originalRecord !== null
261
+ ? !isEqual(record[name], originalRecord[name])
262
+ : true
263
+ }
264
+ } else {
265
+ rootEl = createElement('gmd:MD_Metadata')()
266
+ fieldChanged = () => true
267
+ }
268
+
269
+ fieldChanged('uniqueIdentifier') &&
270
+ this.writers['uniqueIdentifier'](record, rootEl)
271
+ fieldChanged('kind') && this.writers['kind'](record, rootEl)
272
+
273
+ fieldChanged('contacts') && this.writers['contacts'](record, rootEl)
274
+ fieldChanged('ownerOrganization') &&
275
+ this.writers['ownerOrganization'](record, rootEl)
276
+
277
+ fieldChanged('recordUpdated') &&
278
+ this.writers['recordUpdated'](record, rootEl)
279
+ fieldChanged('recordCreated') &&
280
+ this.writers['recordCreated'](record, rootEl)
281
+ fieldChanged('recordPublished') &&
282
+ this.writers['recordPublished'](record, rootEl)
283
+
284
+ fieldChanged('title') && this.writers['title'](record, rootEl)
285
+ fieldChanged('abstract') && this.writers['abstract'](record, rootEl)
286
+
287
+ fieldChanged('resourceCreated') &&
288
+ this.writers['resourceCreated'](record, rootEl)
289
+ fieldChanged('resourcePublished') &&
290
+ this.writers['resourcePublished'](record, rootEl)
291
+ fieldChanged('resourceUpdated') &&
292
+ this.writers['resourceUpdated'](record, rootEl)
293
+
294
+ fieldChanged('contactsForResource') &&
295
+ this.writers['contactsForResource'](record, rootEl)
296
+
297
+ fieldChanged('keywords') && this.writers['keywords'](record, rootEl)
298
+ fieldChanged('topics') && this.writers['topics'](record, rootEl)
299
+ fieldChanged('legalConstraints') &&
300
+ this.writers['legalConstraints'](record, rootEl)
301
+ fieldChanged('securityConstraints') &&
302
+ this.writers['securityConstraints'](record, rootEl)
303
+ fieldChanged('licenses') && this.writers['licenses'](record, rootEl)
304
+ fieldChanged('otherConstraints') &&
305
+ this.writers['otherConstraints'](record, rootEl)
306
+
307
+ if (record.kind === 'dataset') {
308
+ fieldChanged('status') && this.writers['status'](record, rootEl)
309
+ fieldChanged('updateFrequency') &&
310
+ this.writers['updateFrequency'](record, rootEl)
311
+ fieldChanged('spatialRepresentation') &&
312
+ this.writers['spatialRepresentation'](record, rootEl)
313
+ fieldChanged('overviews') && this.writers['overviews'](record, rootEl)
314
+ fieldChanged('distributions') &&
315
+ this.writers['distributions'](record, rootEl)
316
+ fieldChanged('lineage') && this.writers['lineage'](record, rootEl)
317
+ } else {
318
+ fieldChanged('onlineResources') &&
319
+ this.writers['onlineResources'](record, rootEl)
320
+ }
321
+
322
+ this.beforeDocumentCreation(rootEl)
323
+
324
+ const newDocument = createDocument(rootEl)
325
+ return xmlToString(newDocument)
326
+ }
327
+ }