geonetwork-ui 2.10.0-dev.37a1e4c4d → 2.10.0-dev.394310529

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 (57) hide show
  1. package/fesm2022/geonetwork-ui.mjs +661 -340
  2. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  3. package/index.d.ts +60 -94
  4. package/index.d.ts.map +1 -1
  5. package/package.json +1 -1
  6. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +48 -7
  7. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +3 -2
  8. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  9. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +5 -5
  10. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -0
  11. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +2 -1
  12. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +51 -0
  13. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +4 -1
  14. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +26 -19
  15. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +5 -1
  16. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.html +5 -5
  17. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -1
  18. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-online-resources/form-field-online-resources.component.ts +1 -1
  19. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +12 -5
  20. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +4 -4
  21. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +7 -0
  22. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +6 -2
  23. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +3 -1
  24. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +20 -16
  25. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +9 -0
  26. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +13 -4
  27. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +41 -0
  28. package/src/libs/feature/editor/src/lib/expressions.ts +380 -8
  29. package/src/libs/feature/editor/src/lib/fields.config.ts +251 -290
  30. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +2 -3
  31. package/src/libs/feature/editor/src/lib/services/editor.service.ts +8 -12
  32. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +10 -5
  33. package/src/libs/ui/elements/src/lib/contact-details/contact-details.component.html +48 -56
  34. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +17 -7
  35. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +29 -1
  36. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +4 -5
  37. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +4 -0
  38. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  39. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.ts +3 -3
  40. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +5 -5
  41. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +9 -1
  42. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -1
  43. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +3 -8
  44. package/src/libs/ui/layout/src/lib/sortable-list/sortable-list.component.html +7 -7
  45. package/src/libs/ui/layout/src/lib/sortable-list/sortable-list.component.ts +14 -1
  46. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +12 -8
  47. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +3 -1
  48. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +1 -0
  49. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +7 -1
  50. package/translations/de.json +32 -29
  51. package/translations/en.json +37 -34
  52. package/translations/es.json +6 -3
  53. package/translations/fr.json +32 -29
  54. package/translations/it.json +32 -29
  55. package/translations/nl.json +5 -2
  56. package/translations/pt.json +6 -3
  57. package/translations/sk.json +6 -3
@@ -1,12 +1,12 @@
1
1
  <div
2
- class="bg-gray-50 text-black rounded border border-gray-200 shadow-md p-4 flex flex-col gap-3 w-full"
2
+ class="bg-gray-50 text-black rounded border border-gray-200 shadow-md p-4 flex flex-col gap-2 w-full"
3
3
  data-test="contact-details"
4
4
  >
5
5
  @if (displayName) {
6
- <div class="flex items-center gap-3">
6
+ <div class="flex items-center gap-2.5">
7
7
  @if (organization?.logoUrl?.href) {
8
8
  <div
9
- class="flex items-center justify-center rounded-md bg-white w-14 h-14 shrink-0 overflow-hidden"
9
+ class="flex items-center justify-center rounded-lg bg-white w-14 h-14 shrink-0 overflow-hidden"
10
10
  >
11
11
  <gn-ui-thumbnail
12
12
  class="relative h-full w-full"
@@ -23,74 +23,66 @@
23
23
  </div>
24
24
  }
25
25
 
26
- <!-- Email + phone: always shown; icon dimmed when field is absent -->
27
- <div class="grid grid-cols-2 gap-1 rounded-md overflow-hidden">
28
- <div class="bg-gray-100 flex items-center gap-2 px-3 py-2">
29
- <ng-icon
30
- class="!w-5 !h-5 !text-[20px] shrink-0"
31
- [class.opacity-30]="!contact.email"
32
- [class.opacity-75]="!!contact.email"
33
- name="matMailOutline"
34
- ></ng-icon>
26
+ @if (contact.email || contact.phone) {
27
+ <div
28
+ class="grid gap-1 items-start"
29
+ [class.grid-cols-2]="contact.email && contact.phone"
30
+ >
35
31
  @if (contact.email) {
36
- <a
37
- [href]="'mailto:' + contact.email"
38
- class="text-sm break-all hover:underline"
39
- data-test="contact-details-email"
40
- >{{ contact.email }}</a
41
- >
32
+ <div class="bg-gray-100 rounded-lg flex items-center gap-2 px-3 py-2">
33
+ <ng-icon
34
+ class="!w-5 !h-5 !text-[20px] shrink-0 opacity-30"
35
+ name="matMailOutline"
36
+ ></ng-icon>
37
+ <a
38
+ [href]="'mailto:' + contact.email"
39
+ class="text-sm break-all hover:underline"
40
+ data-test="contact-details-email"
41
+ >{{ contact.email }}</a
42
+ >
43
+ </div>
42
44
  }
43
- </div>
44
- <div class="bg-gray-100 flex items-center gap-2 px-3 py-2">
45
- <ng-icon
46
- class="!w-5 !h-5 !text-[20px] shrink-0"
47
- [class.opacity-30]="!contact.phone"
48
- [class.opacity-75]="!!contact.phone"
49
- name="matCallOutline"
50
- ></ng-icon>
51
45
  @if (contact.phone) {
52
- <span class="text-sm" data-test="contact-details-phone">{{
53
- contact.phone
54
- }}</span>
46
+ <div class="bg-gray-100 rounded-lg flex items-center gap-2 px-3 py-2">
47
+ <ng-icon
48
+ class="!w-5 !h-5 !text-[20px] shrink-0 opacity-30"
49
+ name="matCallOutline"
50
+ ></ng-icon>
51
+ <span class="text-sm" data-test="contact-details-phone">{{
52
+ contact.phone
53
+ }}</span>
54
+ </div>
55
55
  }
56
56
  </div>
57
- </div>
57
+ }
58
58
 
59
- <!-- Address: always shown; icon dimmed when absent -->
60
- <div class="bg-gray-100 rounded-md flex items-start gap-2 px-3 py-2">
61
- <ng-icon
62
- class="!w-5 !h-5 !text-[20px] shrink-0 mt-0.5"
63
- [class.opacity-30]="!addressLines.length"
64
- [class.opacity-75]="!!addressLines.length"
65
- name="matLocationOnOutline"
66
- ></ng-icon>
67
- @if (addressLines.length) {
59
+ @if (addressLines.length) {
60
+ <div class="bg-gray-100 rounded-lg flex items-start gap-2 px-3 py-2">
61
+ <ng-icon
62
+ class="!w-5 !h-5 !text-[20px] shrink-0 mt-0.5 opacity-30"
63
+ name="matLocationOnOutline"
64
+ ></ng-icon>
68
65
  <div class="flex flex-col" data-test="contact-details-address">
69
66
  @for (line of addressLines; track line) {
70
67
  <p class="text-sm m-0">{{ line }}</p>
71
68
  }
72
69
  </div>
73
- }
74
- </div>
70
+ </div>
71
+ }
75
72
 
76
- <!-- Website: only shown when org exists; icon dimmed when absent -->
77
- @if (organization) {
78
- <div class="bg-gray-100 rounded-md flex items-center gap-2 px-3 py-2">
73
+ @if (organization?.website) {
74
+ <div class="bg-gray-100 rounded-lg flex items-center gap-2 px-3 py-2">
79
75
  <ng-icon
80
- class="!w-5 !h-5 !text-[20px] shrink-0"
81
- [class.opacity-30]="!organization.website"
82
- [class.opacity-75]="!!organization.website"
76
+ class="!w-5 !h-5 !text-[20px] shrink-0 opacity-30"
83
77
  name="matOpenInNew"
84
78
  ></ng-icon>
85
- @if (organization.website) {
86
- <a
87
- [href]="organization.website.href"
88
- target="_blank"
89
- class="text-sm break-all hover:underline"
90
- data-test="contact-details-website"
91
- >{{ organization.website.href }}</a
92
- >
93
- }
79
+ <a
80
+ [href]="organization.website.href"
81
+ target="_blank"
82
+ class="text-sm break-all hover:underline"
83
+ data-test="contact-details-website"
84
+ >{{ organization.website.href }}</a
85
+ >
94
86
  </div>
95
87
  }
96
88
  </div>
@@ -28,13 +28,23 @@
28
28
  <gn-ui-max-lines [maxLines]="7">
29
29
  <div class="metadata-info-keywords sm:pb-4 flex flex-wrap gap-2">
30
30
  @for (keyword of metadata.keywords; track keyword) {
31
- <gn-ui-button
32
- type="primary-light"
33
- class="inline-block opacity-70"
34
- extraClass="lowercase text-sm py-1 px-2"
35
- (buttonClick)="onKeywordClick(keyword)"
36
- >{{ keyword.label }}</gn-ui-button
37
- >
31
+ <ng-template #keywordTooltip>
32
+ @for (segment of keywordTooltipSegments(keyword); track $index) {
33
+ <span [class.font-bold]="$last">{{ segment }}</span>
34
+ @if (!$last) {
35
+ <span> &gt; </span>
36
+ }
37
+ }
38
+ </ng-template>
39
+ <gn-ui-popover [content]="keywordTooltip" theme="dark">
40
+ <gn-ui-button
41
+ type="primary-light"
42
+ class="inline-block opacity-70"
43
+ extraClass="lowercase text-sm py-1 px-2"
44
+ (buttonClick)="onKeywordClick(keyword)"
45
+ >{{ keyword.label }}</gn-ui-button
46
+ >
47
+ </gn-ui-popover>
38
48
  }
39
49
  </div>
40
50
  </gn-ui-max-lines>
@@ -19,12 +19,18 @@ import {
19
19
  ExpandablePanelComponent,
20
20
  MaxLinesComponent,
21
21
  } from '../../../../../../libs/ui/layout/src'
22
- import { TranslateDirective, TranslatePipe } from '@ngx-translate/core'
22
+ import {
23
+ TranslateDirective,
24
+ TranslatePipe,
25
+ TranslateService,
26
+ } from '@ngx-translate/core'
27
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
23
28
  import {
24
29
  BadgeComponent,
25
30
  ButtonComponent,
26
31
  CopyTextButtonComponent,
27
32
  } from '../../../../../../libs/ui/inputs/src'
33
+ import { PopoverComponent } from '../../../../../../libs/ui/widgets/src'
28
34
  import { ContentGhostComponent } from '../content-ghost/content-ghost.component'
29
35
  import { NgIcon, provideIcons } from '@ng-icons/core'
30
36
  import { matOpenInNew } from '@ng-icons/material-icons/baseline'
@@ -35,6 +41,11 @@ import { GnUiHumanizeDateDirective } from '../../../../../../libs/util/shared/sr
35
41
  import { SpatialExtentComponent } from '../../../../../../libs/ui/map/src'
36
42
  import { ContactPillComponent } from '../contact-pill/contact-pill.component'
37
43
 
44
+ marker('domain.record.keywordType.theme')
45
+ marker('domain.record.keywordType.place')
46
+ marker('domain.record.keywordType.temporal')
47
+ marker('domain.record.keywordType.other')
48
+
38
49
  @Component({
39
50
  selector: 'gn-ui-metadata-info',
40
51
  templateUrl: './metadata-info.component.html',
@@ -56,6 +67,7 @@ import { ContactPillComponent } from '../contact-pill/contact-pill.component'
56
67
  GnUiHumanizeDateDirective,
57
68
  SpatialExtentComponent,
58
69
  ContactPillComponent,
70
+ PopoverComponent,
59
71
  ],
60
72
  viewProviders: [
61
73
  provideIcons({
@@ -66,6 +78,7 @@ import { ContactPillComponent } from '../contact-pill/contact-pill.component'
66
78
  })
67
79
  export class MetadataInfoComponent {
68
80
  private dateService = inject(DateService)
81
+ private translateService = inject(TranslateService)
69
82
 
70
83
  @Input() metadata: Partial<CatalogRecord>
71
84
  @Input() incomplete: boolean
@@ -167,4 +180,19 @@ export class MetadataInfoComponent {
167
180
  onKeywordClick(keyword: Keyword) {
168
181
  this.keyword.emit(keyword)
169
182
  }
183
+
184
+ keywordTooltipSegments(keyword: Keyword): string[] {
185
+ if (keyword.hierarchyPath?.length) {
186
+ return keyword.hierarchyPath
187
+ }
188
+ if (keyword.thesaurus?.name) {
189
+ return [keyword.thesaurus.name, keyword.label]
190
+ }
191
+ return [
192
+ this.translateService.instant(
193
+ `domain.record.keywordType.${keyword.type}`
194
+ ),
195
+ keyword.label,
196
+ ]
197
+ }
170
198
  }
@@ -52,12 +52,11 @@
52
52
  </gn-ui-text-input>
53
53
  @if (!supportOffset) {
54
54
  <div class="flex items-center gap-2 text-orange-500 z-10 ml-3">
55
- <span
56
- class="material-symbols-outlined"
55
+ <ng-icon
56
+ name="matWarningOutline"
57
+ size="24"
57
58
  matTooltip="Not supported on this service"
58
- >
59
- warning
60
- </span>
59
+ ></ng-icon>
61
60
  </div>
62
61
  }
63
62
  </div>
@@ -15,6 +15,8 @@ import {
15
15
  import { CommonModule } from '@angular/common'
16
16
  import { TranslateDirective } from '@ngx-translate/core'
17
17
  import { MatTooltipModule } from '@angular/material/tooltip'
18
+ import { NgIconComponent, provideIcons } from '@ng-icons/core'
19
+ import { matWarningOutline } from '@ng-icons/material-icons/outline'
18
20
 
19
21
  const DEFAULT_PARAMS = {
20
22
  OFFSET: '',
@@ -35,7 +37,9 @@ const DEFAULT_PARAMS = {
35
37
  CopyTextButtonComponent,
36
38
  TranslateDirective,
37
39
  MatTooltipModule,
40
+ NgIconComponent,
38
41
  ],
42
+ providers: [provideIcons({ matWarningOutline })],
39
43
  })
40
44
  export class RecordApiFormComponent {
41
45
  @Input() set apiLink(value: DatasetServiceDistribution) {
@@ -51,7 +51,7 @@
51
51
  <div
52
52
  class="bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container"
53
53
  [style.max-height]="overlayMaxHeight"
54
- [style.width]="overlayWidth"
54
+ [style.min-width]="overlayMinWidth"
55
55
  role="listbox"
56
56
  tabindex="-1"
57
57
  [attr.id]="id"
@@ -3,12 +3,12 @@ import {
3
3
  Component,
4
4
  ElementRef,
5
5
  EventEmitter,
6
+ inject,
6
7
  Input,
7
8
  Output,
8
9
  QueryList,
9
10
  ViewChild,
10
11
  ViewChildren,
11
- inject,
12
12
  } from '@angular/core'
13
13
  import {
14
14
  CdkConnectedOverlay,
@@ -85,7 +85,7 @@ export class DropdownMultiselectComponent {
85
85
  ]
86
86
  scrollStrategy = this.scrollStrategies.reposition()
87
87
  overlayOpen = false
88
- overlayWidth = 'auto'
88
+ overlayMinWidth = 'none'
89
89
  overlayMaxHeight = 'none'
90
90
  id = `dropdown-multiselect-${Math.floor(Math.random() * 10000)}`
91
91
 
@@ -120,7 +120,7 @@ export class DropdownMultiselectComponent {
120
120
  }
121
121
 
122
122
  openOverlay() {
123
- this.overlayWidth =
123
+ this.overlayMinWidth =
124
124
  this.overlayOrigin.elementRef.nativeElement.getBoundingClientRect()
125
125
  .width + 'px'
126
126
  this.overlayMaxHeight = this.maxRows
@@ -3,14 +3,14 @@
3
3
  <span class="flex-none font-bold" translate="">{{ label }}</span>
4
4
  <div class="flex-1 flex justify-end items-center">
5
5
  <ng-content select="[form-field-interaction]"></ng-content>
6
- <span
6
+ <ng-icon
7
7
  *ngIf="hint"
8
- class="material-symbols-outlined m-2 gn-ui-icon-small"
8
+ name="matHelpOutline"
9
+ size="16"
10
+ class="m-2"
9
11
  [matTooltip]="hint"
10
12
  matTooltipPosition="above"
11
- >
12
- help
13
- </span>
13
+ ></ng-icon>
14
14
  </div>
15
15
  </div>
16
16
  <div class="flex-1 mt-2">
@@ -2,6 +2,8 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
2
2
  import { MatTooltipModule } from '@angular/material/tooltip'
3
3
  import { CommonModule } from '@angular/common'
4
4
  import { TranslateDirective } from '@ngx-translate/core'
5
+ import { NgIconComponent, provideIcons } from '@ng-icons/core'
6
+ import { matHelpOutline } from '@ng-icons/material-icons/outline'
5
7
 
6
8
  @Component({
7
9
  selector: 'gn-ui-form-field-wrapper',
@@ -9,7 +11,13 @@ import { TranslateDirective } from '@ngx-translate/core'
9
11
  styleUrls: ['./form-field-wrapper.component.css'],
10
12
  changeDetection: ChangeDetectionStrategy.OnPush,
11
13
  standalone: true,
12
- imports: [MatTooltipModule, CommonModule, TranslateDirective],
14
+ imports: [
15
+ MatTooltipModule,
16
+ CommonModule,
17
+ TranslateDirective,
18
+ NgIconComponent,
19
+ ],
20
+ providers: [provideIcons({ matHelpOutline })],
13
21
  })
14
22
  export class FormFieldWrapperComponent {
15
23
  @Input() label?: string
@@ -37,7 +37,7 @@
37
37
  (click)="handleRowClick(item)"
38
38
  data-cy="table-row"
39
39
  [attr.data-cy-title]="item.title"
40
- [title]="getItemTitle(item) | translate"
40
+ [title]="getItemTitle(item) | translate: { recordKind: item['kind'] }"
41
41
  >
42
42
  <div
43
43
  class="relative h-0"
@@ -16,9 +16,6 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
16
16
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
17
17
  import { Observable, of } from 'rxjs'
18
18
 
19
- marker('editor.record.lock.resourceType')
20
- marker('editor.record.lock.harvested')
21
- marker('editor.record.lock.owner')
22
19
  @Component({
23
20
  selector: 'gn-ui-interactive-table',
24
21
  templateUrl: './interactive-table.component.html',
@@ -53,12 +50,10 @@ export class InteractiveTableComponent {
53
50
 
54
51
  getItemTitle(item: CatalogRecord) {
55
52
  if (!this.isDraftPage) {
56
- if (item.kind !== 'dataset') {
57
- return 'editor.record.lock.resourceType'
58
- } else if (item.extras?.isHarvested) {
59
- return 'editor.record.lock.harvested'
53
+ if (item.extras?.isHarvested) {
54
+ return marker('editor.record.lock.harvested')
60
55
  } else if (!item.extras?.edit) {
61
- return 'editor.record.lock.owner'
56
+ return marker('editor.record.lock.owner')
62
57
  }
63
58
  }
64
59
  return ''
@@ -5,12 +5,12 @@
5
5
  >
6
6
  @for (item of items; track trackByFn(index); let index = $index) {
7
7
  <div class="sortable-box bg-white flex items-center" cdkDrag>
8
- <span
8
+ <ng-icon
9
9
  cdkDragHandle
10
- class="material-symbols-outlined mx-[10px] cursor-grab gn-ui-icon-medium flex-none"
11
- >
12
- drag_handle
13
- </span>
10
+ name="matDragHandleOutline"
11
+ size="20"
12
+ class="mx-[10px] cursor-grab flex-none"
13
+ ></ng-icon>
14
14
  <div class="flex-1">
15
15
  <ng-container
16
16
  *ngTemplateOutlet="
@@ -29,8 +29,8 @@
29
29
  class="ml-[8px] mr-[10px]"
30
30
  (buttonClick)="removeItem(index)"
31
31
  data-test="remove-item"
32
- ><span class="material-symbols-outlined gn-ui-icon-medium">close</span>
33
- </gn-ui-button>
32
+ ><ng-icon name="matCloseOutline" size="20"></ng-icon
33
+ ></gn-ui-button>
34
34
  </div>
35
35
  }
36
36
  </div>
@@ -15,6 +15,11 @@ import {
15
15
  TemplateRef,
16
16
  } from '@angular/core'
17
17
  import { ButtonComponent } from '../../../../../../libs/ui/inputs/src'
18
+ import { NgIconComponent, provideIcons } from '@ng-icons/core'
19
+ import {
20
+ matCloseOutline,
21
+ matDragHandleOutline,
22
+ } from '@ng-icons/material-icons/outline'
18
23
 
19
24
  @Component({
20
25
  selector: 'gn-ui-sortable-list',
@@ -22,7 +27,15 @@ import { ButtonComponent } from '../../../../../../libs/ui/inputs/src'
22
27
  styleUrls: ['sortable-list.component.css'],
23
28
  changeDetection: ChangeDetectionStrategy.OnPush,
24
29
  standalone: true,
25
- imports: [CommonModule, CdkDropList, CdkDrag, CdkDragHandle, ButtonComponent],
30
+ imports: [
31
+ CommonModule,
32
+ CdkDropList,
33
+ CdkDrag,
34
+ CdkDragHandle,
35
+ ButtonComponent,
36
+ NgIconComponent,
37
+ ],
38
+ providers: [provideIcons({ matDragHandleOutline, matCloseOutline })],
26
39
  })
27
40
  export class SortableListComponent {
28
41
  @Input() elementTemplate: TemplateRef<unknown>
@@ -52,10 +52,10 @@
52
52
  class="w-72 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl"
53
53
  >
54
54
  <span class="text-lg font-bold text-center">{{
55
- 'editor.record.delete.confirmation.title' | translate
55
+ 'editor.record.delete.confirmation.title' | translate: { recordKind }
56
56
  }}</span>
57
57
  <span class="text-center">{{
58
- 'editor.record.delete.confirmation.message' | translate
58
+ 'editor.record.delete.confirmation.message' | translate: { recordKind }
59
59
  }}</span>
60
60
  <div class="flex flex-row gap-8 justify-center">
61
61
  <gn-ui-button
@@ -65,14 +65,16 @@
65
65
  data-cy="confirm-button"
66
66
  [style.--gn-ui-button-width]="'100px'"
67
67
  >{{
68
- 'editor.record.delete.confirmation.confirmText' | translate
68
+ 'editor.record.delete.confirmation.confirmText'
69
+ | translate: { recordKind }
69
70
  }}</gn-ui-button
70
71
  >
71
72
  <gn-ui-button
72
73
  [style.--gn-ui-button-width]="'100px'"
73
74
  (buttonClick)="closeActionMenu.emit()"
74
75
  >{{
75
- 'editor.record.delete.confirmation.cancelText' | translate
76
+ 'editor.record.delete.confirmation.cancelText'
77
+ | translate: { recordKind }
76
78
  }}</gn-ui-button
77
79
  >
78
80
  </div>
@@ -84,10 +86,10 @@
84
86
  class="w-80 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl"
85
87
  >
86
88
  <span class="text-lg font-bold text-center">{{
87
- 'editor.record.undo.confirmation.title' | translate
89
+ 'editor.record.undo.confirmation.title' | translate: { recordKind }
88
90
  }}</span>
89
91
  <span class="text-center">{{
90
- 'editor.record.undo.confirmation.message' | translate
92
+ 'editor.record.undo.confirmation.message' | translate: { recordKind }
91
93
  }}</span>
92
94
  <div class="flex flex-row gap-8 justify-center">
93
95
  <gn-ui-button
@@ -97,14 +99,16 @@
97
99
  data-cy="confirm-button"
98
100
  [style.--gn-ui-button-width]="'120px'"
99
101
  >{{
100
- 'editor.record.undo.confirmation.confirmText' | translate
102
+ 'editor.record.undo.confirmation.confirmText'
103
+ | translate: { recordKind }
101
104
  }}</gn-ui-button
102
105
  >
103
106
  <gn-ui-button
104
107
  [style.--gn-ui-button-width]="'120px'"
105
108
  (buttonClick)="closeActionMenu.emit()"
106
109
  >{{
107
- 'editor.record.undo.confirmation.cancelText' | translate
110
+ 'editor.record.undo.confirmation.cancelText'
111
+ | translate: { recordKind }
108
112
  }}</gn-ui-button
109
113
  >
110
114
  </div>
@@ -2,15 +2,16 @@ import {
2
2
  ChangeDetectorRef,
3
3
  Component,
4
4
  EventEmitter,
5
+ inject,
5
6
  Input,
6
7
  Output,
7
8
  ViewChild,
8
- inject,
9
9
  } from '@angular/core'
10
10
  import { MatDialog, MatDialogModule } from '@angular/material/dialog'
11
11
  import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu'
12
12
  import { ButtonComponent } from '../../../../../../../libs/ui/inputs/src'
13
13
  import { TranslateDirective, TranslatePipe } from '@ngx-translate/core'
14
+ import { RecordKind } from '../../../../../../../libs/common/domain/src/lib/model'
14
15
 
15
16
  type ActionMenuPage = 'mainMenu' | 'deleteMenu' | 'rollbackMenu'
16
17
 
@@ -35,6 +36,7 @@ export class ActionMenuComponent {
35
36
  @Input() isDuplicating: boolean
36
37
  @Input() canDelete = true
37
38
  @Input() page: 'draft' | 'main' | 'record'
39
+ @Input() recordKind: RecordKind
38
40
  @Output() duplicate = new EventEmitter<void>()
39
41
  @Output() delete = new EventEmitter<void>()
40
42
  @Output() closeActionMenu = new EventEmitter<void>()
@@ -172,6 +172,7 @@
172
172
  (delete)="handleDelete(item)"
173
173
  (closeActionMenu)="closeActionMenu()"
174
174
  (rollback)="handleRollback(item)"
175
+ [recordKind]="item.kind"
175
176
  >
176
177
  </gn-ui-action-menu>
177
178
  </ng-template>
@@ -28,7 +28,13 @@ export class PopoverComponent implements AfterViewInit, OnChanges, OnDestroy {
28
28
 
29
29
  @ViewChild('popoverContent', { static: false }) popoverContent: ElementRef
30
30
  @Input() content: string | TemplateRef<any>
31
- @Input() theme: 'light' | 'light-border' | 'translucent' | 'material' | ''
31
+ @Input() theme:
32
+ | 'light'
33
+ | 'light-border'
34
+ | 'translucent'
35
+ | 'material'
36
+ | 'dark'
37
+ | ''
32
38
 
33
39
  private tippyInstance: Instance
34
40
  private view: EmbeddedViewRef<any>