geonetwork-ui 2.6.0-dev.600519f47 → 2.6.0-dev.609dd7257

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 (138) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +4 -1
  2. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +4 -2
  3. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -2
  4. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +45 -15
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  6. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  8. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  9. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +4 -3
  10. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +1 -1
  11. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +49 -23
  12. package/esm2022/libs/feature/search/src/lib/constants.mjs +3 -2
  13. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +5 -3
  14. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  15. package/esm2022/libs/ui/elements/src/index.mjs +1 -2
  16. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +19 -34
  17. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  18. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +35 -10
  19. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +5 -1
  20. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +50 -29
  21. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -3
  22. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  23. package/esm2022/libs/ui/layout/src/lib/cell-popin/cell-popin.component.mjs +110 -0
  24. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  25. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +15 -49
  26. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +2 -2
  27. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +5 -3
  28. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +16 -8
  29. package/esm2022/translations/de.json +20 -6
  30. package/esm2022/translations/en.json +20 -6
  31. package/esm2022/translations/es.json +19 -5
  32. package/esm2022/translations/fr.json +20 -6
  33. package/esm2022/translations/it.json +22 -8
  34. package/esm2022/translations/nl.json +19 -5
  35. package/esm2022/translations/pt.json +19 -5
  36. package/fesm2022/geonetwork-ui.mjs +1003 -711
  37. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  38. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  39. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  40. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  41. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +8 -2
  42. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  43. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  44. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  45. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  46. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  47. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +20 -17
  48. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  49. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +3 -0
  50. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  51. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  52. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +13 -5
  53. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  54. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  55. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +2 -1
  56. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  57. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  58. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  59. package/libs/ui/elements/src/index.d.ts +0 -1
  60. package/libs/ui/elements/src/index.d.ts.map +1 -1
  61. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -6
  62. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  63. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  64. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  65. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +3 -0
  66. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  67. package/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.d.ts.map +1 -1
  68. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +20 -9
  69. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -1
  70. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  71. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  72. package/libs/ui/layout/src/index.d.ts +1 -0
  73. package/libs/ui/layout/src/index.d.ts.map +1 -1
  74. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts +28 -0
  75. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts.map +1 -0
  76. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  77. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  78. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +5 -10
  79. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  80. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +2 -1
  81. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  82. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +5 -3
  83. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  84. package/package.json +1 -1
  85. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +7 -0
  86. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +3 -1
  87. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -1
  88. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +57 -14
  89. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  90. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  91. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +20 -14
  92. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +3 -0
  93. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +61 -0
  94. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +1 -1
  95. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +1 -0
  96. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +27 -9
  97. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +84 -27
  98. package/src/libs/feature/search/src/lib/constants.ts +2 -1
  99. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  100. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
  101. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  102. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  103. package/src/libs/ui/elements/src/index.ts +0 -1
  104. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +8 -76
  105. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +20 -51
  106. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  107. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  108. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +48 -9
  109. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +4 -0
  110. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +96 -37
  111. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +60 -29
  112. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -0
  113. package/src/libs/ui/layout/src/index.ts +1 -0
  114. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.html +40 -0
  115. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.ts +141 -0
  116. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +2 -2
  117. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  118. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +25 -42
  119. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +10 -49
  120. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -1
  121. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +6 -4
  122. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +1 -0
  123. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +14 -20
  124. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +13 -5
  125. package/translations/de.json +20 -6
  126. package/translations/en.json +20 -6
  127. package/translations/es.json +19 -5
  128. package/translations/fr.json +20 -6
  129. package/translations/it.json +22 -8
  130. package/translations/nl.json +19 -5
  131. package/translations/pt.json +19 -5
  132. package/translations/sk.json +19 -5
  133. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +0 -56
  134. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +0 -19
  135. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +0 -1
  136. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.css +0 -0
  137. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +0 -9
  138. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +0 -61
@@ -10,16 +10,17 @@ import {
10
10
  } from '@angular/core'
11
11
  import { CommonModule } from '@angular/common'
12
12
  import { provideIcons, NgIconComponent } from '@ng-icons/core'
13
- import { iconoirExpand, iconoirReduce } from '@ng-icons/iconoir'
13
+ import { iconoirExpand } from '@ng-icons/iconoir'
14
14
  import { TranslateModule } from '@ngx-translate/core'
15
15
  import { MatButtonModule } from '@angular/material/button'
16
16
  import {
17
+ CdkScrollable,
17
18
  OverlayModule,
18
19
  ViewportRuler,
19
20
  ConnectedPosition,
20
21
  } from '@angular/cdk/overlay'
21
22
  import { ButtonComponent } from '../../../../../../libs/ui/inputs/src'
22
- import { Subscription } from 'rxjs'
23
+ import { CellPopinComponent } from '../cell-popin/cell-popin.component'
23
24
 
24
25
  @Component({
25
26
  selector: 'gn-ui-truncated-text',
@@ -30,33 +31,29 @@ import { Subscription } from 'rxjs'
30
31
  MatButtonModule,
31
32
  OverlayModule,
32
33
  ButtonComponent,
34
+ CellPopinComponent,
33
35
  NgIconComponent,
34
36
  ],
35
- providers: [provideIcons({ iconoirExpand, iconoirReduce })],
37
+ providers: [provideIcons({ iconoirExpand })],
36
38
  templateUrl: './truncated-text.component.html',
37
39
  styles: [],
38
40
  })
39
41
  export class TruncatedTextComponent implements AfterViewInit, OnDestroy {
40
42
  @Input() text = ''
41
43
  @Input() extraClass = ''
44
+ @Input() scrollContainer!: ElementRef
45
+ @Input() cdkScrollContainer!: CdkScrollable
42
46
 
43
47
  @ViewChild('textElement') textElement: ElementRef<HTMLElement>
48
+
44
49
  isTextTruncated = false
45
- isOpen = false
46
- overlayPosition: ConnectedPosition = {
47
- originX: 'end',
48
- originY: 'top',
49
- overlayX: 'end',
50
- overlayY: 'top',
51
- }
50
+
52
51
  private readonly resizeObserver: ResizeObserver
53
52
  private readonly mutationObserver: MutationObserver
54
- private readonly viewportSubscription: Subscription
55
53
 
56
54
  constructor(
57
55
  private readonly cd: ChangeDetectorRef,
58
- private readonly ngZone: NgZone,
59
- private readonly viewportRuler: ViewportRuler
56
+ private readonly ngZone: NgZone
60
57
  ) {
61
58
  this.resizeObserver = new ResizeObserver(() => {
62
59
  this.ngZone.run(() => this.checkTextTruncation())
@@ -65,15 +62,8 @@ export class TruncatedTextComponent implements AfterViewInit, OnDestroy {
65
62
  this.mutationObserver = new MutationObserver(() => {
66
63
  this.ngZone.run(() => {
67
64
  this.checkTextTruncation()
68
- this.close()
69
65
  })
70
66
  })
71
-
72
- this.viewportSubscription = this.viewportRuler.change().subscribe(() => {
73
- if (this.isOpen) {
74
- this.updateOverlayPosition()
75
- }
76
- })
77
67
  }
78
68
 
79
69
  ngAfterViewInit() {
@@ -90,35 +80,6 @@ export class TruncatedTextComponent implements AfterViewInit, OnDestroy {
90
80
  ngOnDestroy() {
91
81
  this.resizeObserver?.disconnect()
92
82
  this.mutationObserver?.disconnect()
93
- this.viewportSubscription?.unsubscribe()
94
- this.close()
95
- }
96
-
97
- toggleOverlay() {
98
- this.isOpen = !this.isOpen
99
- if (this.isOpen) {
100
- this.updateOverlayPosition()
101
- }
102
- }
103
-
104
- private updateOverlayPosition() {
105
- const element = this.textElement.nativeElement
106
- const rect = element.getBoundingClientRect()
107
- const viewportWidth = this.viewportRuler.getViewportSize().width
108
- const isMobile = viewportWidth < 640
109
- const overlayWidth = isMobile ? 190 : 320
110
- const isNearLeftEdge = rect.left < overlayWidth
111
-
112
- this.overlayPosition = {
113
- originX: isNearLeftEdge ? 'start' : 'end',
114
- originY: 'top',
115
- overlayX: isNearLeftEdge ? 'start' : 'end',
116
- overlayY: 'top',
117
- }
118
- }
119
-
120
- close() {
121
- this.isOpen = false
122
83
  }
123
84
 
124
85
  private checkTextTruncation() {
@@ -1,9 +1,9 @@
1
1
  import { NgModule } from '@angular/core'
2
2
  import { CommonModule } from '@angular/common'
3
3
  import { TranslateModule } from '@ngx-translate/core'
4
+ import { NgIconComponent } from '@ng-icons/core'
4
5
  import { StickyHeaderComponent } from './sticky-header/sticky-header.component'
5
6
  import { AnchorLinkDirective } from './anchor-link/anchor-link.directive'
6
- import { NgIconComponent, provideNgIconsConfig } from '@ng-icons/core'
7
7
 
8
8
  @NgModule({
9
9
  imports: [CommonModule, TranslateModule.forChild(), NgIconComponent],
@@ -13,11 +13,13 @@
13
13
  [disabled]="!canDuplicate"
14
14
  data-test="record-menu-duplicate-button"
15
15
  >
16
- <span *ngIf="canDuplicate" translate>record.action.duplicate</span>
17
- <span *ngIf="!canDuplicate" translate
16
+ <span *ngIf="isDuplicating; else notDuplicating" translate
18
17
  >record.action.duplicating</span
19
- ></gn-ui-button
20
- >
18
+ >
19
+ <ng-template #notDuplicating>
20
+ <span translate>record.action.duplicate</span>
21
+ </ng-template>
22
+ </gn-ui-button>
21
23
  <gn-ui-button
22
24
  *ngIf="page === 'record'"
23
25
  type="light"
@@ -31,6 +31,7 @@ type ActionMenuPage = 'mainMenu' | 'deleteMenu' | 'rollbackMenu'
31
31
  })
32
32
  export class ActionMenuComponent {
33
33
  @Input() canDuplicate = true
34
+ @Input() isDuplicating: boolean
34
35
  @Input() canDelete = true
35
36
  @Input() page: 'draft' | 'main' | 'record'
36
37
  @Output() duplicate = new EventEmitter<void>()
@@ -1,5 +1,6 @@
1
1
  <gn-ui-interactive-table
2
2
  [items]="records"
3
+ [canEditItem]="canEdit"
3
4
  [isDraftPage]="isDraftPage"
4
5
  (itemClick)="handleRecordClick($event)"
5
6
  >
@@ -9,15 +10,16 @@
9
10
  <ng-icon
10
11
  name="iconoirLock"
11
12
  class="text-purple"
12
- *ngIf="(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'"
13
+ *ngIf="(canEdit(item) | async) === false; else selectCheckbox"
13
14
  ></ng-icon>
14
- <gn-ui-checkbox
15
- *ngIf="(item.extras?.edit || isDraftPage) && item.kind === 'dataset'"
16
- [checked]="isChecked(item)"
17
- (changed)="handleRecordSelectedChange($event, item)"
18
- class="-m-2"
19
- type="default"
20
- ></gn-ui-checkbox>
15
+ <ng-template #selectCheckbox>
16
+ <gn-ui-checkbox
17
+ [checked]="isChecked(item)"
18
+ (changed)="handleRecordSelectedChange($event, item)"
19
+ class="-m-2"
20
+ type="default"
21
+ ></gn-ui-checkbox>
22
+ </ng-template>
21
23
  </ng-template>
22
24
  </gn-ui-interactive-table-column>
23
25
 
@@ -158,23 +160,15 @@
158
160
  (buttonClick)="openActionMenu(item, template)"
159
161
  type="light"
160
162
  data-test="record-menu-button"
161
- [disabled]="
162
- (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'
163
- "
164
163
  >
165
- <ng-icon
166
- [ngClass]="{
167
- 'text-purple-light':
168
- (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',
169
- }"
170
- name="matMoreVert"
171
- ></ng-icon>
164
+ <ng-icon name="matMoreVert"></ng-icon>
172
165
  </gn-ui-button>
173
166
  </div>
174
167
  <ng-template #template>
175
168
  <gn-ui-action-menu
176
- [canDuplicate]="canDuplicate(item) && !isDuplicating"
177
- [canDelete]="canDelete(item)"
169
+ [canDuplicate]="canDuplicate(item)"
170
+ [isDuplicating]="isDuplicating"
171
+ [canDelete]="canDelete(item) | async"
178
172
  [page]="isDraftPage ? 'draft' : 'main'"
179
173
  (duplicate)="handleDuplicate(item)"
180
174
  (delete)="handleDelete(item)"
@@ -35,6 +35,7 @@ import { iconoirUser, iconoirLock, iconoirTranslate } from '@ng-icons/iconoir'
35
35
  import { CdkOverlayOrigin, Overlay, OverlayRef } from '@angular/cdk/overlay'
36
36
  import { TemplatePortal } from '@angular/cdk/portal'
37
37
  import { matMoreVert } from '@ng-icons/material-icons/baseline'
38
+ import { Observable, of, take } from 'rxjs'
38
39
 
39
40
  @Component({
40
41
  selector: 'gn-ui-results-table',
@@ -62,7 +63,10 @@ export class ResultsTableComponent {
62
63
  @Input() sortOrder: SortByField = null
63
64
  @Input() hasDraft: (record: CatalogRecord) => boolean = () => false
64
65
  @Input() canDuplicate: (record: CatalogRecord) => boolean = () => true
65
- @Input() canDelete: (record: CatalogRecord) => boolean = () => true
66
+ @Input() canDelete: (record: CatalogRecord) => Observable<boolean> = () =>
67
+ of(true)
68
+ @Input() canEdit: (record: CatalogRecord) => Observable<boolean> = () =>
69
+ of(true)
66
70
  @Input() isDraftPage = false
67
71
  @Input() isDuplicating = false
68
72
 
@@ -171,10 +175,14 @@ export class ResultsTableComponent {
171
175
  return getBadgeColor(format)
172
176
  }
173
177
 
174
- handleRecordClick(item: CatalogRecord) {
175
- if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
176
- this.recordClick.emit(item as CatalogRecord)
177
- }
178
+ handleRecordClick(item: unknown) {
179
+ this.canEdit(item as CatalogRecord)
180
+ .pipe(take(1))
181
+ .subscribe((canEdit) => {
182
+ if (canEdit) {
183
+ this.recordClick.emit(item as CatalogRecord)
184
+ }
185
+ })
178
186
  }
179
187
 
180
188
  handleDuplicate(item: unknown) {
@@ -241,8 +241,9 @@
241
241
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
242
242
  "editor.record.loadError.closeMessage": "Verstanden",
243
243
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
244
- "editor.record.lock.format": "",
245
- "editor.record.lock.reason": "",
244
+ "editor.record.lock.harvested": "",
245
+ "editor.record.lock.owner": "",
246
+ "editor.record.lock.resourceType": "",
246
247
  "editor.record.multilingual.confirmation.cancelText": "",
247
248
  "editor.record.multilingual.confirmation.confirmText": "",
248
249
  "editor.record.multilingual.confirmation.message": "",
@@ -293,6 +294,11 @@
293
294
  "facets.block.title.tag.default": "Stichwort",
294
295
  "facets.block.title.th_regions_tree.default": "Regionen",
295
296
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Anmelden</a>, um auf diese Funktion zuzugreifen</div>",
297
+ "feature.catalog.attribute.code": "Code",
298
+ "feature.catalog.attribute.definition": "Beschreibung",
299
+ "feature.catalog.attribute.name": "Name",
300
+ "feature.catalog.attribute.type": "Typ",
301
+ "feature.catalog.attribute.values": "Werte",
296
302
  "input.file.dropFileLabel": "",
297
303
  "input.file.orInputUrl": "",
298
304
  "input.file.selectFileLabel": "",
@@ -352,6 +358,7 @@
352
358
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
353
359
  "map.ogc.urlInput.hint": "",
354
360
  "map.select.layer": "Datenquelle",
361
+ "map.select.style": "Style",
355
362
  "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
356
363
  "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
357
364
  "multiselect.filter.placeholder": "Suche",
@@ -430,9 +437,15 @@
430
437
  "record.metadata.download": "Downloads",
431
438
  "record.metadata.feature.catalog": "",
432
439
  "record.metadata.formats": "Formate",
440
+ "record.metadata.isGeographical": "Geographischer Datensatz",
433
441
  "record.metadata.keywords": "Stichworte",
434
442
  "record.metadata.languages": "Sprachen",
435
443
  "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
444
+ "record.metadata.linked.datasets": "Verknüpfte Datensätze",
445
+ "record.metadata.linked.records": "Verknüpfte Inhalte",
446
+ "record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
447
+ "record.metadata.linked.services": "Verknüpfte Dienste",
448
+ "record.metadata.linked.sourceDatasets": "Quelldatensätze",
436
449
  "record.metadata.links": "Links",
437
450
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
438
451
  "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
@@ -442,6 +455,8 @@
442
455
  "record.metadata.publication": "Veröffentlichungsdatum",
443
456
  "record.metadata.publications": "{count, plural, =0{Veröffentlichungsdatum} one{Veröffentlichungsdatum} other{Veröffentlichungen}}",
444
457
  "record.metadata.quality": "Metadatenqualität",
458
+ "record.metadata.quality.capabilities.failed": "",
459
+ "record.metadata.quality.capabilities.success": "",
445
460
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
446
461
  "record.metadata.quality.contact.success": "Kontakt angegeben",
447
462
  "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
@@ -453,14 +468,15 @@
453
468
  "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
454
469
  "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
455
470
  "record.metadata.quality.organisation.success": "Organisation angegeben",
471
+ "record.metadata.quality.source.failed": "",
472
+ "record.metadata.quality.source.success": "",
456
473
  "record.metadata.quality.title.failed": "Titel nicht angegeben",
457
474
  "record.metadata.quality.title.success": "Titel angegeben",
458
475
  "record.metadata.quality.topic.failed": "Thema nicht angegeben",
459
476
  "record.metadata.quality.topic.success": "Thema angegeben",
460
477
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
461
478
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
462
- "record.metadata.related": "Ähnliche Datensätze",
463
- "record.metadata.related.contents": "",
479
+ "record.metadata.related": "Entdecken Sie den Katalog",
464
480
  "record.metadata.ressources.and.links": "Ressourcen und Links",
465
481
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
466
482
  "record.metadata.status": "Status",
@@ -472,7 +488,6 @@
472
488
  "record.metadata.temporalExtent.untilDate": "Bis {end}",
473
489
  "record.metadata.title": "Titel",
474
490
  "record.metadata.topics": "Kategorien",
475
- "record.metadata.isGeographical": "Geographischer Datensatz",
476
491
  "record.metadata.uniqueId": "Eindeutige Kennung",
477
492
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
478
493
  "record.metadata.updatedOn": "Geändert am",
@@ -592,7 +607,6 @@
592
607
  "tooltip.html.copy": "HTML kopieren",
593
608
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
594
609
  "tooltip.url.copy": "URL kopieren",
595
- "tooltip.url.open": "URL öffnen",
596
610
  "ui.readLess": "Weniger lesen",
597
611
  "ui.readMore": "Weiterlesen",
598
612
  "wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
@@ -241,8 +241,9 @@
241
241
  "editor.record.loadError.body": "The dataset could not be loaded:",
242
242
  "editor.record.loadError.closeMessage": "Understood",
243
243
  "editor.record.loadError.title": "Error loading dataset",
244
- "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
245
- "editor.record.lock.reason": "You are not an editor of the allowed groups",
244
+ "editor.record.lock.harvested": "Datasets harvested from an external catalog are not editable",
245
+ "editor.record.lock.owner": "You are not an editor of the allowed groups",
246
+ "editor.record.lock.resourceType": "Records of a type other than dataset are not editable",
246
247
  "editor.record.multilingual.confirmation.cancelText": "Keep the language(s)",
247
248
  "editor.record.multilingual.confirmation.confirmText": "Remove the language(s)",
248
249
  "editor.record.multilingual.confirmation.message": "You are about to remove one or several languages, which will delete all of the related translations and is irreversible. Do you want to proceed?",
@@ -293,6 +294,11 @@
293
294
  "facets.block.title.tag.default": "Tag",
294
295
  "facets.block.title.th_regions_tree.default": "Regions",
295
296
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
297
+ "feature.catalog.attribute.code": "Code",
298
+ "feature.catalog.attribute.definition": "Description",
299
+ "feature.catalog.attribute.name": "Name",
300
+ "feature.catalog.attribute.type": "Type",
301
+ "feature.catalog.attribute.values": "Values",
296
302
  "input.file.dropFileLabel": "or drop it here",
297
303
  "input.file.orInputUrl": "or create a link to an external resource",
298
304
  "input.file.selectFileLabel": "Select a file ({sizeMB} MB max.)",
@@ -352,6 +358,7 @@
352
358
  "map.navigation.message": "Please use CTRL + mouse (or two fingers on mobile) to navigate the map",
353
359
  "map.ogc.urlInput.hint": "Enter OGC API service URL",
354
360
  "map.select.layer": "Data source",
361
+ "map.select.style": "Style",
355
362
  "map.wfs.urlInput.hint": "Enter WFS service URL",
356
363
  "map.wms.urlInput.hint": "Enter WMS service URL",
357
364
  "multiselect.filter.placeholder": "Search",
@@ -430,9 +437,15 @@
430
437
  "record.metadata.download": "Downloads",
431
438
  "record.metadata.feature.catalog": "Feature catalog",
432
439
  "record.metadata.formats": "Formats",
440
+ "record.metadata.isGeographical": "Geographical dataset",
433
441
  "record.metadata.keywords": "Keywords",
434
442
  "record.metadata.languages": "Languages",
435
443
  "record.metadata.lastUpdate": "Last updated on {date}",
444
+ "record.metadata.linked.datasets": "Associated datasets",
445
+ "record.metadata.linked.records": "Associated content",
446
+ "record.metadata.linked.reuses": "Associated reuses",
447
+ "record.metadata.linked.services": "Associated services",
448
+ "record.metadata.linked.sourceDatasets": "Source datasets",
436
449
  "record.metadata.links": "Links",
437
450
  "record.metadata.noUsage": "No usage conditions specified for this dataset.",
438
451
  "record.metadata.otherConstraints": "Additional Conditions",
@@ -442,6 +455,8 @@
442
455
  "record.metadata.publication": "Date of publication",
443
456
  "record.metadata.publications": "{count, plural, =0{publication} one{publication} other{publications}}",
444
457
  "record.metadata.quality": "Metadata Quality",
458
+ "record.metadata.quality.capabilities.failed": "Capabilities URL is not specified",
459
+ "record.metadata.quality.capabilities.success": "Capabilities URL is specified",
445
460
  "record.metadata.quality.contact.failed": "Contact is not specified",
446
461
  "record.metadata.quality.contact.success": "Contact is specified",
447
462
  "record.metadata.quality.description.failed": "Description is not specified",
@@ -453,14 +468,15 @@
453
468
  "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
454
469
  "record.metadata.quality.organisation.failed": "Organisation is not specified",
455
470
  "record.metadata.quality.organisation.success": "Organisation is specified",
471
+ "record.metadata.quality.source.failed": "No source dataset is specified",
472
+ "record.metadata.quality.source.success": "A source dataset is specified",
456
473
  "record.metadata.quality.title.failed": "Title is not specified",
457
474
  "record.metadata.quality.title.success": "Title is specified",
458
475
  "record.metadata.quality.topic.failed": "Topic is not specified",
459
476
  "record.metadata.quality.topic.success": "Topic is specified",
460
477
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
461
478
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
462
- "record.metadata.related": "Related records",
463
- "record.metadata.related.contents": "Related content",
479
+ "record.metadata.related": "Explore the catalog",
464
480
  "record.metadata.ressources.and.links": "Resources and links",
465
481
  "record.metadata.sheet": "Original metadata",
466
482
  "record.metadata.status": "Status",
@@ -472,7 +488,6 @@
472
488
  "record.metadata.temporalExtent.untilDate": "Until { end }",
473
489
  "record.metadata.title": "Title",
474
490
  "record.metadata.topics": "Categories",
475
- "record.metadata.isGeographical": "Geographical dataset",
476
491
  "record.metadata.uniqueId": "Unique Identifier",
477
492
  "record.metadata.updateFrequency": "Data Update Frequency",
478
493
  "record.metadata.updatedOn": "Updated on",
@@ -592,7 +607,6 @@
592
607
  "tooltip.html.copy": "Copy HTML",
593
608
  "tooltip.id.copy": "Copy unique identifier",
594
609
  "tooltip.url.copy": "Copy URL",
595
- "tooltip.url.open": "Open URL",
596
610
  "ui.readLess": "Read less",
597
611
  "ui.readMore": "Read more",
598
612
  "wfs.feature.limit": "Too many features to display the WFS layer!",
@@ -241,8 +241,9 @@
241
241
  "editor.record.loadError.body": "",
242
242
  "editor.record.loadError.closeMessage": "",
243
243
  "editor.record.loadError.title": "",
244
- "editor.record.lock.format": "",
245
- "editor.record.lock.reason": "",
244
+ "editor.record.lock.harvested": "",
245
+ "editor.record.lock.owner": "",
246
+ "editor.record.lock.resourceType": "",
246
247
  "editor.record.multilingual.confirmation.cancelText": "",
247
248
  "editor.record.multilingual.confirmation.confirmText": "",
248
249
  "editor.record.multilingual.confirmation.message": "",
@@ -293,6 +294,11 @@
293
294
  "facets.block.title.tag.default": "",
294
295
  "facets.block.title.th_regions_tree.default": "",
295
296
  "favorite.not.authenticated.tooltip": "",
297
+ "feature.catalog.attribute.code": "Código",
298
+ "feature.catalog.attribute.definition": "Descripción",
299
+ "feature.catalog.attribute.name": "Nombre",
300
+ "feature.catalog.attribute.type": "Tipo",
301
+ "feature.catalog.attribute.values": "Valores",
296
302
  "input.file.dropFileLabel": "",
297
303
  "input.file.orInputUrl": "",
298
304
  "input.file.selectFileLabel": "",
@@ -352,6 +358,7 @@
352
358
  "map.navigation.message": "",
353
359
  "map.ogc.urlInput.hint": "",
354
360
  "map.select.layer": "",
361
+ "map.select.style": "",
355
362
  "map.wfs.urlInput.hint": "",
356
363
  "map.wms.urlInput.hint": "",
357
364
  "multiselect.filter.placeholder": "",
@@ -430,9 +437,15 @@
430
437
  "record.metadata.download": "",
431
438
  "record.metadata.feature.catalog": "",
432
439
  "record.metadata.formats": "",
440
+ "record.metadata.isGeographical": "",
433
441
  "record.metadata.keywords": "",
434
442
  "record.metadata.languages": "",
435
443
  "record.metadata.lastUpdate": "",
444
+ "record.metadata.linked.datasets": "",
445
+ "record.metadata.linked.records": "",
446
+ "record.metadata.linked.reuses": "",
447
+ "record.metadata.linked.services": "",
448
+ "record.metadata.linked.sourceDatasets": "",
436
449
  "record.metadata.links": "",
437
450
  "record.metadata.noUsage": "",
438
451
  "record.metadata.otherConstraints": "",
@@ -442,6 +455,8 @@
442
455
  "record.metadata.publication": "",
443
456
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
444
457
  "record.metadata.quality": "",
458
+ "record.metadata.quality.capabilities.failed": "",
459
+ "record.metadata.quality.capabilities.success": "",
445
460
  "record.metadata.quality.contact.failed": "",
446
461
  "record.metadata.quality.contact.success": "",
447
462
  "record.metadata.quality.description.failed": "",
@@ -453,6 +468,8 @@
453
468
  "record.metadata.quality.legalConstraints.success": "",
454
469
  "record.metadata.quality.organisation.failed": "",
455
470
  "record.metadata.quality.organisation.success": "",
471
+ "record.metadata.quality.source.failed": "",
472
+ "record.metadata.quality.source.success": "",
456
473
  "record.metadata.quality.title.failed": "",
457
474
  "record.metadata.quality.title.success": "",
458
475
  "record.metadata.quality.topic.failed": "",
@@ -460,7 +477,6 @@
460
477
  "record.metadata.quality.updateFrequency.failed": "",
461
478
  "record.metadata.quality.updateFrequency.success": "",
462
479
  "record.metadata.related": "",
463
- "record.metadata.related.contents": "",
464
480
  "record.metadata.ressources.and.links": "Recursos y enlaces",
465
481
  "record.metadata.sheet": "",
466
482
  "record.metadata.status": "",
@@ -472,7 +488,6 @@
472
488
  "record.metadata.temporalExtent.untilDate": "",
473
489
  "record.metadata.title": "",
474
490
  "record.metadata.topics": "",
475
- "record.metadata.isGeographical": "",
476
491
  "record.metadata.uniqueId": "",
477
492
  "record.metadata.updateFrequency": "",
478
493
  "record.metadata.updatedOn": "",
@@ -592,7 +607,6 @@
592
607
  "tooltip.html.copy": "",
593
608
  "tooltip.id.copy": "",
594
609
  "tooltip.url.copy": "",
595
- "tooltip.url.open": "",
596
610
  "ui.readLess": "",
597
611
  "ui.readMore": "",
598
612
  "wfs.feature.limit": "",
@@ -241,8 +241,9 @@
241
241
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
242
242
  "editor.record.loadError.closeMessage": "Compris",
243
243
  "editor.record.loadError.title": "Erreur lors du chargement",
244
- "editor.record.lock.format": "Les jeux de données de type 'service' et 'reuse' ne sont pas éditables",
245
- "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
244
+ "editor.record.lock.harvested": "Les jeux de données moissonnés ne sont pas éditables",
245
+ "editor.record.lock.owner": "Vous n'êtes pas éditeur d'un des groupes autorisés",
246
+ "editor.record.lock.resourceType": "Les fiches d'un type autre que jeu de données ne sont pas éditables",
246
247
  "editor.record.multilingual.confirmation.cancelText": "Garder le(s) language(s)",
247
248
  "editor.record.multilingual.confirmation.confirmText": "Supprimer le(s) language(s)",
248
249
  "editor.record.multilingual.confirmation.message": "Vous allez supprimer un ou plusieurs languages, ce qui supprimera toutes les traductions qui y sont liées et est irréversible. Voulez-vous procéder ?",
@@ -293,6 +294,11 @@
293
294
  "facets.block.title.tag.default": "Tag",
294
295
  "facets.block.title.th_regions_tree.default": "Régions",
295
296
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
297
+ "feature.catalog.attribute.code": "Code",
298
+ "feature.catalog.attribute.definition": "Description",
299
+ "feature.catalog.attribute.name": "Nom",
300
+ "feature.catalog.attribute.type": "Type",
301
+ "feature.catalog.attribute.values": "Valeurs",
296
302
  "input.file.dropFileLabel": "ou glissez-le ici",
297
303
  "input.file.orInputUrl": "ou créez un lien vers une ressource externe",
298
304
  "input.file.selectFileLabel": "Sélectionnez un fichier ({sizeMB} Mo max.)",
@@ -352,6 +358,7 @@
352
358
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
353
359
  "map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
354
360
  "map.select.layer": "Source de données",
361
+ "map.select.style": "Style",
355
362
  "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
356
363
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
357
364
  "multiselect.filter.placeholder": "Rechercher",
@@ -430,9 +437,15 @@
430
437
  "record.metadata.download": "Téléchargements",
431
438
  "record.metadata.feature.catalog": "Catalogue d'attributs",
432
439
  "record.metadata.formats": "Formats",
440
+ "record.metadata.isGeographical": "Donnée géographique",
433
441
  "record.metadata.keywords": "Mots-clés",
434
442
  "record.metadata.languages": "Langues",
435
443
  "record.metadata.lastUpdate": "Mis à jour le {date}",
444
+ "record.metadata.linked.datasets": "Jeux de données associés",
445
+ "record.metadata.linked.records": "Contenus associés",
446
+ "record.metadata.linked.reuses": "Réutilisations associées",
447
+ "record.metadata.linked.services": "Services associés",
448
+ "record.metadata.linked.sourceDatasets": "Jeux de données sources",
436
449
  "record.metadata.links": "Liens",
437
450
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
438
451
  "record.metadata.otherConstraints": "Limitations d'usage",
@@ -442,6 +455,8 @@
442
455
  "record.metadata.publication": "Date de publication",
443
456
  "record.metadata.publications": "{count, plural, =0{donnée} one{donnée} other{données}}",
444
457
  "record.metadata.quality": "Qualité des métadonnées",
458
+ "record.metadata.quality.capabilities.failed": "Aucune URL de Capabilities n'est renseignée",
459
+ "record.metadata.quality.capabilities.success": "Une URL de Capabilities est renseignée",
445
460
  "record.metadata.quality.contact.failed": "Le contact n'est pas renseigné",
446
461
  "record.metadata.quality.contact.success": "Le contact est renseigné",
447
462
  "record.metadata.quality.description.failed": "La description n'est pas renseignée",
@@ -453,14 +468,15 @@
453
468
  "record.metadata.quality.legalConstraints.success": "Les contraintes légales sont renseignées",
454
469
  "record.metadata.quality.organisation.failed": "Le producteur n'est pas renseigné",
455
470
  "record.metadata.quality.organisation.success": "Le producteur est renseigné",
471
+ "record.metadata.quality.source.failed": "Aucun jeu de données source n'est renseigné",
472
+ "record.metadata.quality.source.success": "Un jeu de données source est renseigné",
456
473
  "record.metadata.quality.title.failed": "Le titre n'est pas renseigné",
457
474
  "record.metadata.quality.title.success": "Le titre est renseigné",
458
475
  "record.metadata.quality.topic.failed": "Le thème n'est pas renseigné",
459
476
  "record.metadata.quality.topic.success": "Le thème est renseigné",
460
477
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
461
478
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
462
- "record.metadata.related": "Voir aussi",
463
- "record.metadata.related.contents": "Contenu associé",
479
+ "record.metadata.related": "Explorez le catalogue",
464
480
  "record.metadata.ressources.and.links": "Ressources et liens",
465
481
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
466
482
  "record.metadata.status": "Statut",
@@ -472,7 +488,6 @@
472
488
  "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
473
489
  "record.metadata.title": "Intitulé",
474
490
  "record.metadata.topics": "Catégories",
475
- "record.metadata.isGeographical": "Donnée géographique",
476
491
  "record.metadata.uniqueId": "Identificateur de ressource unique",
477
492
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
478
493
  "record.metadata.updatedOn": "Modifié le",
@@ -592,7 +607,6 @@
592
607
  "tooltip.html.copy": "Copier le HTML",
593
608
  "tooltip.id.copy": "Copier l'identifiant unique",
594
609
  "tooltip.url.copy": "Copier l'URL",
595
- "tooltip.url.open": "Ouvrir l'URL",
596
610
  "ui.readLess": "Réduire",
597
611
  "ui.readMore": "Lire la suite",
598
612
  "wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",