geonetwork-ui 2.4.0-dev.78565730 → 2.4.0-dev.8118addf

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 (65) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +5 -5
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +30 -2
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.mjs +31 -0
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +23 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +6 -1
  6. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  7. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +3 -4
  8. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +5 -11
  9. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +3 -3
  10. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +5 -2
  11. package/esm2022/libs/ui/widgets/src/index.mjs +2 -1
  12. package/esm2022/libs/ui/widgets/src/lib/popover/popover.component.mjs +68 -0
  13. package/esm2022/translations/de.json +1 -1
  14. package/esm2022/translations/en.json +1 -1
  15. package/esm2022/translations/fr.json +1 -1
  16. package/esm2022/translations/it.json +1 -1
  17. package/fesm2022/geonetwork-ui.mjs +165 -24
  18. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  19. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  20. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
  21. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  22. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
  23. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
  24. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
  25. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  26. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
  27. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  28. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -1
  29. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  30. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  31. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  32. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -3
  33. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  34. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  35. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +7 -6
  36. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  37. package/libs/ui/widgets/src/index.d.ts +1 -0
  38. package/libs/ui/widgets/src/index.d.ts.map +1 -1
  39. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts +19 -0
  40. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts.map +1 -0
  41. package/package.json +1 -1
  42. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
  43. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
  44. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
  45. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +4 -2
  46. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
  47. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
  48. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
  49. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +8 -0
  50. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -1
  51. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +2 -3
  52. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +14 -20
  53. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -10
  54. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.html +1 -1
  55. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  56. package/src/libs/ui/widgets/src/index.ts +1 -0
  57. package/src/libs/ui/widgets/src/lib/popover/popover.component.css +0 -0
  58. package/src/libs/ui/widgets/src/lib/popover/popover.component.html +3 -0
  59. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +85 -0
  60. package/tailwind.base.css +2 -1
  61. package/translations/de.json +1 -1
  62. package/translations/en.json +1 -1
  63. package/translations/fr.json +1 -1
  64. package/translations/it.json +1 -1
  65. package/translations/sk.json +1 -1
@@ -0,0 +1,39 @@
1
+ import { XmlElement } from '@rgrove/parse-xml'
2
+ import { Geometry } from 'geojson'
3
+ import GML32 from 'ol/format/GML32'
4
+ import GeoJSON from 'ol/format/GeoJSON'
5
+ import { parse } from 'ol/xml'
6
+ import {
7
+ createDocument,
8
+ getRootElement,
9
+ parseXmlString,
10
+ xmlToString,
11
+ } from '../../xml-utils'
12
+
13
+ export function readGeometry(el: XmlElement): Geometry {
14
+ const xmlDoc = createDocument(el)
15
+ xmlDoc.root.attributes['xmlns'] = 'http://www.opengis.net/gml/3.2'
16
+ const gmlString = xmlToString(xmlDoc)
17
+ const doc = parse(gmlString)
18
+ // we need an intermediate node to be able to parse the GML
19
+ const node = document.createElement('pre')
20
+ node.appendChild(doc.documentElement)
21
+ const gml32Format = new GML32()
22
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
23
+ // @ts-ignore
24
+ const geometry = gml32Format.readGeometryFromNode(node)
25
+ const geojsonFormat = new GeoJSON()
26
+ return geojsonFormat.writeGeometryObject(geometry)
27
+ }
28
+
29
+ export function writeGeometry(geometryObject: Geometry): XmlElement {
30
+ const geojsonFormat = new GeoJSON()
31
+ const geometry = geojsonFormat.readGeometry(geometryObject)
32
+ const gml32Format = new GML32()
33
+ const node = gml32Format.writeGeometryNode(geometry)
34
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
35
+ // @ts-ignore
36
+ const element = node.firstElementChild as HTMLElement
37
+ const gmlString = new XMLSerializer().serializeToString(element)
38
+ return getRootElement(parseXmlString(gmlString))
39
+ }
@@ -14,7 +14,9 @@ import {
14
14
  UpdateFrequencyCode,
15
15
  UpdateFrequencyCustom,
16
16
  } from '../../../../../../libs/common/domain/src/lib/model/record'
17
+ import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
17
18
  import format from 'date-fns/format'
19
+ import { Geometry } from 'geojson'
18
20
  import {
19
21
  ChainableFunction,
20
22
  fallback,
@@ -44,8 +46,8 @@ import {
44
46
  setTextContent,
45
47
  } from '../xml-utils'
46
48
  import { readKind } from './read-parts'
49
+ import { writeGeometry } from './utils/geometry'
47
50
  import { namePartsToFull } from './utils/individual-name'
48
- import { ThesaurusModel } from '../../../../../../libs/common/domain/src/lib/model/thesaurus'
49
51
 
50
52
  export function writeCharacterString(
51
53
  text: string
@@ -101,6 +103,14 @@ export function writeDate(
101
103
  )
102
104
  }
103
105
 
106
+ export function writeDecimal(
107
+ decimal: number
108
+ ): ChainableFunction<XmlElement, XmlElement> {
109
+ return tap(
110
+ pipe(findChildOrCreate('gco:Decimal'), setTextContent(decimal.toString()))
111
+ )
112
+ }
113
+
104
114
  export function getProgressCode(status: RecordStatus): string {
105
115
  switch (status) {
106
116
  case 'completed':
@@ -1184,3 +1194,62 @@ export function writeTemporalExtents(
1184
1194
  )
1185
1195
  )(rootEl)
1186
1196
  }
1197
+
1198
+ export function writeSpatialExtents(record: DatasetRecord, rootEl: XmlElement) {
1199
+ const appendBoundingPolygon = (geometry?: Geometry) => {
1200
+ if (!geometry) return null
1201
+ return pipe(
1202
+ createElement('gmd:EX_BoundingPolygon'),
1203
+ appendChildren(
1204
+ pipe(
1205
+ createElement('gmd:polygon'),
1206
+ appendChildren(() => writeGeometry(geometry))
1207
+ )
1208
+ )
1209
+ )
1210
+ }
1211
+
1212
+ const appendGeographicBoundingBox = (
1213
+ bbox?: [number, number, number, number]
1214
+ ) => {
1215
+ if (!bbox) return null
1216
+ return pipe(
1217
+ createElement('gmd:EX_GeographicBoundingBox'),
1218
+ appendChildren(
1219
+ pipe(createElement('gmd:westBoundLongitude'), writeDecimal(bbox[0])),
1220
+ pipe(createElement('gmd:eastBoundLongitude'), writeDecimal(bbox[2])),
1221
+ pipe(createElement('gmd:southBoundLatitude'), writeDecimal(bbox[1])),
1222
+ pipe(createElement('gmd:northBoundLatitude'), writeDecimal(bbox[3]))
1223
+ )
1224
+ )
1225
+ }
1226
+
1227
+ const appendGeographicDescription = (description?: string) => {
1228
+ if (!description) return null
1229
+ return pipe(
1230
+ createElement('gmd:EX_GeographicDescription'),
1231
+ createChild('gmd:geographicIdentifier'),
1232
+ createChild('gmd:MD_Identifier'),
1233
+ createChild('gmd:code'),
1234
+ writeCharacterString(description)
1235
+ )
1236
+ }
1237
+
1238
+ pipe(
1239
+ findOrCreateIdentification(),
1240
+ findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'),
1241
+ removeChildrenByName('gmd:geographicElement'),
1242
+ appendChildren(
1243
+ ...record.spatialExtents.map((extent) =>
1244
+ pipe(
1245
+ createElement('gmd:geographicElement'),
1246
+ appendChildren(
1247
+ appendBoundingPolygon(extent.geometry),
1248
+ appendGeographicBoundingBox(extent.bbox),
1249
+ appendGeographicDescription(extent.description)
1250
+ )
1251
+ )
1252
+ )
1253
+ )
1254
+ )(rootEl)
1255
+ }
@@ -6,6 +6,7 @@ import {
6
6
  XmlText,
7
7
  } from '@rgrove/parse-xml'
8
8
  import { ChainableFunction, fallback } from './function-utils'
9
+
9
10
  export { XmlDocument, XmlElement } from '@rgrove/parse-xml'
10
11
 
11
12
  export class XmlParseError extends Error {
@@ -115,6 +116,10 @@ export function allChildrenElement(element: XmlElement): Array<XmlElement> {
115
116
  ] as Array<XmlElement>
116
117
  }
117
118
 
119
+ export function firstChildElement(element: XmlElement): XmlElement {
120
+ return allChildrenElement(element)[0] ?? null
121
+ }
122
+
118
123
  /**
119
124
  * Will return all matching elements nested according to the given
120
125
  * names (similar to a path), starting form the input element;
@@ -228,6 +233,7 @@ export function xmlToString(
228
233
  ${padding}<${el.name}${attrs}/>
229
234
  ${parentPadding}`
230
235
  }
236
+
231
237
  return `
232
238
  ${padding}<${el.name}${attrs}>${children}</${el.name}>
233
239
  ${parentPadding}`
@@ -307,11 +313,13 @@ function getTreeRoot(element: XmlElement): XmlElement {
307
313
 
308
314
  // stays on the parent element
309
315
  // if the given elements are part of a subtree, will add the root of subtree
316
+ // will filter out falsy elements
310
317
  export function appendChildren(
311
318
  ...childrenFns: Array<ChainableFunction<void, XmlElement>>
312
319
  ): ChainableFunction<XmlElement, XmlElement> {
313
320
  return (element) => {
314
321
  if (!element) return null
322
+ childrenFns = childrenFns.filter((fn) => fn)
315
323
  element.children.push(...childrenFns.map((fn) => fn()).map(getTreeRoot))
316
324
  element.children.forEach((el) => (el.parent = element))
317
325
  return element
@@ -159,7 +159,8 @@ export interface GraphicOverview {
159
159
  }
160
160
 
161
161
  export interface DatasetSpatialExtent {
162
- geometry: Geometry
162
+ bbox?: [number, number, number, number]
163
+ geometry?: Geometry
163
164
  description?: string
164
165
  }
165
166
 
@@ -220,11 +220,10 @@ export class MapUtilsService {
220
220
  if (!('spatialExtents' in record) || record.spatialExtents.length === 0) {
221
221
  return null
222
222
  }
223
- // transform an array of geojson geometries into a bbox
223
+ // extend all the spatial extents bbox into an including bbox
224
224
  const totalExtent = record.spatialExtents.reduce(
225
225
  (prev, curr) => {
226
- const geom = GEOJSON.readGeometry(curr.geometry)
227
- return extend(prev, geom.getExtent())
226
+ return extend(prev, curr.bbox)
228
227
  },
229
228
  [Infinity, Infinity, -Infinity, -Infinity]
230
229
  )
@@ -1,22 +1,16 @@
1
- <div
2
- *ngIf="metadataQualityDisplay"
3
- class="mb-6 metadata-quality"
4
- (mouseenter)="showMenu()"
5
- (mouseleave)="hideMenu()"
6
- >
7
- <div class="min-w-[200px]" [class]="smaller ? 'leading-[8px]' : ''">
8
- <gn-ui-progress-bar
9
- (focus)="showMenu()"
10
- (blur)="hideMenu()"
11
- tabindex="0"
12
- [value]="qualityScore"
13
- type="primary"
14
- ></gn-ui-progress-bar>
15
- </div>
16
- <div
17
- class="absolute z-10 bg-white border border-black border-opacity-35 rounded-lg shadow-lg p-5 whitespace-nowrap"
18
- [class]="isMenuShown ? 'block' : 'hidden'"
19
- >
1
+ <div *ngIf="metadataQualityDisplay" class="mb-6 metadata-quality">
2
+ <gn-ui-popover [content]="popoverItems" theme="light-border">
3
+ <div class="min-w-[200px]" [class]="smaller ? 'leading-[8px]' : ''">
4
+ <gn-ui-progress-bar
5
+ tabindex="0"
6
+ [value]="qualityScore"
7
+ type="primary"
8
+ ></gn-ui-progress-bar>
9
+ </div>
10
+ </gn-ui-popover>
11
+ </div>
12
+ <ng-template #popoverItems>
13
+ <div class="p-2 py-4">
20
14
  <div class="mb-4 font-bold" translate>record.metadata.quality.details</div>
21
15
  <gn-ui-metadata-quality-item
22
16
  *ngFor="let e of items"
@@ -24,4 +18,4 @@
24
18
  [value]="e.value"
25
19
  ></gn-ui-metadata-quality-item>
26
20
  </div>
27
- </div>
21
+ </ng-template>
@@ -21,8 +21,6 @@ export class MetadataQualityComponent implements OnChanges {
21
21
 
22
22
  items: MetadataQualityItem[] = []
23
23
 
24
- isMenuShown = false
25
-
26
24
  get qualityScore() {
27
25
  const qualityScore = this.metadata?.extras?.qualityScore
28
26
  return typeof qualityScore === 'number'
@@ -36,14 +34,6 @@ export class MetadataQualityComponent implements OnChanges {
36
34
  )
37
35
  }
38
36
 
39
- showMenu() {
40
- this.isMenuShown = true
41
- }
42
-
43
- hideMenu() {
44
- this.isMenuShown = false
45
- }
46
-
47
37
  private add(name: string, value: boolean) {
48
38
  if (this.metadataQualityDisplay?.[name] !== false) {
49
39
  this.items.push({ name, value })
@@ -1,4 +1,4 @@
1
1
  <div class="ml-4 flex flex-row">
2
- <mat-icon class="material-symbols-outlined">{{ icon }}</mat-icon>
2
+ <mat-icon class="material-symbols-outlined min-w-fit">{{ icon }}</mat-icon>
3
3
  <p class="ml-2 text">{{ labelKey | translate }}</p>
4
4
  </div>
@@ -9,7 +9,7 @@ import { ContentGhostComponent } from './content-ghost/content-ghost.component'
9
9
  import { DownloadItemComponent } from './download-item/download-item.component'
10
10
  import { DownloadsListComponent } from './downloads-list/downloads-list.component'
11
11
  import { ApiCardComponent } from './api-card/api-card.component'
12
- import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
12
+ import { PopoverComponent, UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
13
13
  import { MaxLinesComponent, UiLayoutModule } from '../../../../../libs/ui/layout/src'
14
14
  import { TranslateModule } from '@ngx-translate/core'
15
15
  import { RelatedRecordCardComponent } from './related-record-card/related-record-card.component'
@@ -45,6 +45,7 @@ import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
45
45
  UiInputsModule,
46
46
  FormsModule,
47
47
  NgOptimizedImage,
48
+ PopoverComponent,
48
49
  MarkdownParserComponent,
49
50
  ThumbnailComponent,
50
51
  TimeSincePipe,
@@ -1,5 +1,6 @@
1
1
  export * from './lib/ui-widgets.module'
2
2
  export * from './lib/progress-bar/progress-bar.component'
3
+ export * from './lib/popover/popover.component'
3
4
  export * from './lib/loading-mask/loading-mask.component'
4
5
  export * from './lib/color-scale/color-scale.component'
5
6
  export * from './lib/popup-alert/popup-alert.component'
@@ -0,0 +1,3 @@
1
+ <span #popoverContent>
2
+ <ng-content></ng-content>
3
+ </span>
@@ -0,0 +1,85 @@
1
+ import { CommonModule } from '@angular/common'
2
+ import {
3
+ Component,
4
+ AfterViewInit,
5
+ ElementRef,
6
+ Input,
7
+ ViewChild,
8
+ OnDestroy,
9
+ OnChanges,
10
+ SimpleChanges,
11
+ TemplateRef,
12
+ Renderer2,
13
+ ViewContainerRef,
14
+ EmbeddedViewRef,
15
+ } from '@angular/core'
16
+ import tippy, { Instance } from 'tippy.js'
17
+
18
+ @Component({
19
+ selector: 'gn-ui-popover',
20
+ templateUrl: './popover.component.html',
21
+ styleUrls: ['./popover.component.css'],
22
+ standalone: true,
23
+ imports: [CommonModule],
24
+ })
25
+ export class PopoverComponent implements AfterViewInit, OnChanges, OnDestroy {
26
+ @ViewChild('popoverContent', { static: false }) popoverContent: ElementRef
27
+ @Input() content: string | TemplateRef<any>
28
+ @Input() theme: 'light' | 'light-border' | 'translucent' | 'material' | ''
29
+
30
+ private tippyInstance: Instance
31
+ private view: EmbeddedViewRef<any>
32
+
33
+ constructor(
34
+ private viewContainerRef: ViewContainerRef,
35
+ private renderer: Renderer2
36
+ ) {}
37
+
38
+ private getContent(): string | HTMLElement {
39
+ if (this.content instanceof TemplateRef) {
40
+ if (this.view) {
41
+ this.view.destroy()
42
+ }
43
+ this.view = this.viewContainerRef.createEmbeddedView(this.content)
44
+ this.view.detectChanges()
45
+ const wrapper = this.renderer.createElement('div') // Create a wrapper div
46
+ this.view.rootNodes.forEach((node) => {
47
+ this.renderer.appendChild(wrapper, node) // Append each root node to the wrapper
48
+ })
49
+ return wrapper
50
+ }
51
+ return this.content
52
+ }
53
+
54
+ ngAfterViewInit(): void {
55
+ this.tippyInstance = tippy(this.popoverContent.nativeElement as Element, {
56
+ content: this.getContent(),
57
+ allowHTML: true,
58
+ theme: this.theme,
59
+ })
60
+ }
61
+
62
+ ngOnChanges(changes: SimpleChanges): void {
63
+ if (changes['theme']) {
64
+ this.theme = changes['theme'].currentValue
65
+ if (this.tippyInstance) {
66
+ this.tippyInstance.setProps({ theme: this.theme })
67
+ }
68
+ }
69
+ if (changes['content']) {
70
+ this.content = changes['content'].currentValue
71
+ if (this.tippyInstance) {
72
+ this.tippyInstance.setContent(this.getContent())
73
+ }
74
+ }
75
+ }
76
+
77
+ ngOnDestroy(): void {
78
+ if (this.tippyInstance) {
79
+ this.tippyInstance.destroy()
80
+ }
81
+ if (this.view) {
82
+ this.view.destroy()
83
+ }
84
+ }
85
+ }
package/tailwind.base.css CHANGED
@@ -115,7 +115,8 @@
115
115
  --padding: var(--gn-ui-badge-padding, 0.375em 0.75em);
116
116
  --text-color: var(--gn-ui-badge-text-color, var(--color-gray-50));
117
117
  --background-color: var(--gn-ui-badge-background-color, black);
118
- @apply inline-block opacity-70 p-[--padding] rounded-[--rounded]
118
+ --opacity: var(--gn-ui-badge-opacity, 0.7);
119
+ @apply inline-block opacity-[--opacity] p-[--padding] rounded-[--rounded]
119
120
  font-medium text-[length:0.875em] leading-none text-[color:--text-color] bg-[color:--background-color];
120
121
  }
121
122
  /* makes sure icons will not make the badges grow vertically; also make size proportional */
@@ -438,7 +438,7 @@
438
438
  "search.filters.resourceType": "Ressourcentyp",
439
439
  "search.filters.standard": "Standard",
440
440
  "search.filters.title": "Ergebnisse filtern",
441
- "search.filters.topic": "Thema",
441
+ "search.filters.topic": "Themen",
442
442
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
443
443
  "search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden Datensätze im Bereich des Katalogs zuerst angezeigt. Datensätze außerhalb dieses Bereichs werden nicht angezeigt.",
444
444
  "share.tab.permalink": "Teilen",
@@ -438,7 +438,7 @@
438
438
  "search.filters.resourceType": "Resource type",
439
439
  "search.filters.standard": "Standard",
440
440
  "search.filters.title": "Filter your results",
441
- "search.filters.topic": "Topic",
441
+ "search.filters.topic": "Topics",
442
442
  "search.filters.useSpatialFilter": "Show records in the area of interest first",
443
443
  "search.filters.useSpatialFilterHelp": "When this is enabled, records situated in the catalog's area of interest are shown first; records outside of this area will not show up.",
444
444
  "share.tab.permalink": "Share",
@@ -438,7 +438,7 @@
438
438
  "search.filters.resourceType": "Type de ressource",
439
439
  "search.filters.standard": "Standard",
440
440
  "search.filters.title": "Affiner votre recherche",
441
- "search.filters.topic": "Thème",
441
+ "search.filters.topic": "Thèmes",
442
442
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
443
443
  "search.filters.useSpatialFilterHelp": "Si cette option est activée, les fiches portant sur la zone d'intérêt du catalogue seront montrées en premier; les fiches en dehors de cette zone n'apparaîtront pas dans les résultats.",
444
444
  "share.tab.permalink": "Partager",
@@ -438,7 +438,7 @@
438
438
  "search.filters.resourceType": "Tipo di risorsa",
439
439
  "search.filters.standard": "Standard",
440
440
  "search.filters.title": "Affina la sua ricerca",
441
- "search.filters.topic": "Argomento",
441
+ "search.filters.topic": "Argomenti",
442
442
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
443
443
  "search.filters.useSpatialFilterHelp": "Se attivata, le schede relative all'area di interesse del catalogo saranno mostrate per prime; le schede al di fuori di questa area non appariranno nei risultati.",
444
444
  "share.tab.permalink": "Condividere",
@@ -438,7 +438,7 @@
438
438
  "search.filters.resourceType": "Typ zdroja",
439
439
  "search.filters.standard": "Štandard",
440
440
  "search.filters.title": "Filtrovanie výsledkov",
441
- "search.filters.topic": "Téma",
441
+ "search.filters.topic": "Témy",
442
442
  "search.filters.useSpatialFilter": "Najskôr zobraziť záznamy v oblasti záujmu",
443
443
  "search.filters.useSpatialFilterHelp": "Keď je táto možnosť zapnutá, záznamy nachádzajúce sa v oblasti záujmu katalógu sa zobrazia ako prvé; záznamy mimo tejto oblasti sa nezobrazia.",
444
444
  "share.tab.permalink": "Zdieľať",