geonetwork-ui 2.3.0-dev.2c3530dc → 2.3.0-dev.376e0e90

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 (114) 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 +3 -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/feature/editor/src/lib/services/editor.service.mjs +8 -8
  25. package/fesm2022/geonetwork-ui.mjs +822 -245
  26. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  27. package/libs/api/metadata-converter/src/index.d.ts +4 -4
  28. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  29. package/libs/api/metadata-converter/src/lib/{metadata-base.mapper.d.ts → base.converter.d.ts} +3 -3
  30. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -0
  31. package/libs/api/metadata-converter/src/lib/find-converter.d.ts +3 -0
  32. package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +1 -0
  33. package/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.d.ts → gn4.converter.d.ts} +5 -5
  34. package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +1 -0
  35. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +4 -0
  36. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +1 -0
  37. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +2 -0
  38. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +1 -0
  39. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +9 -0
  40. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -0
  41. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +20 -0
  42. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -0
  43. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +21 -0
  44. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -0
  45. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +2 -0
  46. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +1 -0
  47. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +11 -0
  48. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -0
  49. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +34 -6
  50. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  51. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +8 -0
  52. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +1 -0
  53. package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +1 -0
  54. package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +1 -0
  55. package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -0
  56. package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +1 -0
  57. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +39 -3
  58. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  59. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +14 -1
  60. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  61. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
  62. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  63. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +6 -4
  64. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  65. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  66. package/package.json +1 -1
  67. package/src/libs/api/metadata-converter/src/index.ts +4 -4
  68. package/src/libs/api/metadata-converter/src/lib/{metadata-base.mapper.ts → base.converter.ts} +2 -2
  69. package/src/libs/api/metadata-converter/src/lib/find-converter.ts +16 -0
  70. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +32 -5
  71. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +11 -4
  72. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +33 -7
  73. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +580 -0
  74. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
  75. package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.ts → gn4.converter.ts} +2 -2
  76. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  77. package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +3 -0
  78. package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +1 -0
  79. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +176 -0
  80. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +329 -0
  81. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +513 -0
  82. package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +1 -0
  83. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +327 -0
  84. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +121 -82
  85. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +20 -0
  86. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +175 -95
  87. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +84 -16
  88. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
  89. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -4
  90. package/src/libs/feature/editor/src/lib/services/editor.service.ts +27 -16
  91. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +0 -52
  92. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +0 -14
  93. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +0 -48
  94. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +0 -18
  95. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +0 -64
  96. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +0 -130
  97. package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +0 -14
  98. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +0 -1
  99. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +0 -1
  100. package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +0 -1
  101. package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +0 -1
  102. package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +0 -1
  103. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +0 -4
  104. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +0 -1
  105. package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +0 -1
  106. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +0 -196
  107. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.d.ts +0 -0
  108. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.d.ts +0 -0
  109. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.d.ts +0 -0
  110. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.d.ts +0 -0
  111. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.ts +0 -0
  112. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.ts +0 -0
  113. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.ts +0 -0
  114. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.ts +0 -0
@@ -0,0 +1,513 @@
1
+ import {
2
+ CatalogRecord,
3
+ DatasetRecord,
4
+ Individual,
5
+ ServiceOnlineResource,
6
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
7
+ import {
8
+ addAttribute,
9
+ allChildrenElement,
10
+ appendChildren,
11
+ appendChildTree,
12
+ createChild,
13
+ createElement,
14
+ findChildElement,
15
+ findChildOrCreate,
16
+ findChildrenElement,
17
+ findNestedChildOrCreate,
18
+ findNestedElement,
19
+ findNestedElements,
20
+ readAttribute,
21
+ removeAllChildren,
22
+ removeChildren,
23
+ removeChildrenByName,
24
+ setTextContent,
25
+ XmlElement,
26
+ } from '../xml-utils'
27
+ import {
28
+ fallback,
29
+ filterArray,
30
+ getAtIndex,
31
+ map,
32
+ mapArray,
33
+ noop,
34
+ pipe,
35
+ } from '../function-utils'
36
+ import {
37
+ appendDistribution,
38
+ appendKeywords,
39
+ createDistributionInfo,
40
+ findOrCreateDistribution,
41
+ findOrCreateIdentification,
42
+ getProgressCode,
43
+ getRoleCode,
44
+ getServiceEndpointProtocol,
45
+ removeKeywords,
46
+ writeCharacterString,
47
+ writeDateTime,
48
+ writeLinkage,
49
+ } from '../iso19139/write-parts'
50
+ import { findIdentification } from '../iso19139/read-parts'
51
+ import { namePartsToFull } from '../iso19139/utils/individual-name'
52
+
53
+ export function writeUniqueIdentifier(
54
+ record: CatalogRecord,
55
+ rootEl: XmlElement
56
+ ) {
57
+ pipe(
58
+ findChildOrCreate('mdb:metadataIdentifier'),
59
+ findChildOrCreate('mcc:MD_Identifier'),
60
+ findChildOrCreate('mcc:code'),
61
+ writeCharacterString(record.uniqueIdentifier)
62
+ )(rootEl)
63
+ }
64
+
65
+ export function writeKind(record: CatalogRecord, rootEl: XmlElement) {
66
+ pipe(
67
+ findNestedChildOrCreate(
68
+ 'mdb:metadataScope',
69
+ 'mdb:MD_MetadataScope',
70
+ 'mdb:resourceScope',
71
+ 'mcc:MD_ScopeCode'
72
+ ),
73
+ addAttribute(
74
+ 'codeList',
75
+ 'https://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode'
76
+ ),
77
+ addAttribute('codeListValue', record.kind),
78
+ setTextContent(record.kind)
79
+ )(rootEl)
80
+ }
81
+
82
+ function removeRecordDate(type: 'revision' | 'creation' | 'publication') {
83
+ return removeChildren(
84
+ pipe(
85
+ findChildrenElement('mdb:dateInfo', false),
86
+ filterArray(
87
+ pipe(
88
+ findChildElement('cit:CI_DateTypeCode'),
89
+ readAttribute('codeListValue'),
90
+ map((value) => value === type)
91
+ )
92
+ )
93
+ )
94
+ )
95
+ }
96
+
97
+ function appendRecordDate(
98
+ date: Date,
99
+ type: 'revision' | 'creation' | 'publication'
100
+ ) {
101
+ return appendChildren(
102
+ pipe(
103
+ createElement('mdb:dateInfo'),
104
+ createChild('cit:CI_Date'),
105
+ appendChildren(
106
+ pipe(createElement('cit:date'), writeDateTime(date)),
107
+ pipe(
108
+ createElement('cit:dateType'),
109
+ createChild('cit:CI_DateTypeCode'),
110
+ addAttribute(
111
+ 'codeList',
112
+ 'https://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode'
113
+ ),
114
+ addAttribute('codeListValue', type),
115
+ setTextContent(type)
116
+ )
117
+ )
118
+ )
119
+ )
120
+ }
121
+
122
+ export function writeRecordUpdated(record: CatalogRecord, rootEl: XmlElement) {
123
+ removeRecordDate('revision')(rootEl)
124
+ appendRecordDate(record.recordUpdated, 'revision')(rootEl)
125
+ }
126
+
127
+ export function writeRecordCreated(record: CatalogRecord, rootEl: XmlElement) {
128
+ removeRecordDate('creation')(rootEl)
129
+ if (!('recordCreated' in record)) return
130
+ appendRecordDate(record.recordCreated, 'creation')(rootEl)
131
+ }
132
+
133
+ export function writeRecordPublished(
134
+ record: CatalogRecord,
135
+ rootEl: XmlElement
136
+ ) {
137
+ removeRecordDate('publication')(rootEl)
138
+ if (!('recordPublished' in record)) return
139
+ appendRecordDate(record.recordPublished, 'publication')(rootEl)
140
+ }
141
+
142
+ function removeResourceDate(type: 'revision' | 'creation' | 'publication') {
143
+ return pipe(
144
+ findIdentification(),
145
+ findNestedElement('mri:citation', 'cit:CI_Citation'),
146
+ removeChildren(
147
+ pipe(
148
+ findChildrenElement('cit:date', false),
149
+ filterArray(
150
+ pipe(
151
+ findChildElement('cit:CI_DateTypeCode'),
152
+ readAttribute('codeListValue'),
153
+ map((value) => value === type)
154
+ )
155
+ )
156
+ )
157
+ )
158
+ )
159
+ }
160
+
161
+ function appendResourceDate(
162
+ date: Date,
163
+ type: 'revision' | 'creation' | 'publication'
164
+ ) {
165
+ return pipe(
166
+ findIdentification(),
167
+ findNestedElement('mri:citation', 'cit:CI_Citation'),
168
+ appendChildren(
169
+ pipe(
170
+ createElement('cit:date'),
171
+ createChild('cit:CI_Date'),
172
+ appendChildren(
173
+ pipe(createElement('cit:date'), writeDateTime(date)),
174
+ pipe(
175
+ createElement('cit:dateType'),
176
+ createChild('cit:CI_DateTypeCode'),
177
+ addAttribute(
178
+ 'codeList',
179
+ 'https://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode'
180
+ ),
181
+ addAttribute('codeListValue', type),
182
+ setTextContent(type)
183
+ )
184
+ )
185
+ )
186
+ )
187
+ )
188
+ }
189
+
190
+ export function writeResourceUpdated(
191
+ record: CatalogRecord,
192
+ rootEl: XmlElement
193
+ ) {
194
+ removeResourceDate('revision')(rootEl)
195
+ if (!('resourceUpdated' in record)) return
196
+ appendResourceDate(record.resourceUpdated, 'revision')(rootEl)
197
+ }
198
+
199
+ export function writeResourceCreated(
200
+ record: CatalogRecord,
201
+ rootEl: XmlElement
202
+ ) {
203
+ removeResourceDate('creation')(rootEl)
204
+ if (!('resourceCreated' in record)) return
205
+ appendResourceDate(record.resourceCreated, 'creation')(rootEl)
206
+ }
207
+
208
+ export function writeResourcePublished(
209
+ record: CatalogRecord,
210
+ rootEl: XmlElement
211
+ ) {
212
+ removeResourceDate('publication')(rootEl)
213
+ if (!('resourcePublished' in record)) return
214
+ appendResourceDate(record.resourcePublished, 'publication')(rootEl)
215
+ }
216
+
217
+ export function writeOwnerOrganization(
218
+ record: CatalogRecord,
219
+ rootEl: XmlElement
220
+ ) {
221
+ // if no contact matches the owner org, create an empty one
222
+ const ownerContact: Individual = record.contacts.find(
223
+ (contact) => contact.organization.name === record.ownerOrganization.name
224
+ )
225
+ pipe(
226
+ findChildOrCreate('mdb:contact'),
227
+ removeAllChildren(),
228
+ appendResponsibleParty(
229
+ ownerContact
230
+ ? {
231
+ ...ownerContact,
232
+ // owner responsible party is always point of contact
233
+ role: 'point_of_contact',
234
+ }
235
+ : {
236
+ organization: record.ownerOrganization,
237
+ email: 'missing@missing.com',
238
+ role: 'point_of_contact',
239
+ }
240
+ )
241
+ )(rootEl)
242
+ }
243
+
244
+ export function appendResponsibleParty(contact: Individual) {
245
+ const fullName = namePartsToFull(contact.firstName, contact.lastName)
246
+
247
+ const createIndividual = pipe(
248
+ createElement('cit:individual'),
249
+ createChild('cit:CI_Individual'),
250
+ fullName
251
+ ? appendChildren(
252
+ pipe(createElement('cit:name'), writeCharacterString(fullName))
253
+ )
254
+ : noop,
255
+ contact.position
256
+ ? appendChildren(
257
+ pipe(
258
+ createElement('cit:positionName'),
259
+ writeCharacterString(contact.position)
260
+ )
261
+ )
262
+ : noop
263
+ )
264
+
265
+ const createContactInfo = pipe(
266
+ createElement('cit:contactInfo'),
267
+ createChild('cit:CI_Contact'),
268
+ appendChildren(
269
+ pipe(
270
+ createElement('cit:address'),
271
+ createChild('cit:CI_Address'),
272
+ appendChildren(
273
+ pipe(
274
+ createElement('cit:electronicMailAddress'),
275
+ writeCharacterString(contact.email)
276
+ )
277
+ ),
278
+ contact.address
279
+ ? appendChildren(
280
+ pipe(
281
+ createElement('cit:deliveryPoint'),
282
+ writeCharacterString(contact.address)
283
+ )
284
+ )
285
+ : noop
286
+ )
287
+ ),
288
+ contact.organization?.website
289
+ ? appendChildren(
290
+ pipe(
291
+ createElement('cit:onlineResource'),
292
+ createChild('cit:CI_OnlineResource'),
293
+ createChild('cit:linkage'),
294
+ writeCharacterString(contact.organization.website.toString())
295
+ )
296
+ )
297
+ : noop,
298
+ contact.phone
299
+ ? appendChildren(
300
+ pipe(
301
+ createElement('cit:phone'),
302
+ createChild('cit:CI_Telephone'),
303
+ createChild('cit:number'),
304
+ writeCharacterString(contact.phone)
305
+ )
306
+ )
307
+ : noop
308
+ )
309
+
310
+ const createRole = pipe(
311
+ createElement('cit:role'),
312
+ createChild('cit:CI_RoleCode'),
313
+ addAttribute(
314
+ 'codeList',
315
+ 'https://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode'
316
+ ),
317
+ addAttribute('codeListValue', getRoleCode(contact.role)),
318
+ setTextContent(getRoleCode(contact.role))
319
+ )
320
+
321
+ const createParty = pipe(
322
+ createElement('cit:party'),
323
+ createChild('cit:CI_Organisation'),
324
+ contact.organization?.name
325
+ ? appendChildren(
326
+ pipe(
327
+ createElement('cit:name'),
328
+ writeCharacterString(contact.organization?.name)
329
+ )
330
+ )
331
+ : noop,
332
+ appendChildren(createContactInfo, createIndividual)
333
+ )
334
+
335
+ return appendChildren(
336
+ pipe(
337
+ createElement('cit:CI_Responsibility'),
338
+ appendChildren(createRole, createParty)
339
+ )
340
+ )
341
+ }
342
+
343
+ export function writeContacts(record: CatalogRecord, rootEl: XmlElement) {
344
+ pipe(
345
+ removeChildrenByName('mdb:contact'),
346
+ appendChildren(
347
+ ...record.contacts.map((contact) =>
348
+ pipe(createElement('gmd:contact'), appendResponsibleParty(contact))
349
+ )
350
+ )
351
+ )(rootEl)
352
+ }
353
+
354
+ export function writeContactsForResource(
355
+ record: CatalogRecord,
356
+ rootEl: XmlElement
357
+ ) {
358
+ const withoutDistributors = record.contactsForResource.filter(
359
+ (c) => c.role !== 'distributor'
360
+ )
361
+ const distributors = record.contactsForResource.filter(
362
+ (c) => c.role === 'distributor'
363
+ )
364
+ pipe(
365
+ findOrCreateIdentification(),
366
+ removeChildrenByName('mri:pointOfContact'),
367
+ appendChildren(
368
+ ...withoutDistributors.map((contact) =>
369
+ pipe(
370
+ createElement('mri:pointOfContact'),
371
+ appendResponsibleParty(contact)
372
+ )
373
+ )
374
+ )
375
+ )(rootEl)
376
+ if (!distributors.length) return
377
+ pipe(
378
+ findOrCreateDistribution(),
379
+ removeChildrenByName('mrd:distributor'),
380
+ createChild('mrd:distributor'),
381
+ createChild('mrd:MD_Distributor'),
382
+ appendChildren(
383
+ ...distributors.map((contact) =>
384
+ pipe(
385
+ createElement('mrd:distributorContact'),
386
+ appendResponsibleParty(contact)
387
+ )
388
+ )
389
+ )
390
+ )(rootEl)
391
+ }
392
+
393
+ export function writeKeywords(record: CatalogRecord, rootEl: XmlElement) {
394
+ pipe(
395
+ findOrCreateIdentification(),
396
+ removeKeywords(),
397
+ appendKeywords(record.keywords)
398
+ )(rootEl)
399
+ }
400
+
401
+ export function writeLandingPage(record: DatasetRecord, rootEl: XmlElement) {
402
+ pipe(
403
+ findNestedChildOrCreate(
404
+ 'mdb:metadataLinkage',
405
+ 'cit:CI_OnlineResource',
406
+ 'cit:linkage'
407
+ ),
408
+ writeLinkage(record.landingPage)
409
+ )(rootEl)
410
+ }
411
+
412
+ export function writeLineage(record: DatasetRecord, rootEl: XmlElement) {
413
+ pipe(
414
+ findNestedChildOrCreate(
415
+ 'mdb:resourceLineage',
416
+ 'mrl:LI_Lineage',
417
+ 'mrl:statement'
418
+ ),
419
+ writeCharacterString(record.lineage)
420
+ )(rootEl)
421
+ }
422
+
423
+ export function writeStatus(record: DatasetRecord, rootEl: XmlElement) {
424
+ const progressCode = getProgressCode(record.status)
425
+ pipe(
426
+ findOrCreateIdentification(),
427
+ findNestedChildOrCreate('mri:status', 'mcc:MD_ProgressCode'),
428
+ addAttribute(
429
+ 'codeList',
430
+ 'https://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ProgressCode'
431
+ ),
432
+ addAttribute('codeListValue', progressCode),
433
+ setTextContent(progressCode)
434
+ )(rootEl)
435
+ }
436
+
437
+ export function writeSpatialRepresentation(
438
+ record: DatasetRecord,
439
+ rootEl: XmlElement
440
+ ) {
441
+ pipe(
442
+ findOrCreateIdentification(),
443
+ findNestedChildOrCreate(
444
+ 'mri:spatialRepresentationType',
445
+ 'mcc:MD_SpatialRepresentationTypeCode'
446
+ ),
447
+ addAttribute(
448
+ 'codeList',
449
+ 'https://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_SpatialRepresentationTypeCode'
450
+ ),
451
+ addAttribute('codeListValue', record.spatialRepresentation),
452
+ setTextContent(record.spatialRepresentation)
453
+ )(rootEl)
454
+ }
455
+
456
+ // this will remove all transfer options and formats from distribution info
457
+ // and remove empty distribution info
458
+ function removeTransferOptions(rootEl: XmlElement) {
459
+ // remove transfer options & formats
460
+ pipe(
461
+ findNestedElements('mdb:distributionInfo', 'mrd:MD_Distribution'),
462
+ mapArray(
463
+ pipe(
464
+ removeChildren(findChildrenElement('mrd:distributionFormat', false)),
465
+ removeChildren(findChildrenElement('mrd:transferOptions', false))
466
+ )
467
+ )
468
+ )(rootEl)
469
+ // remove empty distributions
470
+ removeChildren(
471
+ pipe(
472
+ findChildrenElement('mdb:distributionInfo', false),
473
+ filterArray(
474
+ pipe(
475
+ findChildElement('mrd:MD_Distribution'),
476
+ allChildrenElement,
477
+ map((children) => children.length === 0)
478
+ )
479
+ )
480
+ )
481
+ )(rootEl)
482
+ }
483
+
484
+ function appendDistributionFormat(mimeType: string) {
485
+ return appendChildren(
486
+ pipe(
487
+ createElement('mrd:distributionFormat'),
488
+ createChild('mrd:MD_Format'),
489
+ createChild('mrd:formatSpecificationCitation'),
490
+ createChild('cit:CI_Citation'),
491
+ createChild('cit:title'),
492
+ writeCharacterString(mimeType)
493
+ )
494
+ )
495
+ }
496
+
497
+ export function writeDistributions(record: DatasetRecord, rootEl: XmlElement) {
498
+ removeTransferOptions(rootEl)
499
+
500
+ // for each distribution, either find an existing distribution info or create a new one
501
+ record.distributions.forEach((distribution, index) => {
502
+ pipe(
503
+ fallback(
504
+ pipe(
505
+ findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'),
506
+ getAtIndex(index)
507
+ ),
508
+ appendChildTree(createDistributionInfo())
509
+ ),
510
+ appendDistribution(distribution, appendDistributionFormat)
511
+ )(rootEl)
512
+ })
513
+ }
@@ -0,0 +1 @@
1
+ export * from './iso19139.converter'