geonetwork-ui 2.7.0-dev.8de7be79f → 2.7.0-dev.9895bd35c
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.
- package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.mjs +4 -7
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +20 -20
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/metadata-url.service.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +4 -4
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -4
- package/esm2022/libs/api/repository/src/index.mjs +2 -2
- package/esm2022/libs/api/repository/src/lib/gn4/auth/auth.service.mjs +5 -5
- package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +55 -12
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +3 -3
- package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.mjs +3 -3
- package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +3 -3
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -5
- package/esm2022/libs/api/repository/src/lib/metadata-language.token.mjs +3 -0
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +11 -1
- package/esm2022/libs/feature/catalog/src/lib/sources/sources.service.mjs +3 -3
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.mjs +79 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +8 -3
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +2 -1
- package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +77 -1
- package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +3 -5
- package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +3 -2
- package/esm2022/libs/feature/search/src/lib/state/reducer.mjs +5 -2
- package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
- package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +1 -4
- package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +7 -7
- package/esm2022/libs/util/app-config/src/lib/app-config.mjs +3 -1
- package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -2
- package/esm2022/libs/util/app-config/src/lib/model.mjs +1 -1
- package/esm2022/libs/util/app-config/src/lib/parse-utils.mjs +5 -4
- package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +50 -9
- package/esm2022/libs/util/shared/src/lib/record/quality-score.util.mjs +9 -8
- package/esm2022/libs/util/shared/src/lib/utils/geojson.mjs +58 -1
- package/esm2022/translations/de.json +39 -7
- package/esm2022/translations/en.json +38 -6
- package/esm2022/translations/es.json +38 -6
- package/esm2022/translations/fr.json +38 -6
- package/esm2022/translations/it.json +38 -6
- package/esm2022/translations/nl.json +38 -6
- package/esm2022/translations/pt.json +38 -6
- package/esm2022/translations/sk.json +38 -6
- package/fesm2022/geonetwork-ui.mjs +2950 -2831
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
- package/libs/api/repository/src/index.d.ts +1 -1
- package/libs/api/repository/src/index.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -2
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +1 -0
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/metadata-language.token.d.ts +5 -0
- package/libs/api/repository/src/lib/metadata-language.token.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +4 -0
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/feature/catalog/src/lib/sources/sources.service.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.d.ts +28 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts +8 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
- package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +2 -2
- package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
- package/libs/feature/search/src/lib/state/reducer.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -1
- package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/model.d.ts +1 -0
- package/libs/util/app-config/src/lib/model.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/parse-utils.d.ts.map +1 -1
- package/libs/util/i18n/src/lib/language-codes.d.ts +91 -31
- package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
- package/libs/util/shared/src/lib/record/quality-score.util.d.ts.map +1 -1
- package/libs/util/shared/src/lib/utils/geojson.d.ts +7 -2
- package/libs/util/shared/src/lib/utils/geojson.d.ts.map +1 -1
- package/package.json +11 -10
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.ts +3 -6
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +47 -22
- package/src/libs/api/metadata-converter/src/lib/gn4/metadata-url.service.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +3 -3
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
- package/src/libs/api/repository/src/index.ts +1 -1
- package/src/libs/api/repository/src/lib/gn4/auth/auth.service.ts +4 -4
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +65 -14
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +9 -7
- package/src/libs/api/repository/src/lib/metadata-language.token.ts +8 -0
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +16 -0
- package/src/libs/feature/catalog/src/lib/sources/sources.service.ts +2 -5
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.css +0 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.html +20 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.ts +85 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +6 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +5 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +1 -0
- package/src/libs/feature/editor/src/lib/fields.config.ts +85 -1
- package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -8
- package/src/libs/feature/router/src/lib/default/state/router.facade.ts +2 -1
- package/src/libs/feature/search/src/lib/state/reducer.ts +4 -1
- package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +4 -1
- package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -4
- package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +6 -6
- package/src/libs/util/app-config/src/lib/app-config.ts +2 -0
- package/src/libs/util/app-config/src/lib/fixtures.ts +1 -1
- package/src/libs/util/app-config/src/lib/model.ts +1 -0
- package/src/libs/util/app-config/src/lib/parse-utils.ts +4 -7
- package/src/libs/util/i18n/src/lib/language-codes.ts +62 -11
- package/src/libs/util/shared/src/lib/record/quality-score.util.ts +13 -10
- package/src/libs/util/shared/src/lib/utils/geojson.ts +72 -2
- package/translations/de.json +39 -7
- package/translations/en.json +38 -6
- package/translations/es.json +38 -6
- package/translations/fr.json +38 -6
- package/translations/it.json +38 -6
- package/translations/nl.json +38 -6
- package/translations/pt.json +38 -6
- package/translations/sk.json +38 -6
- package/esm2022/libs/api/repository/src/lib/metadata-language.mjs +0 -3
- package/esm2022/libs/util/app-config/src/lib/constants.mjs +0 -439
- package/libs/api/repository/src/lib/metadata-language.d.ts +0 -3
- package/libs/api/repository/src/lib/metadata-language.d.ts.map +0 -1
- package/libs/util/app-config/src/lib/constants.d.ts +0 -2
- package/libs/util/app-config/src/lib/constants.d.ts.map +0 -1
- package/src/libs/api/repository/src/lib/metadata-language.ts +0 -3
|
@@ -28,10 +28,7 @@ import { matchProtocol } from '../common/distribution.mapper'
|
|
|
28
28
|
import { Thesaurus } from './types'
|
|
29
29
|
import { getResourceType, getReuseType } from '../common/resource-types'
|
|
30
30
|
import { TranslateService } from '@ngx-translate/core'
|
|
31
|
-
import {
|
|
32
|
-
getLang2FromLang3,
|
|
33
|
-
getLocalizedIndexKey,
|
|
34
|
-
} from '../../../../../../libs/util/i18n/src'
|
|
31
|
+
import { toLang2, toLang3 } from '../../../../../../libs/util/i18n/src'
|
|
35
32
|
|
|
36
33
|
type ESResponseSource = SourceWithUnknownProps
|
|
37
34
|
|
|
@@ -49,8 +46,8 @@ export class Gn4FieldMapper {
|
|
|
49
46
|
private translateService: TranslateService
|
|
50
47
|
) {}
|
|
51
48
|
|
|
52
|
-
private get
|
|
53
|
-
return
|
|
49
|
+
private get getLocalizedIndexKey() {
|
|
50
|
+
return `lang${toLang3(this.translateService.currentLang)}`
|
|
54
51
|
}
|
|
55
52
|
|
|
56
53
|
protected fields: Record<string, EsFieldMapperFn> = {
|
|
@@ -69,14 +66,22 @@ export class Gn4FieldMapper {
|
|
|
69
66
|
resourceTitleObject: (output, source) => ({
|
|
70
67
|
...output,
|
|
71
68
|
title: selectFallback(
|
|
72
|
-
selectTranslatedField(
|
|
69
|
+
selectTranslatedField(
|
|
70
|
+
source,
|
|
71
|
+
'resourceTitleObject',
|
|
72
|
+
this.getLocalizedIndexKey
|
|
73
|
+
),
|
|
73
74
|
'no title'
|
|
74
75
|
),
|
|
75
76
|
}),
|
|
76
77
|
resourceAbstractObject: (output, source) => ({
|
|
77
78
|
...output,
|
|
78
79
|
abstract: selectFallback(
|
|
79
|
-
selectTranslatedField(
|
|
80
|
+
selectTranslatedField(
|
|
81
|
+
source,
|
|
82
|
+
'resourceAbstractObject',
|
|
83
|
+
this.getLocalizedIndexKey
|
|
84
|
+
),
|
|
80
85
|
'no title'
|
|
81
86
|
),
|
|
82
87
|
}),
|
|
@@ -84,7 +89,7 @@ export class Gn4FieldMapper {
|
|
|
84
89
|
const firstOverview = getFirstValue(selectField(source, 'overview'))
|
|
85
90
|
const description = selectTranslatedValue<string>(
|
|
86
91
|
selectField(firstOverview, 'text'),
|
|
87
|
-
this.
|
|
92
|
+
this.getLocalizedIndexKey
|
|
88
93
|
)
|
|
89
94
|
return {
|
|
90
95
|
...output,
|
|
@@ -102,7 +107,9 @@ export class Gn4FieldMapper {
|
|
|
102
107
|
...(output.topics || []),
|
|
103
108
|
...getAsArray(
|
|
104
109
|
selectField<SourceWithUnknownProps[]>(source, 'cl_topic')
|
|
105
|
-
).map((topic) =>
|
|
110
|
+
).map((topic) =>
|
|
111
|
+
selectTranslatedValue<string>(topic, this.getLocalizedIndexKey)
|
|
112
|
+
),
|
|
106
113
|
],
|
|
107
114
|
}),
|
|
108
115
|
cl_status: (output, source) => ({
|
|
@@ -156,7 +163,7 @@ export class Gn4FieldMapper {
|
|
|
156
163
|
const langList = getAsArray(
|
|
157
164
|
selectField<string>(source, 'resourceLanguage')
|
|
158
165
|
)
|
|
159
|
-
const languages = langList.map(
|
|
166
|
+
const languages = langList.map(toLang2)
|
|
160
167
|
const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null // set the first language as main one as fallback
|
|
161
168
|
|
|
162
169
|
return {
|
|
@@ -166,7 +173,7 @@ export class Gn4FieldMapper {
|
|
|
166
173
|
},
|
|
167
174
|
otherLanguage: (output, source) => {
|
|
168
175
|
const langList = getAsArray(selectField<string>(source, 'otherLanguage'))
|
|
169
|
-
const languages = langList.map(
|
|
176
|
+
const languages = langList.map(toLang2)
|
|
170
177
|
const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null
|
|
171
178
|
const otherLanguages = languages.filter(
|
|
172
179
|
(lang) => lang !== defaultLanguage
|
|
@@ -181,7 +188,7 @@ export class Gn4FieldMapper {
|
|
|
181
188
|
const language = selectField<string>(source, 'mainLanguage')
|
|
182
189
|
return {
|
|
183
190
|
...output,
|
|
184
|
-
defaultLanguage: language ?
|
|
191
|
+
defaultLanguage: language ? toLang2(language) : null,
|
|
185
192
|
}
|
|
186
193
|
},
|
|
187
194
|
link: (output, source) => {
|
|
@@ -199,7 +206,10 @@ export class Gn4FieldMapper {
|
|
|
199
206
|
contact: (output, source) => ({
|
|
200
207
|
...output,
|
|
201
208
|
contacts: [
|
|
202
|
-
mapContact(
|
|
209
|
+
mapContact(
|
|
210
|
+
getFirstValue(selectField(source, 'contact')),
|
|
211
|
+
this.getLocalizedIndexKey
|
|
212
|
+
),
|
|
203
213
|
],
|
|
204
214
|
}),
|
|
205
215
|
contactForResource: (output, source) => ({
|
|
@@ -210,7 +220,7 @@ export class Gn4FieldMapper {
|
|
|
210
220
|
? output.contactsForResource
|
|
211
221
|
: []),
|
|
212
222
|
...getAsArray(selectField(source, 'contactForResource')).map(
|
|
213
|
-
(contact) => mapContact(contact, this.
|
|
223
|
+
(contact) => mapContact(contact, this.getLocalizedIndexKey)
|
|
214
224
|
),
|
|
215
225
|
],
|
|
216
226
|
}),
|
|
@@ -229,7 +239,7 @@ export class Gn4FieldMapper {
|
|
|
229
239
|
...output,
|
|
230
240
|
keywords: mapKeywords(
|
|
231
241
|
selectField<Thesaurus[]>(source, 'allKeywords'),
|
|
232
|
-
this.
|
|
242
|
+
this.getLocalizedIndexKey
|
|
233
243
|
),
|
|
234
244
|
}),
|
|
235
245
|
inspireTheme: (output, source) => ({
|
|
@@ -277,7 +287,11 @@ export class Gn4FieldMapper {
|
|
|
277
287
|
),
|
|
278
288
|
lineageObject: (output, source) => ({
|
|
279
289
|
...output,
|
|
280
|
-
lineage: selectTranslatedField(
|
|
290
|
+
lineage: selectTranslatedField(
|
|
291
|
+
source,
|
|
292
|
+
'lineageObject',
|
|
293
|
+
this.getLocalizedIndexKey
|
|
294
|
+
),
|
|
281
295
|
}),
|
|
282
296
|
userSavedCount: (output, source) =>
|
|
283
297
|
this.addExtra(
|
|
@@ -410,7 +424,7 @@ export class Gn4FieldMapper {
|
|
|
410
424
|
...geoms.map((geom, index) => {
|
|
411
425
|
const description = selectTranslatedValue(
|
|
412
426
|
getArrayItem(extentDescriptions, index),
|
|
413
|
-
this.
|
|
427
|
+
this.getLocalizedIndexKey
|
|
414
428
|
)
|
|
415
429
|
const geometry = shapes[index] ?? geom
|
|
416
430
|
return {
|
|
@@ -465,7 +479,10 @@ export class Gn4FieldMapper {
|
|
|
465
479
|
outputField in output ? output[outputField] : []
|
|
466
480
|
outputArray.push(
|
|
467
481
|
...constraintArray.map((item) => {
|
|
468
|
-
const text = selectTranslatedValue(
|
|
482
|
+
const text = selectTranslatedValue(
|
|
483
|
+
item,
|
|
484
|
+
this.getLocalizedIndexKey
|
|
485
|
+
) as string
|
|
469
486
|
const url = getAsUrl(selectField(item, 'link'))
|
|
470
487
|
return {
|
|
471
488
|
text,
|
|
@@ -508,19 +525,27 @@ export class Gn4FieldMapper {
|
|
|
508
525
|
mapLink = (sourceLink: SourceWithUnknownProps): OnlineResource | null => {
|
|
509
526
|
const url = getAsUrl(
|
|
510
527
|
selectFallback(
|
|
511
|
-
selectTranslatedField<string>(
|
|
528
|
+
selectTranslatedField<string>(
|
|
529
|
+
sourceLink,
|
|
530
|
+
'urlObject',
|
|
531
|
+
this.getLocalizedIndexKey
|
|
532
|
+
),
|
|
512
533
|
selectField<string>(sourceLink, 'url')
|
|
513
534
|
)
|
|
514
535
|
)
|
|
515
536
|
const name = selectFallback(
|
|
516
|
-
selectTranslatedField<string>(
|
|
537
|
+
selectTranslatedField<string>(
|
|
538
|
+
sourceLink,
|
|
539
|
+
'nameObject',
|
|
540
|
+
this.getLocalizedIndexKey
|
|
541
|
+
),
|
|
517
542
|
selectField<string>(sourceLink, 'name')
|
|
518
543
|
)
|
|
519
544
|
const description = selectFallback(
|
|
520
545
|
selectTranslatedField<string>(
|
|
521
546
|
sourceLink,
|
|
522
547
|
'descriptionObject',
|
|
523
|
-
this.
|
|
548
|
+
this.getLocalizedIndexKey
|
|
524
549
|
),
|
|
525
550
|
selectField<string>(sourceLink, 'description')
|
|
526
551
|
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Inject, Injectable } from '@angular/core'
|
|
2
2
|
import { Configuration } from '../../../../../../libs/data-access/gn4/src'
|
|
3
3
|
import { TranslateService } from '@ngx-translate/core'
|
|
4
|
-
import {
|
|
4
|
+
import { toLang3 } from '../../../../../../libs/util/i18n/src'
|
|
5
5
|
|
|
6
6
|
@Injectable({
|
|
7
7
|
providedIn: 'root',
|
|
@@ -14,7 +14,7 @@ export class MetadataUrlService {
|
|
|
14
14
|
|
|
15
15
|
getUrl(uuid: string, apiPath: string = this.apiConfiguration.basePath) {
|
|
16
16
|
const prefix = `${apiPath}/../`
|
|
17
|
-
return `${prefix}${
|
|
17
|
+
return `${prefix}${toLang3(
|
|
18
18
|
this.translate.currentLang
|
|
19
19
|
)}/catalog.search#/metadata/${uuid}`
|
|
20
20
|
}
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
} from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
42
42
|
import { matchMimeType } from '../common/distribution.mapper'
|
|
43
43
|
import { fullNameToParts } from '../iso19139/utils/individual-name'
|
|
44
|
-
import {
|
|
44
|
+
import { toLang2 } from '../../../../../../libs/util/i18n/src/lib/language-codes'
|
|
45
45
|
import { getResourceType, getReuseType } from '../common/resource-types'
|
|
46
46
|
|
|
47
47
|
export function readKind(rootEl: XmlElement): RecordKind {
|
|
@@ -370,7 +370,7 @@ export function readLocaleElement(): ChainableFunction<
|
|
|
370
370
|
return pipe(
|
|
371
371
|
findChildElement('lan:LanguageCode'),
|
|
372
372
|
readAttribute('codeListValue'),
|
|
373
|
-
map((lang) =>
|
|
373
|
+
map((lang) => toLang2(lang?.toLowerCase()) ?? lang)
|
|
374
374
|
)
|
|
375
375
|
}
|
|
376
376
|
|
|
@@ -49,7 +49,7 @@ import {
|
|
|
49
49
|
} from '../iso19139/write-parts'
|
|
50
50
|
import { findIdentification } from '../iso19139/read-parts'
|
|
51
51
|
import { namePartsToFull } from '../iso19139/utils/individual-name'
|
|
52
|
-
import {
|
|
52
|
+
import { toLang3 } from '../../../../../../libs/util/i18n/src/lib/language-codes'
|
|
53
53
|
import { kindToCodeListValue } from '../common/resource-types'
|
|
54
54
|
|
|
55
55
|
export function writeUniqueIdentifier(
|
|
@@ -529,7 +529,7 @@ export function writeOnlineResources(
|
|
|
529
529
|
}
|
|
530
530
|
|
|
531
531
|
function writeLocaleElement(language: LanguageCode) {
|
|
532
|
-
const lang3 =
|
|
532
|
+
const lang3 = toLang3(language.toLowerCase()) ?? language
|
|
533
533
|
return pipe(
|
|
534
534
|
findChildOrCreate('lan:PT_Locale'),
|
|
535
535
|
writeAttribute('id', language.toUpperCase()),
|
|
@@ -55,7 +55,7 @@ import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper'
|
|
|
55
55
|
import { getRoleFromRoleCode } from './utils/role.mapper'
|
|
56
56
|
import { getStatusFromStatusCode } from './utils/status.mapper'
|
|
57
57
|
import { getUpdateFrequencyFromFrequencyCode } from './utils/update-frequency.mapper'
|
|
58
|
-
import {
|
|
58
|
+
import { toLang2 } from '../../../../../../libs/util/i18n/src/lib/language-codes'
|
|
59
59
|
import { getResourceType, getReuseType } from '../common/resource-types'
|
|
60
60
|
|
|
61
61
|
export function extractCharacterString(): ChainableFunction<
|
|
@@ -1164,7 +1164,7 @@ export function readOtherLanguages(rootEl: XmlElement): LanguageCode[] {
|
|
|
1164
1164
|
pipe(
|
|
1165
1165
|
findChildElement('lan:LanguageCode'),
|
|
1166
1166
|
readAttribute('codeListValue'),
|
|
1167
|
-
map((lang) =>
|
|
1167
|
+
map((lang) => toLang2(lang?.toLowerCase()) ?? lang)
|
|
1168
1168
|
)
|
|
1169
1169
|
),
|
|
1170
1170
|
map((languages) =>
|
|
@@ -1179,7 +1179,7 @@ export function readDefaultLanguage(rootEl: XmlElement): LanguageCode {
|
|
|
1179
1179
|
findChildElement('gmd:language', false),
|
|
1180
1180
|
findChildElement('lan:LanguageCode'),
|
|
1181
1181
|
readAttribute('codeListValue'),
|
|
1182
|
-
map((lang) => (lang ?
|
|
1182
|
+
map((lang) => (lang ? toLang2(lang.toLowerCase()) : null))
|
|
1183
1183
|
)(rootEl)
|
|
1184
1184
|
}
|
|
1185
1185
|
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
import { readKind } from './read-parts'
|
|
54
54
|
import { writeGeometry } from './utils/geometry'
|
|
55
55
|
import { namePartsToFull } from './utils/individual-name'
|
|
56
|
-
import {
|
|
56
|
+
import { toLang3 } from '../../../../../../libs/util/i18n/src/lib/language-codes'
|
|
57
57
|
import { kindToCodeListValue } from '../common/resource-types'
|
|
58
58
|
|
|
59
59
|
function writeLocalizedElement(
|
|
@@ -1476,7 +1476,7 @@ export function writeLanguages(record: DatasetRecord, rootEl: XmlElement) {
|
|
|
1476
1476
|
writeAttribute('id', lang.toUpperCase()),
|
|
1477
1477
|
createNestedChild('gmd:languageCode', 'gmd:LanguageCode'),
|
|
1478
1478
|
writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'),
|
|
1479
|
-
writeAttribute('codeListValue',
|
|
1479
|
+
writeAttribute('codeListValue', toLang3(lang) ?? lang)
|
|
1480
1480
|
)
|
|
1481
1481
|
|
|
1482
1482
|
// add new languages (only if other than default one)
|
|
@@ -1490,7 +1490,7 @@ export function writeDefaultLanguage(
|
|
|
1490
1490
|
record: DatasetRecord,
|
|
1491
1491
|
rootEl: XmlElement
|
|
1492
1492
|
) {
|
|
1493
|
-
const lang3 =
|
|
1493
|
+
const lang3 = toLang3(record.defaultLanguage.toLowerCase())
|
|
1494
1494
|
return pipe(
|
|
1495
1495
|
findNestedChildOrCreate('gmd:language', 'gmd:LanguageCode'),
|
|
1496
1496
|
writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core'
|
|
2
|
-
import {
|
|
2
|
+
import { toLang2, toLang3 } from '../../../../../../../libs/util/i18n/src'
|
|
3
3
|
import { TranslateService } from '@ngx-translate/core'
|
|
4
4
|
import { Location } from '@angular/common'
|
|
5
5
|
|
|
@@ -35,8 +35,8 @@ export class AuthService {
|
|
|
35
35
|
'${current_url}',
|
|
36
36
|
new URL(this.location.path(), window.location.href).toString()
|
|
37
37
|
)
|
|
38
|
-
.replace('${lang2}', this.translateService.currentLang)
|
|
39
|
-
.replace('${lang3}',
|
|
38
|
+
.replace('${lang2}', toLang2(this.translateService.currentLang))
|
|
39
|
+
.replace('${lang3}', toLang3(this.translateService.currentLang))
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
get logoutUrl() {
|
|
@@ -46,7 +46,7 @@ export class AuthService {
|
|
|
46
46
|
get settingsUrl() {
|
|
47
47
|
return this.baseSettingsUrl.replace(
|
|
48
48
|
'${lang3}',
|
|
49
|
-
|
|
49
|
+
toLang3(this.translateService.currentLang)
|
|
50
50
|
)
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Injectable, Injector } from '@angular/core'
|
|
2
|
-
import { Geometry } from 'geojson'
|
|
2
|
+
import type { Geometry } from 'geojson'
|
|
3
3
|
import {
|
|
4
4
|
ES_QUERY_FIELDS_PRIORITY,
|
|
5
5
|
ES_SOURCE_SUMMARY,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
FiltersAggregationParams,
|
|
16
16
|
SortByField,
|
|
17
17
|
} from '../../../../../../../libs/common/domain/src/lib/model/search'
|
|
18
|
-
import { METADATA_LANGUAGE } from '../../metadata-language'
|
|
18
|
+
import { METADATA_LANGUAGE } from '../../metadata-language.token'
|
|
19
19
|
import {
|
|
20
20
|
AggregationResult,
|
|
21
21
|
EsSearchParams,
|
|
@@ -26,10 +26,16 @@ import {
|
|
|
26
26
|
SortParams,
|
|
27
27
|
TermsAggregationResult,
|
|
28
28
|
} from '../../../../../../../libs/api/metadata-converter/src'
|
|
29
|
-
import {
|
|
29
|
+
import { toLang3 } from '../../../../../../../libs/util/i18n/src'
|
|
30
30
|
import { formatDate, isDateRange } from './date-range.utils'
|
|
31
|
-
import {
|
|
31
|
+
import {
|
|
32
|
+
CatalogRecord,
|
|
33
|
+
LanguageCode,
|
|
34
|
+
} from '../../../../../../../libs/common/domain/src/lib/model/record'
|
|
32
35
|
import { TranslateService } from '@ngx-translate/core'
|
|
36
|
+
import { getGeometryBoundingBox } from '../../../../../../../libs/util/shared/src'
|
|
37
|
+
import { getLength as getGeodesicLength } from 'ol/sphere'
|
|
38
|
+
import { LineString } from 'ol/geom'
|
|
33
39
|
|
|
34
40
|
export type DateRange = { start?: Date; end?: Date }
|
|
35
41
|
|
|
@@ -42,11 +48,9 @@ export class ElasticsearchService {
|
|
|
42
48
|
private runtimeFields: Record<string, string> = {}
|
|
43
49
|
|
|
44
50
|
// we're using getters in case the defined languages change over time
|
|
45
|
-
private get
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
private get metadataLang() {
|
|
49
|
-
return this.injector.get(METADATA_LANGUAGE, null)
|
|
51
|
+
private get metadataLang(): LanguageCode {
|
|
52
|
+
const mdLangValue = this.injector.get(METADATA_LANGUAGE, null)
|
|
53
|
+
return typeof mdLangValue === 'function' ? mdLangValue() : mdLangValue
|
|
50
54
|
}
|
|
51
55
|
|
|
52
56
|
constructor(
|
|
@@ -230,9 +234,12 @@ export class ElasticsearchService {
|
|
|
230
234
|
|
|
231
235
|
private getQueryLang(): string {
|
|
232
236
|
if (this.metadataLang) {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
237
|
+
const lang3 = toLang3(
|
|
238
|
+
this.isCurrentSearchLang()
|
|
239
|
+
? this.translateService.currentLang
|
|
240
|
+
: this.metadataLang
|
|
241
|
+
)
|
|
242
|
+
return `lang${lang3}`
|
|
236
243
|
} else return '*'
|
|
237
244
|
}
|
|
238
245
|
private isCurrentSearchLang() {
|
|
@@ -351,6 +358,11 @@ export class ElasticsearchService {
|
|
|
351
358
|
})
|
|
352
359
|
}
|
|
353
360
|
if (geometry) {
|
|
361
|
+
// boosts applied using the filter geometry:
|
|
362
|
+
// * records completely within the geometry receive a boost of 5
|
|
363
|
+
// * records intersecting the geometry receive a boost of 2
|
|
364
|
+
// * records close to the geometry center receive a boost of 5 (based on the `location` field)
|
|
365
|
+
// * records on the outskirt of the geometry receive a boost of 2.5
|
|
354
366
|
should.push(
|
|
355
367
|
{
|
|
356
368
|
geo_shape: {
|
|
@@ -358,7 +370,7 @@ export class ElasticsearchService {
|
|
|
358
370
|
shape: geometry,
|
|
359
371
|
relation: 'within',
|
|
360
372
|
},
|
|
361
|
-
boost:
|
|
373
|
+
boost: 5.0,
|
|
362
374
|
},
|
|
363
375
|
},
|
|
364
376
|
{
|
|
@@ -367,10 +379,49 @@ export class ElasticsearchService {
|
|
|
367
379
|
shape: geometry,
|
|
368
380
|
relation: 'intersects',
|
|
369
381
|
},
|
|
370
|
-
boost:
|
|
382
|
+
boost: 2.0,
|
|
371
383
|
},
|
|
372
384
|
}
|
|
373
385
|
)
|
|
386
|
+
|
|
387
|
+
// this will boost the results variably depending on their distance from the given geometry
|
|
388
|
+
// note: this takes into account the `location` field of a record; this is generally the center of all spatial extents
|
|
389
|
+
// combined, and thus the actual size/coverage of the record spatial extent isn't relevant here
|
|
390
|
+
const bbox = getGeometryBoundingBox(geometry)
|
|
391
|
+
const center = [(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2]
|
|
392
|
+
const northToCenter = new LineString([
|
|
393
|
+
[center[0], bbox[3]],
|
|
394
|
+
center,
|
|
395
|
+
]).transform('EPSG:4326', 'EPSG:3857')
|
|
396
|
+
const southToCenter = new LineString([
|
|
397
|
+
[center[0], bbox[1]],
|
|
398
|
+
center,
|
|
399
|
+
]).transform('EPSG:4326', 'EPSG:3857')
|
|
400
|
+
const westToCenter = new LineString([
|
|
401
|
+
[bbox[0], center[1]],
|
|
402
|
+
center,
|
|
403
|
+
]).transform('EPSG:4326', 'EPSG:3857')
|
|
404
|
+
const eastToCenter = new LineString([
|
|
405
|
+
[bbox[2], center[1]],
|
|
406
|
+
center,
|
|
407
|
+
]).transform('EPSG:4326', 'EPSG:3857')
|
|
408
|
+
// cutoff distance is the distance from where the boost will only be half of the max value
|
|
409
|
+
// it is an average of the "size" of the bounding box in every direction, in meters
|
|
410
|
+
const cutoffDistance =
|
|
411
|
+
(getGeodesicLength(northToCenter) +
|
|
412
|
+
getGeodesicLength(southToCenter) +
|
|
413
|
+
getGeodesicLength(westToCenter) +
|
|
414
|
+
getGeodesicLength(eastToCenter)) /
|
|
415
|
+
4
|
|
416
|
+
|
|
417
|
+
should.push({
|
|
418
|
+
distance_feature: {
|
|
419
|
+
field: 'location',
|
|
420
|
+
pivot: `${Math.round(cutoffDistance).toFixed(0)}m`,
|
|
421
|
+
origin: center,
|
|
422
|
+
boost: 5.0,
|
|
423
|
+
},
|
|
424
|
+
})
|
|
374
425
|
}
|
|
375
426
|
|
|
376
427
|
return {
|
|
@@ -48,7 +48,7 @@ import {
|
|
|
48
48
|
import { catchError, map, tap } from 'rxjs/operators'
|
|
49
49
|
import { lt } from 'semver'
|
|
50
50
|
import { ElasticsearchService } from './elasticsearch'
|
|
51
|
-
import {
|
|
51
|
+
import { toLang2 } from '../../../../../../libs/util/i18n/src'
|
|
52
52
|
import { Gn4SettingsService } from './settings/gn4-settings.service'
|
|
53
53
|
|
|
54
54
|
const minPublicationApiVersion = '4.2.5'
|
|
@@ -562,7 +562,7 @@ export class Gn4Repository implements RecordsRepositoryInterface {
|
|
|
562
562
|
.pipe(
|
|
563
563
|
map((languages) =>
|
|
564
564
|
languages
|
|
565
|
-
.map((lang) =>
|
|
565
|
+
.map((lang) => toLang2(lang.id))
|
|
566
566
|
.filter((code): code is string => !!code)
|
|
567
567
|
)
|
|
568
568
|
)
|
package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
import { forkJoin, Observable, of } from 'rxjs'
|
|
8
8
|
import { map, shareReplay } from 'rxjs/operators'
|
|
9
9
|
import { TranslateService } from '@ngx-translate/core'
|
|
10
|
-
import {
|
|
10
|
+
import { toLang3 } from '../../../../../../../libs/util/i18n/src'
|
|
11
11
|
import { FieldFilters } from '../../../../../../../libs/common/domain/src/lib/model/search'
|
|
12
12
|
import {
|
|
13
13
|
CatalogRecord,
|
|
@@ -52,7 +52,7 @@ export class OrganizationsFromGroupsService
|
|
|
52
52
|
organisationsCount$ = this.organisations$.pipe(map((orgs) => orgs.length))
|
|
53
53
|
|
|
54
54
|
private get lang3() {
|
|
55
|
-
return
|
|
55
|
+
return toLang3(this.translateService.currentLang)
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
constructor(
|
package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts
CHANGED
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
tap,
|
|
34
34
|
withLatestFrom,
|
|
35
35
|
} from 'rxjs/operators'
|
|
36
|
-
import {
|
|
36
|
+
import { toLang3 } from '../../../../../../../libs/util/i18n/src'
|
|
37
37
|
import { PlatformServiceInterface } from '../../../../../../../libs/common/domain/src/lib/platform.service.interface'
|
|
38
38
|
import { coerce, satisfies, valid } from 'semver'
|
|
39
39
|
import { TranslateService } from '@ngx-translate/core'
|
|
@@ -126,7 +126,7 @@ export class OrganizationsFromMetadataService
|
|
|
126
126
|
) {}
|
|
127
127
|
|
|
128
128
|
private get langIndex() {
|
|
129
|
-
return
|
|
129
|
+
return `lang${toLang3(this.translateService.currentLang)}`
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
equalsNormalizedStrings(
|
|
@@ -45,8 +45,7 @@ import {
|
|
|
45
45
|
throwError,
|
|
46
46
|
} from 'rxjs'
|
|
47
47
|
import { TranslateService } from '@ngx-translate/core'
|
|
48
|
-
import {
|
|
49
|
-
import { DatavizConfigModel } from '../../../../../../../libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model'
|
|
48
|
+
import { toLang3 } from '../../../../../../../libs/util/i18n/src'
|
|
50
49
|
|
|
51
50
|
const minApiVersion = '4.2.2'
|
|
52
51
|
|
|
@@ -56,6 +55,7 @@ export class Gn4PlatformService implements PlatformServiceInterface {
|
|
|
56
55
|
private readonly me$: Observable<UserModel>
|
|
57
56
|
private readonly users$: Observable<UserModel[]>
|
|
58
57
|
private readonly isUserAnonymous$: Observable<boolean>
|
|
58
|
+
private readonly gnParseVersion = '4.2.5'
|
|
59
59
|
|
|
60
60
|
private keyTranslations$ = this.toolsApiService
|
|
61
61
|
.getTranslationsPackage1('gnui')
|
|
@@ -98,7 +98,7 @@ export class Gn4PlatformService implements PlatformServiceInterface {
|
|
|
98
98
|
private keywordsByThesauri: Record<string, Observable<Keyword[]>> = {}
|
|
99
99
|
|
|
100
100
|
private get lang3() {
|
|
101
|
-
return
|
|
101
|
+
return toLang3(this.translateService.currentLang)
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
constructor(
|
|
@@ -390,13 +390,15 @@ export class Gn4PlatformService implements PlatformServiceInterface {
|
|
|
390
390
|
})
|
|
391
391
|
)
|
|
392
392
|
}
|
|
393
|
-
|
|
394
393
|
getFileContent(url: URL | string): Observable<any> {
|
|
395
|
-
return
|
|
396
|
-
|
|
394
|
+
return combineLatest([
|
|
395
|
+
this.httpClient.get(url.toString(), { responseType: 'text' }),
|
|
396
|
+
this.getApiVersion(),
|
|
397
|
+
]).pipe(
|
|
398
|
+
map(([text, version]) => {
|
|
397
399
|
const parsed = JSON.parse(text)
|
|
398
400
|
|
|
399
|
-
if (
|
|
401
|
+
if (version > this.gnParseVersion) {
|
|
400
402
|
return parsed
|
|
401
403
|
}
|
|
402
404
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core'
|
|
2
|
+
import { LanguageCode } from '../../../../../libs/common/domain/src/lib/model/record'
|
|
3
|
+
|
|
4
|
+
export type LanguageCodeFactory = () => LanguageCode
|
|
5
|
+
|
|
6
|
+
export const METADATA_LANGUAGE = new InjectionToken<
|
|
7
|
+
LanguageCode | LanguageCodeFactory
|
|
8
|
+
>('metadata-language')
|
|
@@ -108,6 +108,11 @@ export interface Keyword {
|
|
|
108
108
|
translations?: KeywordTranslations
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
export interface INSPIRE_theme {
|
|
112
|
+
value: string
|
|
113
|
+
label: string
|
|
114
|
+
}
|
|
115
|
+
|
|
111
116
|
export interface BaseRecord {
|
|
112
117
|
uniqueIdentifier: Uuid
|
|
113
118
|
ownerOrganization: Organization
|
|
@@ -160,6 +165,17 @@ export type ServiceProtocol =
|
|
|
160
165
|
| 'maplibre-style'
|
|
161
166
|
| 'other'
|
|
162
167
|
|
|
168
|
+
marker('record.metadata.api.accessServiceProtocol.wms')
|
|
169
|
+
marker('record.metadata.api.accessServiceProtocol.wfs')
|
|
170
|
+
marker('record.metadata.api.accessServiceProtocol.wps')
|
|
171
|
+
marker('record.metadata.api.accessServiceProtocol.wmts')
|
|
172
|
+
marker('record.metadata.api.accessServiceProtocol.esriRest')
|
|
173
|
+
marker('record.metadata.api.accessServiceProtocol.ogcFeatures')
|
|
174
|
+
marker('record.metadata.api.accessServiceProtocol.GPFDL')
|
|
175
|
+
marker('record.metadata.api.accessServiceProtocol.tms')
|
|
176
|
+
marker('record.metadata.api.accessServiceProtocol.maplibre-style')
|
|
177
|
+
marker('record.metadata.api.accessServiceProtocol.other')
|
|
178
|
+
|
|
163
179
|
export type OnlineResourceType = 'service' | 'download' | 'link' | 'endpoint'
|
|
164
180
|
|
|
165
181
|
export interface DatasetServiceDistribution {
|
|
@@ -4,7 +4,7 @@ import { Observable } from 'rxjs'
|
|
|
4
4
|
import { filter, map, shareReplay } from 'rxjs/operators'
|
|
5
5
|
import { CatalogSource } from './sources.model'
|
|
6
6
|
import { TranslateService } from '@ngx-translate/core'
|
|
7
|
-
import {
|
|
7
|
+
import { toLang3 } from '../../../../../../libs/util/i18n/src'
|
|
8
8
|
|
|
9
9
|
@Injectable({
|
|
10
10
|
providedIn: 'root',
|
|
@@ -23,10 +23,7 @@ export class SourcesService {
|
|
|
23
23
|
return this.sources$.pipe(
|
|
24
24
|
map((sources) => sources.filter((source) => source.uuid === uuid)[0]),
|
|
25
25
|
filter((source) => !!source),
|
|
26
|
-
map(
|
|
27
|
-
(source) =>
|
|
28
|
-
source.label[getLang3FromLang2(this.translateService.currentLang)]
|
|
29
|
-
)
|
|
26
|
+
map((source) => source.label[toLang3(this.translateService.currentLang)])
|
|
30
27
|
)
|
|
31
28
|
}
|
|
32
29
|
}
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<div class="flex flex-col gap-3">
|
|
2
|
+
<div class="flex flex-col gap-4">
|
|
3
|
+
<gn-ui-autocomplete
|
|
4
|
+
[placeholder]="'editor.record.form.inspire.placeholder' | translate"
|
|
5
|
+
[displayWithFn]="displayWithFn"
|
|
6
|
+
[action]="autoCompleteAction"
|
|
7
|
+
(itemSelected)="handleItemSelection($event)"
|
|
8
|
+
[minCharacterCount]="1"
|
|
9
|
+
[clearOnSelection]="true"
|
|
10
|
+
></gn-ui-autocomplete>
|
|
11
|
+
<div class="flex gap-2 flex-wrap">
|
|
12
|
+
<gn-ui-badge
|
|
13
|
+
*ngFor="let theme of themes"
|
|
14
|
+
[removable]="true"
|
|
15
|
+
(badgeRemoveClicked)="removeTheme(theme)"
|
|
16
|
+
>{{ getTranslatedTheme(theme) }}
|
|
17
|
+
</gn-ui-badge>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|