geonetwork-ui 2.7.0-dev.3d703fd88 → 2.7.0-dev.65c46841b

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 (84) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +4 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +5 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +12 -2
  4. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +5 -1
  5. package/esm2022/libs/feature/editor/src/index.mjs +2 -1
  6. package/esm2022/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.mjs +80 -0
  7. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +3 -3
  8. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +1 -3
  9. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +4 -2
  10. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +4 -4
  11. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +21 -43
  12. package/esm2022/libs/util/shared/src/index.mjs +2 -2
  13. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -2
  14. package/esm2022/libs/util/shared/src/lib/record/index.mjs +3 -0
  15. package/esm2022/libs/util/shared/src/lib/record/quality-score.util.mjs +45 -0
  16. package/esm2022/libs/util/shared/src/lib/record/record.util.mjs +56 -0
  17. package/esm2022/translations/de.json +7 -0
  18. package/esm2022/translations/en.json +7 -0
  19. package/esm2022/translations/es.json +7 -0
  20. package/esm2022/translations/fr.json +8 -1
  21. package/esm2022/translations/it.json +7 -0
  22. package/esm2022/translations/nl.json +7 -0
  23. package/esm2022/translations/pt.json +7 -0
  24. package/esm2022/translations/sk.json +7 -0
  25. package/fesm2022/geonetwork-ui.mjs +226 -55
  26. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  27. package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -1
  28. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  29. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +1 -0
  30. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  31. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  32. package/libs/feature/editor/src/index.d.ts +1 -0
  33. package/libs/feature/editor/src/index.d.ts.map +1 -1
  34. package/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.d.ts +19 -0
  35. package/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.d.ts.map +1 -0
  36. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  37. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  38. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  39. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +7 -6
  40. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  41. package/libs/util/shared/src/index.d.ts +1 -1
  42. package/libs/util/shared/src/index.d.ts.map +1 -1
  43. package/libs/util/shared/src/lib/links/link-utils.d.ts +1 -1
  44. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  45. package/libs/util/shared/src/lib/record/index.d.ts +3 -0
  46. package/libs/util/shared/src/lib/record/index.d.ts.map +1 -0
  47. package/libs/util/shared/src/lib/record/quality-score.util.d.ts +13 -0
  48. package/libs/util/shared/src/lib/record/quality-score.util.d.ts.map +1 -0
  49. package/libs/util/shared/src/lib/record/record.util.d.ts +3 -0
  50. package/libs/util/shared/src/lib/record/record.util.d.ts.map +1 -0
  51. package/package.json +1 -1
  52. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/status.mapper.ts +3 -0
  53. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.ts +3 -0
  54. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -0
  55. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +12 -1
  56. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +4 -0
  57. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +0 -3
  58. package/src/libs/feature/editor/src/index.ts +1 -0
  59. package/src/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.css +0 -0
  60. package/src/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.html +37 -0
  61. package/src/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.ts +90 -0
  62. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +2 -1
  63. package/src/libs/feature/editor/src/lib/fields.config.ts +0 -2
  64. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +3 -1
  65. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +1 -0
  66. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +5 -1
  67. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +1 -0
  68. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +21 -54
  69. package/src/libs/util/shared/src/index.ts +1 -1
  70. package/src/libs/util/shared/src/lib/links/link-utils.ts +2 -1
  71. package/src/libs/util/shared/src/lib/record/index.ts +2 -0
  72. package/src/libs/util/shared/src/lib/record/quality-score.util.ts +69 -0
  73. package/src/libs/util/shared/src/lib/{record.util.ts → record/record.util.ts} +1 -1
  74. package/translations/de.json +7 -0
  75. package/translations/en.json +7 -0
  76. package/translations/es.json +7 -0
  77. package/translations/fr.json +8 -1
  78. package/translations/it.json +7 -0
  79. package/translations/nl.json +7 -0
  80. package/translations/pt.json +7 -0
  81. package/translations/sk.json +7 -0
  82. package/esm2022/libs/util/shared/src/lib/record.util.mjs +0 -56
  83. package/libs/util/shared/src/lib/record.util.d.ts +0 -3
  84. package/libs/util/shared/src/lib/record.util.d.ts.map +0 -1
@@ -14,15 +14,16 @@ import {
14
14
  PopoverComponent,
15
15
  ProgressBarComponent,
16
16
  } from '../../../../../../libs/ui/widgets/src'
17
+ import {
18
+ getQualityValidators,
19
+ getAllKeysValidator,
20
+ type ValidatorMapperKeys,
21
+ } from '../../../../../../libs/util/shared/src'
17
22
  import { CommonModule } from '@angular/common'
18
23
  import { TranslateDirective } from '@ngx-translate/core'
19
24
  import { NgIcon, provideIcons, provideNgIconsConfig } from '@ng-icons/core'
20
25
  import { matInfoOutline } from '@ng-icons/material-icons/outline'
21
26
 
22
- type QualityChecks = {
23
- [key: string]: (metadata: Partial<CatalogRecord>) => boolean
24
- }
25
-
26
27
  @Component({
27
28
  selector: 'gn-ui-metadata-quality',
28
29
  templateUrl: './metadata-quality.component.html',
@@ -48,77 +49,43 @@ type QualityChecks = {
48
49
  ],
49
50
  })
50
51
  export class MetadataQualityComponent implements OnChanges {
51
- @Input() metadata: Partial<CatalogRecord>
52
+ @Input() metadata: CatalogRecord
52
53
  @Input() smaller = false
53
54
  @Input() metadataQualityDisplay: boolean
55
+ @Input() popoverDisplay = true
56
+ @Input() propsToValidate?: ValidatorMapperKeys[]
57
+ @Input() forceComputeScore = false // Instead of returning es' quality score
54
58
 
55
59
  items: MetadataQualityItem[] = []
56
60
 
57
61
  get qualityScore() {
58
- const qualityScore = this.metadata?.extras?.qualityScore
62
+ const qualityScore = !this.forceComputeScore
63
+ ? this.metadata?.extras?.qualityScore
64
+ : this.computedQualityScore
65
+
59
66
  return typeof qualityScore === 'number'
60
67
  ? qualityScore
61
- : this.calculatedQualityScore
68
+ : this.computedQualityScore
62
69
  }
63
70
 
64
- get calculatedQualityScore(): number {
71
+ get computedQualityScore(): number {
65
72
  return Math.round(
66
73
  (this.items.filter(({ value }) => value).length * 100) / this.items.length
67
74
  )
68
75
  }
69
76
 
70
- private add(name: string, value: boolean) {
71
- if (this.metadataQualityDisplay?.[name] !== false) {
72
- this.items.push({ name, value })
73
- }
74
- }
75
77
  hasGetCapabilities(url: string): boolean {
76
78
  return url.toLowerCase().includes('capabilities')
77
79
  }
78
80
 
79
- private readonly COMMON_CHECKS: QualityChecks = {
80
- title: (metadata) => !!metadata?.title,
81
- description: (metadata) => !!metadata?.abstract,
82
- keywords: (metadata) => (metadata?.keywords?.length ?? 0) > 0,
83
- legalConstraints: (metadata) =>
84
- (metadata?.legalConstraints?.length ?? 0) > 0,
85
- contact: (metadata) => !!metadata?.contacts?.[0]?.email,
86
- }
87
-
88
- private readonly SPECIFIC_CHECKS: Record<string, QualityChecks> = {
89
- dataset: {
90
- updateFrequency: (metadata) => !!metadata?.updateFrequency,
91
- topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
92
- organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
93
- },
94
- service: {
95
- capabilities: (metadata) =>
96
- (metadata?.onlineResources ?? []).some((resource) =>
97
- this.hasGetCapabilities(resource?.url?.href ?? '')
98
- ),
99
- },
100
- reuse: {
101
- topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
102
- organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
103
- source: (metadata) => !!metadata?.extras?.sourcesIdentifiers,
104
- },
105
- }
106
-
107
81
  initialize() {
108
- this.items = []
109
-
110
- Object.entries(this.COMMON_CHECKS).forEach(([name, check]) => {
111
- this.add(name, check(this.metadata))
112
- })
113
-
114
- const datasetType = this.metadata?.kind
115
- if (datasetType && this.SPECIFIC_CHECKS[datasetType]) {
116
- Object.entries(this.SPECIFIC_CHECKS[datasetType]).forEach(
117
- ([name, check]) => {
118
- this.add(name, check(this.metadata))
119
- }
120
- )
82
+ if (!this.propsToValidate) {
83
+ this.propsToValidate = getAllKeysValidator()
121
84
  }
85
+
86
+ this.items = getQualityValidators(this.metadata, this.propsToValidate).map(
87
+ ({ name, validator }) => ({ name, value: validator() })
88
+ )
122
89
  }
123
90
 
124
91
  ngOnChanges(changes: SimpleChanges): void {
@@ -3,4 +3,4 @@ export * from './lib/utils'
3
3
  export * from './lib/links'
4
4
  export * from './lib/image-fallback.directive'
5
5
  export * from './lib/gn-ui-version'
6
- export * from './lib/record.util'
6
+ export * from './lib/record'
@@ -23,8 +23,8 @@ export const FORMATS = {
23
23
  excel: {
24
24
  extensions: [
25
25
  'excel',
26
- 'xls',
27
26
  'xlsx',
27
+ 'xls',
28
28
  'ms-excel',
29
29
  'openxmlformats-officedocument',
30
30
  ],
@@ -190,6 +190,7 @@ export function isFormatInQueryParam(
190
190
  alias: string
191
191
  ): boolean {
192
192
  const queryParams = link.url.searchParams
193
+ if (!queryParams) return false
193
194
  for (const [key, value] of queryParams.entries()) {
194
195
  if (key === 'format' || key === 'f') {
195
196
  return value === alias
@@ -0,0 +1,2 @@
1
+ export * from './quality-score.util'
2
+ export * from './record.util'
@@ -0,0 +1,69 @@
1
+ import {
2
+ CatalogRecord,
3
+ RecordKind,
4
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
5
+
6
+ type TValidatorMapper = {
7
+ [key: string]: (metadata: Partial<CatalogRecord>) => boolean
8
+ }
9
+
10
+ const ValidatorMapper: TValidatorMapper = {
11
+ title: (record) => !!record?.title,
12
+ abstract: (record) => !!record?.abstract,
13
+ keywords: (record) => (record?.keywords?.length ?? 0) > 0,
14
+ legalConstraints: (record) => (record?.legalConstraints?.length ?? 0) > 0,
15
+ contacts: (record) => !!record?.contacts?.[0]?.email,
16
+ updateFrequency: (record) => !!record?.updateFrequency,
17
+ topics: (record) => (record?.topics?.length ?? 0) > 0,
18
+ organisation: (record) => !!record?.contacts?.[0]?.organization?.name,
19
+ capabilities: (record) =>
20
+ record?.onlineResources?.some((resource) =>
21
+ resource?.url?.href.toLowerCase().includes('capabilities')
22
+ ),
23
+ source: (record) => !!record?.extras?.sourcesIdentifiers,
24
+ } as const
25
+
26
+ export type ValidatorMapperKeys = keyof typeof ValidatorMapper & string
27
+
28
+ export function getAllKeysValidator() {
29
+ return Object.keys(ValidatorMapper)
30
+ }
31
+
32
+ function getMappersFromKind(kind: RecordKind) {
33
+ let kindKeys = <ValidatorMapperKeys[]>[]
34
+ const commonsKeys = <ValidatorMapperKeys[]>[
35
+ 'title',
36
+ 'abstract',
37
+ 'keywords',
38
+ 'legalConstraints',
39
+ 'contacts',
40
+ ]
41
+
42
+ switch (kind) {
43
+ case 'service':
44
+ kindKeys = ['capabilities']
45
+ break
46
+ case 'reuse':
47
+ kindKeys = ['topics', 'organisation', 'source']
48
+ break
49
+ case 'dataset':
50
+ default:
51
+ kindKeys = ['updateFrequency', 'topics', 'organisation']
52
+ }
53
+
54
+ return [...commonsKeys, ...kindKeys]
55
+ }
56
+
57
+ export function getQualityValidators(
58
+ record: Partial<CatalogRecord>,
59
+ propsToValidate: ValidatorMapperKeys[]
60
+ ) {
61
+ const filteredProps = propsToValidate.filter((prop) =>
62
+ getMappersFromKind(record.kind).includes(prop)
63
+ )
64
+
65
+ return filteredProps.map((name) => ({
66
+ name,
67
+ validator: () => ValidatorMapper[name](record),
68
+ }))
69
+ }
@@ -10,7 +10,7 @@ import {
10
10
  OnlineLinkResource,
11
11
  Organization,
12
12
  ServiceEndpoint,
13
- } from '../../../../../libs/common/domain/src/lib/model/record'
13
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
14
14
 
15
15
  type TranslatedRecordObjects =
16
16
  | BaseRecord
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "Abgeschlossen",
87
87
  "domain.record.status.deprecated": "Veraltet",
88
88
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
89
+ "domain.record.status.planned": "",
89
90
  "domain.record.status.removed": "Entfernt",
91
+ "domain.record.status.required": "",
90
92
  "domain.record.status.under_development": "In Erstellung",
91
93
  "domain.record.updateFrequency.annually": "Daten werden jedes Jahr aktualisiert",
92
94
  "domain.record.updateFrequency.asNeeded": "Daten werden nach Bedarf aktualisiert",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "",
143
145
  "editor.record.form.field.abstract": "Kurzbeschreibung",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "Ansprechpartner - Email",
145
148
  "editor.record.form.field.contacts.noContact": "",
146
149
  "editor.record.form.field.contacts.placeholder": "",
147
150
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "",
168
171
  "editor.record.form.field.onlineResources": "",
172
+ "editor.record.form.field.organisation": "Ansprechpartner - Organisation",
169
173
  "editor.record.form.field.otherConstraints": "Allgemeine Einschränkung",
170
174
  "editor.record.form.field.overviews": "",
171
175
  "editor.record.form.field.recordUpdated": "Datensatz zuletzt aktualisiert",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "Zeitlicher Umfang",
178
182
  "editor.record.form.field.title": "Metadaten-Titel",
179
183
  "editor.record.form.field.title.placeholder": "Geben Sie einen Titel ein",
184
+ "editor.record.form.field.topics": "Kategorien",
180
185
  "editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
181
186
  "editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
182
187
  "editor.record.form.keywords.place.placeholder": "",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "",
192
197
  "editor.record.form.license.pddl": "",
193
198
  "editor.record.form.license.unknown": "",
199
+ "editor.record.form.metadataQuality.open": "Öffnen Sie das Panel zur Metadatenqualität",
200
+ "editor.record.form.metadataQuality.title": "Vollständigkeit",
194
201
  "editor.record.form.multilingual.activate": "",
195
202
  "editor.record.form.multilingual.default": "",
196
203
  "editor.record.form.multilingual.enable": "",
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "Completed",
87
87
  "domain.record.status.deprecated": "Deprecated",
88
88
  "domain.record.status.ongoing": "Ongoing",
89
+ "domain.record.status.planned": "Planned",
89
90
  "domain.record.status.removed": "Removed",
91
+ "domain.record.status.required": "Required",
90
92
  "domain.record.status.under_development": "Under development",
91
93
  "domain.record.updateFrequency.annually": "Data is updated every year",
92
94
  "domain.record.updateFrequency.asNeeded": "Data is updated as deemed necessary",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "Since you created this draft, the dataset has been updated on { date } by { user }. Publishing your draft might erase their edits. To avoid this, you need to either cancel your changes or knowingly publish your own version.",
143
145
  "editor.record.form.field.abstract": "Abstract",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "Point of contact - Email",
145
148
  "editor.record.form.field.contacts.noContact": "Please provide at least one point of contact.",
146
149
  "editor.record.form.field.contacts.placeholder": "Choose a contact",
147
150
  "editor.record.form.field.contactsForResource.noContact": "Please provide at least one point of contact responsible for the data.",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "Link to a file",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "Link to a service",
168
171
  "editor.record.form.field.onlineResources": "Distribution",
172
+ "editor.record.form.field.organisation": "Point of contact - Organization",
169
173
  "editor.record.form.field.otherConstraints": "Other constraint",
170
174
  "editor.record.form.field.overviews": "Overview",
171
175
  "editor.record.form.field.recordUpdated": "Record updated",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "Temporal extents",
178
182
  "editor.record.form.field.title": "Metadata title",
179
183
  "editor.record.form.field.title.placeholder": "Enter a title",
184
+ "editor.record.form.field.topics": "Categories",
180
185
  "editor.record.form.field.uniqueIdentifier": "Unique identifier",
181
186
  "editor.record.form.field.updateFrequency": "Update frequency",
182
187
  "editor.record.form.keywords.place.placeholder": "Search for place keywords",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
192
197
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
193
198
  "editor.record.form.license.unknown": "Unknown or absent",
199
+ "editor.record.form.metadataQuality.open": "Open the metadata quality panel",
200
+ "editor.record.form.metadataQuality.title": "Completeness",
194
201
  "editor.record.form.multilingual.activate": "Activate the languages",
195
202
  "editor.record.form.multilingual.default": "Default",
196
203
  "editor.record.form.multilingual.enable": "Multilingual Mode",
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "",
87
87
  "domain.record.status.deprecated": "",
88
88
  "domain.record.status.ongoing": "",
89
+ "domain.record.status.planned": "",
89
90
  "domain.record.status.removed": "",
91
+ "domain.record.status.required": "",
90
92
  "domain.record.status.under_development": "",
91
93
  "domain.record.updateFrequency.annually": "Los datos se actualizan cada año",
92
94
  "domain.record.updateFrequency.asNeeded": "Los datos se actualizan según sea necesario",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "",
143
145
  "editor.record.form.field.abstract": "",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "Punto de contacto - Correo ",
145
148
  "editor.record.form.field.contacts.noContact": "",
146
149
  "editor.record.form.field.contacts.placeholder": "",
147
150
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "",
168
171
  "editor.record.form.field.onlineResources": "",
172
+ "editor.record.form.field.organisation": "Punto de contacto - Organización",
169
173
  "editor.record.form.field.otherConstraints": "",
170
174
  "editor.record.form.field.overviews": "",
171
175
  "editor.record.form.field.recordUpdated": "",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "",
178
182
  "editor.record.form.field.title": "",
179
183
  "editor.record.form.field.title.placeholder": "Introduzca un título",
184
+ "editor.record.form.field.topics": "Categorías",
180
185
  "editor.record.form.field.uniqueIdentifier": "",
181
186
  "editor.record.form.field.updateFrequency": "",
182
187
  "editor.record.form.keywords.place.placeholder": "",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "",
192
197
  "editor.record.form.license.pddl": "",
193
198
  "editor.record.form.license.unknown": "",
199
+ "editor.record.form.metadataQuality.open": "Abrir el panel de calidad de los metadatos",
200
+ "editor.record.form.metadataQuality.title": "Completitud",
194
201
  "editor.record.form.multilingual.activate": "",
195
202
  "editor.record.form.multilingual.default": "",
196
203
  "editor.record.form.multilingual.enable": "",
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "Finalisé",
87
87
  "domain.record.status.deprecated": "Obsolète",
88
88
  "domain.record.status.ongoing": "Mise à jour continue",
89
+ "domain.record.status.planned": "Planifié",
89
90
  "domain.record.status.removed": "Supprimé",
91
+ "domain.record.status.required": "Obligatoire",
90
92
  "domain.record.status.under_development": "En cours de création",
91
93
  "domain.record.updateFrequency.annually": "Les données sont mises à jour chaque année",
92
94
  "domain.record.updateFrequency.asNeeded": "Les données sont mises à jour selon les besoins",
@@ -99,7 +101,7 @@
99
101
  "domain.record.updateFrequency.irregular": "Les données sont mises à jour à intervalles irréguliers",
100
102
  "domain.record.updateFrequency.month": "{count, plural, =0{0 fois} one{Une fois} other{{count} fois}} par mois",
101
103
  "domain.record.updateFrequency.monthly": "Les données sont mises à jour chaque mois",
102
- "domain.record.updateFrequency.notPlanned": "Il n'y a pas de plan pour mettre à jour les données",
104
+ "domain.record.updateFrequency.notPlanned": "La mise à jour des données n’est pas planifiée",
103
105
  "domain.record.updateFrequency.periodic": "Les données sont mises à jour à intervalles réguliers",
104
106
  "domain.record.updateFrequency.quarterly": "Les données sont mises à jour tous les trois mois",
105
107
  "domain.record.updateFrequency.semimonthly": "Les données sont mises à jour deux fois par mois",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "Depuis la création de ce brouillon, ce jeu de données a été modifié le { date } par { user }. Publier votre version peut supprimer ses modifications. Pour éviter cela, vous pouvez annuler vos changements, ou publier votre version en connaissance de cause.",
143
145
  "editor.record.form.field.abstract": "Description",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "Point de contact - Email",
145
148
  "editor.record.form.field.contacts.noContact": "Veuillez renseigner au moins un point de contact.",
146
149
  "editor.record.form.field.contacts.placeholder": "Choisissez un contact",
147
150
  "editor.record.form.field.contactsForResource.noContact": "Veuillez renseigner au moins un point de contact responsable de la donnée.",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "Lier un fichier",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "Lier un service",
168
171
  "editor.record.form.field.onlineResources": "Distribution",
172
+ "editor.record.form.field.organisation": "Point de contact - Organisation",
169
173
  "editor.record.form.field.otherConstraints": "Contrainte générale",
170
174
  "editor.record.form.field.overviews": "Aperçu",
171
175
  "editor.record.form.field.recordUpdated": "Date de mise à jour",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "Étendue temporelle",
178
182
  "editor.record.form.field.title": "Titre",
179
183
  "editor.record.form.field.title.placeholder": "Saisir un titre",
184
+ "editor.record.form.field.topics": "Thèmes",
180
185
  "editor.record.form.field.uniqueIdentifier": "Identifiant unique",
181
186
  "editor.record.form.field.updateFrequency": "Fréquence de mise à jour",
182
187
  "editor.record.form.keywords.place.placeholder": "Rechercher une localisation par mot-clé",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
192
197
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
193
198
  "editor.record.form.license.unknown": "Inconnue ou absente",
199
+ "editor.record.form.metadataQuality.open": "Ouvrir le menu de qualité des métadonnées",
200
+ "editor.record.form.metadataQuality.title": "Complétion",
194
201
  "editor.record.form.multilingual.activate": "Activez les langues",
195
202
  "editor.record.form.multilingual.default": "Par défaut",
196
203
  "editor.record.form.multilingual.enable": "Mode Multilingue",
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "Completato",
87
87
  "domain.record.status.deprecated": "Deprecato",
88
88
  "domain.record.status.ongoing": "Aggiornamento continuo",
89
+ "domain.record.status.planned": "",
89
90
  "domain.record.status.removed": "Rimosso",
91
+ "domain.record.status.required": "",
90
92
  "domain.record.status.under_development": "In fase di creazione",
91
93
  "domain.record.updateFrequency.annually": "I dati vengono aggiornati ogni anno",
92
94
  "domain.record.updateFrequency.asNeeded": "I dati vengono aggiornati secondo necessità",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "Da quando è stata creata questa bozza, questo dataset è stato modificato il { date } da { user }. La pubblicazione della sua versione potrebbe rimuovere le loro modifiche. Per evitarlo, puoi annullare le sue modifiche o pubblicare la sua versione consapevolmente.",
143
145
  "editor.record.form.field.abstract": "Riassunto",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "",
145
148
  "editor.record.form.field.contacts.noContact": "Inserisci almeno un punto di contatto.",
146
149
  "editor.record.form.field.contacts.placeholder": "Scegli un contatto",
147
150
  "editor.record.form.field.contactsForResource.noContact": "Inserisci almeno un punto di contatto responsabile dei dati.",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "Collega un file",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "Collega un servizio",
168
171
  "editor.record.form.field.onlineResources": "Distribuzione",
172
+ "editor.record.form.field.organisation": "",
169
173
  "editor.record.form.field.otherConstraints": "Vincolo generale",
170
174
  "editor.record.form.field.overviews": "Panoramica",
171
175
  "editor.record.form.field.recordUpdated": "Data di aggiornamento",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "Estensioni temporali",
178
182
  "editor.record.form.field.title": "Titolo",
179
183
  "editor.record.form.field.title.placeholder": "Inserisci un titolo",
184
+ "editor.record.form.field.topics": "",
180
185
  "editor.record.form.field.uniqueIdentifier": "Identificatore univoco",
181
186
  "editor.record.form.field.updateFrequency": "Frequenza di aggiornamento",
182
187
  "editor.record.form.keywords.place.placeholder": "Cerca una posizione per parola chiave",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
192
197
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
193
198
  "editor.record.form.license.unknown": "Sconosciuto o assente",
199
+ "editor.record.form.metadataQuality.open": "",
200
+ "editor.record.form.metadataQuality.title": "",
194
201
  "editor.record.form.multilingual.activate": "",
195
202
  "editor.record.form.multilingual.default": "",
196
203
  "editor.record.form.multilingual.enable": "Aprire il pannello multilingue",
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "",
87
87
  "domain.record.status.deprecated": "",
88
88
  "domain.record.status.ongoing": "",
89
+ "domain.record.status.planned": "",
89
90
  "domain.record.status.removed": "",
91
+ "domain.record.status.required": "",
90
92
  "domain.record.status.under_development": "",
91
93
  "domain.record.updateFrequency.annually": "Gegevens worden elk jaar bijgewerkt",
92
94
  "domain.record.updateFrequency.asNeeded": "Gegevens worden bijgewerkt naar behoefte",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "",
143
145
  "editor.record.form.field.abstract": "",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "",
145
148
  "editor.record.form.field.contacts.noContact": "",
146
149
  "editor.record.form.field.contacts.placeholder": "",
147
150
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "",
168
171
  "editor.record.form.field.onlineResources": "",
172
+ "editor.record.form.field.organisation": "",
169
173
  "editor.record.form.field.otherConstraints": "",
170
174
  "editor.record.form.field.overviews": "",
171
175
  "editor.record.form.field.recordUpdated": "",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "",
178
182
  "editor.record.form.field.title": "",
179
183
  "editor.record.form.field.title.placeholder": "Voer een titel in",
184
+ "editor.record.form.field.topics": "",
180
185
  "editor.record.form.field.uniqueIdentifier": "",
181
186
  "editor.record.form.field.updateFrequency": "",
182
187
  "editor.record.form.keywords.place.placeholder": "",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "",
192
197
  "editor.record.form.license.pddl": "",
193
198
  "editor.record.form.license.unknown": "",
199
+ "editor.record.form.metadataQuality.open": "",
200
+ "editor.record.form.metadataQuality.title": "",
194
201
  "editor.record.form.multilingual.activate": "",
195
202
  "editor.record.form.multilingual.default": "",
196
203
  "editor.record.form.multilingual.enable": "",
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "",
87
87
  "domain.record.status.deprecated": "",
88
88
  "domain.record.status.ongoing": "",
89
+ "domain.record.status.planned": "",
89
90
  "domain.record.status.removed": "",
91
+ "domain.record.status.required": "",
90
92
  "domain.record.status.under_development": "",
91
93
  "domain.record.updateFrequency.annually": "Os dados são atualizados anualmente",
92
94
  "domain.record.updateFrequency.asNeeded": "Os dados são atualizados conforme necessário",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "",
143
145
  "editor.record.form.field.abstract": "",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "",
145
148
  "editor.record.form.field.contacts.noContact": "",
146
149
  "editor.record.form.field.contacts.placeholder": "",
147
150
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "",
168
171
  "editor.record.form.field.onlineResources": "",
172
+ "editor.record.form.field.organisation": "",
169
173
  "editor.record.form.field.otherConstraints": "",
170
174
  "editor.record.form.field.overviews": "",
171
175
  "editor.record.form.field.recordUpdated": "",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "",
178
182
  "editor.record.form.field.title": "",
179
183
  "editor.record.form.field.title.placeholder": "Insira um título",
184
+ "editor.record.form.field.topics": "",
180
185
  "editor.record.form.field.uniqueIdentifier": "",
181
186
  "editor.record.form.field.updateFrequency": "",
182
187
  "editor.record.form.keywords.place.placeholder": "",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "",
192
197
  "editor.record.form.license.pddl": "",
193
198
  "editor.record.form.license.unknown": "",
199
+ "editor.record.form.metadataQuality.open": "",
200
+ "editor.record.form.metadataQuality.title": "",
194
201
  "editor.record.form.multilingual.activate": "",
195
202
  "editor.record.form.multilingual.default": "",
196
203
  "editor.record.form.multilingual.enable": "",
@@ -86,7 +86,9 @@
86
86
  "domain.record.status.completed": "Dokončené",
87
87
  "domain.record.status.deprecated": "Zastarané",
88
88
  "domain.record.status.ongoing": "Prebiehajúce",
89
+ "domain.record.status.planned": "",
89
90
  "domain.record.status.removed": "Odstránené",
91
+ "domain.record.status.required": "",
90
92
  "domain.record.status.under_development": "Vo vývoji",
91
93
  "domain.record.updateFrequency.annually": "Údaje sa aktualizujú každý rok",
92
94
  "domain.record.updateFrequency.asNeeded": "Údaje sa aktualizujú podľa potreby",
@@ -142,6 +144,7 @@
142
144
  "editor.record.form.draft.updateAlert": "",
143
145
  "editor.record.form.field.abstract": "",
144
146
  "editor.record.form.field.constraintsShortcuts": "",
147
+ "editor.record.form.field.contacts": "",
145
148
  "editor.record.form.field.contacts.noContact": "",
146
149
  "editor.record.form.field.contacts.placeholder": "",
147
150
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -166,6 +169,7 @@
166
169
  "editor.record.form.field.onlineResource.toggle.dataset": "",
167
170
  "editor.record.form.field.onlineResource.toggle.service": "",
168
171
  "editor.record.form.field.onlineResources": "",
172
+ "editor.record.form.field.organisation": "",
169
173
  "editor.record.form.field.otherConstraints": "",
170
174
  "editor.record.form.field.overviews": "",
171
175
  "editor.record.form.field.recordUpdated": "",
@@ -177,6 +181,7 @@
177
181
  "editor.record.form.field.temporalExtents": "",
178
182
  "editor.record.form.field.title": "",
179
183
  "editor.record.form.field.title.placeholder": "Zadajte názov",
184
+ "editor.record.form.field.topics": "",
180
185
  "editor.record.form.field.uniqueIdentifier": "",
181
186
  "editor.record.form.field.updateFrequency": "",
182
187
  "editor.record.form.keywords.place.placeholder": "",
@@ -191,6 +196,8 @@
191
196
  "editor.record.form.license.odc-by": "",
192
197
  "editor.record.form.license.pddl": "",
193
198
  "editor.record.form.license.unknown": "",
199
+ "editor.record.form.metadataQuality.open": "",
200
+ "editor.record.form.metadataQuality.title": "",
194
201
  "editor.record.form.multilingual.activate": "",
195
202
  "editor.record.form.multilingual.default": "",
196
203
  "editor.record.form.multilingual.enable": "",
@@ -1,56 +0,0 @@
1
- export function updateLanguages(record, defaultLanguage, otherLanguages) {
2
- function updateFieldTranslations(target, fieldName) {
3
- const fieldTranslations = {};
4
- for (const lang of otherLanguages) {
5
- const prevValue = record.defaultLanguage === lang
6
- ? target[fieldName]
7
- : target.translations?.[fieldName]?.[lang];
8
- fieldTranslations[lang] = prevValue ?? '';
9
- }
10
- const defaultPrevValue = record.defaultLanguage === defaultLanguage
11
- ? target[fieldName]
12
- : target.translations?.[fieldName]?.[defaultLanguage];
13
- return {
14
- ...target,
15
- [fieldName]: defaultPrevValue ?? '',
16
- translations: {
17
- ...target.translations,
18
- [fieldName]: fieldTranslations,
19
- },
20
- };
21
- }
22
- function updateTranslations(target, fieldNames) {
23
- let result = target;
24
- for (const field of fieldNames) {
25
- result = updateFieldTranslations(result, field);
26
- }
27
- return result;
28
- }
29
- const updatedRecord = updateTranslations(record, [
30
- 'title',
31
- 'abstract',
32
- 'lineage',
33
- ]);
34
- updatedRecord.keywords = updatedRecord.keywords.map((k) => updateTranslations(k, ['label', 'description']));
35
- updatedRecord.onlineResources = updatedRecord.onlineResources.map((o) => updateTranslations(o, ['name', 'description']));
36
- updatedRecord.licenses = updatedRecord.licenses.map((l) => updateTranslations(l, ['text']));
37
- updatedRecord.legalConstraints = updatedRecord.legalConstraints.map((c) => updateTranslations(c, ['text']));
38
- updatedRecord.securityConstraints = updatedRecord.securityConstraints.map((c) => updateTranslations(c, ['text']));
39
- updatedRecord.otherConstraints = updatedRecord.otherConstraints.map((c) => updateTranslations(c, ['text']));
40
- updatedRecord.contacts = updatedRecord.contacts.map((c) => ({
41
- ...c,
42
- organization: updateTranslations(c.organization, ['name']),
43
- }));
44
- updatedRecord.contactsForResource = updatedRecord.contactsForResource.map((c) => ({
45
- ...c,
46
- organization: updateTranslations(c.organization, ['name']),
47
- }));
48
- updatedRecord.ownerOrganization = updateTranslations(updatedRecord.ownerOrganization, ['name']);
49
- if (updatedRecord.kind === 'dataset') {
50
- updatedRecord.spatialExtents = updatedRecord.spatialExtents.map((e) => updateTranslations(e, ['description']));
51
- }
52
- updatedRecord.defaultLanguage = defaultLanguage;
53
- updatedRecord.otherLanguages = otherLanguages;
54
- return updatedRecord;
55
- }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3V0aWwvc2hhcmVkL3NyYy9saWIvcmVjb3JkLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUJBLE1BQU0sVUFBVSxlQUFlLENBQzdCLE1BQVMsRUFDVCxlQUE2QixFQUM3QixjQUE4QjtJQUU5QixTQUFTLHVCQUF1QixDQUM5QixNQUFTLEVBQ1QsU0FBaUI7UUFFakIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUE7UUFDNUIsS0FBSyxNQUFNLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFNBQVMsR0FDYixNQUFNLENBQUMsZUFBZSxLQUFLLElBQUk7Z0JBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDOUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxJQUFJLEVBQUUsQ0FBQTtRQUMzQyxDQUFDO1FBQ0QsTUFBTSxnQkFBZ0IsR0FDcEIsTUFBTSxDQUFDLGVBQWUsS0FBSyxlQUFlO1lBQ3hDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUN6RCxPQUFPO1lBQ0wsR0FBRyxNQUFNO1lBQ1QsQ0FBQyxTQUFTLENBQUMsRUFBRSxnQkFBZ0IsSUFBSSxFQUFFO1lBQ25DLFlBQVksRUFBRTtnQkFDWixHQUFHLE1BQU0sQ0FBQyxZQUFZO2dCQUN0QixDQUFDLFNBQVMsQ0FBQyxFQUFFLGlCQUFpQjthQUMvQjtTQUNGLENBQUE7SUFDSCxDQUFDO0lBQ0QsU0FBUyxrQkFBa0IsQ0FDekIsTUFB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Qy9DLGFBQWEsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO0lBQzdDLE9BQU8sYUFBYSxDQUFBO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlUmVjb3JkLFxuICBDYXRhbG9nUmVjb3JkLFxuICBDb25zdHJhaW50LFxuICBEYXRhc2V0RG93bmxvYWREaXN0cmlidXRpb24sXG4gIERhdGFzZXRTZXJ2aWNlRGlzdHJpYnV0aW9uLFxuICBEYXRhc2V0U3BhdGlhbEV4dGVudCxcbiAgS2V5d29yZCxcbiAgTGFuZ3VhZ2VDb2RlLFxuICBPbmxpbmVMaW5rUmVzb3VyY2UsXG4gIE9yZ2FuaXphdGlvbixcbiAgU2VydmljZUVuZHBvaW50LFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5cbnR5cGUgVHJhbnNsYXRlZFJlY29yZE9iamVjdHMgPVxuICB8IEJhc2VSZWNvcmRcbiAgfCBDb25zdHJhaW50XG4gIHwgS2V5d29yZFxuICB8IERhdGFzZXRTZXJ2aWNlRGlzdHJpYnV0aW9uXG4gIHwgRGF0YXNldERvd25sb2FkRGlzdHJpYnV0aW9uXG4gIHwgT25saW5lTGlua1Jlc291cmNlXG4gIHwgU2VydmljZUVuZHBvaW50XG4gIHwgRGF0YXNldFNwYXRpYWxFeHRlbnRcbiAgfCBPcmdhbml6YXRpb25cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxhbmd1YWdlczxUIGV4dGVuZHMgQ2F0YWxvZ1JlY29yZD4oXG4gIHJlY29yZDogVCxcbiAgZGVmYXVsdExhbmd1YWdlOiBMYW5ndWFnZUNvZGUsXG4gIG90aGVyTGFuZ3VhZ2VzOiBMYW5ndWFnZUNvZGVbXVxuKTogVCB7XG4gIGZ1bmN0aW9uIHVwZGF0ZUZpZWxkVHJhbnNsYXRpb25zPFQgZXh0ZW5kcyBUcmFuc2xhdGVkUmVjb3JkT2JqZWN0cz4oXG4gICAgdGFyZ2V0OiBULFxuICAgIGZpZWxkTmFtZTogc3RyaW5nXG4gICk6IFQge1xuICAgIGNvbnN0IGZpZWxkVHJhbnNsYXRpb25zID0ge31cbiAgICBmb3IgKGNvbnN0IGxhbmcgb2Ygb3RoZXJMYW5ndWFnZXMpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9XG4gICAgICAgIHJlY29yZC5kZWZhdWx0TGFuZ3VhZ2UgPT09IGxhbmdcbiAgICAgICAgICA/IHRhcmdldFtmaWVsZE5hbWVdXG4gICAgICAgICAgOiB0YXJnZXQudHJhbnNsYXRpb25zPy5bZmllbGROYW1lXT8uW2xhbmddXG4gICAgICBmaWVsZFRyYW5zbGF0aW9uc1tsYW5nXSA9IHByZXZWYWx1ZSA/PyAnJ1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0UHJldlZhbHVlID1cbiAgICAgIHJlY29yZC5kZWZhdWx0TGFuZ3VhZ2UgPT09IGRlZmF1bHRMYW5ndWFnZVxuICAgICAgICA/IHRhcmdldFtmaWVsZE5hbWVdXG4gICAgICAgIDogdGFyZ2V0LnRyYW5zbGF0aW9ucz8uW2ZpZWxkTmFtZV0/LltkZWZhdWx0TGFuZ3VhZ2VdXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRhcmdldCxcbiAgICAgIFtmaWVsZE5hbWVdOiBkZWZhdWx0UHJldlZhbHVlID8/ICcnLFxuICAgICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICAgIC4uLnRhcmdldC50cmFuc2xhdGlvbnMsXG4gICAgICAgIFtmaWVsZE5hbWVdOiBmaWVsZFRyYW5zbGF0aW9ucyxcbiAgICAgIH0sXG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZVRyYW5zbGF0aW9uczxUIGV4dGVuZHMgVHJhbnNsYXRlZFJlY29yZE9iamVjdHM+KFxuICAgIHRhcmdldDogVCxcbiAgICBmaWVsZE5hbWVzOiBzdHJpbmdbXVxuICApOiBUIHtcbiAgICBsZXQgcmVzdWx0OiBUID0gdGFyZ2V0XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZE5hbWVzKSB7XG4gICAgICByZXN1bHQgPSB1cGRhdGVGaWVsZFRyYW5zbGF0aW9ucyhyZXN1bHQsIGZpZWxkKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCB1cGRhdGVkUmVjb3JkID0gdXBkYXRlVHJhbnNsYXRpb25zKHJlY29yZCwgW1xuICAgICd0aXRsZScsXG4gICAgJ2Fic3RyYWN0JyxcbiAgICAnbGluZWFnZScsXG4gIF0pXG4gIHVwZGF0ZWRSZWNvcmQua2V5d29yZHMgPSB1cGRhdGVkUmVjb3JkLmtleXdvcmRzLm1hcCgoaykgPT5cbiAgICB1cGRhdGVUcmFuc2xhdGlvbnMoaywgWydsYWJlbCcsICdkZXNjcmlwdGlvbiddKVxuICApXG4gIHVwZGF0ZWRSZWNvcmQub25saW5lUmVzb3VyY2VzID0gdXBkYXRlZFJlY29yZC5vbmxpbmVSZXNvdXJjZXMubWFwKChvKSA9PlxuICAgIHVwZGF0ZVRyYW5zbGF0aW9ucyhvLCBbJ25hbWUnLCAnZGVzY3JpcHRpb24nXSlcbiAgKVxuICB1cGRhdGVkUmVjb3JkLmxpY2Vuc2VzID0gdXBkYXRlZFJlY29yZC5saWNlbnNlcy5tYXAoKGwpID0+XG4gICAgdXBkYXRlVHJhbnNsYXRpb25zKGwsIFsndGV4dCddKVxuICApXG4gIHVwZGF0ZWRSZWNvcmQubGVnYWxDb25zdHJhaW50cyA9IHVwZGF0ZWRSZWNvcmQubGVnYWxDb25zdHJhaW50cy5tYXAoKGMpID0+XG4gICAgdXBkYXRlVHJhbnNsYXRpb25zKGMsIFsndGV4dCddKVxuICApXG4gIHVwZGF0ZWRSZWNvcmQuc2VjdXJpdHlDb25zdHJhaW50cyA9IHVwZGF0ZWRSZWNvcmQuc2VjdXJpdHlDb25zdHJhaW50cy5tYXAoXG4gICAgKGMpID0+IHVwZGF0ZVRyYW5zbGF0aW9ucyhjLCBbJ3RleHQnXSlcbiAgKVxuICB1cGRhdGVkUmVjb3JkLm90aGVyQ29uc3RyYWludHMgPSB1cGRhdGVkUmVjb3JkLm90aGVyQ29uc3RyYWludHMubWFwKChjKSA9PlxuICAgIHVwZGF0ZVRyYW5zbGF0aW9ucyhjLCBbJ3RleHQnXSlcbiAgKVxuICB1cGRhdGVkUmVjb3JkLmNvbnRhY3RzID0gdXBkYXRlZFJlY29yZC5jb250YWN0cy5tYXAoKGMpID0+ICh7XG4gICAgLi4uYyxcbiAgICBvcmdhbml6YXRpb246IHVwZGF0ZVRyYW5zbGF0aW9ucyhjLm9yZ2FuaXphdGlvbiwgWyduYW1lJ10pLFxuICB9KSlcbiAgdXBkYXRlZFJlY29yZC5jb250YWN0c0ZvclJlc291cmNlID0gdXBkYXRlZFJlY29yZC5jb250YWN0c0ZvclJlc291cmNlLm1hcChcbiAgICAoYykgPT4gKHtcbiAgICAgIC4uLmMsXG4gICAgICBvcmdhbml6YXRpb246IHVwZGF0ZVRyYW5zbGF0aW9ucyhjLm9yZ2FuaXphdGlvbiwgWyduYW1lJ10pLFxuICAgIH0pXG4gIClcbiAgdXBkYXRlZFJlY29yZC5vd25lck9yZ2FuaXphdGlvbiA9IHVwZGF0ZVRyYW5zbGF0aW9ucyhcbiAgICB1cGRhdGVkUmVjb3JkLm93bmVyT3JnYW5pemF0aW9uLFxuICAgIFsnbmFtZSddXG4gIClcblxuICBpZiAodXBkYXRlZFJlY29yZC5raW5kID09PSAnZGF0YXNldCcpIHtcbiAgICB1cGRhdGVkUmVjb3JkLnNwYXRpYWxFeHRlbnRzID0gdXBkYXRlZFJlY29yZC5zcGF0aWFsRXh0ZW50cy5tYXAoKGUpID0+XG4gICAgICB1cGRhdGVUcmFuc2xhdGlvbnMoZSwgWydkZXNjcmlwdGlvbiddKVxuICAgIClcbiAgfVxuXG4gIHVwZGF0ZWRSZWNvcmQuZGVmYXVsdExhbmd1YWdlID0gZGVmYXVsdExhbmd1YWdlXG4gIHVwZGF0ZWRSZWNvcmQub3RoZXJMYW5ndWFnZXMgPSBvdGhlckxhbmd1YWdlc1xuICByZXR1cm4gdXBkYXRlZFJlY29yZFxufVxuIl19