geonetwork-ui 2.11.0-dev.a2881de31 → 2.11.0-dev.e7b8ec331

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 (32) hide show
  1. package/fesm2022/geonetwork-ui.mjs +263 -141
  2. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  3. package/index.d.ts +22 -7
  4. package/index.d.ts.map +1 -1
  5. package/package.json +1 -1
  6. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +5 -5
  7. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -5
  8. package/src/libs/api/metadata-converter/src/lib/gn4/types/elasticsearch.model.ts +13 -1
  9. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +2 -2
  10. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +9 -5
  11. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/association-type.mapper.ts +12 -0
  12. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +2 -2
  13. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +22 -3
  14. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +28 -2
  15. package/src/libs/common/domain/src/lib/model/search/sort-by.model.ts +1 -5
  16. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-associated-records/form-field-associated-records.component.css +0 -0
  17. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-associated-records/form-field-associated-records.component.html +33 -0
  18. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-associated-records/form-field-associated-records.component.ts +94 -0
  19. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.html +16 -12
  20. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +6 -0
  21. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +6 -0
  22. package/src/libs/feature/editor/src/lib/fields.config.ts +5 -0
  23. package/src/libs/feature/router/src/lib/default/router.service.ts +1 -1
  24. package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +1 -1
  25. package/translations/de.json +13 -1
  26. package/translations/en.json +13 -1
  27. package/translations/es.json +12 -0
  28. package/translations/fr.json +13 -1
  29. package/translations/it.json +13 -1
  30. package/translations/nl.json +12 -0
  31. package/translations/pt.json +12 -0
  32. package/translations/sk.json +13 -1
@@ -422,23 +422,23 @@ Depuis, ce sont les Districts routiers qui assurent la tenue à jour de ces info
422
422
  sourceRecords: [],
423
423
  associatedRecords: [
424
424
  {
425
- uuid: 'b1882436-3016-421e-9dfd-0326cca998f2',
425
+ uniqueIdentifier: 'b1882436-3016-421e-9dfd-0326cca998f2',
426
426
  associationType: 'crossReference',
427
427
  },
428
428
  {
429
- uuid: 'b1741571-bbda-4732-a807-cbc36b64d54f',
429
+ uniqueIdentifier: 'b1741571-bbda-4732-a807-cbc36b64d54f',
430
430
  associationType: 'crossReference',
431
431
  },
432
432
  {
433
- uuid: 'bdcb789c-4b02-4c0c-863a-98dac4ed0240',
433
+ uniqueIdentifier: 'bdcb789c-4b02-4c0c-863a-98dac4ed0240',
434
434
  associationType: 'crossReference',
435
435
  },
436
436
  {
437
- uuid: 'c0112b86-a6e3-4df3-9da1-2927376076f4',
437
+ uniqueIdentifier: 'c0112b86-a6e3-4df3-9da1-2927376076f4',
438
438
  associationType: 'partOfSeamlessDatabase',
439
439
  },
440
440
  {
441
- uuid: '7451e2bd-22e8-4a74-a999-01c58b630369',
441
+ uniqueIdentifier: '7451e2bd-22e8-4a74-a999-01c58b630369',
442
442
  associationType: 'largerWorkCitation',
443
443
  },
444
444
  ],
@@ -2,7 +2,19 @@ export type SortOrder = 'asc' | 'desc'
2
2
  interface SortParam {
3
3
  [key: string]: SortOrder
4
4
  }
5
- export type SortParams = string | SortParam | (string | SortParam)[]
5
+ type EsFieldSort = {
6
+ order: SortOrder
7
+ mode?: 'max' | 'min'
8
+ missing?: '_last'
9
+ nested?: {
10
+ path: string
11
+ }
12
+ }
13
+ export type SortParams =
14
+ | string
15
+ | SortParam
16
+ | { [property: string]: EsFieldSort }
17
+ | (string | SortParam | { [property: string]: EsFieldSort })[]
6
18
 
7
19
  export interface EsRequestAggTerm {
8
20
  field?: string
@@ -587,7 +587,7 @@ export function writeAssociatedRecords(
587
587
  removeChildrenByName('mri:associatedResource'),
588
588
  appendChildren(
589
589
  ...record.associatedRecords
590
- .filter((assoc) => assoc.uuid && assoc.associationType)
590
+ .filter((assoc) => assoc.uniqueIdentifier && assoc.associationType)
591
591
  .map((assoc) =>
592
592
  pipe(
593
593
  createNestedElement(
@@ -608,7 +608,7 @@ export function writeAssociatedRecords(
608
608
  ),
609
609
  pipe(
610
610
  createElement('mri:metadataReference'),
611
- writeAttribute('uuidref', assoc.uuid)
611
+ writeAttribute('uuidref', assoc.uniqueIdentifier)
612
612
  )
613
613
  )
614
614
  )
@@ -51,6 +51,7 @@ import {
51
51
  readText,
52
52
  XmlElement,
53
53
  } from '../xml-utils'
54
+ import { getAssociationTypeFromCode } from './utils/association-type.mapper'
54
55
  import { readGeometry } from './utils/geometry'
55
56
  import { fullNameToParts } from './utils/individual-name'
56
57
  import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper'
@@ -931,19 +932,22 @@ export function readSourceRecords(rootEl: XmlElement): SourceRecord[] {
931
932
  export function extractAssociatedRecords(
932
933
  containerName: string,
933
934
  aggregateName: string,
934
- readUuid: ChainableFunction<XmlElement, string>
935
+ readIdentifier: ChainableFunction<XmlElement, string>
935
936
  ): ChainableFunction<XmlElement, AssociatedRecord[]> {
936
937
  return pipe(
937
938
  findChildrenElement(containerName, false),
938
939
  mapArray((el) => {
939
940
  const aggregateEl = findChildElement(aggregateName, false)(el)
940
- const uuid = readUuid(aggregateEl)
941
- const associationType = pipe(
941
+ const uniqueIdentifier = readIdentifier(aggregateEl)
942
+ const associationTypeCode = pipe(
942
943
  findNestedElement('gmd:associationType', 'gmd:DS_AssociationTypeCode'),
943
944
  readAttribute('codeListValue')
944
945
  )(aggregateEl)
945
- if (!uuid || !associationType) return null
946
- return { uuid, associationType }
946
+ if (!uniqueIdentifier || !associationTypeCode) return null
947
+ return {
948
+ uniqueIdentifier,
949
+ associationType: getAssociationTypeFromCode(associationTypeCode),
950
+ }
947
951
  }),
948
952
  filterArray((r): r is AssociatedRecord => r !== null)
949
953
  )
@@ -0,0 +1,12 @@
1
+ import {
2
+ AssociationType,
3
+ associationTypeValues,
4
+ } from '../../../../../../../libs/common/domain/src/lib/model/record'
5
+
6
+ export function getAssociationTypeFromCode(
7
+ associationTypeCode: string
8
+ ): AssociationType {
9
+ return associationTypeValues.includes(associationTypeCode as AssociationType)
10
+ ? (associationTypeCode as AssociationType)
11
+ : 'crossReference'
12
+ }
@@ -1276,7 +1276,7 @@ export function writeAssociatedRecords(
1276
1276
  removeChildrenByName('gmd:aggregationInfo'),
1277
1277
  appendChildren(
1278
1278
  ...record.associatedRecords
1279
- .filter((assoc) => assoc.uuid && assoc.associationType)
1279
+ .filter((assoc) => assoc.uniqueIdentifier && assoc.associationType)
1280
1280
  .map((assoc) =>
1281
1281
  pipe(
1282
1282
  createNestedElement(
@@ -1290,7 +1290,7 @@ export function writeAssociatedRecords(
1290
1290
  'gmd:MD_Identifier',
1291
1291
  'gmd:code'
1292
1292
  ),
1293
- writeCharacterString(assoc.uuid)
1293
+ writeCharacterString(assoc.uniqueIdentifier)
1294
1294
  ),
1295
1295
  pipe(
1296
1296
  createNestedElement(
@@ -11,6 +11,7 @@ import {
11
11
  AggregationsParams,
12
12
  FieldFilter,
13
13
  FieldFilters,
14
+ FieldSort,
14
15
  FilterQuery,
15
16
  FiltersAggregationParams,
16
17
  SortByField,
@@ -199,9 +200,27 @@ export class ElasticsearchService {
199
200
  }
200
201
 
201
202
  private buildPayloadSort(sortBy: SortByField): SortParams {
202
- if (sortBy === null) return undefined
203
- const fields = Array.isArray(sortBy[0]) ? sortBy : [sortBy]
204
- return fields.map((field) => ({ [field[1]]: field[0] }))
203
+ if (!sortBy || sortBy.length === 0) return undefined
204
+ const fields = Array.isArray(sortBy[0])
205
+ ? (sortBy as FieldSort[])
206
+ : [sortBy as FieldSort]
207
+ return fields.map((field) => {
208
+ // Sort by nested array of dates only works with the explicit syntax
209
+ if (field[1].endsWith('.date')) {
210
+ const nestedPath = field[1].slice(0, field[1].lastIndexOf('.date'))
211
+ return {
212
+ [field[1]]: {
213
+ order: field[0] as 'desc' | 'asc',
214
+ mode: field[0] === 'desc' ? 'max' : 'min',
215
+ missing: '_last',
216
+ nested: {
217
+ path: nestedPath,
218
+ },
219
+ },
220
+ }
221
+ }
222
+ return { [field[1]]: field[0] }
223
+ })
205
224
  }
206
225
 
207
226
  private injectLangInQueryStringFields(
@@ -260,12 +260,38 @@ export interface SourceRecord {
260
260
  href?: string
261
261
  }
262
262
 
263
+ marker('domain.record.associationType.crossReference')
264
+ marker('domain.record.associationType.largerWorkCitation')
265
+ marker('domain.record.associationType.partOfSeamlessDatabase')
266
+ marker('domain.record.associationType.stereoMate')
267
+ marker('domain.record.associationType.isComposedOf')
268
+ marker('domain.record.associationType.collectiveTitle')
269
+ marker('domain.record.associationType.series')
270
+ marker('domain.record.associationType.dependency')
271
+ marker('domain.record.associationType.revisionOf')
272
+
273
+ // DS_AssociationTypeCode values of the ISO19115-3 codelist, any unrecognized value
274
+ // being mapped to 'crossReference'
275
+ export const associationTypeValues = [
276
+ 'crossReference',
277
+ 'largerWorkCitation',
278
+ 'partOfSeamlessDatabase',
279
+ 'stereoMate',
280
+ 'isComposedOf',
281
+ 'collectiveTitle',
282
+ 'series',
283
+ 'dependency',
284
+ 'revisionOf',
285
+ ] as const
286
+
287
+ export type AssociationType = (typeof associationTypeValues)[number]
288
+
263
289
  /**
264
290
  * Represents another record associated with this one (e.g. a parent/sibling dataset).
265
291
  */
266
292
  export interface AssociatedRecord {
267
- uuid: string
268
- associationType: string
293
+ uniqueIdentifier: string
294
+ associationType: AssociationType
269
295
  }
270
296
 
271
297
  export interface DatasetRecord extends BaseRecord {
@@ -6,9 +6,5 @@ export const SortByEnum: Record<string, SortByField> = {
6
6
  RELEVANCY: ['desc', '_score'],
7
7
  QUALITY_SCORE: ['desc', 'qualityScore'],
8
8
  CHANGE_DATE: ['desc', 'changeDate'],
9
- RESOURCE_DATES: [
10
- ['desc', 'revisionDateForResource'],
11
- ['desc', 'publicationDateForResource'],
12
- ['desc', 'creationDateForResource'],
13
- ],
9
+ RESOURCE_DATE: ['desc', 'resourceDate.date'],
14
10
  }
@@ -0,0 +1,33 @@
1
+ <div class="flex flex-col gap-2">
2
+ <gn-ui-check-toggle
3
+ [label]="'editor.record.form.field.parentLink' | translate"
4
+ [value]="hasParentLink"
5
+ (toggled)="onToggle($event)"
6
+ data-cy="associated-record-toggle"
7
+ ></gn-ui-check-toggle>
8
+ @if (hasParentLink) {
9
+ <gn-ui-form-field-wrapper
10
+ [label]="'editor.record.form.field.parentIdentifier' | translate"
11
+ >
12
+ <gn-ui-text-input
13
+ [value]="uniqueIdentifier"
14
+ (valueChange)="onUniqueIdentifierChange($event)"
15
+ placeholder=""
16
+ data-cy="associated-record-identifier"
17
+ ></gn-ui-text-input>
18
+ </gn-ui-form-field-wrapper>
19
+ <gn-ui-form-field-wrapper
20
+ [label]="'editor.record.form.field.parentType' | translate"
21
+ >
22
+ <gn-ui-dropdown-selector
23
+ [title]="'editor.record.form.field.parentType' | translate"
24
+ [showTitle]="false"
25
+ [choices]="choices"
26
+ [selected]="selectedType"
27
+ (selectValue)="onTypeChange($event)"
28
+ [extraBtnClass]="'input-as-button gn-ui-text-input'"
29
+ data-cy="associated-record-type"
30
+ ></gn-ui-dropdown-selector>
31
+ </gn-ui-form-field-wrapper>
32
+ }
33
+ </div>
@@ -0,0 +1,94 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ EventEmitter,
5
+ Input,
6
+ Output,
7
+ } from '@angular/core'
8
+ import {
9
+ AssociatedRecord,
10
+ AssociationType,
11
+ associationTypeValues,
12
+ } from '../../../../../../../../../libs/common/domain/src/lib/model/record'
13
+ import {
14
+ CheckToggleComponent,
15
+ DropdownChoice,
16
+ DropdownSelectorComponent,
17
+ TextInputComponent,
18
+ } from '../../../../../../../../../libs/ui/inputs/src'
19
+ import { FormFieldWrapperComponent } from '../../../../../../../../../libs/ui/layout/src'
20
+ import { TranslatePipe } from '@ngx-translate/core'
21
+
22
+ @Component({
23
+ selector: 'gn-ui-form-field-associated-records',
24
+ templateUrl: './form-field-associated-records.component.html',
25
+ styleUrls: ['./form-field-associated-records.component.css'],
26
+ changeDetection: ChangeDetectionStrategy.OnPush,
27
+ standalone: true,
28
+ imports: [
29
+ CheckToggleComponent,
30
+ TextInputComponent,
31
+ DropdownSelectorComponent,
32
+ FormFieldWrapperComponent,
33
+ TranslatePipe,
34
+ ],
35
+ })
36
+ export class FormFieldAssociatedRecordsComponent {
37
+ @Input() value?: AssociatedRecord[]
38
+ @Output() valueChange = new EventEmitter<AssociatedRecord[]>()
39
+
40
+ private get list() {
41
+ return this.value ?? []
42
+ }
43
+ private get first() {
44
+ return this.list[0]
45
+ }
46
+ private get rest() {
47
+ return this.list.slice(1)
48
+ }
49
+
50
+ get hasParentLink() {
51
+ return this.list.length > 0
52
+ }
53
+ get uniqueIdentifier() {
54
+ return this.first?.uniqueIdentifier ?? ''
55
+ }
56
+ get selectedType() {
57
+ return this.first?.associationType
58
+ }
59
+ get choices(): DropdownChoice[] {
60
+ return associationTypeValues.map((value) => ({
61
+ value,
62
+ label: `domain.record.associationType.${value}`,
63
+ }))
64
+ }
65
+
66
+ onToggle(checked: boolean) {
67
+ this.valueChange.emit(
68
+ checked
69
+ ? [
70
+ {
71
+ uniqueIdentifier: '',
72
+ associationType: associationTypeValues[0],
73
+ },
74
+ ...this.rest,
75
+ ]
76
+ : this.rest
77
+ )
78
+ }
79
+
80
+ onUniqueIdentifierChange(uniqueIdentifier: string) {
81
+ this.valueChange.emit(
82
+ uniqueIdentifier
83
+ ? [{ ...this.first, uniqueIdentifier }, ...this.rest]
84
+ : this.rest
85
+ )
86
+ }
87
+
88
+ onTypeChange(associationType: DropdownChoice['value']) {
89
+ this.valueChange.emit([
90
+ { ...this.first, associationType: associationType as AssociationType },
91
+ ...this.rest,
92
+ ])
93
+ }
94
+ }
@@ -1,17 +1,21 @@
1
- <div class="flex gap-2 mb-2">
2
- @for (addOption of addOptions$ | async; track addOption) {
3
- <gn-ui-button type="gray" (buttonClick)="onAdd(addOption.eventName)">
4
- <ng-icon name="iconoirPlus" class="text-primary"></ng-icon> &nbsp;{{
5
- addOption.buttonLabel
6
- }}</gn-ui-button
7
- >
1
+ <div class="flex flex-col gap-2">
2
+ <div class="flex gap-2">
3
+ @for (addOption of addOptions$ | async; track addOption) {
4
+ <gn-ui-button type="gray" (buttonClick)="onAdd(addOption.eventName)">
5
+ <ng-icon name="iconoirPlus" class="text-primary"></ng-icon> &nbsp;{{
6
+ addOption.buttonLabel
7
+ }}</gn-ui-button
8
+ >
9
+ }
10
+ </div>
11
+ @if (extents.length) {
12
+ <gn-ui-sortable-list
13
+ [items]="extents"
14
+ (itemsOrderChange)="onItemsOrderChange($event)"
15
+ [elementTemplate]="template"
16
+ ></gn-ui-sortable-list>
8
17
  }
9
18
  </div>
10
- <gn-ui-sortable-list
11
- [items]="extents"
12
- (itemsOrderChange)="onItemsOrderChange($event)"
13
- [elementTemplate]="template"
14
- ></gn-ui-sortable-list>
15
19
  <ng-template #template let-extent let-index="index">
16
20
  @if (extent.end === undefined) {
17
21
  <div class="border rounded-lg px-4 pb-4">
@@ -98,6 +98,12 @@
98
98
  [recordKind]="recordKind"
99
99
  ></gn-ui-form-field-update-frequency>
100
100
  </ng-container>
101
+ <ng-container *ngSwitchCase="'associatedRecords'">
102
+ <gn-ui-form-field-associated-records
103
+ [value]="valueAsAssociatedRecords"
104
+ (valueChange)="valueChange.emit($event)"
105
+ ></gn-ui-form-field-associated-records>
106
+ </ng-container>
101
107
  <ng-container *ngSwitchCase="'temporalExtents'">
102
108
  <gn-ui-form-field-temporal-extents
103
109
  [value]="valueAsTemporalExtents"
@@ -11,6 +11,7 @@ import {
11
11
  } from '@angular/core'
12
12
  import { MatTooltipModule } from '@angular/material/tooltip'
13
13
  import {
14
+ AssociatedRecord,
14
15
  CatalogRecordKeys,
15
16
  Constraint,
16
17
  DatasetTemporalExtent,
@@ -39,6 +40,7 @@ import {
39
40
  FormFieldComponentName,
40
41
  FormFieldConfig,
41
42
  } from '../../../models'
43
+ import { FormFieldAssociatedRecordsComponent } from './form-field-associated-records/form-field-associated-records.component'
42
44
  import { FormFieldContactsForResourceComponent } from './form-field-contacts-for-resource/form-field-contacts-for-resource.component'
43
45
  import { FormFieldContactsComponent } from './form-field-contacts/form-field-contacts.component'
44
46
  import { FormFieldKeywordsComponent } from './form-field-keywords/form-field-keywords.component'
@@ -70,6 +72,7 @@ import { FormFieldTopicsComponent } from './form-field-topics/form-field-topics.
70
72
  FormFieldLicenseComponent,
71
73
  FormFieldDateComponent,
72
74
  FormFieldUpdateFrequencyComponent,
75
+ FormFieldAssociatedRecordsComponent,
73
76
  FormFieldTemporalExtentsComponent,
74
77
  FormFieldSimpleComponent,
75
78
  FormFieldRichComponent,
@@ -140,6 +143,9 @@ export class FormFieldComponent {
140
143
  get valueAsUpdateFrequency() {
141
144
  return this.value as UpdateFrequency
142
145
  }
146
+ get valueAsAssociatedRecords() {
147
+ return this.value as Array<AssociatedRecord>
148
+ }
143
149
  get valueAsTemporalExtents() {
144
150
  return this.value as Array<DatasetTemporalExtent>
145
151
  }
@@ -134,6 +134,11 @@ export const DEFAULT_CONFIGURATION: EditorConfig = {
134
134
  },
135
135
  hidden: '${record.kind == "service"}',
136
136
  },
137
+ {
138
+ model: 'associatedRecords',
139
+ formFieldConfig: {},
140
+ hidden: '${record.kind == "service"}',
141
+ },
137
142
  ],
138
143
  },
139
144
 
@@ -62,6 +62,6 @@ export class RouterService {
62
62
  }
63
63
 
64
64
  getDefaultSort(): SortByField {
65
- return SortByEnum.RESOURCE_DATES
65
+ return SortByEnum.RESOURCE_DATE
66
66
  }
67
67
  }
@@ -34,7 +34,7 @@ export class SortByComponent implements OnInit {
34
34
  },
35
35
  {
36
36
  label: marker('results.sortBy.dateStamp'),
37
- value: SortByEnum.RESOURCE_DATES,
37
+ value: SortByEnum.RESOURCE_DATE,
38
38
  },
39
39
  {
40
40
  label: marker('results.sortBy.popularity'),
@@ -89,6 +89,15 @@
89
89
  "domain.contact.role.stakeholder": "Beteiligter",
90
90
  "domain.contact.role.unspecified": "Nicht angegeben",
91
91
  "domain.contact.role.user": "Benutzer",
92
+ "domain.record.associationType.collectiveTitle": "",
93
+ "domain.record.associationType.crossReference": "",
94
+ "domain.record.associationType.dependency": "",
95
+ "domain.record.associationType.isComposedOf": "",
96
+ "domain.record.associationType.largerWorkCitation": "",
97
+ "domain.record.associationType.partOfSeamlessDatabase": "",
98
+ "domain.record.associationType.revisionOf": "",
99
+ "domain.record.associationType.series": "",
100
+ "domain.record.associationType.stereoMate": "",
92
101
  "domain.record.keywordType.other": "Stichworte",
93
102
  "domain.record.keywordType.place": "Ort",
94
103
  "domain.record.keywordType.temporal": "Zeitlich",
@@ -212,6 +221,9 @@
212
221
  "editor.record.form.field.organisation": "Ansprechpartner - Organisation",
213
222
  "editor.record.form.field.otherConstraints": "Allgemeine Einschränkung",
214
223
  "editor.record.form.field.overviews": "Übersicht",
224
+ "editor.record.form.field.parentIdentifier": "",
225
+ "editor.record.form.field.parentLink": "",
226
+ "editor.record.form.field.parentType": "",
215
227
  "editor.record.form.field.recordUpdated": "Datensatz zuletzt aktualisiert",
216
228
  "editor.record.form.field.resourceCreated": "Erstellungsdatum",
217
229
  "editor.record.form.field.resourceIdentifier": "Kennung",
@@ -533,7 +545,7 @@
533
545
  "record.metadata.download": "Herunterladen",
534
546
  "record.metadata.feature.catalog": "Attributkatalog",
535
547
  "record.metadata.formats": "Formate",
536
- "record.metadata.isGeographical": "geographischer Datensatz",
548
+ "record.metadata.isGeographical": "geo",
537
549
  "record.metadata.keywords": "Stichworte",
538
550
  "record.metadata.languages": "Sprachen",
539
551
  "record.metadata.link.postgis.table": "Tabelle:",
@@ -89,6 +89,15 @@
89
89
  "domain.contact.role.stakeholder": "Stakeholder",
90
90
  "domain.contact.role.unspecified": "Unspecified",
91
91
  "domain.contact.role.user": "User",
92
+ "domain.record.associationType.collectiveTitle": "Collective Title",
93
+ "domain.record.associationType.crossReference": "Cross reference",
94
+ "domain.record.associationType.dependency": "Dependency",
95
+ "domain.record.associationType.isComposedOf": "Is composed of",
96
+ "domain.record.associationType.largerWorkCitation": "Larger work citation",
97
+ "domain.record.associationType.partOfSeamlessDatabase": "Part of seamless database",
98
+ "domain.record.associationType.revisionOf": "Revision Of",
99
+ "domain.record.associationType.series": "Series",
100
+ "domain.record.associationType.stereoMate": "Stereo mate",
92
101
  "domain.record.keywordType.other": "Keywords",
93
102
  "domain.record.keywordType.place": "Place",
94
103
  "domain.record.keywordType.temporal": "Temporal",
@@ -212,6 +221,9 @@
212
221
  "editor.record.form.field.organisation": "Point of contact - Organization",
213
222
  "editor.record.form.field.otherConstraints": "Other constraint",
214
223
  "editor.record.form.field.overviews": "Overview",
224
+ "editor.record.form.field.parentIdentifier": "Parent identifier",
225
+ "editor.record.form.field.parentLink": "This record has a parent link",
226
+ "editor.record.form.field.parentType": "Relationship type",
215
227
  "editor.record.form.field.recordUpdated": "Record updated",
216
228
  "editor.record.form.field.resourceCreated": "{recordKind, select, dataset{Dataset} service{Service} reuse{Reuse} other{Record}} created",
217
229
  "editor.record.form.field.resourceIdentifier": "Identifier",
@@ -533,7 +545,7 @@
533
545
  "record.metadata.download": "Downloads",
534
546
  "record.metadata.feature.catalog": "Feature catalog",
535
547
  "record.metadata.formats": "Formats",
536
- "record.metadata.isGeographical": "geographic dataset",
548
+ "record.metadata.isGeographical": "geo",
537
549
  "record.metadata.keywords": "Keywords",
538
550
  "record.metadata.languages": "Languages",
539
551
  "record.metadata.link.postgis.table": "table :",
@@ -89,6 +89,15 @@
89
89
  "domain.contact.role.stakeholder": "",
90
90
  "domain.contact.role.unspecified": "",
91
91
  "domain.contact.role.user": "",
92
+ "domain.record.associationType.collectiveTitle": "",
93
+ "domain.record.associationType.crossReference": "",
94
+ "domain.record.associationType.dependency": "",
95
+ "domain.record.associationType.isComposedOf": "",
96
+ "domain.record.associationType.largerWorkCitation": "",
97
+ "domain.record.associationType.partOfSeamlessDatabase": "",
98
+ "domain.record.associationType.revisionOf": "",
99
+ "domain.record.associationType.series": "",
100
+ "domain.record.associationType.stereoMate": "",
92
101
  "domain.record.keywordType.other": "",
93
102
  "domain.record.keywordType.place": "",
94
103
  "domain.record.keywordType.temporal": "",
@@ -212,6 +221,9 @@
212
221
  "editor.record.form.field.organisation": "Punto de contacto - Organización",
213
222
  "editor.record.form.field.otherConstraints": "",
214
223
  "editor.record.form.field.overviews": "",
224
+ "editor.record.form.field.parentIdentifier": "",
225
+ "editor.record.form.field.parentLink": "",
226
+ "editor.record.form.field.parentType": "",
215
227
  "editor.record.form.field.recordUpdated": "",
216
228
  "editor.record.form.field.resourceCreated": "",
217
229
  "editor.record.form.field.resourceIdentifier": "",
@@ -89,6 +89,15 @@
89
89
  "domain.contact.role.stakeholder": "Partie prenante",
90
90
  "domain.contact.role.unspecified": "Non spécifié",
91
91
  "domain.contact.role.user": "Utilisateur",
92
+ "domain.record.associationType.collectiveTitle": "Titre commun",
93
+ "domain.record.associationType.crossReference": "Référence croisée",
94
+ "domain.record.associationType.dependency": "Dépendance",
95
+ "domain.record.associationType.isComposedOf": "Est composé de",
96
+ "domain.record.associationType.largerWorkCitation": "Référence mère",
97
+ "domain.record.associationType.partOfSeamlessDatabase": "Partie d'une même base de données",
98
+ "domain.record.associationType.revisionOf": "Révision de",
99
+ "domain.record.associationType.series": "Séries",
100
+ "domain.record.associationType.stereoMate": "Stéréo restitution",
92
101
  "domain.record.keywordType.other": "Mots-clés",
93
102
  "domain.record.keywordType.place": "Localisation",
94
103
  "domain.record.keywordType.temporal": "Temps",
@@ -212,6 +221,9 @@
212
221
  "editor.record.form.field.organisation": "Point de contact - Organisation",
213
222
  "editor.record.form.field.otherConstraints": "Contrainte générale",
214
223
  "editor.record.form.field.overviews": "Aperçu",
224
+ "editor.record.form.field.parentIdentifier": "Identifiant du parent",
225
+ "editor.record.form.field.parentLink": "Cette donnée possède un lien de parenté",
226
+ "editor.record.form.field.parentType": "Type de parenté",
215
227
  "editor.record.form.field.recordUpdated": "Date de mise à jour",
216
228
  "editor.record.form.field.resourceCreated": "Date de création",
217
229
  "editor.record.form.field.resourceIdentifier": "Identifiant",
@@ -533,7 +545,7 @@
533
545
  "record.metadata.download": "Téléchargements",
534
546
  "record.metadata.feature.catalog": "Catalogue d'attributs",
535
547
  "record.metadata.formats": "Formats",
536
- "record.metadata.isGeographical": "donnée géographique",
548
+ "record.metadata.isGeographical": "géo",
537
549
  "record.metadata.keywords": "Mots-clés",
538
550
  "record.metadata.languages": "Langues",
539
551
  "record.metadata.link.postgis.table": "table :",
@@ -89,6 +89,15 @@
89
89
  "domain.contact.role.stakeholder": "Parte interessata",
90
90
  "domain.contact.role.unspecified": "Non specificato",
91
91
  "domain.contact.role.user": "Utente",
92
+ "domain.record.associationType.collectiveTitle": "",
93
+ "domain.record.associationType.crossReference": "",
94
+ "domain.record.associationType.dependency": "",
95
+ "domain.record.associationType.isComposedOf": "",
96
+ "domain.record.associationType.largerWorkCitation": "",
97
+ "domain.record.associationType.partOfSeamlessDatabase": "",
98
+ "domain.record.associationType.revisionOf": "",
99
+ "domain.record.associationType.series": "",
100
+ "domain.record.associationType.stereoMate": "",
92
101
  "domain.record.keywordType.other": "Parole chiave",
93
102
  "domain.record.keywordType.place": "Luogo",
94
103
  "domain.record.keywordType.temporal": "Temporale",
@@ -212,6 +221,9 @@
212
221
  "editor.record.form.field.organisation": "",
213
222
  "editor.record.form.field.otherConstraints": "Vincolo generale",
214
223
  "editor.record.form.field.overviews": "Panoramica",
224
+ "editor.record.form.field.parentIdentifier": "",
225
+ "editor.record.form.field.parentLink": "",
226
+ "editor.record.form.field.parentType": "",
215
227
  "editor.record.form.field.recordUpdated": "Data di aggiornamento",
216
228
  "editor.record.form.field.resourceCreated": "Data di creazione",
217
229
  "editor.record.form.field.resourceIdentifier": "Identificatore",
@@ -533,7 +545,7 @@
533
545
  "record.metadata.download": "Download",
534
546
  "record.metadata.feature.catalog": "Catalogo dei oggetti",
535
547
  "record.metadata.formats": "Formati",
536
- "record.metadata.isGeographical": "dati geografici",
548
+ "record.metadata.isGeographical": "geo",
537
549
  "record.metadata.keywords": "Parole chiave",
538
550
  "record.metadata.languages": "Lingue",
539
551
  "record.metadata.link.postgis.table": "",