geonetwork-ui 2.4.0-dev.49a5852a → 2.4.0-dev.4e4ab1af

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 (166) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +12 -1
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -5
  6. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  7. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  8. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -6
  9. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  10. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +3 -3
  11. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +7 -2
  12. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
  13. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +7 -3
  14. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +16 -6
  15. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +4 -2
  16. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +3 -3
  17. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +1 -2
  18. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +11 -7
  19. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
  20. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +143 -60
  21. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +2 -0
  22. package/esm2022/libs/feature/editor/src/lib/models/index.mjs +2 -1
  23. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +4 -3
  24. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +42 -23
  25. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +13 -5
  26. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +49 -15
  27. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +9 -3
  28. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +7 -3
  29. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  30. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +5 -4
  31. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -4
  32. package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +3 -3
  33. package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +3 -3
  34. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +29 -0
  35. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +15 -7
  36. package/esm2022/translations/de.json +77 -39
  37. package/esm2022/translations/en.json +47 -12
  38. package/esm2022/translations/es.json +47 -9
  39. package/esm2022/translations/fr.json +46 -11
  40. package/esm2022/translations/it.json +47 -9
  41. package/esm2022/translations/nl.json +47 -9
  42. package/esm2022/translations/pt.json +47 -9
  43. package/fesm2022/geonetwork-ui.mjs +786 -303
  44. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  45. package/libs/api/metadata-converter/src/index.d.ts +1 -0
  46. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  47. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  48. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +1 -0
  49. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  50. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +1 -0
  51. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  52. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -1
  53. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  54. package/libs/common/domain/src/lib/platform.service.interface.d.ts +2 -1
  55. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  56. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +9 -0
  57. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  58. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  59. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +5 -0
  60. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  61. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +4 -4
  62. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  63. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +8 -0
  64. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
  65. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -3
  66. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  67. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +4 -8
  68. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  69. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  70. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +1 -1
  71. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  72. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +0 -1
  73. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  74. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +5 -7
  75. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  76. package/libs/feature/editor/src/lib/expressions.d.ts +1 -1
  77. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -1
  78. package/libs/feature/editor/src/lib/fields.config.d.ts +38 -2
  79. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  80. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +36 -0
  81. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -0
  82. package/libs/feature/editor/src/lib/models/index.d.ts +1 -0
  83. package/libs/feature/editor/src/lib/models/index.d.ts.map +1 -1
  84. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  85. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  86. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +4 -1
  87. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  88. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +4 -1
  89. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  90. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +4 -1
  91. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  92. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +3 -1
  93. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  94. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  95. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  96. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  97. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +11 -0
  98. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  99. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +4 -2
  100. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  101. package/package.json +1 -1
  102. package/src/libs/api/metadata-converter/src/index.ts +1 -0
  103. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +1 -0
  104. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  105. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +20 -0
  106. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +26 -15
  107. package/src/libs/common/domain/src/lib/platform.service.interface.ts +5 -1
  108. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +12 -0
  109. package/src/libs/common/fixtures/src/index.ts +2 -0
  110. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +156 -0
  111. package/src/libs/common/fixtures/src/lib/editor/index.ts +1 -0
  112. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +1 -5
  113. package/src/libs/data-access/gn4/src/spec.yaml +0 -8
  114. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +5 -0
  115. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +2 -2
  116. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +9 -1
  117. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +11 -0
  118. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +11 -5
  119. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +22 -8
  120. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +8 -6
  121. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +9 -9
  122. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +2 -1
  123. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +0 -1
  124. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +51 -11
  125. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +15 -8
  126. package/src/libs/feature/editor/src/lib/expressions.ts +1 -1
  127. package/src/libs/feature/editor/src/lib/fields.config.ts +175 -61
  128. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +53 -0
  129. package/src/libs/feature/editor/src/lib/models/index.ts +1 -0
  130. package/src/libs/feature/editor/src/lib/services/editor.service.ts +8 -4
  131. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +36 -19
  132. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +6 -2
  133. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +11 -0
  134. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +59 -12
  135. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  136. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +5 -0
  137. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +16 -2
  138. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +29 -29
  139. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  140. package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -1
  141. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.css +31 -0
  142. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +15 -0
  143. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +38 -0
  144. package/src/libs/ui/layout/src/lib/max-lines/max-lines.component.html +1 -0
  145. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  146. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +17 -0
  147. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +22 -0
  148. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +9 -0
  149. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +26 -12
  150. package/tailwind.base.css +2 -1
  151. package/translations/de.json +77 -39
  152. package/translations/en.json +47 -12
  153. package/translations/es.json +47 -9
  154. package/translations/fr.json +46 -11
  155. package/translations/it.json +47 -9
  156. package/translations/nl.json +47 -9
  157. package/translations/pt.json +47 -9
  158. package/translations/sk.json +47 -9
  159. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +0 -2
  160. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +0 -2
  161. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts +0 -26
  162. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +0 -1
  163. package/libs/feature/editor/src/lib/models/fields.model.d.ts +0 -15
  164. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +0 -1
  165. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.ts +0 -43
  166. package/src/libs/feature/editor/src/lib/models/fields.model.ts +0 -29
@@ -25,19 +25,21 @@ marker('search.filters.keyword')
25
25
  marker('search.filters.isSpatial')
26
26
  marker('search.filters.license')
27
27
  marker('search.filters.publicationYear')
28
- marker('search.filters.publisher')
28
+ marker('search.filters.organization')
29
29
  marker('search.filters.representationType')
30
30
  marker('search.filters.resourceType')
31
31
  marker('search.filters.standard')
32
32
  marker('search.filters.topic')
33
33
  marker('search.filters.contact')
34
+ marker('search.filters.producerOrg')
35
+ marker('search.filters.publisherOrg')
34
36
 
35
37
  @Injectable({
36
38
  providedIn: 'root',
37
39
  })
38
40
  export class FieldsService {
39
41
  protected fields = {
40
- publisher: new OrganizationSearchField(this.injector),
42
+ organization: new OrganizationSearchField(this.injector),
41
43
  format: new SimpleSearchField('format', this.injector, 'asc'),
42
44
  resourceType: new TranslatedSearchField(
43
45
  'resourceType',
@@ -70,6 +72,18 @@ export class FieldsService {
70
72
  q: new FullTextSearchField(),
71
73
  license: new LicenseSearchField(this.injector),
72
74
  owner: new OwnerSearchField(this.injector),
75
+ producerOrg: new MultilingualSearchField(
76
+ 'originatorOrgForResourceObject',
77
+ this.injector,
78
+ 'asc',
79
+ 'key'
80
+ ),
81
+ publisherOrg: new MultilingualSearchField(
82
+ 'distributorOrgForResourceObject',
83
+ this.injector,
84
+ 'asc',
85
+ 'key'
86
+ ),
73
87
  } as Record<string, AbstractSearchField>
74
88
 
75
89
  get supportedFields() {
@@ -1,7 +1,5 @@
1
1
  <div
2
- class="group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden"
3
- [ngClass]="{ 'cursor-pointer': displayApiFormButton }"
4
- (click)="openRecordApiFormPanel()"
2
+ class="group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default"
5
3
  >
6
4
  <div
7
5
  class="font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]"
@@ -17,35 +15,37 @@
17
15
  }"
18
16
  >{{ link.accessServiceProtocol }}</span
19
17
  >
20
- <gn-ui-copy-text-button
21
- *ngIf="!displayApiFormButton"
22
- [text]="link.url.toString()"
23
- [tooltipText]="'tooltip.url.copy' | translate"
24
- [displayText]="false"
25
- ></gn-ui-copy-text-button>
26
- <button
27
- *ngIf="displayApiFormButton"
28
- type="button"
29
- [ngClass]="{
30
- 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':
31
- displayText
32
- }"
33
- mat-raised-button
34
- [matTooltip]="
35
- !currentlyActive
36
- ? ('record.metadata.api.form.openForm' | translate)
37
- : ('record.metadata.api.form.closeForm' | translate)
38
- "
39
- matTooltipPosition="above"
40
- >
41
- <mat-icon
42
- class="material-symbols-outlined pointer-events-none align-middle card-icon"
18
+ <div class="flex flex-row gap-2 items-center">
19
+ <gn-ui-copy-text-button
20
+ [text]="link.url"
21
+ [tooltipText]="'tooltip.url.copy' | translate"
22
+ [displayText]="false"
23
+ ></gn-ui-copy-text-button>
24
+ <button
25
+ *ngIf="displayApiFormButton"
26
+ type="button"
43
27
  [ngClass]="{
44
- 'text-secondary opacity-100': currentlyActive
28
+ 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':
29
+ displayText
45
30
  }"
46
- >more_horiz</mat-icon
31
+ mat-raised-button
32
+ [matTooltip]="
33
+ !currentlyActive
34
+ ? ('record.metadata.api.form.openForm' | translate)
35
+ : ('record.metadata.api.form.closeForm' | translate)
36
+ "
37
+ matTooltipPosition="above"
38
+ (click)="openRecordApiFormPanel()"
47
39
  >
48
- </button>
40
+ <mat-icon
41
+ class="material-symbols-outlined pointer-events-none align-middle card-icon"
42
+ [ngClass]="{
43
+ 'text-secondary opacity-100': currentlyActive
44
+ }"
45
+ >more_horiz</mat-icon
46
+ >
47
+ </button>
48
+ </div>
49
49
  </div>
50
50
  </div>
51
51
  </div>
@@ -10,7 +10,7 @@ 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
12
  import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
13
- import { UiLayoutModule } from '../../../../../libs/ui/layout/src'
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'
16
16
  import { MetadataContactComponent } from './metadata-contact/metadata-contact.component'
@@ -49,6 +49,7 @@ import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
49
49
  ThumbnailComponent,
50
50
  TimeSincePipe,
51
51
  BadgeComponent,
52
+ MaxLinesComponent,
52
53
  ],
53
54
  declarations: [
54
55
  MetadataInfoComponent,
@@ -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
@@ -0,0 +1,31 @@
1
+ :host {
2
+ --mat-standard-button-toggle-height: 32px;
3
+ }
4
+
5
+ .mat-button-toggle-group-appearance-standard {
6
+ background-color: var(--color-gray-200);
7
+ padding: 4px;
8
+ display: flex;
9
+ gap: 4px;
10
+ border-radius: 8px;
11
+ }
12
+
13
+ .mat-button-toggle-appearance-standard {
14
+ color: var(--color-main);
15
+ background-color: var(--color-gray-200);
16
+ border-radius: 4px;
17
+ border-left: none;
18
+ }
19
+
20
+ .mat-button-toggle-appearance-standard.mat-button-toggle-checked {
21
+ background-color: var(--color-main);
22
+ color: var(--color-primary-white);
23
+ }
24
+
25
+ button.mat-button-toggle-button.mat-focus-indicator.mat-button-toggle-label-content {
26
+ line-height: 32px;
27
+ }
28
+
29
+ .mat-button-toggle-label-content {
30
+ line-height: 32px;
31
+ }
@@ -0,0 +1,15 @@
1
+ <mat-button-toggle-group
2
+ #group="matButtonToggleGroup"
3
+ multiple="false"
4
+ class="flex w-full"
5
+ >
6
+ <mat-button-toggle
7
+ *ngFor="let option of options"
8
+ [aria-label]="option.label"
9
+ [value]="option.value"
10
+ [checked]="option.checked"
11
+ (change)="onChange(option)"
12
+ [class]="extraClasses"
13
+ >{{ option.label }}</mat-button-toggle
14
+ >
15
+ </mat-button-toggle-group>
@@ -0,0 +1,38 @@
1
+ import { CommonModule } from '@angular/common'
2
+ import {
3
+ ChangeDetectionStrategy,
4
+ Component,
5
+ EventEmitter,
6
+ Input,
7
+ Output,
8
+ } from '@angular/core'
9
+ import { MatButtonToggleModule } from '@angular/material/button-toggle'
10
+
11
+ export type SwitchToggleOption = {
12
+ label: string
13
+ value: string
14
+ checked: boolean
15
+ }
16
+
17
+ @Component({
18
+ selector: 'gn-ui-switch-toggle',
19
+ templateUrl: './switch-toggle.component.html',
20
+ styleUrls: ['./switch-toggle.component.css'],
21
+ changeDetection: ChangeDetectionStrategy.OnPush,
22
+ standalone: true,
23
+ imports: [MatButtonToggleModule, CommonModule],
24
+ })
25
+ export class SwitchToggleComponent {
26
+ @Input() options: SwitchToggleOption[]
27
+ @Input() ariaLabel? = ''
28
+ @Input() extraClasses? = ''
29
+ @Output() selectedValue = new EventEmitter<SwitchToggleOption>()
30
+
31
+ onChange(selectedOption: SwitchToggleOption) {
32
+ this.options.find(
33
+ (option) => option.value === selectedOption.value
34
+ ).checked = true
35
+
36
+ this.selectedValue.emit(selectedOption)
37
+ }
38
+ }
@@ -14,6 +14,7 @@
14
14
  *ngIf="showToggleButton"
15
15
  (click)="toggleDisplay()"
16
16
  class="text-secondary cursor-pointer pt-2.5"
17
+ data-cy="readMoreButton"
17
18
  >
18
19
  {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}
19
20
  </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
  }
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 */
@@ -49,6 +49,8 @@
49
49
  "datafeeder.datasetValidation.submitButton": "OK, meine Daten sind korrekt",
50
50
  "datafeeder.datasetValidation.title": "Stellen Sie sicher, dass Ihre Daten korrekt sind",
51
51
  "datafeeder.datasetValidation.unknown": " - ",
52
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
53
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
52
54
  "datafeeder.form.abstract": "Wie würden Sie Ihren Datensatz beschreiben?",
53
55
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
54
56
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
@@ -76,6 +78,7 @@
76
78
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
77
79
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
78
80
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
81
+ "datafeeder.publishSuccess.ogcFeature": "",
79
82
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
80
83
  "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
81
84
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
@@ -104,7 +107,6 @@
104
107
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
105
108
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
106
109
  "datafeeder.upload.uploadButton": "Hochladen",
107
- "datafeeder.validation.encoding": "Codierung",
108
110
  "datafeeder.validation.csv.delimiter": "",
109
111
  "datafeeder.validation.csv.delimiter.comma": "",
110
112
  "datafeeder.validation.csv.delimiter.semicolon": "",
@@ -114,6 +116,7 @@
114
116
  "datafeeder.validation.csv.quote.none": "",
115
117
  "datafeeder.validation.csv.quote.simple": "",
116
118
  "datafeeder.validation.csv.quoteChar": "",
119
+ "datafeeder.validation.encoding": "Codierung",
117
120
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
118
121
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
119
122
  "datafeeder.validation.projection": "Raumbezugssystem:",
@@ -126,7 +129,7 @@
126
129
  "datahub.header.lastRecords": "Die neuesten",
127
130
  "datahub.header.myfavorites": "Meine Favoriten",
128
131
  "datahub.header.news": "Startseite",
129
- "datahub.header.organisations": "Organisationen",
132
+ "datahub.header.organizations": "Organisationen",
130
133
  "datahub.header.popularRecords": "Die beliebtesten",
131
134
  "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
132
135
  "datahub.news.contact.contactus": "Kontaktieren Sie uns",
@@ -162,37 +165,71 @@
162
165
  "downloads.format.unknown": "unbekannt",
163
166
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
164
167
  "dropFile": "Datei ablegen",
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": "Schlagwörter",
173
+ "editor.record.form.field.license": "Lizenz",
174
+ "editor.record.form.field.recordUpdated": "",
175
+ "editor.record.form.field.resourceUpdated": "",
176
+ "editor.record.form.field.temporalExtents": "",
177
+ "editor.record.form.field.title": "",
178
+ "editor.record.form.field.uniqueIdentifier": "",
179
+ "editor.record.form.field.updateFrequency": "",
180
+ "editor.record.form.abstract": "Kurzbeschreibung",
181
+ "editor.record.form.keywords": "Schlüsselwörter",
165
182
  "editor.record.form.license": "Lizenz",
166
- "editor.record.form.license.cc-by": "",
167
- "editor.record.form.license.cc-by-sa": "",
168
- "editor.record.form.license.cc-zero": "",
169
- "editor.record.form.license.etalab": "",
170
- "editor.record.form.license.etalab-v2": "",
171
- "editor.record.form.license.odbl": "",
172
- "editor.record.form.license.odc-by": "",
173
- "editor.record.form.license.pddl": "",
183
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
184
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
185
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
186
+ "editor.record.form.license.etalab": "Offene Lizenz (Etalab)",
187
+ "editor.record.form.license.etalab-v2": "Offene Lizenz v2.0 (Etalab)",
188
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
189
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
190
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
174
191
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
175
- "editor.record.form.resourceUpdated": "",
176
- "editor.record.form.temporalExtents": "",
177
- "editor.record.form.temporalExtents.addDate": "",
178
- "editor.record.form.temporalExtents.addRange": "",
179
- "editor.record.form.temporalExtents.date": "",
180
- "editor.record.form.temporalExtents.range": "",
181
- "editor.record.form.updateFrequency": "",
182
- "editor.record.form.updateFrequency.planned": "",
183
- "editor.record.loadError.body": "",
184
- "editor.record.loadError.closeMessage": "",
185
- "editor.record.loadError.title": "",
186
- "editor.record.publish": "",
187
- "editor.record.publishError.body": "",
188
- "editor.record.publishError.closeMessage": "",
189
- "editor.record.publishError.title": "",
190
- "editor.record.publishSuccess.body": "",
191
- "editor.record.publishSuccess.title": "",
192
- "editor.record.saveStatus.asDraftOnly": "",
193
- "editor.record.saveStatus.draftWithChangesPending": "",
194
- "editor.record.saveStatus.recordUpToDate": "",
195
- "editor.record.upToDate": "",
192
+ "editor.record.form.page.accessAndContact": "",
193
+ "editor.record.form.page.description": "",
194
+ "editor.record.form.page.ressources": "",
195
+ "editor.record.form.section.about.description": "",
196
+ "editor.record.form.section.about.label": "",
197
+ "editor.record.form.section.annexes.label": "",
198
+ "editor.record.form.section.associatedResources.description": "",
199
+ "editor.record.form.section.associatedResources.label": "",
200
+ "editor.record.form.section.classification.description": "",
201
+ "editor.record.form.section.classification.label": "",
202
+ "editor.record.form.section.dataManagers.description": "",
203
+ "editor.record.form.section.dataManagers.label": "",
204
+ "editor.record.form.section.dataPointOfContact.description": "",
205
+ "editor.record.form.section.dataPointOfContact.label": "",
206
+ "editor.record.form.section.geographicalCoverage.label": "",
207
+ "editor.record.form.section.useAndAccessConditions.label": "",
208
+ "editor.record.form.metadata.title": "Metadaten-Titel",
209
+ "editor.record.form.record.updated": "Datensatz zuletzt aktualisiert",
210
+ "editor.record.form.resourceUpdated": "Letztes Aktualisierungsdatum",
211
+ "editor.record.form.temporalExtents": "Zeitlicher Umfang",
212
+ "editor.record.form.temporalExtents.addDate": "Zeitpunkt",
213
+ "editor.record.form.temporalExtents.addRange": "Zeitraum",
214
+ "editor.record.form.temporalExtents.date": "Datum",
215
+ "editor.record.form.temporalExtents.range": "Datumsbereich",
216
+ "editor.record.form.unique.identifier": "Eindeutige Kennung (ID)",
217
+ "editor.record.form.updateFrequency": "Aktualisierungshäufigkeit",
218
+ "editor.record.form.updateFrequency.planned": "Die Daten sollten regelmäßig aktualisiert werden.",
219
+ "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
220
+ "editor.record.loadError.closeMessage": "Verstanden",
221
+ "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
222
+ "editor.record.publish": "Diesen Datensatz veröffentlichen",
223
+ "editor.record.publishError.body": "Der Datensatz konnte nicht veröffentlicht werden:",
224
+ "editor.record.publishError.closeMessage": "Verstanden",
225
+ "editor.record.publishError.title": "Fehler beim Veröffentlichen des Datensatzes",
226
+ "editor.record.publishSuccess.body": "Der Datensatz wurde erfolgreich veröffentlicht!",
227
+ "editor.record.publishSuccess.title": "Veröffentlichung erfolgreich",
228
+ "editor.record.saveStatus.asDraftOnly": "Nur als Entwurf gespeichert - noch nicht veröffentlicht",
229
+ "editor.record.saveStatus.draftWithChangesPending": "Als Entwurf gespeichert - Änderungen stehen aus",
230
+ "editor.record.saveStatus.recordUpToDate": "Datensatz ist auf dem neuesten Stand",
231
+ "editor.record.upToDate": "Dieser Datensatz ist auf dem neuesten Stand",
232
+ "editor.sidebar.menu.editor": "",
196
233
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
197
234
  "facets.block.title.OrgForResource": "Organisation",
198
235
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -261,17 +298,16 @@
261
298
  "organisations.sortBy.nameDesc": "Name Z → A",
262
299
  "organisations.sortBy.recordCountAsc": "Veröffentlichungen 0 → 9",
263
300
  "organisations.sortBy.recordCountDesc": "Veröffentlichungen 9 → 0",
264
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
265
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{}}",
301
+ "organization.details.lastPublishedDatasets": "",
302
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
266
303
  "organization.details.mailContact": "",
267
- "organization.datasets": "",
268
- "organization.lastPublishedDatasets": "",
269
- "organization.lastPublishedDatasets.searchAllButton": "",
304
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
270
305
  "pagination.nextPage": "Nächste Seite",
271
306
  "pagination.page": "Seite",
272
307
  "pagination.pageOf": "von",
273
308
  "previous": "zurück",
274
309
  "record.action.download": "Herunterladen",
310
+ "record.action.duplicate": "",
275
311
  "record.action.view": "Anzeigen",
276
312
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
277
313
  "record.metadata.about": "Beschreibung",
@@ -364,11 +400,11 @@
364
400
  "results.sortBy.relevancy": "Relevanz",
365
401
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
366
402
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
403
+ "search.error.organizationHasNoDataset": "",
404
+ "search.error.organizationNotFound": "",
367
405
  "search.error.receivedError": "Ein Fehler ist aufgetreten",
368
406
  "search.error.recordHasnolink": "",
369
407
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
370
- "search.error.organizationNotFound": "",
371
- "search.error.organizationHasNoDataset": "",
372
408
  "search.field.any.placeholder": "Suche Datensätze ...",
373
409
  "search.field.sortBy": "Sortieren nach:",
374
410
  "search.filters.clear": "Zurücksetzen",
@@ -393,9 +429,11 @@
393
429
  "search.filters.minimize": "Minimieren",
394
430
  "search.filters.myRecords": "Nur meine Datensätze anzeigen",
395
431
  "search.filters.myRecordsHelp": "Wenn dies aktiviert ist, werden nur von mir erstellte Datensätze angezeigt; Datensätze, die von anderen erstellt wurden, werden nicht angezeigt.",
432
+ "search.filters.organization": "",
396
433
  "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
434
+ "search.filters.producerOrg": "",
397
435
  "search.filters.publicationYear": "Veröffentlichungsjahr",
398
- "search.filters.publisher": "Organisationen",
436
+ "search.filters.publisherOrg": "",
399
437
  "search.filters.representationType": "Repräsentationstyp",
400
438
  "search.filters.resourceType": "Ressourcentyp",
401
439
  "search.filters.standard": "Standard",