geonetwork-ui 2.10.0-dev.fc6515c0b → 2.11.0-dev.5c2e5295e

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 (161) hide show
  1. package/fesm2022/geonetwork-ui.mjs +1709 -6267
  2. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  3. package/index.d.ts +230 -172
  4. package/index.d.ts.map +1 -1
  5. package/package.json +25 -35
  6. package/src/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.ts +20 -0
  7. package/src/libs/api/metadata-converter/src/lib/fixtures/eu.dcat-ap.records.ts +4 -0
  8. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +23 -0
  9. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.reuse+ongules.ts +8 -0
  10. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.reuse+roilaye.ts +2 -0
  11. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +2 -0
  12. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -0
  13. package/src/libs/api/metadata-converter/src/lib/fixtures/georhena.records.ts +2 -0
  14. package/src/libs/api/metadata-converter/src/lib/fixtures/metadata-for-i18n.records.ts +4 -0
  15. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +23 -0
  16. package/src/libs/api/metadata-converter/src/lib/fixtures/opendataswiss.records.ts +2 -0
  17. package/src/libs/api/metadata-converter/src/lib/fixtures/sextant.records.ts +4 -0
  18. package/src/libs/api/metadata-converter/src/lib/fixtures/vlaanderen.dcat-ap.records.ts +2 -0
  19. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.reuse.ts +9 -0
  20. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +48 -7
  21. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.converter.ts +2 -0
  22. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +6 -5
  23. package/src/libs/api/metadata-converter/src/lib/gn4/metadata-url.service.ts +2 -2
  24. package/src/libs/api/metadata-converter/src/lib/gn4/types/elasticsearch.model.ts +13 -1
  25. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  26. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +11 -0
  27. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +21 -0
  28. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +52 -0
  29. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +24 -1
  30. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +77 -0
  31. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/association-type.mapper.ts +12 -0
  32. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +79 -0
  33. package/src/libs/api/repository/src/lib/gn4/auth/auth.service.ts +8 -4
  34. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +24 -5
  35. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +66 -40
  36. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.ts +1 -1
  37. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +1 -1
  38. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +37 -2
  39. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +49 -5
  40. package/src/libs/common/domain/src/lib/model/search/sort-by.model.ts +1 -5
  41. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +2 -1
  42. package/src/libs/common/domain/src/lib/model/user/group.model.ts +8 -0
  43. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  44. package/src/libs/common/domain/src/lib/platform.service.interface.ts +2 -0
  45. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +2 -1
  46. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +62 -0
  47. package/src/libs/feature/catalog/src/lib/sources/sources.service.ts +5 -2
  48. package/src/libs/feature/editor/src/index.ts +1 -0
  49. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +4 -1
  50. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +26 -19
  51. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +5 -1
  52. package/src/libs/feature/editor/src/lib/components/constraint-card/constraint-card.component.ts +0 -2
  53. package/src/libs/feature/editor/src/lib/components/contact-details/contact-details-form.component.css +0 -0
  54. package/src/libs/feature/editor/src/lib/components/contact-details/contact-details-form.component.html +68 -0
  55. package/src/libs/feature/editor/src/lib/components/contact-details/contact-details-form.component.ts +41 -0
  56. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.html +5 -14
  57. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.ts +3 -28
  58. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.html +5 -5
  59. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -1
  60. package/src/libs/feature/editor/src/lib/components/record-form/form-field/field-focus.directive.ts +4 -1
  61. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-associated-records/form-field-associated-records.component.css +0 -0
  62. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-associated-records/form-field-associated-records.component.html +33 -0
  63. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-associated-records/form-field-associated-records.component.ts +94 -0
  64. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-constraints-shortcuts/form-field-constraints-shortcuts.component.ts +7 -7
  65. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.html +9 -2
  66. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts/form-field-contacts.component.ts +12 -0
  67. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.ts +1 -1
  68. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +12 -5
  69. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +4 -4
  70. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +7 -0
  71. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.html +16 -12
  72. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-topics/form-field-topics.component.ts +2 -2
  73. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +6 -2
  74. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +3 -1
  75. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.css +0 -34
  76. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +34 -16
  77. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +17 -0
  78. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.css +35 -0
  79. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +18 -5
  80. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +76 -19
  81. package/src/libs/feature/editor/src/lib/expressions.ts +380 -8
  82. package/src/libs/feature/editor/src/lib/fields.config.ts +359 -337
  83. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +10 -3
  84. package/src/libs/feature/editor/src/lib/services/editor.service.ts +9 -13
  85. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +33 -0
  86. package/src/libs/feature/notify-reuse/src/index.ts +1 -0
  87. package/src/libs/feature/notify-reuse/src/lib/edit-delete-reuse-buttons/edit-delete-reuse-buttons.component.css +0 -0
  88. package/src/libs/feature/notify-reuse/src/lib/edit-delete-reuse-buttons/edit-delete-reuse-buttons.component.html +23 -0
  89. package/src/libs/feature/notify-reuse/src/lib/edit-delete-reuse-buttons/edit-delete-reuse-buttons.component.ts +114 -0
  90. package/src/libs/feature/notify-reuse/src/lib/notify-reuse-form/notify-reuse-form.component.html +111 -1
  91. package/src/libs/feature/notify-reuse/src/lib/notify-reuse-form/notify-reuse-form.component.ts +219 -8
  92. package/src/libs/feature/notify-reuse/src/lib/utils/url.ts +16 -0
  93. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +9 -1
  94. package/src/libs/feature/router/src/lib/default/router.service.ts +1 -1
  95. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +10 -5
  96. package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +1 -1
  97. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.ts +2 -2
  98. package/src/libs/ui/dataviz/src/index.ts +0 -1
  99. package/src/libs/ui/elements/src/index.ts +1 -0
  100. package/src/libs/ui/elements/src/lib/contact-details/contact-details.component.html +48 -56
  101. package/src/libs/ui/elements/src/lib/contact-pill/contact-pill.component.html +7 -3
  102. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.html +2 -1
  103. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.ts +2 -2
  104. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +13 -0
  105. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +13 -3
  106. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +43 -6
  107. package/src/libs/ui/elements/src/lib/keyword-badge/keyword-badge.component.html +14 -0
  108. package/src/libs/ui/elements/src/lib/keyword-badge/keyword-badge.component.ts +85 -0
  109. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +2 -2
  110. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +5 -0
  111. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +5 -8
  112. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +2 -2
  113. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +4 -5
  114. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +4 -0
  115. package/src/libs/ui/inputs/src/lib/badge/badge.component.html +33 -26
  116. package/src/libs/ui/inputs/src/lib/badge/badge.component.ts +9 -0
  117. package/src/libs/ui/inputs/src/lib/button/button.component.ts +4 -0
  118. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +2 -2
  119. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  120. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.ts +3 -3
  121. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.css +0 -3
  122. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +11 -7
  123. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +56 -30
  124. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +5 -5
  125. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +9 -1
  126. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -1
  127. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +3 -8
  128. package/src/libs/ui/layout/src/lib/sortable-list/sortable-list.component.html +7 -7
  129. package/src/libs/ui/layout/src/lib/sortable-list/sortable-list.component.ts +14 -1
  130. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.ts +4 -54
  131. package/src/libs/ui/map/src/lib/map-utils.ts +48 -0
  132. package/src/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.ts +1 -1
  133. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +12 -8
  134. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +3 -1
  135. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +1 -0
  136. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +7 -1
  137. package/src/libs/ui/widgets/src/lib/spinning-loader/spinning-loader.component.html +1 -1
  138. package/src/libs/util/app-config/src/lib/app-config.ts +35 -10
  139. package/src/libs/util/app-config/src/lib/model.ts +3 -0
  140. package/src/libs/util/app-config/src/lib/parse-utils.ts +27 -0
  141. package/src/libs/util/data-fetcher/src/lib/readers/base-file.ts +1 -2
  142. package/src/libs/util/data-fetcher/src/lib/readers/wfs.ts +6 -3
  143. package/src/libs/util/i18n/src/index.ts +0 -1
  144. package/src/libs/util/i18n/src/lib/i18n.constants.ts +17 -11
  145. package/src/libs/util/i18n/src/lib/i18n.interceptor.ts +2 -2
  146. package/src/libs/util/i18n/src/lib/i18n.providers.ts +14 -17
  147. package/src/libs/util/i18n/src/lib/test.translate.loader.ts +48 -0
  148. package/src/libs/util/shared/src/lib/links/link-utils.ts +23 -1
  149. package/src/libs/util/shared/src/lib/services/date.service.ts +3 -3
  150. package/src/libs/util/shared/src/lib/utils/geojson.ts +58 -1
  151. package/style.css +0 -1
  152. package/tailwind.base.css +15 -0
  153. package/translations/de.json +122 -50
  154. package/translations/en.json +127 -55
  155. package/translations/es.json +96 -24
  156. package/translations/fr.json +124 -52
  157. package/translations/it.json +123 -51
  158. package/translations/nl.json +95 -23
  159. package/translations/pt.json +96 -24
  160. package/translations/sk.json +96 -24
  161. package/src/libs/feature/editor/src/lib/components/generic-keywords/generic-keywords.component.css +0 -3
@@ -15,8 +15,15 @@
15
15
  (itemsOrderChange)="handleContactsChanged($event)"
16
16
  [elementTemplate]="contactTemplate"
17
17
  ></gn-ui-sortable-list>
18
- <ng-template #contactTemplate let-contact>
19
- <gn-ui-contact-card [contact]="contact"></gn-ui-contact-card>
18
+ <ng-template #contactTemplate let-contact let-index="index">
19
+ @if (modelSpecifier === 'contact:editableDetails') {
20
+ <gn-ui-contact-details-form
21
+ [contact]="contact"
22
+ (contactChange)="handleContactChanged($event, index)"
23
+ ></gn-ui-contact-details-form>
24
+ } @else {
25
+ <gn-ui-contact-card [contact]="contact"></gn-ui-contact-card>
26
+ }
20
27
  </ng-template>
21
28
  } @else {
22
29
  <div
@@ -28,6 +28,7 @@ import { UserModel } from '../../../../../../../../../libs/common/domain/src/lib
28
28
  import { PlatformServiceInterface } from '../../../../../../../../../libs/common/domain/src/lib/platform.service.interface'
29
29
  import { OrganizationsServiceInterface } from '../../../../../../../../../libs/common/domain/src/lib/organizations.service.interface'
30
30
  import { ContactCardComponent } from '../../../contact-card/contact-card.component'
31
+ import { ContactDetailsFormComponent } from '../../../contact-details/contact-details-form.component'
31
32
  import {
32
33
  createFuzzyFilter,
33
34
  getIndividualDisplayName,
@@ -35,6 +36,7 @@ import {
35
36
  } from '../../../../../../../../../libs/util/shared/src'
36
37
  import { map } from 'rxjs/operators'
37
38
  import { SortableListComponent } from '../../../../../../../../../libs/ui/layout/src'
39
+ import { FieldModelSpecifier } from '../../../../models/editor-config.model'
38
40
 
39
41
  @Component({
40
42
  selector: 'gn-ui-form-field-contacts',
@@ -47,6 +49,7 @@ import { SortableListComponent } from '../../../../../../../../../libs/ui/layout
47
49
  TranslateDirective,
48
50
  TranslatePipe,
49
51
  ContactCardComponent,
52
+ ContactDetailsFormComponent,
50
53
  SortableListComponent,
51
54
  ],
52
55
  })
@@ -56,6 +59,7 @@ export class FormFieldContactsComponent implements OnDestroy, OnChanges {
56
59
  private changeDetectorRef = inject(ChangeDetectorRef)
57
60
 
58
61
  @Input() value: Individual[]
62
+ @Input() modelSpecifier: FieldModelSpecifier
59
63
  @Output() valueChange: EventEmitter<Individual[]> = new EventEmitter()
60
64
 
61
65
  contacts: Individual[] = []
@@ -117,6 +121,14 @@ export class FormFieldContactsComponent implements OnDestroy, OnChanges {
117
121
  this.valueChange.emit(contacts)
118
122
  }
119
123
 
124
+ handleContactChanged(updatedContact: Individual, index: number) {
125
+ const contacts = this.contacts.map((contact, i) =>
126
+ i === index ? updatedContact : contact
127
+ )
128
+
129
+ this.handleContactsChanged(contacts)
130
+ }
131
+
120
132
  /**
121
133
  * gn-ui-autocomplete
122
134
  */
@@ -3,11 +3,11 @@ import {
3
3
  ChangeDetectorRef,
4
4
  Component,
5
5
  EventEmitter,
6
+ inject,
6
7
  Input,
7
8
  Output,
8
9
  TemplateRef,
9
10
  ViewChild,
10
- inject,
11
11
  } from '@angular/core'
12
12
  import { MatDialog } from '@angular/material/dialog'
13
13
  import { marker } from '@biesbjerg/ngx-translate-extract-marker'
@@ -3,11 +3,14 @@ import {
3
3
  ChangeDetectorRef,
4
4
  Component,
5
5
  EventEmitter,
6
+ inject,
6
7
  Input,
7
8
  Output,
8
- inject,
9
9
  } from '@angular/core'
10
- import { GraphicOverview } from '../../../../../../../../../libs/common/domain/src/lib/model/record'
10
+ import {
11
+ GraphicOverview,
12
+ RecordKind,
13
+ } from '../../../../../../../../../libs/common/domain/src/lib/model/record'
11
14
  import { ImageInputComponent } from '../../../../../../../../../libs/ui/elements/src'
12
15
  import { PlatformServiceInterface } from '../../../../../../../../../libs/common/domain/src/lib/platform.service.interface'
13
16
  import { NotificationsService } from '../../../../../../../../../libs/feature/notifications/src'
@@ -30,6 +33,7 @@ export class FormFieldOverviewsComponent {
30
33
  private cd = inject(ChangeDetectorRef)
31
34
 
32
35
  @Input() metadataUuid: string
36
+ @Input() recordKind: RecordKind
33
37
  @Input() value: Array<GraphicOverview>
34
38
  @Output() valueChange: EventEmitter<Array<GraphicOverview>> =
35
39
  new EventEmitter()
@@ -111,13 +115,16 @@ export class FormFieldOverviewsComponent {
111
115
  {
112
116
  type: 'error',
113
117
  title: this.translateService.instant(
114
- 'editor.record.resourceError.title'
118
+ 'editor.record.resourceError.title',
119
+ { recordKind: this.recordKind }
115
120
  ),
116
121
  text: `${this.translateService.instant(
117
- 'editor.record.resourceError.body'
122
+ 'editor.record.resourceError.body',
123
+ { recordKind: this.recordKind }
118
124
  )} ${error.message}`,
119
125
  closeMessage: this.translateService.instant(
120
- 'editor.record.resourceError.closeMessage'
126
+ 'editor.record.resourceError.closeMessage',
127
+ { recordKind: this.recordKind }
121
128
  ),
122
129
  },
123
130
  undefined,
@@ -9,11 +9,11 @@
9
9
  "
10
10
  (buttonClick)="togglePreview()"
11
11
  >
12
- <span
13
- class="material-symbols-outlined gn-ui-icon-small"
12
+ <ng-icon
13
+ [name]="preview ? 'matVisibilityOffOutline' : 'matVisibilityOutline'"
14
+ size="16"
14
15
  [ngClass]="{ 'text-primary': !preview }"
15
- >{{ preview ? 'visibility_off' : 'visibility' }}</span
16
- >
16
+ ></ng-icon>
17
17
  &nbsp;
18
18
  {{ preview ? 'Edit' : 'Preview' }}
19
19
  </gn-ui-button>
@@ -10,6 +10,11 @@ import { ReactiveFormsModule } from '@angular/forms'
10
10
  import { MarkdownEditorComponent } from '../../../../../../../../../libs/ui/elements/src'
11
11
  import { ButtonComponent } from '../../../../../../../../../libs/ui/inputs/src'
12
12
  import { FormFieldWrapperComponent } from '../../../../../../../../../libs/ui/layout/src'
13
+ import { NgIconComponent, provideIcons } from '@ng-icons/core'
14
+ import {
15
+ matVisibilityOffOutline,
16
+ matVisibilityOutline,
17
+ } from '@ng-icons/material-icons/outline'
13
18
 
14
19
  @Component({
15
20
  selector: 'gn-ui-form-field-rich',
@@ -23,7 +28,9 @@ import { FormFieldWrapperComponent } from '../../../../../../../../../libs/ui/la
23
28
  MarkdownEditorComponent,
24
29
  FormFieldWrapperComponent,
25
30
  ButtonComponent,
31
+ NgIconComponent,
26
32
  ],
33
+ providers: [provideIcons({ matVisibilityOutline, matVisibilityOffOutline })],
27
34
  })
28
35
  export class FormFieldRichComponent {
29
36
  @Input() label: string
@@ -1,17 +1,21 @@
1
- <div class="flex gap-2 mb-2">
2
- @for (addOption of addOptions$ | async; track addOption) {
3
- <gn-ui-button type="gray" (buttonClick)="onAdd(addOption.eventName)">
4
- <ng-icon name="iconoirPlus" class="text-primary"></ng-icon> &nbsp;{{
5
- addOption.buttonLabel
6
- }}</gn-ui-button
7
- >
1
+ <div class="flex flex-col gap-2">
2
+ <div class="flex gap-2">
3
+ @for (addOption of addOptions$ | async; track addOption) {
4
+ <gn-ui-button type="gray" (buttonClick)="onAdd(addOption.eventName)">
5
+ <ng-icon name="iconoirPlus" class="text-primary"></ng-icon> &nbsp;{{
6
+ addOption.buttonLabel
7
+ }}</gn-ui-button
8
+ >
9
+ }
10
+ </div>
11
+ @if (extents.length) {
12
+ <gn-ui-sortable-list
13
+ [items]="extents"
14
+ (itemsOrderChange)="onItemsOrderChange($event)"
15
+ [elementTemplate]="template"
16
+ ></gn-ui-sortable-list>
8
17
  }
9
18
  </div>
10
- <gn-ui-sortable-list
11
- [items]="extents"
12
- (itemsOrderChange)="onItemsOrderChange($event)"
13
- [elementTemplate]="template"
14
- ></gn-ui-sortable-list>
15
19
  <ng-template #template let-extent let-index="index">
16
20
  @if (extent.end === undefined) {
17
21
  <div class="border rounded-lg px-4 pb-4">
@@ -5,7 +5,7 @@ import {
5
5
  DropdownMultiselectComponent,
6
6
  } from '../../../../../../../../../libs/ui/inputs/src'
7
7
  import { TranslatePipe, TranslateService } from '@ngx-translate/core'
8
- import { INSPIRE_TOPICS } from '../../../../fields.config'
8
+ import { ISO_TOPICS } from '../../../../fields.config'
9
9
 
10
10
  @Component({
11
11
  selector: 'gn-ui-form-field-topics',
@@ -22,7 +22,7 @@ export class FormFieldTopicsComponent {
22
22
  this.topics = topics
23
23
  }
24
24
  @Output() valueChange: EventEmitter<string[]> = new EventEmitter()
25
- availableTopics = INSPIRE_TOPICS.map((topic) => {
25
+ availableTopics = ISO_TOPICS.map((topic) => {
26
26
  return {
27
27
  label: this.translateService.instant(topic.label),
28
28
  value: topic.value,
@@ -1,11 +1,15 @@
1
1
  <div class="flex flex-col gap-2">
2
2
  <gn-ui-check-toggle
3
- [label]="'editor.record.form.updateFrequency.planned' | translate"
3
+ [label]="
4
+ 'editor.record.form.updateFrequency.planned' | translate: { recordKind }
5
+ "
4
6
  [value]="planned"
5
7
  (toggled)="onPlannedToggled()"
6
8
  ></gn-ui-check-toggle>
7
9
  <gn-ui-dropdown-selector
8
- [title]="'editor.record.form.field.updateFrequency' | translate"
10
+ [title]="
11
+ 'editor.record.form.field.updateFrequency' | translate: { recordKind }
12
+ "
9
13
  [showTitle]="false"
10
14
  [choices]="choices"
11
15
  [selected]="selectedFrequency"
@@ -2,12 +2,13 @@ import {
2
2
  ChangeDetectionStrategy,
3
3
  Component,
4
4
  EventEmitter,
5
+ inject,
5
6
  Input,
6
7
  OnInit,
7
8
  Output,
8
- inject,
9
9
  } from '@angular/core'
10
10
  import {
11
+ RecordKind,
11
12
  UpdateFrequency,
12
13
  UpdateFrequencyCode,
13
14
  updateFrequencyCodeValues,
@@ -37,6 +38,7 @@ export class FormFieldUpdateFrequencyComponent implements OnInit {
37
38
  private translateService = inject(TranslateService)
38
39
 
39
40
  @Input() value: UpdateFrequency
41
+ @Input() recordKind: RecordKind
40
42
  @Output() valueChange: EventEmitter<UpdateFrequency> = new EventEmitter()
41
43
 
42
44
  protected choices: DropdownChoice[] = []
@@ -1,37 +1,3 @@
1
1
  :host {
2
2
  scroll-margin-top: 90px;
3
3
  }
4
-
5
- :host.gn-ui-field-focus-glow {
6
- position: relative;
7
- }
8
-
9
- :host.gn-ui-field-focus-glow::after {
10
- content: '';
11
- position: absolute;
12
- inset: -8px;
13
- border-radius: 8px;
14
- background-color: color-mix(in srgb, var(--color-primary) 12%, transparent);
15
- pointer-events: none;
16
- animation: gn-ui-field-focus-glow 3s ease-out forwards;
17
- }
18
-
19
- :host.gn-ui-field-focus-glow::before {
20
- content: '';
21
- position: absolute;
22
- inset: -16px;
23
- border: 2px dashed var(--color-primary);
24
- border-radius: 10px;
25
- pointer-events: none;
26
- animation: gn-ui-field-focus-glow 3s ease-out forwards;
27
- }
28
-
29
- @keyframes gn-ui-field-focus-glow {
30
- 0%,
31
- 55% {
32
- opacity: 1;
33
- }
34
- 100% {
35
- opacity: 0;
36
- }
37
- }
@@ -12,8 +12,8 @@
12
12
  </ng-container>
13
13
  <ng-template #withGenericWrapper>
14
14
  <gn-ui-form-field-wrapper
15
- [label]="config.labelKey! | translate"
16
- [hint]="config.hintKey! | translate"
15
+ [label]="config.labelKey! | translate: { recordKind }"
16
+ [hint]="config.hintKey! | translate: { recordKind }"
17
17
  >
18
18
  <ng-container *ngTemplateOutlet="fieldContent"></ng-container>
19
19
  </gn-ui-form-field-wrapper>
@@ -34,30 +34,32 @@
34
34
  [value]="valueAsString"
35
35
  (change)="valueChange.emit($event.target.value)"
36
36
  [placeholder]="
37
- 'editor.record.form.field.title.placeholder' | translate
37
+ 'editor.record.form.field.title.placeholder'
38
+ | translate: { recordKind }
38
39
  "
39
40
  ></textarea>
40
41
  <div class="flex flex-row justify-between self-start mt-0.5">
41
- <span
42
- class="material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer"
42
+ <ng-icon
43
+ name="matEditOutline"
44
+ size="16"
45
+ class="m-2 cursor-pointer"
43
46
  (click)="focusTitleInput()"
44
- >edit</span
45
- >
46
- <span
47
+ ></ng-icon>
48
+ <ng-icon
47
49
  *ngIf="config.hintKey"
48
- class="material-symbols-outlined gn-ui-icon-small m-2"
49
- [matTooltip]="config.hintKey! | translate"
50
+ name="matHelpOutline"
51
+ size="16"
52
+ class="m-2"
53
+ [matTooltip]="config.hintKey! | translate: { recordKind }"
50
54
  matTooltipPosition="above"
51
- >
52
- help
53
- </span>
55
+ ></ng-icon>
54
56
  </div>
55
57
  </div>
56
58
  </ng-container>
57
59
  <ng-container *ngSwitchCase="'abstract'">
58
60
  <gn-ui-form-field-rich
59
- [label]="config.labelKey! | translate"
60
- [hint]="config.hintKey! | translate"
61
+ [label]="config.labelKey! | translate: { recordKind }"
62
+ [hint]="config.hintKey! | translate: { recordKind }"
61
63
  [value]="valueAsString"
62
64
  (valueChange)="valueChange.emit($event)"
63
65
  ></gn-ui-form-field-rich>
@@ -65,6 +67,7 @@
65
67
  <ng-container *ngSwitchCase="'overviews'">
66
68
  <gn-ui-form-field-overviews
67
69
  [metadataUuid]="uniqueIdentifier"
70
+ [recordKind]="recordKind"
68
71
  [value]="valueAsOverviews"
69
72
  (valueChange)="valueChange.emit($event)"
70
73
  ></gn-ui-form-field-overviews>
@@ -92,8 +95,15 @@
92
95
  <gn-ui-form-field-update-frequency
93
96
  [value]="valueAsUpdateFrequency"
94
97
  (valueChange)="valueChange.emit($event)"
98
+ [recordKind]="recordKind"
95
99
  ></gn-ui-form-field-update-frequency>
96
100
  </ng-container>
101
+ <ng-container *ngSwitchCase="'associatedRecords'">
102
+ <gn-ui-form-field-associated-records
103
+ [value]="valueAsAssociatedRecords"
104
+ (valueChange)="valueChange.emit($event)"
105
+ ></gn-ui-form-field-associated-records>
106
+ </ng-container>
97
107
  <ng-container *ngSwitchCase="'temporalExtents'">
98
108
  <gn-ui-form-field-temporal-extents
99
109
  [value]="valueAsTemporalExtents"
@@ -117,7 +127,7 @@
117
127
  </ng-container>
118
128
  <ng-container *ngSwitchCase="'licenses'">
119
129
  <gn-ui-form-field-license
120
- [label]="config.labelKey! | translate"
130
+ [label]="config.labelKey! | translate: { recordKind }"
121
131
  [recordLicences]="valueAsConstraints"
122
132
  (recordLicencesChange)="valueChange.emit($event)"
123
133
  ></gn-ui-form-field-license>
@@ -150,6 +160,7 @@
150
160
  <ng-container *ngSwitchCase="'contacts'">
151
161
  <gn-ui-form-field-contacts
152
162
  [value]="valueAsIndividuals"
163
+ [modelSpecifier]="modelSpecifier"
153
164
  (valueChange)="valueChange.emit($event)"
154
165
  ></gn-ui-form-field-contacts>
155
166
  </ng-container>
@@ -169,6 +180,13 @@
169
180
  (valueChange)="valueChange.emit($event)"
170
181
  ></gn-ui-form-field-online-link-resources>
171
182
  </ng-container>
183
+ <ng-container *ngSwitchCase="'onlineResources'">
184
+ <gn-ui-form-field-online-single-link-resource
185
+ *ngIf="modelSpecifier === 'onlineResourceType:singleLink'"
186
+ [value]="valueAsOnlineResources"
187
+ (valueChange)="valueChange.emit($event)"
188
+ ></gn-ui-form-field-online-single-link-resource>
189
+ </ng-container>
172
190
  </ng-container>
173
191
 
174
192
  <ng-container *ngIf="!model">
@@ -11,6 +11,7 @@ import {
11
11
  } from '@angular/core'
12
12
  import { MatTooltipModule } from '@angular/material/tooltip'
13
13
  import {
14
+ AssociatedRecord,
14
15
  CatalogRecordKeys,
15
16
  Constraint,
16
17
  DatasetTemporalExtent,
@@ -18,9 +19,15 @@ import {
18
19
  Individual,
19
20
  Keyword,
20
21
  OnlineResource,
22
+ RecordKind,
21
23
  UpdateFrequency,
22
24
  } from '../../../../../../../../libs/common/domain/src/lib/model/record'
23
25
  import { FormFieldWrapperComponent } from '../../../../../../../../libs/ui/layout/src'
26
+ import { NgIconComponent, provideIcons } from '@ng-icons/core'
27
+ import {
28
+ matEditOutline,
29
+ matHelpOutline,
30
+ } from '@ng-icons/material-icons/outline'
24
31
  import { TranslatePipe } from '@ngx-translate/core'
25
32
  import {
26
33
  FieldFocusDirective,
@@ -33,11 +40,13 @@ import {
33
40
  FormFieldComponentName,
34
41
  FormFieldConfig,
35
42
  } from '../../../models'
43
+ import { FormFieldAssociatedRecordsComponent } from './form-field-associated-records/form-field-associated-records.component'
36
44
  import { FormFieldContactsForResourceComponent } from './form-field-contacts-for-resource/form-field-contacts-for-resource.component'
37
45
  import { FormFieldContactsComponent } from './form-field-contacts/form-field-contacts.component'
38
46
  import { FormFieldKeywordsComponent } from './form-field-keywords/form-field-keywords.component'
39
47
  import { FormFieldOnlineLinkResourcesComponent } from './form-field-online-link-resources/form-field-online-link-resources.component'
40
48
  import { FormFieldOnlineResourcesComponent } from './form-field-online-resources/form-field-online-resources.component'
49
+ import { FormFieldOnlineSingleLinkResourceComponent } from './form-field-online-single-link-resource/form-field-online-single-link-resource.component'
41
50
  import { FormFieldOverviewsComponent } from './form-field-overviews/form-field-overviews.component'
42
51
  import { FormFieldRichComponent } from './form-field-rich/form-field-rich.component'
43
52
  import { FormFieldSimpleComponent } from './form-field-simple/form-field-simple.component'
@@ -63,6 +72,7 @@ import { FormFieldTopicsComponent } from './form-field-topics/form-field-topics.
63
72
  FormFieldLicenseComponent,
64
73
  FormFieldDateComponent,
65
74
  FormFieldUpdateFrequencyComponent,
75
+ FormFieldAssociatedRecordsComponent,
66
76
  FormFieldTemporalExtentsComponent,
67
77
  FormFieldSimpleComponent,
68
78
  FormFieldRichComponent,
@@ -72,17 +82,21 @@ import { FormFieldTopicsComponent } from './form-field-topics/form-field-topics.
72
82
  FormFieldContactsForResourceComponent,
73
83
  FormFieldOnlineResourcesComponent,
74
84
  FormFieldOnlineLinkResourcesComponent,
85
+ FormFieldOnlineSingleLinkResourceComponent,
75
86
  FormFieldContactsComponent,
76
87
  FormFieldConstraintsComponent,
77
88
  FormFieldConstraintsShortcutsComponent,
78
89
  FormFieldSpatialToggleComponent,
79
90
  FormFieldTopicsComponent,
80
91
  TextFieldModule,
92
+ NgIconComponent,
81
93
  ],
94
+ providers: [provideIcons({ matEditOutline, matHelpOutline })],
82
95
  hostDirectives: [FieldFocusDirective],
83
96
  })
84
97
  export class FormFieldComponent {
85
98
  @Input() uniqueIdentifier: string
99
+ @Input() recordKind: RecordKind
86
100
  @Input() model: CatalogRecordKeys
87
101
  @Input() modelSpecifier: FieldModelSpecifier
88
102
  @Input() componentName: FormFieldComponentName
@@ -129,6 +143,9 @@ export class FormFieldComponent {
129
143
  get valueAsUpdateFrequency() {
130
144
  return this.value as UpdateFrequency
131
145
  }
146
+ get valueAsAssociatedRecords() {
147
+ return this.value as Array<AssociatedRecord>
148
+ }
132
149
  get valueAsTemporalExtents() {
133
150
  return this.value as Array<DatasetTemporalExtent>
134
151
  }
@@ -0,0 +1,35 @@
1
+ /* Glow applied by FieldFocusDirective (gnUiFieldFocus) to a focused field or,
2
+ when the field is hidden, to its whole section. */
3
+ .gn-ui-field-focus-glow {
4
+ position: relative;
5
+ }
6
+
7
+ .gn-ui-field-focus-glow::after {
8
+ content: '';
9
+ position: absolute;
10
+ inset: -8px;
11
+ border-radius: 8px;
12
+ background-color: color-mix(in srgb, var(--color-primary) 12%, transparent);
13
+ pointer-events: none;
14
+ animation: gn-ui-field-focus-glow 3s ease-out forwards;
15
+ }
16
+
17
+ .gn-ui-field-focus-glow::before {
18
+ content: '';
19
+ position: absolute;
20
+ inset: -16px;
21
+ border: 2px dashed var(--color-primary);
22
+ border-radius: 10px;
23
+ pointer-events: none;
24
+ animation: gn-ui-field-focus-glow 3s ease-out forwards;
25
+ }
26
+
27
+ @keyframes gn-ui-field-focus-glow {
28
+ 0%,
29
+ 55% {
30
+ opacity: 1;
31
+ }
32
+ 100% {
33
+ opacity: 0;
34
+ }
35
+ }
@@ -3,16 +3,28 @@
3
3
  section of facade.currentSections$ | async;
4
4
  track sectionTracker($index, section)
5
5
  ) {
6
- @if (!section.hidden) {
7
- <div class="flex flex-col gap-6 border p-8 rounded-[8px] shadow">
6
+ @if (evaluateExpression(section.hidden)() !== true) {
7
+ <div
8
+ class="flex flex-col gap-6 border p-8 rounded-[8px] shadow scroll-mt-[90px] bg-white"
9
+ gnUiFieldFocus
10
+ #sectionFocus="fieldFocus"
11
+ >
8
12
  <div class="flex flex-col gap-2">
9
13
  @if (section.labelKey) {
10
- <div class="text-2xl font-title text-black" translate>
14
+ <div
15
+ class="text-2xl font-title text-black"
16
+ translate
17
+ [translateParams]="{ recordKind: recordKind$ | async }"
18
+ >
11
19
  {{ section.labelKey }}
12
20
  </div>
13
21
  }
14
22
  @if (section.descriptionKey) {
15
- <div class="text-gray-800 text-sm" translate>
23
+ <div
24
+ class="text-gray-800 text-sm"
25
+ translate
26
+ [translateParams]="{ recordKind: recordKind$ | async }"
27
+ >
16
28
  {{ section.descriptionKey }}
17
29
  </div>
18
30
  }
@@ -22,7 +34,7 @@
22
34
  field of section.fieldsWithValues;
23
35
  track fieldTracker($index, field)
24
36
  ) {
25
- @if (!field.config.hidden) {
37
+ @if (evaluateExpression(field.config.hidden)() !== true) {
26
38
  <gn-ui-form-field
27
39
  [ngClass]="
28
40
  field.config.gridColumnSpan === 1
@@ -30,6 +42,7 @@
30
42
  : 'col-span-2'
31
43
  "
32
44
  [uniqueIdentifier]="recordUniqueIdentifier$ | async"
45
+ [recordKind]="recordKind$ | async"
33
46
  [model]="field.config.model!"
34
47
  [modelSpecifier]="field.config.modelSpecifier!"
35
48
  [config]="field.config.formFieldConfig"