geonetwork-ui 2.4.0-dev.5cc37149 → 2.4.0-dev.618ec561

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 (196) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +5 -5
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +30 -2
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.mjs +31 -0
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +23 -1
  6. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +6 -1
  7. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +12 -1
  8. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  9. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  10. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -6
  11. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  12. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +3 -3
  13. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +7 -2
  14. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
  15. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +7 -3
  16. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +16 -6
  17. package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +138 -0
  18. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +21 -0
  19. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +19 -9
  20. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +1 -2
  21. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +12 -7
  22. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
  23. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +153 -60
  24. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +2 -0
  25. package/esm2022/libs/feature/editor/src/lib/models/index.mjs +2 -1
  26. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +4 -3
  27. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +10 -5
  28. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +9 -3
  29. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +4 -3
  30. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  31. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  32. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +5 -11
  33. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +3 -3
  34. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +5 -2
  35. package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +3 -3
  36. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +11 -5
  37. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
  38. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +29 -0
  39. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +15 -7
  40. package/esm2022/libs/ui/widgets/src/index.mjs +2 -1
  41. package/esm2022/libs/ui/widgets/src/lib/popover/popover.component.mjs +68 -0
  42. package/esm2022/translations/de.json +32 -10
  43. package/esm2022/translations/en.json +32 -10
  44. package/esm2022/translations/es.json +31 -9
  45. package/esm2022/translations/fr.json +32 -10
  46. package/esm2022/translations/it.json +32 -10
  47. package/esm2022/translations/nl.json +31 -9
  48. package/esm2022/translations/pt.json +31 -9
  49. package/fesm2022/geonetwork-ui.mjs +823 -206
  50. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  51. package/libs/api/metadata-converter/src/index.d.ts +1 -0
  52. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  53. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  54. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
  55. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  56. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
  57. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
  58. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
  59. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  60. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
  61. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  62. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +1 -0
  63. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  64. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -1
  65. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  66. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +9 -0
  67. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  68. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  69. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +5 -0
  70. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  71. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +4 -4
  72. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  73. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +8 -0
  74. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
  75. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -3
  76. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  77. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +4 -8
  78. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  79. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +27 -0
  80. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +1 -0
  81. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +11 -0
  82. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -0
  83. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +6 -2
  84. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  85. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +0 -1
  86. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  87. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +5 -7
  88. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  89. package/libs/feature/editor/src/lib/expressions.d.ts +1 -1
  90. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -1
  91. package/libs/feature/editor/src/lib/fields.config.d.ts +39 -2
  92. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  93. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +36 -0
  94. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -0
  95. package/libs/feature/editor/src/lib/models/index.d.ts +1 -0
  96. package/libs/feature/editor/src/lib/models/index.d.ts.map +1 -1
  97. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  98. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  99. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  100. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +3 -1
  101. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  102. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  103. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -3
  104. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  105. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  106. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +7 -6
  107. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  108. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +4 -2
  109. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -1
  110. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +11 -0
  111. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  112. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +4 -2
  113. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  114. package/libs/ui/widgets/src/index.d.ts +1 -0
  115. package/libs/ui/widgets/src/index.d.ts.map +1 -1
  116. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts +19 -0
  117. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts.map +1 -0
  118. package/package.json +1 -1
  119. package/src/libs/api/metadata-converter/src/index.ts +1 -0
  120. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
  121. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
  122. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
  123. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +4 -2
  124. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
  125. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
  126. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
  127. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +8 -0
  128. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +20 -0
  129. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -1
  130. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +12 -0
  131. package/src/libs/common/fixtures/src/index.ts +2 -0
  132. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +156 -0
  133. package/src/libs/common/fixtures/src/lib/editor/index.ts +1 -0
  134. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +1 -5
  135. package/src/libs/data-access/gn4/src/spec.yaml +0 -8
  136. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +5 -0
  137. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +2 -2
  138. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +9 -1
  139. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +11 -0
  140. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +11 -5
  141. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +22 -8
  142. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +3 -1
  143. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +117 -21
  144. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.css +0 -0
  145. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +5 -0
  146. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +22 -0
  147. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +15 -9
  148. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +15 -2
  149. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +0 -1
  150. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +51 -11
  151. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +16 -8
  152. package/src/libs/feature/editor/src/lib/expressions.ts +1 -1
  153. package/src/libs/feature/editor/src/lib/fields.config.ts +186 -61
  154. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +53 -0
  155. package/src/libs/feature/editor/src/lib/models/index.ts +1 -0
  156. package/src/libs/feature/editor/src/lib/services/editor.service.ts +8 -4
  157. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -4
  158. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  159. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +5 -0
  160. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +4 -1
  161. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -1
  162. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +12 -8
  163. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +14 -20
  164. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -10
  165. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.html +1 -1
  166. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  167. package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -1
  168. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +1 -1
  169. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +7 -2
  170. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
  171. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  172. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +17 -0
  173. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +22 -0
  174. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +9 -0
  175. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +26 -12
  176. package/src/libs/ui/widgets/src/index.ts +1 -0
  177. package/src/libs/ui/widgets/src/lib/popover/popover.component.css +0 -0
  178. package/src/libs/ui/widgets/src/lib/popover/popover.component.html +3 -0
  179. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +85 -0
  180. package/tailwind.base.css +2 -1
  181. package/translations/de.json +32 -10
  182. package/translations/en.json +32 -10
  183. package/translations/es.json +31 -9
  184. package/translations/fr.json +32 -10
  185. package/translations/it.json +32 -10
  186. package/translations/nl.json +31 -9
  187. package/translations/pt.json +31 -9
  188. package/translations/sk.json +32 -10
  189. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +0 -2
  190. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +0 -2
  191. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts +0 -26
  192. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +0 -1
  193. package/libs/feature/editor/src/lib/models/fields.model.d.ts +0 -15
  194. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +0 -1
  195. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.ts +0 -43
  196. package/src/libs/feature/editor/src/lib/models/fields.model.ts +0 -29
@@ -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,6 +1,6 @@
1
1
  <figure class="text-center">
2
2
  <div
3
- class="w-12 h-12 border border-primary rounded-full capitalize"
3
+ class="w-10 h-10 border border-primary rounded-full capitalize"
4
4
  [matTooltip]="userFullName"
5
5
  >
6
6
  <gn-ui-avatar
@@ -51,7 +51,7 @@
51
51
  <div class="w-full h-full flex flex-col gap-2">
52
52
  <label
53
53
  gnUiFilesDrop
54
- class="block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4"
54
+ class="block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4 hover:cursor-pointer"
55
55
  (dragFilesOver)="handleDragFilesOver($event)"
56
56
  (dropFiles)="handleDropFiles($event)"
57
57
  >
@@ -16,6 +16,7 @@ import { ButtonComponent } from '../button/button.component'
16
16
  import { FilesDropDirective } from '../files-drop/files-drop.directive'
17
17
  import { TranslateModule } from '@ngx-translate/core'
18
18
  import { marker } from '@biesbjerg/ngx-translate-extract-marker'
19
+ import { FormControl, ReactiveFormsModule } from '@angular/forms'
19
20
 
20
21
  @Component({
21
22
  selector: 'gn-ui-image-input',
@@ -30,11 +31,13 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
30
31
  FilesDropDirective,
31
32
  MatProgressSpinnerModule,
32
33
  TranslateModule,
34
+ ReactiveFormsModule,
33
35
  ],
34
36
  })
35
37
  export class ImageInputComponent {
38
+ @Input() formControl!: FormControl
36
39
  @Input() maxSizeMB: number
37
- @Input() previewUrl?: string
40
+ @Input() previewUrl?: URL
38
41
  @Input() altText?: string
39
42
  @Input() uploadProgress?: number
40
43
  @Input() uploadError?: boolean
@@ -127,7 +130,8 @@ export class ImageInputComponent {
127
130
  const file = new File([blob], name)
128
131
  this.fileChange.emit(file)
129
132
  },
130
- error: () => {
133
+ error: (error) => {
134
+ console.error(error)
131
135
  this.downloadError = true
132
136
  this.cd.markForCheck()
133
137
  this.urlChange.emit(this.urlInputValue)
@@ -165,6 +169,7 @@ export class ImageInputComponent {
165
169
  }
166
170
 
167
171
  handleDelete() {
172
+ this.formControl.markAsDirty()
168
173
  this.delete.emit()
169
174
  }
170
175
 
@@ -12,7 +12,7 @@
12
12
  </span>
13
13
  </div>
14
14
  </div>
15
- <div class="flex-1">
15
+ <div class="flex-1 overflow-y-auto">
16
16
  <ng-content></ng-content>
17
17
  </div>
18
18
  </div>
@@ -0,0 +1,17 @@
1
+ <gn-ui-button
2
+ type="outline"
3
+ [matMenuTriggerFor]="menu"
4
+ (buttonClick)="openMenu()"
5
+ data-test="record-menu-button"
6
+ >
7
+ <mat-icon class="material-symbols-outlined">more_vert</mat-icon>
8
+ </gn-ui-button>
9
+ <mat-menu #menu="matMenu">
10
+ <button
11
+ mat-menu-item
12
+ (click)="duplicate.emit()"
13
+ data-test="record-menu-duplicate-button"
14
+ >
15
+ <span translate>record.action.duplicate</span>
16
+ </button>
17
+ </mat-menu>
@@ -0,0 +1,22 @@
1
+ import { Component, EventEmitter, Output, ViewChild } from '@angular/core'
2
+ import { MatIconModule } from '@angular/material/icon'
3
+ import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu'
4
+ import { ButtonComponent } from '../../../../../../../libs/ui/inputs/src'
5
+ import { TranslateModule } from '@ngx-translate/core'
6
+
7
+ @Component({
8
+ selector: 'gn-ui-action-menu',
9
+ templateUrl: './action-menu.component.html',
10
+ styleUrls: ['./action-menu.component.css'],
11
+ standalone: true,
12
+ imports: [MatIconModule, ButtonComponent, MatMenuModule, TranslateModule],
13
+ })
14
+ export class ActionMenuComponent {
15
+ @Output() duplicate = new EventEmitter<void>()
16
+
17
+ @ViewChild(MatMenuTrigger) trigger: MatMenuTrigger
18
+
19
+ openMenu() {
20
+ this.trigger.openMenu()
21
+ }
22
+ }
@@ -120,4 +120,13 @@
120
120
  {{ dateToString(item.recordUpdated) }}
121
121
  </ng-template>
122
122
  </gn-ui-interactive-table-column>
123
+
124
+ <!-- ACTION MENU COLUMN -->
125
+ <gn-ui-interactive-table-column>
126
+ <ng-template #header> </ng-template>
127
+ <ng-template #cell let-item>
128
+ <gn-ui-action-menu (duplicate)="handleDuplicate(item)">
129
+ </gn-ui-action-menu>
130
+ </ng-template>
131
+ </gn-ui-interactive-table-column>
123
132
  </gn-ui-interactive-table>
@@ -1,23 +1,31 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core'
1
+ import { CommonModule } from '@angular/common'
2
+ import {
3
+ Component,
4
+ EventEmitter,
5
+ Input,
6
+ Output,
7
+ ViewChild,
8
+ } from '@angular/core'
9
+ import { MatIconModule } from '@angular/material/icon'
10
+ import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu'
2
11
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
3
12
  import {
4
- FileFormat,
5
- getBadgeColor,
6
- getFileFormat,
7
- getFormatPriority,
8
- } from '../../../../../../libs/util/shared/src'
13
+ FieldSort,
14
+ SortByField,
15
+ } from '../../../../../../libs/common/domain/src/lib/model/search'
9
16
  import { BadgeComponent, UiInputsModule } from '../../../../../../libs/ui/inputs/src'
10
17
  import {
11
18
  InteractiveTableColumnComponent,
12
19
  InteractiveTableComponent,
13
20
  } from '../../../../../../libs/ui/layout/src'
14
- import { MatIconModule } from '@angular/material/icon'
15
- import { TranslateModule } from '@ngx-translate/core'
16
- import { CommonModule } from '@angular/common'
17
21
  import {
18
- FieldSort,
19
- SortByField,
20
- } from '../../../../../../libs/common/domain/src/lib/model/search'
22
+ FileFormat,
23
+ getBadgeColor,
24
+ getFileFormat,
25
+ getFormatPriority,
26
+ } from '../../../../../../libs/util/shared/src'
27
+ import { TranslateModule } from '@ngx-translate/core'
28
+ import { ActionMenuComponent } from './action-menu/action-menu.component'
21
29
 
22
30
  @Component({
23
31
  selector: 'gn-ui-results-table',
@@ -32,6 +40,7 @@ import {
32
40
  MatIconModule,
33
41
  TranslateModule,
34
42
  BadgeComponent,
43
+ ActionMenuComponent,
35
44
  ],
36
45
  })
37
46
  export class ResultsTableComponent {
@@ -43,6 +52,7 @@ export class ResultsTableComponent {
43
52
  // emits the column (field) as well as the order
44
53
  @Output() sortByChange = new EventEmitter<[string, 'asc' | 'desc']>()
45
54
  @Output() recordClick = new EventEmitter<CatalogRecord>()
55
+ @Output() duplicateRecord = new EventEmitter<CatalogRecord>()
46
56
  @Output() recordsSelectedChange = new EventEmitter<
47
57
  [CatalogRecord[], boolean]
48
58
  >()
@@ -89,6 +99,10 @@ export class ResultsTableComponent {
89
99
  this.recordClick.emit(item as CatalogRecord)
90
100
  }
91
101
 
102
+ handleDuplicate(item: unknown) {
103
+ this.duplicateRecord.emit(item as CatalogRecord)
104
+ }
105
+
92
106
  setSortBy(col: string, order: 'asc' | 'desc') {
93
107
  this.sortByChange.emit([col, order])
94
108
  }
@@ -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 */
@@ -165,9 +165,19 @@
165
165
  "downloads.format.unknown": "unbekannt",
166
166
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
167
167
  "dropFile": "Datei ablegen",
168
- "editor.record.form.abstract": "Kurzbeschreibung",
169
- "editor.record.form.keywords": "Schlüsselwörter",
170
- "editor.record.form.license": "Lizenz",
168
+ "editor.record.form.bottomButtons.comeBackLater": "",
169
+ "editor.record.form.bottomButtons.next": "",
170
+ "editor.record.form.bottomButtons.previous": "",
171
+ "editor.record.form.field.abstract": "Kurzbeschreibung",
172
+ "editor.record.form.field.keywords": "Schlagwörter",
173
+ "editor.record.form.field.license": "Lizenz",
174
+ "editor.record.form.field.overviews": "",
175
+ "editor.record.form.field.recordUpdated": "Datensatz zuletzt aktualisiert",
176
+ "editor.record.form.field.resourceUpdated": "Letztes Aktualisierungsdatum",
177
+ "editor.record.form.field.temporalExtents": "Zeitlicher Umfang",
178
+ "editor.record.form.field.title": "Metadaten-Titel",
179
+ "editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
180
+ "editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
171
181
  "editor.record.form.license.cc-by": "Creative Commons CC-BY",
172
182
  "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
173
183
  "editor.record.form.license.cc-zero": "Creative Commons CC-0",
@@ -177,16 +187,26 @@
177
187
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
178
188
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
179
189
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
180
- "editor.record.form.metadata.title": "Metadaten-Titel",
181
- "editor.record.form.record.updated": "Datensatz zuletzt aktualisiert",
182
- "editor.record.form.resourceUpdated": "Letztes Aktualisierungsdatum",
183
- "editor.record.form.temporalExtents": "Zeitlicher Umfang",
190
+ "editor.record.form.page.accessAndContact": "",
191
+ "editor.record.form.page.description": "",
192
+ "editor.record.form.page.ressources": "",
193
+ "editor.record.form.section.about.description": "",
194
+ "editor.record.form.section.about.label": "",
195
+ "editor.record.form.section.annexes.label": "",
196
+ "editor.record.form.section.associatedResources.description": "",
197
+ "editor.record.form.section.associatedResources.label": "",
198
+ "editor.record.form.section.classification.description": "",
199
+ "editor.record.form.section.classification.label": "",
200
+ "editor.record.form.section.dataManagers.description": "",
201
+ "editor.record.form.section.dataManagers.label": "",
202
+ "editor.record.form.section.dataPointOfContact.description": "",
203
+ "editor.record.form.section.dataPointOfContact.label": "",
204
+ "editor.record.form.section.geographicalCoverage.label": "",
205
+ "editor.record.form.section.useAndAccessConditions.label": "",
184
206
  "editor.record.form.temporalExtents.addDate": "Zeitpunkt",
185
207
  "editor.record.form.temporalExtents.addRange": "Zeitraum",
186
208
  "editor.record.form.temporalExtents.date": "Datum",
187
209
  "editor.record.form.temporalExtents.range": "Datumsbereich",
188
- "editor.record.form.unique.identifier": "Eindeutige Kennung (ID)",
189
- "editor.record.form.updateFrequency": "Aktualisierungshäufigkeit",
190
210
  "editor.record.form.updateFrequency.planned": "Die Daten sollten regelmäßig aktualisiert werden.",
191
211
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
192
212
  "editor.record.loadError.closeMessage": "Verstanden",
@@ -201,6 +221,7 @@
201
221
  "editor.record.saveStatus.draftWithChangesPending": "Als Entwurf gespeichert - Änderungen stehen aus",
202
222
  "editor.record.saveStatus.recordUpToDate": "Datensatz ist auf dem neuesten Stand",
203
223
  "editor.record.upToDate": "Dieser Datensatz ist auf dem neuesten Stand",
224
+ "editor.sidebar.menu.editor": "",
204
225
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
205
226
  "facets.block.title.OrgForResource": "Organisation",
206
227
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -278,6 +299,7 @@
278
299
  "pagination.pageOf": "von",
279
300
  "previous": "zurück",
280
301
  "record.action.download": "Herunterladen",
302
+ "record.action.duplicate": "",
281
303
  "record.action.view": "Anzeigen",
282
304
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
283
305
  "record.metadata.about": "Beschreibung",
@@ -408,7 +430,7 @@
408
430
  "search.filters.resourceType": "Ressourcentyp",
409
431
  "search.filters.standard": "Standard",
410
432
  "search.filters.title": "Ergebnisse filtern",
411
- "search.filters.topic": "Thema",
433
+ "search.filters.topic": "Themen",
412
434
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
413
435
  "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.",
414
436
  "share.tab.permalink": "Teilen",
@@ -165,9 +165,19 @@
165
165
  "downloads.format.unknown": "unknown",
166
166
  "downloads.wfs.featuretype.not.found": "The layer was not found",
167
167
  "dropFile": "drop file",
168
- "editor.record.form.abstract": "Abstract",
169
- "editor.record.form.keywords": "Keywords",
170
- "editor.record.form.license": "License",
168
+ "editor.record.form.bottomButtons.comeBackLater": "Come back later",
169
+ "editor.record.form.bottomButtons.next": "Next",
170
+ "editor.record.form.bottomButtons.previous": "Previous",
171
+ "editor.record.form.field.abstract": "Abstract",
172
+ "editor.record.form.field.keywords": "Keywords",
173
+ "editor.record.form.field.license": "License",
174
+ "editor.record.form.field.overviews": "Overviews",
175
+ "editor.record.form.field.recordUpdated": "Record Updated",
176
+ "editor.record.form.field.resourceUpdated": "Resource Updated",
177
+ "editor.record.form.field.temporalExtents": "Temporal extents",
178
+ "editor.record.form.field.title": "Metadata title",
179
+ "editor.record.form.field.uniqueIdentifier": "Unique identifier",
180
+ "editor.record.form.field.updateFrequency": "Update frequency",
171
181
  "editor.record.form.license.cc-by": "Creative Commons CC-BY",
172
182
  "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
173
183
  "editor.record.form.license.cc-zero": "Creative Commons CC-0",
@@ -177,16 +187,26 @@
177
187
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
178
188
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
179
189
  "editor.record.form.license.unknown": "Unknown or absent",
180
- "editor.record.form.metadata.title": "Metadata title",
181
- "editor.record.form.record.updated": "Record updated",
182
- "editor.record.form.resourceUpdated": "Last update date",
183
- "editor.record.form.temporalExtents": "Temporal extent",
190
+ "editor.record.form.page.accessAndContact": "Access and contact",
191
+ "editor.record.form.page.description": "Resource description",
192
+ "editor.record.form.page.ressources": "Resources",
193
+ "editor.record.form.section.about.description": "This section describes the resource.",
194
+ "editor.record.form.section.about.label": "About the resource",
195
+ "editor.record.form.section.annexes.label": "Annexes",
196
+ "editor.record.form.section.associatedResources.description": "Drop files here to associate them with the resource.",
197
+ "editor.record.form.section.associatedResources.label": "Associated resources",
198
+ "editor.record.form.section.classification.description": "The classification has an impact on the access to the data.",
199
+ "editor.record.form.section.classification.label": "Classification",
200
+ "editor.record.form.section.dataManagers.description": "The data managers are responsible for the data.",
201
+ "editor.record.form.section.dataManagers.label": "Data managers",
202
+ "editor.record.form.section.dataPointOfContact.description": "This information concerns the metadata.",
203
+ "editor.record.form.section.dataPointOfContact.label": "Data point of contact",
204
+ "editor.record.form.section.geographicalCoverage.label": "Geographical coverage",
205
+ "editor.record.form.section.useAndAccessConditions.label": "Use and access conditions",
184
206
  "editor.record.form.temporalExtents.addDate": "Time instant",
185
207
  "editor.record.form.temporalExtents.addRange": "Time period",
186
208
  "editor.record.form.temporalExtents.date": "Date",
187
209
  "editor.record.form.temporalExtents.range": "Date range",
188
- "editor.record.form.unique.identifier": "Unique identifier",
189
- "editor.record.form.updateFrequency": "Update frequency",
190
210
  "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
191
211
  "editor.record.loadError.body": "The record could not be loaded:",
192
212
  "editor.record.loadError.closeMessage": "Understood",
@@ -201,6 +221,7 @@
201
221
  "editor.record.saveStatus.draftWithChangesPending": "Saved as draft - changes are pending",
202
222
  "editor.record.saveStatus.recordUpToDate": "Record is up to date",
203
223
  "editor.record.upToDate": "This record is up to date",
224
+ "editor.sidebar.menu.editor": "Editor",
204
225
  "externalviewer.dataset.unnamed": "Datahub layer",
205
226
  "facets.block.title.OrgForResource": "Organisation",
206
227
  "facets.block.title.availableInServices": "Available for",
@@ -278,6 +299,7 @@
278
299
  "pagination.pageOf": "of",
279
300
  "previous": "previous",
280
301
  "record.action.download": "Download",
302
+ "record.action.duplicate": "Duplicate",
281
303
  "record.action.view": "View",
282
304
  "record.externalViewer.open": "Open in the external map viewer",
283
305
  "record.metadata.about": "Description",
@@ -408,7 +430,7 @@
408
430
  "search.filters.resourceType": "Resource type",
409
431
  "search.filters.standard": "Standard",
410
432
  "search.filters.title": "Filter your results",
411
- "search.filters.topic": "Topic",
433
+ "search.filters.topic": "Topics",
412
434
  "search.filters.useSpatialFilter": "Show records in the area of interest first",
413
435
  "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.",
414
436
  "share.tab.permalink": "Share",
@@ -165,9 +165,19 @@
165
165
  "downloads.format.unknown": "",
166
166
  "downloads.wfs.featuretype.not.found": "",
167
167
  "dropFile": "",
168
- "editor.record.form.abstract": "",
169
- "editor.record.form.keywords": "",
170
- "editor.record.form.license": "",
168
+ "editor.record.form.bottomButtons.comeBackLater": "",
169
+ "editor.record.form.bottomButtons.next": "",
170
+ "editor.record.form.bottomButtons.previous": "",
171
+ "editor.record.form.field.abstract": "",
172
+ "editor.record.form.field.keywords": "",
173
+ "editor.record.form.field.license": "",
174
+ "editor.record.form.field.overviews": "",
175
+ "editor.record.form.field.recordUpdated": "",
176
+ "editor.record.form.field.resourceUpdated": "",
177
+ "editor.record.form.field.temporalExtents": "",
178
+ "editor.record.form.field.title": "",
179
+ "editor.record.form.field.uniqueIdentifier": "",
180
+ "editor.record.form.field.updateFrequency": "",
171
181
  "editor.record.form.license.cc-by": "",
172
182
  "editor.record.form.license.cc-by-sa": "",
173
183
  "editor.record.form.license.cc-zero": "",
@@ -177,16 +187,26 @@
177
187
  "editor.record.form.license.odc-by": "",
178
188
  "editor.record.form.license.pddl": "",
179
189
  "editor.record.form.license.unknown": "",
180
- "editor.record.form.metadata.title": "",
181
- "editor.record.form.record.updated": "",
182
- "editor.record.form.resourceUpdated": "",
183
- "editor.record.form.temporalExtents": "",
190
+ "editor.record.form.page.accessAndContact": "",
191
+ "editor.record.form.page.description": "",
192
+ "editor.record.form.page.ressources": "",
193
+ "editor.record.form.section.about.description": "",
194
+ "editor.record.form.section.about.label": "",
195
+ "editor.record.form.section.annexes.label": "",
196
+ "editor.record.form.section.associatedResources.description": "",
197
+ "editor.record.form.section.associatedResources.label": "",
198
+ "editor.record.form.section.classification.description": "",
199
+ "editor.record.form.section.classification.label": "",
200
+ "editor.record.form.section.dataManagers.description": "",
201
+ "editor.record.form.section.dataManagers.label": "",
202
+ "editor.record.form.section.dataPointOfContact.description": "",
203
+ "editor.record.form.section.dataPointOfContact.label": "",
204
+ "editor.record.form.section.geographicalCoverage.label": "",
205
+ "editor.record.form.section.useAndAccessConditions.label": "",
184
206
  "editor.record.form.temporalExtents.addDate": "",
185
207
  "editor.record.form.temporalExtents.addRange": "",
186
208
  "editor.record.form.temporalExtents.date": "",
187
209
  "editor.record.form.temporalExtents.range": "",
188
- "editor.record.form.unique.identifier": "",
189
- "editor.record.form.updateFrequency": "",
190
210
  "editor.record.form.updateFrequency.planned": "",
191
211
  "editor.record.loadError.body": "",
192
212
  "editor.record.loadError.closeMessage": "",
@@ -201,6 +221,7 @@
201
221
  "editor.record.saveStatus.draftWithChangesPending": "",
202
222
  "editor.record.saveStatus.recordUpToDate": "",
203
223
  "editor.record.upToDate": "",
224
+ "editor.sidebar.menu.editor": "",
204
225
  "externalviewer.dataset.unnamed": "",
205
226
  "facets.block.title.OrgForResource": "",
206
227
  "facets.block.title.availableInServices": "",
@@ -278,6 +299,7 @@
278
299
  "pagination.pageOf": "",
279
300
  "previous": "",
280
301
  "record.action.download": "",
302
+ "record.action.duplicate": "",
281
303
  "record.action.view": "",
282
304
  "record.externalViewer.open": "",
283
305
  "record.metadata.about": "",