geonetwork-ui 2.4.0-dev.58b3c2e5 → 2.4.0-dev.613f7319

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 (135) 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/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  6. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  7. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +3 -3
  8. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +7 -2
  9. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +7 -3
  11. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +16 -6
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +3 -3
  13. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +1 -2
  14. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +11 -7
  15. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
  16. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +143 -60
  17. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +2 -0
  18. package/esm2022/libs/feature/editor/src/lib/models/index.mjs +2 -1
  19. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +4 -3
  20. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +42 -23
  21. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +13 -5
  22. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +49 -15
  23. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +9 -3
  24. package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +3 -3
  25. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +29 -0
  26. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +15 -7
  27. package/esm2022/translations/de.json +30 -0
  28. package/esm2022/translations/en.json +30 -0
  29. package/esm2022/translations/es.json +30 -0
  30. package/esm2022/translations/fr.json +30 -0
  31. package/esm2022/translations/it.json +30 -0
  32. package/esm2022/translations/nl.json +30 -0
  33. package/esm2022/translations/pt.json +30 -0
  34. package/fesm2022/geonetwork-ui.mjs +547 -123
  35. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  36. package/libs/api/metadata-converter/src/index.d.ts +1 -0
  37. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  38. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  39. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +1 -0
  40. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  41. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +1 -0
  42. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  43. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +9 -0
  44. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  45. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +5 -0
  46. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  47. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +4 -4
  48. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  49. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +8 -0
  50. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
  51. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -3
  52. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  53. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +4 -8
  54. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  55. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +1 -1
  56. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  57. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +0 -1
  58. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  59. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +5 -7
  60. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  61. package/libs/feature/editor/src/lib/expressions.d.ts +1 -1
  62. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -1
  63. package/libs/feature/editor/src/lib/fields.config.d.ts +38 -2
  64. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  65. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +36 -0
  66. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -0
  67. package/libs/feature/editor/src/lib/models/index.d.ts +1 -0
  68. package/libs/feature/editor/src/lib/models/index.d.ts.map +1 -1
  69. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  70. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  71. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +4 -1
  72. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  73. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +4 -1
  74. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  75. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +4 -1
  76. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  77. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +3 -1
  78. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  79. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +11 -0
  80. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  81. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +4 -2
  82. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  83. package/package.json +1 -1
  84. package/src/libs/api/metadata-converter/src/index.ts +1 -0
  85. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +1 -0
  86. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  87. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +20 -0
  88. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +12 -0
  89. package/src/libs/common/fixtures/src/index.ts +2 -0
  90. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +156 -0
  91. package/src/libs/common/fixtures/src/lib/editor/index.ts +1 -0
  92. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +5 -0
  93. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +2 -2
  94. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +9 -1
  95. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +11 -0
  96. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +11 -5
  97. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +22 -8
  98. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +9 -9
  99. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +2 -1
  100. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +0 -1
  101. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +51 -11
  102. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +15 -8
  103. package/src/libs/feature/editor/src/lib/expressions.ts +1 -1
  104. package/src/libs/feature/editor/src/lib/fields.config.ts +175 -61
  105. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +53 -0
  106. package/src/libs/feature/editor/src/lib/models/index.ts +1 -0
  107. package/src/libs/feature/editor/src/lib/services/editor.service.ts +8 -4
  108. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +36 -19
  109. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +6 -2
  110. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +11 -0
  111. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +59 -12
  112. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  113. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +5 -0
  114. package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -1
  115. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  116. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +17 -0
  117. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +22 -0
  118. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +9 -0
  119. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +26 -12
  120. package/translations/de.json +30 -0
  121. package/translations/en.json +30 -0
  122. package/translations/es.json +30 -0
  123. package/translations/fr.json +30 -0
  124. package/translations/it.json +30 -0
  125. package/translations/nl.json +30 -0
  126. package/translations/pt.json +30 -0
  127. package/translations/sk.json +30 -0
  128. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +0 -2
  129. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +0 -2
  130. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts +0 -26
  131. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +0 -1
  132. package/libs/feature/editor/src/lib/models/fields.model.d.ts +0 -15
  133. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +0 -1
  134. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.ts +0 -43
  135. package/src/libs/feature/editor/src/lib/models/fields.model.ts +0 -29
@@ -48,7 +48,7 @@ import { MVT, WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
48
48
  import VectorTileLayer from 'ol/layer/VectorTile';
49
49
  import OGCMapTile from 'ol/source/OGCMapTile.js';
50
50
  import ImageLayer from 'ol/layer/Image';
51
- import * as i2$5 from '@angular/material/tabs';
51
+ import * as i2$6 from '@angular/material/tabs';
52
52
  import { MatTabsModule } from '@angular/material/tabs';
53
53
  import * as i2$2 from '@angular/forms';
54
54
  import { FormsModule, ReactiveFormsModule, UntypedFormControl, FormArray, FormControl } from '@angular/forms';
@@ -81,6 +81,8 @@ import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/c
81
81
  import EmblaCarousel from 'embla-carousel';
82
82
  import { formatDistance } from 'date-fns';
83
83
  import { enUS, sk, pt as pt$1, nl as nl$1, it as it$1, es as es$1, de as de$1, fr as fr$1 } from 'date-fns/locale';
84
+ import * as i2$5 from '@angular/material/menu';
85
+ import { MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
84
86
  import * as i1$8 from '@ngrx/effects';
85
87
  import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
86
88
  import tippy from 'tippy.js';
@@ -91,7 +93,7 @@ import { trigger, transition, animate, keyframes, style } from '@angular/animati
91
93
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
92
94
  import * as i4 from '@angular/cdk/scrolling';
93
95
  import { ScrollingModule } from '@angular/cdk/scrolling';
94
- import * as i2$6 from '@angular/material/sort';
96
+ import * as i2$7 from '@angular/material/sort';
95
97
  import { MatSort, MatSortModule } from '@angular/material/sort';
96
98
  import * as i1$9 from '@angular/material/table';
97
99
  import { MatTableModule } from '@angular/material/table';
@@ -2176,6 +2178,7 @@ const mapKeywords = (thesauri, language) => {
2176
2178
  keywords.push({
2177
2179
  label: selectTranslatedValue(keyword, language),
2178
2180
  type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
2181
+ ...(keyword.link && { key: keyword.link }),
2179
2182
  ...(thesaurus && { thesaurus }),
2180
2183
  });
2181
2184
  }
@@ -17472,6 +17475,18 @@ var de = {
17472
17475
  "downloads.format.unknown": "unbekannt",
17473
17476
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
17474
17477
  dropFile: dropFile$6,
17478
+ "editor.record.form.bottomButtons.comeBackLater": "",
17479
+ "editor.record.form.bottomButtons.next": "",
17480
+ "editor.record.form.bottomButtons.previous": "",
17481
+ "editor.record.form.field.abstract": "",
17482
+ "editor.record.form.field.keywords": "Schlagwörter",
17483
+ "editor.record.form.field.license": "Lizenz",
17484
+ "editor.record.form.field.recordUpdated": "",
17485
+ "editor.record.form.field.resourceUpdated": "",
17486
+ "editor.record.form.field.temporalExtents": "",
17487
+ "editor.record.form.field.title": "",
17488
+ "editor.record.form.field.uniqueIdentifier": "",
17489
+ "editor.record.form.field.updateFrequency": "",
17475
17490
  "editor.record.form.abstract": "Kurzbeschreibung",
17476
17491
  "editor.record.form.keywords": "Schlüsselwörter",
17477
17492
  "editor.record.form.license": "Lizenz",
@@ -17484,6 +17499,22 @@ var de = {
17484
17499
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17485
17500
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
17486
17501
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17502
+ "editor.record.form.page.accessAndContact": "",
17503
+ "editor.record.form.page.description": "",
17504
+ "editor.record.form.page.ressources": "",
17505
+ "editor.record.form.section.about.description": "",
17506
+ "editor.record.form.section.about.label": "",
17507
+ "editor.record.form.section.annexes.label": "",
17508
+ "editor.record.form.section.associatedResources.description": "",
17509
+ "editor.record.form.section.associatedResources.label": "",
17510
+ "editor.record.form.section.classification.description": "",
17511
+ "editor.record.form.section.classification.label": "",
17512
+ "editor.record.form.section.dataManagers.description": "",
17513
+ "editor.record.form.section.dataManagers.label": "",
17514
+ "editor.record.form.section.dataPointOfContact.description": "",
17515
+ "editor.record.form.section.dataPointOfContact.label": "",
17516
+ "editor.record.form.section.geographicalCoverage.label": "",
17517
+ "editor.record.form.section.useAndAccessConditions.label": "",
17487
17518
  "editor.record.form.metadata.title": "Metadaten-Titel",
17488
17519
  "editor.record.form.record.updated": "Datensatz zuletzt aktualisiert",
17489
17520
  "editor.record.form.resourceUpdated": "Letztes Aktualisierungsdatum",
@@ -17508,6 +17539,7 @@ var de = {
17508
17539
  "editor.record.saveStatus.draftWithChangesPending": "Als Entwurf gespeichert - Änderungen stehen aus",
17509
17540
  "editor.record.saveStatus.recordUpToDate": "Datensatz ist auf dem neuesten Stand",
17510
17541
  "editor.record.upToDate": "Dieser Datensatz ist auf dem neuesten Stand",
17542
+ "editor.sidebar.menu.editor": "",
17511
17543
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
17512
17544
  "facets.block.title.OrgForResource": "Organisation",
17513
17545
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -17585,6 +17617,7 @@ var de = {
17585
17617
  "pagination.pageOf": "von",
17586
17618
  previous: previous$6,
17587
17619
  "record.action.download": "Herunterladen",
17620
+ "record.action.duplicate": "",
17588
17621
  "record.action.view": "Anzeigen",
17589
17622
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
17590
17623
  "record.metadata.about": "Beschreibung",
@@ -17907,6 +17940,18 @@ var en = {
17907
17940
  "downloads.format.unknown": "unknown",
17908
17941
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17909
17942
  dropFile: dropFile$5,
17943
+ "editor.record.form.bottomButtons.comeBackLater": "Come back later",
17944
+ "editor.record.form.bottomButtons.next": "Next",
17945
+ "editor.record.form.bottomButtons.previous": "Previous",
17946
+ "editor.record.form.field.abstract": "Abstract",
17947
+ "editor.record.form.field.keywords": "Keywords",
17948
+ "editor.record.form.field.license": "License",
17949
+ "editor.record.form.field.recordUpdated": "Record Updated",
17950
+ "editor.record.form.field.resourceUpdated": "Resource Updated",
17951
+ "editor.record.form.field.temporalExtents": "Temporal extents",
17952
+ "editor.record.form.field.title": "Metadata title",
17953
+ "editor.record.form.field.uniqueIdentifier": "Unique identifier",
17954
+ "editor.record.form.field.updateFrequency": "Update frequency",
17910
17955
  "editor.record.form.abstract": "Abstract",
17911
17956
  "editor.record.form.keywords": "Keywords",
17912
17957
  "editor.record.form.license": "License",
@@ -17919,6 +17964,22 @@ var en = {
17919
17964
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17920
17965
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
17921
17966
  "editor.record.form.license.unknown": "Unknown or absent",
17967
+ "editor.record.form.page.accessAndContact": "Access and contact",
17968
+ "editor.record.form.page.description": "Resource description",
17969
+ "editor.record.form.page.ressources": "Resources",
17970
+ "editor.record.form.section.about.description": "This section describes the resource.",
17971
+ "editor.record.form.section.about.label": "About the resource",
17972
+ "editor.record.form.section.annexes.label": "Annexes",
17973
+ "editor.record.form.section.associatedResources.description": "Drop files here to associate them with the resource.",
17974
+ "editor.record.form.section.associatedResources.label": "Associated resources",
17975
+ "editor.record.form.section.classification.description": "The classification has an impact on the access to the data.",
17976
+ "editor.record.form.section.classification.label": "Classification",
17977
+ "editor.record.form.section.dataManagers.description": "The data managers are responsible for the data.",
17978
+ "editor.record.form.section.dataManagers.label": "Data managers",
17979
+ "editor.record.form.section.dataPointOfContact.description": "This information concerns the metadata.",
17980
+ "editor.record.form.section.dataPointOfContact.label": "Data point of contact",
17981
+ "editor.record.form.section.geographicalCoverage.label": "Geographical coverage",
17982
+ "editor.record.form.section.useAndAccessConditions.label": "Use and access conditions",
17922
17983
  "editor.record.form.metadata.title": "Metadata title",
17923
17984
  "editor.record.form.record.updated": "Record updated",
17924
17985
  "editor.record.form.resourceUpdated": "Last update date",
@@ -17943,6 +18004,7 @@ var en = {
17943
18004
  "editor.record.saveStatus.draftWithChangesPending": "Saved as draft - changes are pending",
17944
18005
  "editor.record.saveStatus.recordUpToDate": "Record is up to date",
17945
18006
  "editor.record.upToDate": "This record is up to date",
18007
+ "editor.sidebar.menu.editor": "Editor",
17946
18008
  "externalviewer.dataset.unnamed": "Datahub layer",
17947
18009
  "facets.block.title.OrgForResource": "Organisation",
17948
18010
  "facets.block.title.availableInServices": "Available for",
@@ -18020,6 +18082,7 @@ var en = {
18020
18082
  "pagination.pageOf": "of",
18021
18083
  previous: previous$5,
18022
18084
  "record.action.download": "Download",
18085
+ "record.action.duplicate": "Duplicate",
18023
18086
  "record.action.view": "View",
18024
18087
  "record.externalViewer.open": "Open in the external map viewer",
18025
18088
  "record.metadata.about": "Description",
@@ -18342,6 +18405,18 @@ var es = {
18342
18405
  "downloads.format.unknown": "",
18343
18406
  "downloads.wfs.featuretype.not.found": "",
18344
18407
  dropFile: dropFile$4,
18408
+ "editor.record.form.bottomButtons.comeBackLater": "",
18409
+ "editor.record.form.bottomButtons.next": "",
18410
+ "editor.record.form.bottomButtons.previous": "",
18411
+ "editor.record.form.field.abstract": "",
18412
+ "editor.record.form.field.keywords": "",
18413
+ "editor.record.form.field.license": "",
18414
+ "editor.record.form.field.recordUpdated": "",
18415
+ "editor.record.form.field.resourceUpdated": "",
18416
+ "editor.record.form.field.temporalExtents": "",
18417
+ "editor.record.form.field.title": "",
18418
+ "editor.record.form.field.uniqueIdentifier": "",
18419
+ "editor.record.form.field.updateFrequency": "",
18345
18420
  "editor.record.form.abstract": "",
18346
18421
  "editor.record.form.keywords": "",
18347
18422
  "editor.record.form.license": "",
@@ -18354,6 +18429,22 @@ var es = {
18354
18429
  "editor.record.form.license.odc-by": "",
18355
18430
  "editor.record.form.license.pddl": "",
18356
18431
  "editor.record.form.license.unknown": "",
18432
+ "editor.record.form.page.accessAndContact": "",
18433
+ "editor.record.form.page.description": "",
18434
+ "editor.record.form.page.ressources": "",
18435
+ "editor.record.form.section.about.description": "",
18436
+ "editor.record.form.section.about.label": "",
18437
+ "editor.record.form.section.annexes.label": "",
18438
+ "editor.record.form.section.associatedResources.description": "",
18439
+ "editor.record.form.section.associatedResources.label": "",
18440
+ "editor.record.form.section.classification.description": "",
18441
+ "editor.record.form.section.classification.label": "",
18442
+ "editor.record.form.section.dataManagers.description": "",
18443
+ "editor.record.form.section.dataManagers.label": "",
18444
+ "editor.record.form.section.dataPointOfContact.description": "",
18445
+ "editor.record.form.section.dataPointOfContact.label": "",
18446
+ "editor.record.form.section.geographicalCoverage.label": "",
18447
+ "editor.record.form.section.useAndAccessConditions.label": "",
18357
18448
  "editor.record.form.metadata.title": "",
18358
18449
  "editor.record.form.record.updated": "",
18359
18450
  "editor.record.form.resourceUpdated": "",
@@ -18378,6 +18469,7 @@ var es = {
18378
18469
  "editor.record.saveStatus.draftWithChangesPending": "",
18379
18470
  "editor.record.saveStatus.recordUpToDate": "",
18380
18471
  "editor.record.upToDate": "",
18472
+ "editor.sidebar.menu.editor": "",
18381
18473
  "externalviewer.dataset.unnamed": "",
18382
18474
  "facets.block.title.OrgForResource": "",
18383
18475
  "facets.block.title.availableInServices": "",
@@ -18455,6 +18547,7 @@ var es = {
18455
18547
  "pagination.pageOf": "",
18456
18548
  previous: previous$4,
18457
18549
  "record.action.download": "",
18550
+ "record.action.duplicate": "",
18458
18551
  "record.action.view": "",
18459
18552
  "record.externalViewer.open": "",
18460
18553
  "record.metadata.about": "",
@@ -18777,6 +18870,18 @@ var fr = {
18777
18870
  "downloads.format.unknown": "inconnu",
18778
18871
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
18779
18872
  dropFile: dropFile$3,
18873
+ "editor.record.form.bottomButtons.comeBackLater": "Revenir plus tard",
18874
+ "editor.record.form.bottomButtons.next": "Suivant",
18875
+ "editor.record.form.bottomButtons.previous": "Précédent",
18876
+ "editor.record.form.field.abstract": "Résumé",
18877
+ "editor.record.form.field.keywords": "Mots-clés",
18878
+ "editor.record.form.field.license": "Licence",
18879
+ "editor.record.form.field.recordUpdated": "Date de dernière révision",
18880
+ "editor.record.form.field.resourceUpdated": "Date de dernière révision",
18881
+ "editor.record.form.field.temporalExtents": "Étendue temporelle",
18882
+ "editor.record.form.field.title": "Titre",
18883
+ "editor.record.form.field.uniqueIdentifier": "Identifiant unique",
18884
+ "editor.record.form.field.updateFrequency": "Fréquence de mise à jour",
18780
18885
  "editor.record.form.abstract": "",
18781
18886
  "editor.record.form.keywords": "",
18782
18887
  "editor.record.form.license": "Licence",
@@ -18789,6 +18894,22 @@ var fr = {
18789
18894
  "editor.record.form.license.odc-by": "",
18790
18895
  "editor.record.form.license.pddl": "",
18791
18896
  "editor.record.form.license.unknown": "Non-reconnue ou absente",
18897
+ "editor.record.form.page.accessAndContact": "Acces et contact",
18898
+ "editor.record.form.page.description": "Description de la ressource",
18899
+ "editor.record.form.page.ressources": "Ressources",
18900
+ "editor.record.form.section.about.description": "Ces informations concernent la donnée.",
18901
+ "editor.record.form.section.about.label": "A propos de la ressource",
18902
+ "editor.record.form.section.annexes.label": "Annexes",
18903
+ "editor.record.form.section.associatedResources.description": "Déposez les jeux de données associées à cette fiche de métadonnée.",
18904
+ "editor.record.form.section.associatedResources.label": "Ressources associees",
18905
+ "editor.record.form.section.classification.description": "La classification a un impact sur la recherche du jeux de données.",
18906
+ "editor.record.form.section.classification.label": "Classification",
18907
+ "editor.record.form.section.dataManagers.description": "Cette information concerne la donnée.",
18908
+ "editor.record.form.section.dataManagers.label": "Responsables de la donnee",
18909
+ "editor.record.form.section.dataPointOfContact.description": "Cette information concerne la fiche de métadonnée.",
18910
+ "editor.record.form.section.dataPointOfContact.label": "Point de contact de la metadonee",
18911
+ "editor.record.form.section.geographicalCoverage.label": "Couverture geographique",
18912
+ "editor.record.form.section.useAndAccessConditions.label": "Conditions d'acces et usage",
18792
18913
  "editor.record.form.metadata.title": "",
18793
18914
  "editor.record.form.record.updated": "",
18794
18915
  "editor.record.form.resourceUpdated": "Date de dernière révision",
@@ -18813,6 +18934,7 @@ var fr = {
18813
18934
  "editor.record.saveStatus.draftWithChangesPending": "Brouillon enregistré - modifications en cours",
18814
18935
  "editor.record.saveStatus.recordUpToDate": "La fiche publiée est à jour",
18815
18936
  "editor.record.upToDate": "",
18937
+ "editor.sidebar.menu.editor": "",
18816
18938
  "externalviewer.dataset.unnamed": "Couche du datahub",
18817
18939
  "facets.block.title.OrgForResource": "Organisation",
18818
18940
  "facets.block.title.availableInServices": "Disponible pour",
@@ -18890,6 +19012,7 @@ var fr = {
18890
19012
  "pagination.pageOf": "sur",
18891
19013
  previous: previous$3,
18892
19014
  "record.action.download": "Télécharger",
19015
+ "record.action.duplicate": "Dupliquer",
18893
19016
  "record.action.view": "Voir",
18894
19017
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
18895
19018
  "record.metadata.about": "Description",
@@ -19212,6 +19335,18 @@ var it = {
19212
19335
  "downloads.format.unknown": "sconosciuto",
19213
19336
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
19214
19337
  dropFile: dropFile$2,
19338
+ "editor.record.form.bottomButtons.comeBackLater": "",
19339
+ "editor.record.form.bottomButtons.next": "",
19340
+ "editor.record.form.bottomButtons.previous": "",
19341
+ "editor.record.form.field.abstract": "",
19342
+ "editor.record.form.field.keywords": "",
19343
+ "editor.record.form.field.license": "Licenza",
19344
+ "editor.record.form.field.recordUpdated": "",
19345
+ "editor.record.form.field.resourceUpdated": "",
19346
+ "editor.record.form.field.temporalExtents": "",
19347
+ "editor.record.form.field.title": "",
19348
+ "editor.record.form.field.uniqueIdentifier": "",
19349
+ "editor.record.form.field.updateFrequency": "",
19215
19350
  "editor.record.form.abstract": "",
19216
19351
  "editor.record.form.keywords": "",
19217
19352
  "editor.record.form.license": "Licenza",
@@ -19224,6 +19359,22 @@ var it = {
19224
19359
  "editor.record.form.license.odc-by": "",
19225
19360
  "editor.record.form.license.pddl": "",
19226
19361
  "editor.record.form.license.unknown": "Non riconosciuta o assente",
19362
+ "editor.record.form.page.accessAndContact": "",
19363
+ "editor.record.form.page.description": "",
19364
+ "editor.record.form.page.ressources": "",
19365
+ "editor.record.form.section.about.description": "",
19366
+ "editor.record.form.section.about.label": "",
19367
+ "editor.record.form.section.annexes.label": "",
19368
+ "editor.record.form.section.associatedResources.description": "",
19369
+ "editor.record.form.section.associatedResources.label": "",
19370
+ "editor.record.form.section.classification.description": "",
19371
+ "editor.record.form.section.classification.label": "",
19372
+ "editor.record.form.section.dataManagers.description": "",
19373
+ "editor.record.form.section.dataManagers.label": "",
19374
+ "editor.record.form.section.dataPointOfContact.description": "",
19375
+ "editor.record.form.section.dataPointOfContact.label": "",
19376
+ "editor.record.form.section.geographicalCoverage.label": "",
19377
+ "editor.record.form.section.useAndAccessConditions.label": "",
19227
19378
  "editor.record.form.metadata.title": "",
19228
19379
  "editor.record.form.record.updated": "",
19229
19380
  "editor.record.form.resourceUpdated": "",
@@ -19248,6 +19399,7 @@ var it = {
19248
19399
  "editor.record.saveStatus.draftWithChangesPending": "",
19249
19400
  "editor.record.saveStatus.recordUpToDate": "",
19250
19401
  "editor.record.upToDate": "",
19402
+ "editor.sidebar.menu.editor": "",
19251
19403
  "externalviewer.dataset.unnamed": "Layer del datahub",
19252
19404
  "facets.block.title.OrgForResource": "Organizzazione",
19253
19405
  "facets.block.title.availableInServices": "Disponibile per",
@@ -19325,6 +19477,7 @@ var it = {
19325
19477
  "pagination.pageOf": "di",
19326
19478
  previous: previous$2,
19327
19479
  "record.action.download": "Scarica",
19480
+ "record.action.duplicate": "",
19328
19481
  "record.action.view": "Visualizza",
19329
19482
  "record.externalViewer.open": "Apri nell'visualizzatore esterno",
19330
19483
  "record.metadata.about": "Descrizione",
@@ -19647,6 +19800,18 @@ var nl = {
19647
19800
  "downloads.format.unknown": "",
19648
19801
  "downloads.wfs.featuretype.not.found": "",
19649
19802
  dropFile: dropFile$1,
19803
+ "editor.record.form.bottomButtons.comeBackLater": "",
19804
+ "editor.record.form.bottomButtons.next": "",
19805
+ "editor.record.form.bottomButtons.previous": "",
19806
+ "editor.record.form.field.abstract": "",
19807
+ "editor.record.form.field.keywords": "",
19808
+ "editor.record.form.field.license": "",
19809
+ "editor.record.form.field.recordUpdated": "",
19810
+ "editor.record.form.field.resourceUpdated": "",
19811
+ "editor.record.form.field.temporalExtents": "",
19812
+ "editor.record.form.field.title": "",
19813
+ "editor.record.form.field.uniqueIdentifier": "",
19814
+ "editor.record.form.field.updateFrequency": "",
19650
19815
  "editor.record.form.abstract": "",
19651
19816
  "editor.record.form.keywords": "",
19652
19817
  "editor.record.form.license": "",
@@ -19659,6 +19824,22 @@ var nl = {
19659
19824
  "editor.record.form.license.odc-by": "",
19660
19825
  "editor.record.form.license.pddl": "",
19661
19826
  "editor.record.form.license.unknown": "",
19827
+ "editor.record.form.page.accessAndContact": "",
19828
+ "editor.record.form.page.description": "",
19829
+ "editor.record.form.page.ressources": "",
19830
+ "editor.record.form.section.about.description": "",
19831
+ "editor.record.form.section.about.label": "",
19832
+ "editor.record.form.section.annexes.label": "",
19833
+ "editor.record.form.section.associatedResources.description": "",
19834
+ "editor.record.form.section.associatedResources.label": "",
19835
+ "editor.record.form.section.classification.description": "",
19836
+ "editor.record.form.section.classification.label": "",
19837
+ "editor.record.form.section.dataManagers.description": "",
19838
+ "editor.record.form.section.dataManagers.label": "",
19839
+ "editor.record.form.section.dataPointOfContact.description": "",
19840
+ "editor.record.form.section.dataPointOfContact.label": "",
19841
+ "editor.record.form.section.geographicalCoverage.label": "",
19842
+ "editor.record.form.section.useAndAccessConditions.label": "",
19662
19843
  "editor.record.form.metadata.title": "",
19663
19844
  "editor.record.form.record.updated": "",
19664
19845
  "editor.record.form.resourceUpdated": "",
@@ -19683,6 +19864,7 @@ var nl = {
19683
19864
  "editor.record.saveStatus.draftWithChangesPending": "",
19684
19865
  "editor.record.saveStatus.recordUpToDate": "",
19685
19866
  "editor.record.upToDate": "",
19867
+ "editor.sidebar.menu.editor": "",
19686
19868
  "externalviewer.dataset.unnamed": "",
19687
19869
  "facets.block.title.OrgForResource": "",
19688
19870
  "facets.block.title.availableInServices": "",
@@ -19760,6 +19942,7 @@ var nl = {
19760
19942
  "pagination.pageOf": "",
19761
19943
  previous: previous$1,
19762
19944
  "record.action.download": "",
19945
+ "record.action.duplicate": "",
19763
19946
  "record.action.view": "",
19764
19947
  "record.externalViewer.open": "",
19765
19948
  "record.metadata.about": "",
@@ -20082,6 +20265,18 @@ var pt = {
20082
20265
  "downloads.format.unknown": "",
20083
20266
  "downloads.wfs.featuretype.not.found": "",
20084
20267
  dropFile: dropFile,
20268
+ "editor.record.form.bottomButtons.comeBackLater": "",
20269
+ "editor.record.form.bottomButtons.next": "",
20270
+ "editor.record.form.bottomButtons.previous": "",
20271
+ "editor.record.form.field.abstract": "",
20272
+ "editor.record.form.field.keywords": "",
20273
+ "editor.record.form.field.license": "",
20274
+ "editor.record.form.field.recordUpdated": "",
20275
+ "editor.record.form.field.resourceUpdated": "",
20276
+ "editor.record.form.field.temporalExtents": "",
20277
+ "editor.record.form.field.title": "",
20278
+ "editor.record.form.field.uniqueIdentifier": "",
20279
+ "editor.record.form.field.updateFrequency": "",
20085
20280
  "editor.record.form.abstract": "",
20086
20281
  "editor.record.form.keywords": "",
20087
20282
  "editor.record.form.license": "",
@@ -20094,6 +20289,22 @@ var pt = {
20094
20289
  "editor.record.form.license.odc-by": "",
20095
20290
  "editor.record.form.license.pddl": "",
20096
20291
  "editor.record.form.license.unknown": "",
20292
+ "editor.record.form.page.accessAndContact": "",
20293
+ "editor.record.form.page.description": "",
20294
+ "editor.record.form.page.ressources": "",
20295
+ "editor.record.form.section.about.description": "",
20296
+ "editor.record.form.section.about.label": "",
20297
+ "editor.record.form.section.annexes.label": "",
20298
+ "editor.record.form.section.associatedResources.description": "",
20299
+ "editor.record.form.section.associatedResources.label": "",
20300
+ "editor.record.form.section.classification.description": "",
20301
+ "editor.record.form.section.classification.label": "",
20302
+ "editor.record.form.section.dataManagers.description": "",
20303
+ "editor.record.form.section.dataManagers.label": "",
20304
+ "editor.record.form.section.dataPointOfContact.description": "",
20305
+ "editor.record.form.section.dataPointOfContact.label": "",
20306
+ "editor.record.form.section.geographicalCoverage.label": "",
20307
+ "editor.record.form.section.useAndAccessConditions.label": "",
20097
20308
  "editor.record.form.metadata.title": "",
20098
20309
  "editor.record.form.record.updated": "",
20099
20310
  "editor.record.form.resourceUpdated": "",
@@ -20118,6 +20329,7 @@ var pt = {
20118
20329
  "editor.record.saveStatus.draftWithChangesPending": "",
20119
20330
  "editor.record.saveStatus.recordUpToDate": "",
20120
20331
  "editor.record.upToDate": "",
20332
+ "editor.sidebar.menu.editor": "",
20121
20333
  "externalviewer.dataset.unnamed": "",
20122
20334
  "facets.block.title.OrgForResource": "",
20123
20335
  "facets.block.title.availableInServices": "",
@@ -20195,6 +20407,7 @@ var pt = {
20195
20407
  "pagination.pageOf": "",
20196
20408
  previous: previous,
20197
20409
  "record.action.download": "",
20410
+ "record.action.duplicate": "",
20198
20411
  "record.action.view": "",
20199
20412
  "record.externalViewer.open": "",
20200
20413
  "record.metadata.about": "",
@@ -21327,6 +21540,17 @@ class Gn4Repository {
21327
21540
  .then((record) => [record, xml, isSavedAlready]);
21328
21541
  }));
21329
21542
  }
21543
+ openRecordForDuplication(uniqueIdentifier) {
21544
+ return this.loadRecordAsXml(uniqueIdentifier).pipe(switchMap(async (recordAsXml) => {
21545
+ const converter = findConverterForDocument(recordAsXml);
21546
+ const record = await converter.readRecord(recordAsXml);
21547
+ record.uniqueIdentifier = `TEMP-ID-${Date.now()}`;
21548
+ record.title = `${record.title} (Copy)`;
21549
+ const xml = await converter.writeRecord(record, recordAsXml);
21550
+ window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), xml);
21551
+ return [record, xml, false];
21552
+ }));
21553
+ }
21330
21554
  serializeRecordToXml(record, referenceRecordSource) {
21331
21555
  // if there's a reference record, use that standard; otherwise, use iso19139
21332
21556
  const converter = referenceRecordSource
@@ -28316,11 +28540,11 @@ class UserPreviewComponent {
28316
28540
  return (this.user.name + ' ' + this.user.surname).trim();
28317
28541
  }
28318
28542
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28319
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UserPreviewComponent, selector: "gn-ui-user-preview", inputs: { user: "user", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<figure class=\"text-center\">\n <div\n class=\"w-12 h-12 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n", dependencies: [{ kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28543
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UserPreviewComponent, selector: "gn-ui-user-preview", inputs: { user: "user", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<figure class=\"text-center\">\n <div\n class=\"w-10 h-10 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n", dependencies: [{ kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28320
28544
  }
28321
28545
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, decorators: [{
28322
28546
  type: Component,
28323
- args: [{ selector: 'gn-ui-user-preview', changeDetection: ChangeDetectionStrategy.OnPush, template: "<figure class=\"text-center\">\n <div\n class=\"w-12 h-12 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n" }]
28547
+ args: [{ selector: 'gn-ui-user-preview', changeDetection: ChangeDetectionStrategy.OnPush, template: "<figure class=\"text-center\">\n <div\n class=\"w-10 h-10 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n" }]
28324
28548
  }], propDecorators: { user: [{
28325
28549
  type: Input
28326
28550
  }], avatarPlaceholder: [{
@@ -28669,6 +28893,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28669
28893
  }]
28670
28894
  }] });
28671
28895
 
28896
+ class ActionMenuComponent {
28897
+ constructor() {
28898
+ this.duplicate = new EventEmitter();
28899
+ }
28900
+ openMenu() {
28901
+ this.trigger.openMenu();
28902
+ }
28903
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ActionMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28904
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ActionMenuComponent, isStandalone: true, selector: "gn-ui-action-menu", outputs: { duplicate: "duplicate" }, viewQueries: [{ propertyName: "trigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n [matMenuTriggerFor]=\"menu\"\n (buttonClick)=\"openMenu()\"\n data-test=\"record-menu-button\"\n>\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n</gn-ui-button>\n<mat-menu #menu=\"matMenu\">\n <button\n mat-menu-item\n (click)=\"duplicate.emit()\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span translate>record.action.duplicate</span>\n </button>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2$5.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i2$5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2$5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
28905
+ }
28906
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ActionMenuComponent, decorators: [{
28907
+ type: Component,
28908
+ args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [MatIconModule, ButtonComponent, MatMenuModule, TranslateModule], template: "<gn-ui-button\n type=\"outline\"\n [matMenuTriggerFor]=\"menu\"\n (buttonClick)=\"openMenu()\"\n data-test=\"record-menu-button\"\n>\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n</gn-ui-button>\n<mat-menu #menu=\"matMenu\">\n <button\n mat-menu-item\n (click)=\"duplicate.emit()\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span translate>record.action.duplicate</span>\n </button>\n</mat-menu>\n" }]
28909
+ }], propDecorators: { duplicate: [{
28910
+ type: Output
28911
+ }], trigger: [{
28912
+ type: ViewChild,
28913
+ args: [MatMenuTrigger]
28914
+ }] } });
28915
+
28672
28916
  class ResultsTableComponent {
28673
28917
  constructor() {
28674
28918
  this.records = [];
@@ -28678,6 +28922,7 @@ class ResultsTableComponent {
28678
28922
  // emits the column (field) as well as the order
28679
28923
  this.sortByChange = new EventEmitter();
28680
28924
  this.recordClick = new EventEmitter();
28925
+ this.duplicateRecord = new EventEmitter();
28681
28926
  this.recordsSelectedChange = new EventEmitter();
28682
28927
  }
28683
28928
  dateToString(date) {
@@ -28712,6 +28957,9 @@ class ResultsTableComponent {
28712
28957
  handleRecordClick(item) {
28713
28958
  this.recordClick.emit(item);
28714
28959
  }
28960
+ handleDuplicate(item) {
28961
+ this.duplicateRecord.emit(item);
28962
+ }
28715
28963
  setSortBy(col, order) {
28716
28964
  this.sortByChange.emit([col, order]);
28717
28965
  }
@@ -28747,7 +28995,7 @@ class ResultsTableComponent {
28747
28995
  return !allSelected && someSelected;
28748
28996
  }
28749
28997
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28750
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", recordHasDraft: "recordHasDraft" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", recordsSelectedChange: "recordsSelectedChange" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
28998
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", recordHasDraft: "recordHasDraft" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", recordsSelectedChange: "recordsSelectedChange" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-action-menu (duplicate)=\"handleDuplicate(item)\">\n </gn-ui-action-menu>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", outputs: ["duplicate"] }] }); }
28751
28999
  }
28752
29000
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, decorators: [{
28753
29001
  type: Component,
@@ -28759,7 +29007,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28759
29007
  MatIconModule,
28760
29008
  TranslateModule,
28761
29009
  BadgeComponent,
28762
- ], template: "<gn-ui-interactive-table\n [items]=\"records\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
29010
+ ActionMenuComponent,
29011
+ ], template: "<gn-ui-interactive-table\n [items]=\"records\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full\">\n <span class=\"overflow-hidden text-ellipsis\">{{ item.title }}</span>\n <gn-ui-badge\n *ngIf=\"recordHasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.4em 0.6em'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-action-menu (duplicate)=\"handleDuplicate(item)\">\n </gn-ui-action-menu>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
28763
29012
  }], propDecorators: { records: [{
28764
29013
  type: Input
28765
29014
  }], selectedRecordsIdentifiers: [{
@@ -28772,6 +29021,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28772
29021
  type: Output
28773
29022
  }], recordClick: [{
28774
29023
  type: Output
29024
+ }], duplicateRecord: [{
29025
+ type: Output
28775
29026
  }], recordsSelectedChange: [{
28776
29027
  type: Output
28777
29028
  }] } });
@@ -30753,6 +31004,7 @@ class ResultsTableContainerComponent {
30753
31004
  this.selectionService = selectionService;
30754
31005
  this.recordsRepository = recordsRepository;
30755
31006
  this.recordClick = new EventEmitter();
31007
+ this.duplicateRecord = new EventEmitter();
30756
31008
  this.records$ = this.searchFacade.results$;
30757
31009
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
30758
31010
  this.sortBy$ = this.searchFacade.sortBy$;
@@ -30761,6 +31013,9 @@ class ResultsTableContainerComponent {
30761
31013
  handleRecordClick(item) {
30762
31014
  this.recordClick.emit(item);
30763
31015
  }
31016
+ handleDuplicateRecord(item) {
31017
+ this.duplicateRecord.emit(item);
31018
+ }
30764
31019
  handleSortByChange(col, order) {
30765
31020
  this.searchService.setSortBy([order, col]);
30766
31021
  }
@@ -30773,13 +31028,15 @@ class ResultsTableContainerComponent {
30773
31028
  }
30774
31029
  }
30775
31030
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableContainerComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: SelectionService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
30776
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableContainerComponent, isStandalone: true, selector: "gn-ui-results-table-container", outputs: { recordClick: "recordClick" }, ngImport: i0, template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: ResultsTableComponent, selector: "gn-ui-results-table", inputs: ["records", "selectedRecordsIdentifiers", "sortOrder", "recordHasDraft"], outputs: ["sortByChange", "recordClick", "recordsSelectedChange"] }] }); }
31031
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResultsTableContainerComponent, isStandalone: true, selector: "gn-ui-results-table-container", outputs: { recordClick: "recordClick", duplicateRecord: "duplicateRecord" }, ngImport: i0, template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: ResultsTableComponent, selector: "gn-ui-results-table", inputs: ["records", "selectedRecordsIdentifiers", "sortOrder", "recordHasDraft"], outputs: ["sortByChange", "recordClick", "duplicateRecord", "recordsSelectedChange"] }] }); }
30777
31032
  }
30778
31033
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
30779
31034
  type: Component,
30780
- args: [{ selector: 'gn-ui-results-table-container', standalone: true, imports: [CommonModule, ResultsTableComponent], template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n" }]
31035
+ args: [{ selector: 'gn-ui-results-table-container', standalone: true, imports: [CommonModule, ResultsTableComponent], template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [recordHasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n" }]
30781
31036
  }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }]; }, propDecorators: { recordClick: [{
30782
31037
  type: Output
31038
+ }], duplicateRecord: [{
31039
+ type: Output
30783
31040
  }] } });
30784
31041
 
30785
31042
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
@@ -31079,7 +31336,7 @@ class LayersPanelComponent {
31079
31336
  this.mapFacade.addLayer(layer);
31080
31337
  }
31081
31338
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
31082
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LayersPanelComponent, selector: "gn-ui-layers-panel", ngImport: i0, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.ogc.api' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-ogc-api\n [ogcUrl]=\"ogcUrl\"\n (layerAdded)=\"addLayer($event)\"\n ></gn-ui-add-layer-from-ogc-api>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>\n </div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ExpandablePanelButtonComponent, selector: "gn-ui-expandable-panel-button", inputs: ["titleTemplate", "collapsed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: AddLayerFromOgcApiComponent, selector: "gn-ui-add-layer-from-ogc-api", inputs: ["ogcUrl"], outputs: ["layerAdded"] }, { kind: "component", type: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { kind: "component", type: AddLayerFromFileComponent, selector: "gn-ui-add-layer-from-file" }, { kind: "component", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31339
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LayersPanelComponent, selector: "gn-ui-layers-panel", ngImport: i0, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.ogc.api' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-ogc-api\n [ogcUrl]=\"ogcUrl\"\n (layerAdded)=\"addLayer($event)\"\n ></gn-ui-add-layer-from-ogc-api>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>\n </div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ExpandablePanelButtonComponent, selector: "gn-ui-expandable-panel-button", inputs: ["titleTemplate", "collapsed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$6.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: AddLayerFromOgcApiComponent, selector: "gn-ui-add-layer-from-ogc-api", inputs: ["ogcUrl"], outputs: ["layerAdded"] }, { kind: "component", type: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { kind: "component", type: AddLayerFromFileComponent, selector: "gn-ui-add-layer-from-file" }, { kind: "component", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31083
31340
  }
31084
31341
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LayersPanelComponent, decorators: [{
31085
31342
  type: Component,
@@ -31821,7 +32078,7 @@ class TableComponent {
31821
32078
  return rowIdPrefix + id;
31822
32079
  }
31823
32080
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
31824
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "gn-ui-table", inputs: { data: "data", activeId: "activeId" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"border border-gray-300 rounded-lg overflow-hidden bg-white h-full\">\n <cdk-virtual-scroll-viewport\n tvsItemSize=\"48\"\n headerHeight=\"56\"\n style=\"height: calc(100% - 37px)\"\n >\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8\" matSort>\n <ng-container *ngFor=\"let prop of properties\" [matColumnDef]=\"prop\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ prop }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[prop] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"row.id === activeId\"\n ></tr>\n </table>\n </cdk-virtual-scroll-viewport>\n <div class=\"text-gray-900 border-t border-gray-300 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n</div>\n", styles: ["table{width:100%;background:white}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:whitesmoke}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$2.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32081
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "gn-ui-table", inputs: { data: "data", activeId: "activeId" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"border border-gray-300 rounded-lg overflow-hidden bg-white h-full\">\n <cdk-virtual-scroll-viewport\n tvsItemSize=\"48\"\n headerHeight=\"56\"\n style=\"height: calc(100% - 37px)\"\n >\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8\" matSort>\n <ng-container *ngFor=\"let prop of properties\" [matColumnDef]=\"prop\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ prop }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[prop] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"row.id === activeId\"\n ></tr>\n </table>\n </cdk-virtual-scroll-viewport>\n <div class=\"text-gray-900 border-t border-gray-300 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n</div>\n", styles: ["table{width:100%;background:white}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:whitesmoke}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$2.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31825
32082
  }
31826
32083
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, decorators: [{
31827
32084
  type: Component,
@@ -33967,37 +34224,54 @@ const GN_UI_VERSION = new InjectionToken('gnUiVersion');
33967
34224
 
33968
34225
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
33969
34226
  class DataViewPermalinkComponent {
34227
+ set viewType(value) {
34228
+ this.viewType$.next(value);
34229
+ }
33970
34230
  constructor(config, wcEmbedderBaseUrl, version, facade) {
33971
34231
  this.config = config;
33972
34232
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
33973
34233
  this.version = version;
33974
34234
  this.facade = facade;
34235
+ this.viewType$ = new BehaviorSubject('map');
33975
34236
  this.permalinkUrl$ = combineLatest([
34237
+ this.viewType$,
33976
34238
  this.facade.chartConfig$,
33977
34239
  this.facade.metadata$,
33978
- ]).pipe(map$2(([config, metadata]) => {
33979
- if (config) {
33980
- const { aggregation, xProperty, yProperty, chartType } = config;
33981
- const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
33982
- url.searchParams.set('v', `${this.version}`);
33983
- url.searchParams.append('e', `gn-dataset-view-chart`);
33984
- url.searchParams.append('a', `api-url=${this.config.basePath}`);
33985
- url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
33986
- url.searchParams.append('a', `primary-color=#0f4395`);
33987
- url.searchParams.append('a', `secondary-color=#8bc832`);
33988
- url.searchParams.append('a', `main-color=#555`);
33989
- url.searchParams.append('a', `background-color=#fdfbff`);
33990
- url.searchParams.append('a', `aggregation=${aggregation}`);
33991
- url.searchParams.append('a', `x-property=${xProperty}`);
33992
- url.searchParams.append('a', `y-property=${yProperty}`);
33993
- url.searchParams.append('a', `chart-type=${chartType}`);
33994
- return url.toString();
34240
+ ]).pipe(map$2(([viewType, config, metadata]) => {
34241
+ const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
34242
+ url.searchParams.set('v', `${this.version}`);
34243
+ if (viewType === 'chart') {
34244
+ if (config) {
34245
+ const { aggregation, xProperty, yProperty, chartType } = config;
34246
+ url.searchParams.append('e', `gn-dataset-view-chart`);
34247
+ url.searchParams.append('a', `aggregation=${aggregation}`);
34248
+ url.searchParams.append('a', `x-property=${xProperty}`);
34249
+ url.searchParams.append('a', `y-property=${yProperty}`);
34250
+ url.searchParams.append('a', `chart-type=${chartType}`);
34251
+ }
34252
+ else {
34253
+ return '';
34254
+ }
33995
34255
  }
33996
- return '';
34256
+ else if (viewType === 'table') {
34257
+ // table
34258
+ url.searchParams.append('e', `gn-dataset-view-table`);
34259
+ }
34260
+ else {
34261
+ // map
34262
+ url.searchParams.append('e', `gn-dataset-view-map`);
34263
+ }
34264
+ url.searchParams.append('a', `api-url=${this.config.basePath}`);
34265
+ url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
34266
+ url.searchParams.append('a', `primary-color=#0f4395`);
34267
+ url.searchParams.append('a', `secondary-color=#8bc832`);
34268
+ url.searchParams.append('a', `main-color=#555`);
34269
+ url.searchParams.append('a', `background-color=#fdfbff`);
34270
+ return url.toString();
33997
34271
  }));
33998
34272
  }
33999
34273
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewPermalinkComponent, deps: [{ token: Configuration }, { token: WEB_COMPONENT_EMBEDDER_URL, optional: true }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
34000
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink", ngImport: i0, template: "<gn-ui-copy-text-button\n *ngIf=\"wcEmbedderBaseUrl\"\n [text]=\"permalinkUrl$ | async\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34274
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n *ngIf=\"wcEmbedderBaseUrl\"\n [text]=\"permalinkUrl$ | async\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34001
34275
  }
34002
34276
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
34003
34277
  type: Component,
@@ -34013,37 +34287,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34013
34287
  }] }, { type: undefined, decorators: [{
34014
34288
  type: Inject,
34015
34289
  args: [GN_UI_VERSION]
34016
- }] }, { type: MdViewFacade }]; } });
34290
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34291
+ type: Input
34292
+ }] } });
34017
34293
 
34018
34294
  class DataViewWebComponentComponent {
34295
+ set viewType(value) {
34296
+ this.viewType$.next(value);
34297
+ }
34019
34298
  constructor(config, version, facade) {
34020
34299
  this.config = config;
34021
34300
  this.version = version;
34022
34301
  this.facade = facade;
34023
- this.webComponentHtml$ = combineLatest(this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([config, metadata]) => {
34024
- if (config) {
34025
- const { aggregation, xProperty, yProperty, chartType } = config;
34302
+ this.viewType$ = new BehaviorSubject('map');
34303
+ this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
34304
+ if (viewType === 'chart') {
34305
+ if (config) {
34306
+ const { aggregation, xProperty, yProperty, chartType } = config;
34307
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34308
+ <gn-dataset-view-chart
34309
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34310
+ dataset-id="${metadata.uniqueIdentifier}"
34311
+ aggregation="${aggregation}"
34312
+ x-property="${xProperty}"
34313
+ y-property="${yProperty}"
34314
+ chart-type="${chartType}"
34315
+ primary-color="#0f4395"
34316
+ secondary-color="#8bc832"
34317
+ main-color="#555"
34318
+ background-color="#fdfbff"
34319
+ main-font="'Inter', sans-serif"
34320
+ title-font="'DM Serif Display', serif"
34321
+ ></gn-dataset-view-chart>`;
34322
+ }
34323
+ return '';
34324
+ }
34325
+ else if (viewType === 'table') {
34026
34326
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34027
- <gn-dataset-view-chart
34327
+ <gn-dataset-view-table
34328
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34329
+ dataset-id="${metadata.uniqueIdentifier}"
34330
+ primary-color="#0f4395"
34331
+ secondary-color="#8bc832"
34332
+ main-color="#555"
34333
+ background-color="#fdfbff"
34334
+ main-font="'Inter', sans-serif"
34335
+ title-font="'DM Serif Display', serif"
34336
+ ></gn-dataset-view-table>`;
34337
+ }
34338
+ else {
34339
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34340
+ <gn-dataset-view-map
34028
34341
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34029
34342
  dataset-id="${metadata.uniqueIdentifier}"
34030
- aggregation="${aggregation}"
34031
- x-property="${xProperty}"
34032
- y-property="${yProperty}"
34033
- chart-type="${chartType}"
34034
34343
  primary-color="#0f4395"
34035
34344
  secondary-color="#8bc832"
34036
34345
  main-color="#555"
34037
34346
  background-color="#fdfbff"
34038
34347
  main-font="'Inter', sans-serif"
34039
34348
  title-font="'DM Serif Display', serif"
34040
- ></gn-dataset-view-chart>`;
34349
+ ></gn-dataset-view-map>`;
34041
34350
  }
34042
- return '';
34043
34351
  }));
34044
34352
  }
34045
34353
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewWebComponentComponent, deps: [{ token: Configuration }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
34046
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component", ngImport: i0, template: "<gn-ui-copy-text-button\n [text]=\"webComponentHtml$ | async\"\n [rows]=\"3\"\n [tooltipText]=\"'tooltip.html.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34354
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n [text]=\"webComponentHtml$ | async\"\n [rows]=\"3\"\n [tooltipText]=\"'tooltip.html.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34047
34355
  }
34048
34356
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
34049
34357
  type: Component,
@@ -34054,24 +34362,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34054
34362
  }] }, { type: undefined, decorators: [{
34055
34363
  type: Inject,
34056
34364
  args: [GN_UI_VERSION]
34057
- }] }, { type: MdViewFacade }]; } });
34365
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34366
+ type: Input
34367
+ }] } });
34058
34368
 
34059
34369
  class DataViewShareComponent {
34370
+ set viewType(value) {
34371
+ this._viewType = value;
34372
+ }
34373
+ get viewType() {
34374
+ return this._viewType;
34375
+ }
34060
34376
  constructor(wcEmbedderBaseUrl) {
34061
34377
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
34062
34378
  }
34063
34379
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewShareComponent, deps: [{ token: WEB_COMPONENT_EMBEDDER_URL, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
34064
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewShareComponent, selector: "gn-ui-data-view-share", ngImport: i0, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$5.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2$5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink" }, { kind: "component", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34380
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataViewShareComponent, selector: "gn-ui-data-view-share", inputs: { viewType: "viewType" }, ngImport: i0, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink\n [viewType]=\"viewType\"\n ></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component\n [viewType]=\"viewType\"\n ></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$6.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2$6.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink", inputs: ["viewType"] }, { kind: "component", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component", inputs: ["viewType"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34065
34381
  }
34066
34382
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewShareComponent, decorators: [{
34067
34383
  type: Component,
34068
- args: [{ selector: 'gn-ui-data-view-share', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"] }]
34384
+ args: [{ selector: 'gn-ui-data-view-share', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink\n [viewType]=\"viewType\"\n ></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component\n [viewType]=\"viewType\"\n ></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"] }]
34069
34385
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
34070
34386
  type: Optional
34071
34387
  }, {
34072
34388
  type: Inject,
34073
34389
  args: [WEB_COMPONENT_EMBEDDER_URL]
34074
- }] }]; } });
34390
+ }] }]; }, propDecorators: { viewType: [{
34391
+ type: Input
34392
+ }] } });
34075
34393
 
34076
34394
  class FeatureRecordModule {
34077
34395
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureRecordModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -34161,75 +34479,159 @@ const saveRecord = createAction('[Editor] Save record');
34161
34479
  const saveRecordSuccess = createAction('[Editor] Save record success');
34162
34480
  const saveRecordFailure = createAction('[Editor] Save record failure', props());
34163
34481
  const draftSaveSuccess = createAction('[Editor] Draft save success');
34482
+ const setCurrentPage = createAction('[Editor] Set current page', props());
34164
34483
 
34165
- const DEFAULT_FIELDS = [
34166
- {
34167
- model: 'title',
34168
- formFieldConfig: {
34169
- labelKey: marker('editor.record.form.metadata.title'),
34170
- type: 'text',
34171
- },
34484
+ /**
34485
+ * This file contains the configuration of the fields that will be displayed in the editor.
34486
+ * To add a new field, you need to create a new EditorField object in the fields part of this file.
34487
+ * Then add it to the corresponding section in the sections part of this file.
34488
+ * Finally, add the section to the corresponding page in the pages part of this file.
34489
+ */
34490
+ /************************************************************
34491
+ *************** FIELDS *****************
34492
+ ************************************************************
34493
+ */
34494
+ const RECORD_LICENSE_FIELD = {
34495
+ model: 'licenses',
34496
+ formFieldConfig: {
34497
+ labelKey: marker('editor.record.form.field.license'),
34172
34498
  },
34173
- {
34174
- model: 'abstract',
34175
- formFieldConfig: {
34176
- labelKey: marker('editor.record.form.abstract'),
34177
- type: 'rich',
34178
- },
34499
+ };
34500
+ const RECORD_KEYWORDS_FIELD = {
34501
+ model: 'keywords',
34502
+ formFieldConfig: {
34503
+ labelKey: marker('editor.record.form.field.keywords'),
34179
34504
  },
34180
- {
34181
- model: 'uniqueIdentifier',
34182
- formFieldConfig: {
34183
- labelKey: marker('editor.record.form.unique.identifier'),
34184
- type: 'text',
34185
- locked: true,
34186
- },
34505
+ };
34506
+ const RECORD_UNIQUE_IDENTIFIER_FIELD = {
34507
+ model: 'uniqueIdentifier',
34508
+ formFieldConfig: {
34509
+ labelKey: marker('editor.record.form.field.uniqueIdentifier'),
34510
+ locked: true,
34187
34511
  },
34188
- {
34189
- model: 'recordUpdated',
34190
- formFieldConfig: {
34191
- labelKey: marker('editor.record.form.record.updated'),
34192
- type: 'text',
34193
- locked: true,
34194
- },
34195
- onSaveProcess: '${dateNow()}',
34512
+ };
34513
+ const RECORD_RESOURCE_UPDATED_FIELD = {
34514
+ model: 'resourceUpdated',
34515
+ formFieldConfig: {
34516
+ labelKey: marker('editor.record.form.field.resourceUpdated'),
34196
34517
  },
34197
- {
34198
- model: 'licenses',
34199
- formFieldConfig: {
34200
- labelKey: marker('editor.record.form.license'),
34201
- type: 'list',
34202
- },
34518
+ };
34519
+ const RECORD_UPDATED_FIELD = {
34520
+ model: 'recordUpdated',
34521
+ formFieldConfig: {
34522
+ labelKey: marker('editor.record.form.field.recordUpdated'),
34523
+ locked: true,
34203
34524
  },
34204
- {
34205
- model: 'resourceUpdated',
34206
- formFieldConfig: {
34207
- labelKey: marker('editor.record.form.resourceUpdated'),
34208
- type: 'date',
34209
- },
34525
+ onSaveProcess: '${dateNow()}',
34526
+ };
34527
+ const RECORD_UPDATE_FREQUENCY_FIELD = {
34528
+ model: 'updateFrequency',
34529
+ formFieldConfig: {
34530
+ labelKey: marker('editor.record.form.field.updateFrequency'),
34210
34531
  },
34211
- {
34212
- model: 'updateFrequency',
34213
- formFieldConfig: {
34214
- labelKey: marker('editor.record.form.updateFrequency'),
34215
- type: 'text',
34216
- },
34532
+ };
34533
+ const RECORD_TEMPORAL_EXTENTS_FIELD = {
34534
+ model: 'temporalExtents',
34535
+ formFieldConfig: {
34536
+ labelKey: marker('editor.record.form.field.temporalExtents'),
34217
34537
  },
34218
- {
34219
- model: 'temporalExtents',
34220
- formFieldConfig: {
34221
- labelKey: marker('editor.record.form.temporalExtents'),
34222
- type: 'list',
34223
- },
34538
+ };
34539
+ const RECORD_TITLE_FIELD = {
34540
+ model: 'title',
34541
+ formFieldConfig: {
34542
+ labelKey: marker('editor.record.form.field.title'),
34224
34543
  },
34225
- {
34226
- model: 'keywords',
34227
- formFieldConfig: {
34228
- labelKey: marker('editor.record.form.keywords'),
34229
- type: 'list',
34230
- },
34544
+ };
34545
+ const RECORD_ABSTRACT_FIELD = {
34546
+ model: 'abstract',
34547
+ formFieldConfig: {
34548
+ labelKey: marker('editor.record.form.field.abstract'),
34231
34549
  },
34232
- ];
34550
+ };
34551
+ /************************************************************
34552
+ *************** SECTIONS *****************
34553
+ ************************************************************
34554
+ */
34555
+ const TITLE_SECTION = {
34556
+ hidden: false,
34557
+ fields: [RECORD_TITLE_FIELD, RECORD_ABSTRACT_FIELD],
34558
+ };
34559
+ const ABOUT_SECTION = {
34560
+ labelKey: marker('editor.record.form.section.about.label'),
34561
+ descriptionKey: marker('editor.record.form.section.about.description'),
34562
+ hidden: false,
34563
+ fields: [
34564
+ RECORD_UNIQUE_IDENTIFIER_FIELD,
34565
+ RECORD_RESOURCE_UPDATED_FIELD,
34566
+ RECORD_UPDATED_FIELD,
34567
+ RECORD_UPDATE_FREQUENCY_FIELD,
34568
+ RECORD_TEMPORAL_EXTENTS_FIELD,
34569
+ ],
34570
+ };
34571
+ const GEOGRAPHICAL_COVERAGE_SECTION = {
34572
+ labelKey: marker('editor.record.form.section.geographicalCoverage.label'),
34573
+ hidden: false,
34574
+ fields: [],
34575
+ };
34576
+ const ASSOCIATED_RESOURCES_SECTION = {
34577
+ labelKey: marker('editor.record.form.section.associatedResources.label'),
34578
+ descriptionKey: marker('editor.record.form.section.associatedResources.description'),
34579
+ hidden: false,
34580
+ fields: [],
34581
+ };
34582
+ const ANNEXES_SECTION = {
34583
+ labelKey: marker('editor.record.form.section.annexes.label'),
34584
+ hidden: false,
34585
+ fields: [],
34586
+ };
34587
+ const CLASSIFICATION_SECTION = {
34588
+ labelKey: marker('editor.record.form.section.classification.label'),
34589
+ descriptionKey: marker('editor.record.form.section.classification.description'),
34590
+ hidden: false,
34591
+ fields: [RECORD_KEYWORDS_FIELD],
34592
+ };
34593
+ const USE_AND_ACCESS_CONDITIONS_SECTION = {
34594
+ labelKey: marker('editor.record.form.section.useAndAccessConditions.label'),
34595
+ hidden: false,
34596
+ fields: [RECORD_LICENSE_FIELD],
34597
+ };
34598
+ const DATA_MANAGERS_SECTION = {
34599
+ labelKey: marker('editor.record.form.section.dataManagers.label'),
34600
+ descriptionKey: marker('editor.record.form.section.dataManagers.description'),
34601
+ hidden: false,
34602
+ fields: [],
34603
+ };
34604
+ const DATA_POINT_OF_CONTACT_SECTION = {
34605
+ labelKey: marker('editor.record.form.section.dataPointOfContact.label'),
34606
+ descriptionKey: marker('editor.record.form.section.dataPointOfContact.description'),
34607
+ hidden: false,
34608
+ fields: [],
34609
+ };
34610
+ /************************************************************
34611
+ *************** PAGES *****************
34612
+ ************************************************************
34613
+ */
34614
+ const DEFAULT_CONFIGURATION = {
34615
+ pages: [
34616
+ {
34617
+ labelKey: marker('editor.record.form.page.description'),
34618
+ sections: [TITLE_SECTION, ABOUT_SECTION, GEOGRAPHICAL_COVERAGE_SECTION],
34619
+ },
34620
+ {
34621
+ labelKey: marker('editor.record.form.page.ressources'),
34622
+ sections: [ASSOCIATED_RESOURCES_SECTION, ANNEXES_SECTION],
34623
+ },
34624
+ {
34625
+ labelKey: marker('editor.record.form.page.accessAndContact'),
34626
+ sections: [
34627
+ CLASSIFICATION_SECTION,
34628
+ USE_AND_ACCESS_CONDITIONS_SECTION,
34629
+ DATA_MANAGERS_SECTION,
34630
+ DATA_POINT_OF_CONTACT_SECTION,
34631
+ ],
34632
+ },
34633
+ ],
34634
+ };
34233
34635
 
34234
34636
  const EDITOR_FEATURE_KEY = 'editor';
34235
34637
  const initialEditorState = {
@@ -34239,7 +34641,8 @@ const initialEditorState = {
34239
34641
  saving: false,
34240
34642
  saveError: null,
34241
34643
  changedSinceSave: false,
34242
- fieldsConfig: DEFAULT_FIELDS,
34644
+ editorConfig: DEFAULT_CONFIGURATION,
34645
+ currentPage: 0,
34243
34646
  };
34244
34647
  const reducer = createReducer(initialEditorState, on(openRecord, (state, { record, recordSource, alreadySavedOnce }) => ({
34245
34648
  ...state,
@@ -34269,6 +34672,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
34269
34672
  })), on(markRecordAsChanged, (state) => ({
34270
34673
  ...state,
34271
34674
  changedSinceSave: true,
34675
+ })), on(setCurrentPage, (state, { page }) => ({
34676
+ ...state,
34677
+ currentPage: page,
34272
34678
  })));
34273
34679
  function editorReducer(state, action) {
34274
34680
  return reducer(state, action);
@@ -34281,11 +34687,21 @@ const selectRecordSaving = createSelector(selectEditorState, (state) => state.sa
34281
34687
  const selectRecordSaveError = createSelector(selectEditorState, (state) => state.saveError);
34282
34688
  const selectRecordChangedSinceSave = createSelector(selectEditorState, (state) => state.changedSinceSave);
34283
34689
  const selectRecordAlreadySavedOnce = createSelector(selectEditorState, (state) => state.alreadySavedOnce);
34284
- const selectRecordFieldsConfig = createSelector(selectEditorState, (state) => state.fieldsConfig);
34285
- const selectRecordFields = createSelector(selectEditorState, (state) => state.fieldsConfig.map((fieldConfig) => ({
34286
- config: fieldConfig,
34287
- value: state.record?.[fieldConfig.model] ?? null,
34288
- })));
34690
+ const selectEditorConfig = createSelector(selectEditorState, (state) => state.editorConfig);
34691
+ const selectCurrentPage = createSelector(selectEditorState, (state) => state.currentPage);
34692
+ const selectRecordSections = createSelector(selectEditorState, (state) => {
34693
+ const currentPage = state.editorConfig.pages[state.currentPage];
34694
+ if (!currentPage) {
34695
+ return [];
34696
+ }
34697
+ return currentPage.sections.map((section) => ({
34698
+ ...section,
34699
+ fieldsWithValues: section.fields.map((fieldConfig) => ({
34700
+ config: fieldConfig,
34701
+ value: state.record?.[fieldConfig.model] ?? null,
34702
+ })),
34703
+ }));
34704
+ });
34289
34705
 
34290
34706
  class EditorFacade {
34291
34707
  constructor() {
@@ -34298,8 +34714,10 @@ class EditorFacade {
34298
34714
  this.saveError$ = this.store.pipe(select(selectRecordSaveError), filter$1((error) => !!error));
34299
34715
  this.saveSuccess$ = this.actions$.pipe(ofType(saveRecordSuccess));
34300
34716
  this.changedSinceSave$ = this.store.pipe(select(selectRecordChangedSinceSave));
34301
- this.recordFields$ = this.store.pipe(select(selectRecordFields));
34717
+ this.currentSections$ = this.store.pipe(select(selectRecordSections));
34302
34718
  this.draftSaveSuccess$ = this.actions$.pipe(ofType(draftSaveSuccess));
34719
+ this.currentPage$ = this.store.pipe(select(selectCurrentPage));
34720
+ this.editorConfig$ = this.store.pipe(select(selectEditorConfig));
34303
34721
  }
34304
34722
  openRecord(record, recordSource, alreadySavedOnce) {
34305
34723
  this.store.dispatch(openRecord({ record, recordSource, alreadySavedOnce }));
@@ -34310,6 +34728,9 @@ class EditorFacade {
34310
34728
  updateRecordField(field, value) {
34311
34729
  this.store.dispatch(updateRecordField({ field, value }));
34312
34730
  }
34731
+ setCurrentPage(page) {
34732
+ this.store.dispatch(setCurrentPage({ page }));
34733
+ }
34313
34734
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34314
34735
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade }); }
34315
34736
  }
@@ -34337,12 +34758,13 @@ class EditorService {
34337
34758
  // returns the record as it was when saved, alongside its source
34338
34759
  saveRecord(record, fieldsConfig, generateNewUniqueIdentifier = false) {
34339
34760
  const savedRecord = { ...record };
34761
+ const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
34340
34762
  // run onSave processes
34341
- for (const field of fieldsConfig) {
34763
+ for (const field of fields) {
34342
34764
  if (field.onSaveProcess && field.model) {
34343
34765
  const evaluator = evaluate(field.onSaveProcess);
34344
34766
  savedRecord[field.model] = evaluator({
34345
- config: field,
34767
+ model: field.model,
34346
34768
  value: record[field.model],
34347
34769
  });
34348
34770
  }
@@ -34379,7 +34801,7 @@ class EditorEffects {
34379
34801
  this.editorService = inject(EditorService);
34380
34802
  this.recordsRepository = inject(RecordsRepositoryInterface);
34381
34803
  this.store = inject(Store);
34382
- this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordFieldsConfig), this.store.select(selectRecordAlreadySavedOnce)), switchMap$1(([, record, fieldsConfig, alreadySavedOnce]) => this.editorService
34804
+ this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectEditorConfig), this.store.select(selectRecordAlreadySavedOnce)), switchMap$1(([, record, fieldsConfig, alreadySavedOnce]) => this.editorService
34383
34805
  .saveRecord(record, fieldsConfig, !alreadySavedOnce)
34384
34806
  .pipe(switchMap$1(([record, recordSource]) => of(saveRecordSuccess(), openRecord({
34385
34807
  record,
@@ -35332,7 +35754,7 @@ class FormFieldComponent {
35332
35754
  return this.model === 'title' || this.model === 'abstract';
35333
35755
  }
35334
35756
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35335
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "component", type: FormFieldResourceUpdatedComponent, selector: "gn-ui-form-field-resource-updated", inputs: ["control"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["control"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["control"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["control"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35757
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <span\n #titleInput\n class=\"grow font-title text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </span>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "component", type: FormFieldResourceUpdatedComponent, selector: "gn-ui-form-field-resource-updated", inputs: ["control"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["control"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["control"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["control"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35336
35758
  }
35337
35759
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, decorators: [{
35338
35760
  type: Component,
@@ -35355,7 +35777,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35355
35777
  FormFieldArrayComponent,
35356
35778
  FormFieldKeywordsComponent,
35357
35779
  TranslateModule,
35358
- ], template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n" }]
35780
+ ], template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <span\n #titleInput\n class=\"grow font-title text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </span>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey! | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtents\">\n <gn-ui-form-field-temporal-extents\n [control]=\"formControl\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n type=\"text\"\n [control]=\"formControl\"\n [readonly]=\"isReadOnly\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isKeywords\">\n <gn-ui-form-field-keywords\n [control]=\"formControl\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n</ng-template>\n" }]
35359
35781
  }], ctorParameters: function () { return []; }, propDecorators: { model: [{
35360
35782
  type: Input
35361
35783
  }], config: [{
@@ -35372,23 +35794,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35372
35794
  class RecordFormComponent {
35373
35795
  constructor(facade) {
35374
35796
  this.facade = facade;
35375
- this.fields$ = this.facade.recordFields$;
35376
35797
  }
35377
- handleFieldValueChange(field, newValue) {
35378
- if (!field.config.model) {
35798
+ handleFieldValueChange(model, newValue) {
35799
+ if (!model) {
35379
35800
  return;
35380
35801
  }
35381
- this.facade.updateRecordField(field.config.model, newValue);
35802
+ this.facade.updateRecordField(model, newValue);
35382
35803
  }
35383
35804
  fieldTracker(index, field) {
35384
35805
  return field.config.model;
35385
35806
  }
35807
+ sectionTracker(index, section) {
35808
+ return section.labelKey;
35809
+ }
35386
35810
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
35387
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [model]=\"field.config.model\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["model", "config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35811
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<ng-container>\n <div class=\"flex flex-col gap-6 p-8\">\n <ng-container\n *ngFor=\"\n let section of facade.currentSections$ | async;\n trackBy: sectionTracker\n \"\n >\n <ng-container *ngIf=\"!section.hidden\">\n <div class=\"flex flex-col gap-8 border p-8 rounded-[8px] shadow\">\n <div\n class=\"flex flex-col gap-2\"\n [ngClass]=\"section.labelKey ? 'mb-4' : 'hidden'\"\n >\n <div\n *ngIf=\"section.labelKey\"\n class=\"text-2xl font-petrona text-secondary\"\n translate\n >\n {{ section.labelKey }}\n </div>\n <div\n *ngIf=\"section.descriptionKey\"\n class=\"text-secondary-lightest\"\n translate\n >\n {{ section.descriptionKey }}\n </div>\n </div>\n <ng-container\n *ngFor=\"\n let field of section.fieldsWithValues;\n trackBy: fieldTracker\n \"\n >\n <ng-container *ngIf=\"!field.config.hidden\">\n <gn-ui-form-field\n [model]=\"field.config.model!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["model", "config", "value"], outputs: ["valueChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35388
35812
  }
35389
35813
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, decorators: [{
35390
35814
  type: Component,
35391
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent], template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [model]=\"field.config.model\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n" }]
35815
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent, TranslateModule], template: "<ng-container>\n <div class=\"flex flex-col gap-6 p-8\">\n <ng-container\n *ngFor=\"\n let section of facade.currentSections$ | async;\n trackBy: sectionTracker\n \"\n >\n <ng-container *ngIf=\"!section.hidden\">\n <div class=\"flex flex-col gap-8 border p-8 rounded-[8px] shadow\">\n <div\n class=\"flex flex-col gap-2\"\n [ngClass]=\"section.labelKey ? 'mb-4' : 'hidden'\"\n >\n <div\n *ngIf=\"section.labelKey\"\n class=\"text-2xl font-petrona text-secondary\"\n translate\n >\n {{ section.labelKey }}\n </div>\n <div\n *ngIf=\"section.descriptionKey\"\n class=\"text-secondary-lightest\"\n translate\n >\n {{ section.descriptionKey }}\n </div>\n </div>\n <ng-container\n *ngFor=\"\n let field of section.fieldsWithValues;\n trackBy: fieldTracker\n \"\n >\n <ng-container *ngIf=\"!field.config.hidden\">\n <gn-ui-form-field\n [model]=\"field.config.model!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</ng-container>\n" }]
35392
35816
  }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
35393
35817
 
35394
35818
  const ROUTER_STATE_KEY = 'router';
@@ -35771,5 +36195,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35771
36195
  * Generated bundle index. Do not edit.
35772
36196
  */
35773
36197
 
35774
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MultilingualSearchField, MyOrgService, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, findConverterForDocument, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, initSearch, initialEditorState, initialMapState, initialState, isBeginningOfResults, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, megabytesToBytes, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordAlreadySavedOnce, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectRecordSource, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
36198
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseConverter, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MultilingualSearchField, MyOrgService, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, findConverterForDocument, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, initSearch, initialEditorState, initialMapState, initialState, isBeginningOfResults, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, megabytesToBytes, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordAlreadySavedOnce, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setCurrentPage, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
35775
36199
  //# sourceMappingURL=geonetwork-ui.mjs.map