geonetwork-ui 2.4.0-dev.27089d81 → 2.4.0-dev.3c297076

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 (261) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +5 -5
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +30 -2
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.mjs +31 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +23 -1
  7. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +6 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +31 -3
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -5
  10. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  12. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  13. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -6
  14. package/esm2022/libs/feature/catalog/src/lib/records/records.service.mjs +4 -6
  15. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  16. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +3 -3
  17. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +7 -2
  18. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
  19. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +7 -3
  20. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +16 -6
  21. package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +131 -0
  22. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +4 -2
  23. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +21 -0
  24. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.mjs +7 -6
  25. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +19 -9
  26. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +1 -2
  27. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +11 -7
  28. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
  29. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +153 -60
  30. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +2 -0
  31. package/esm2022/libs/feature/editor/src/lib/models/index.mjs +2 -1
  32. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +4 -3
  33. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +10 -5
  34. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +42 -23
  35. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +13 -5
  36. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +49 -15
  37. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +6 -3
  38. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +41 -7
  39. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +6 -2
  40. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +7 -3
  41. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  42. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  43. package/esm2022/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.mjs +27 -0
  44. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +4 -3
  45. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  46. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +6 -5
  47. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +5 -11
  48. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +3 -3
  49. package/esm2022/libs/ui/elements/src/lib/sortable-list/sortable-list.component.mjs +6 -3
  50. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +11 -5
  51. package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +3 -3
  52. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
  53. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
  54. package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +3 -3
  55. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +67 -0
  56. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +28 -8
  57. package/esm2022/libs/ui/widgets/src/index.mjs +2 -1
  58. package/esm2022/libs/ui/widgets/src/lib/popover/popover.component.mjs +68 -0
  59. package/esm2022/translations/de.json +87 -40
  60. package/esm2022/translations/en.json +62 -15
  61. package/esm2022/translations/es.json +60 -13
  62. package/esm2022/translations/fr.json +71 -24
  63. package/esm2022/translations/it.json +61 -14
  64. package/esm2022/translations/nl.json +60 -13
  65. package/esm2022/translations/pt.json +60 -13
  66. package/fesm2022/geonetwork-ui.mjs +1475 -501
  67. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  68. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  69. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +1 -0
  70. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  71. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  72. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
  73. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  74. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
  75. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
  76. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
  77. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  78. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
  79. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  80. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +7 -1
  81. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  82. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -1
  83. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  84. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -1
  85. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  86. package/libs/common/domain/src/lib/platform.service.interface.d.ts +2 -1
  87. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  88. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +17 -0
  89. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  90. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  91. package/libs/feature/catalog/src/lib/records/records.service.d.ts.map +1 -1
  92. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +5 -0
  93. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  94. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +4 -4
  95. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  96. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +8 -0
  97. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
  98. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -3
  99. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  100. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +4 -8
  101. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  102. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +27 -0
  103. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +1 -0
  104. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  105. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +11 -0
  106. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -0
  107. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts +3 -1
  108. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts.map +1 -1
  109. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +6 -2
  110. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  111. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +0 -1
  112. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  113. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +5 -7
  114. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  115. package/libs/feature/editor/src/lib/expressions.d.ts +1 -1
  116. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -1
  117. package/libs/feature/editor/src/lib/fields.config.d.ts +39 -2
  118. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  119. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +36 -0
  120. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -0
  121. package/libs/feature/editor/src/lib/models/index.d.ts +1 -0
  122. package/libs/feature/editor/src/lib/models/index.d.ts.map +1 -1
  123. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  124. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  125. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  126. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +4 -1
  127. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  128. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +4 -1
  129. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  130. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +4 -1
  131. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  132. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  133. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +14 -4
  134. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  135. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -0
  136. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  137. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  138. package/libs/ui/elements/src/index.d.ts +1 -0
  139. package/libs/ui/elements/src/index.d.ts.map +1 -1
  140. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts +18 -0
  141. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts.map +1 -0
  142. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  143. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -3
  144. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  145. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  146. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts +3 -2
  147. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts.map +1 -1
  148. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +7 -5
  149. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  150. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +20 -0
  151. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  152. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +9 -3
  153. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  154. package/libs/ui/widgets/src/index.d.ts +1 -0
  155. package/libs/ui/widgets/src/index.d.ts.map +1 -1
  156. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts +19 -0
  157. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts.map +1 -0
  158. package/package.json +1 -1
  159. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
  160. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
  161. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
  162. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +1 -0
  163. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  164. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +4 -2
  165. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
  166. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
  167. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
  168. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +8 -0
  169. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +42 -2
  170. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +26 -15
  171. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -1
  172. package/src/libs/common/domain/src/lib/platform.service.interface.ts +5 -1
  173. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +22 -0
  174. package/src/libs/common/fixtures/src/index.ts +2 -0
  175. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +156 -0
  176. package/src/libs/common/fixtures/src/lib/editor/index.ts +1 -0
  177. package/src/libs/data-access/datafeeder/src/openapi/model/datasetMetadata.api.model.ts +4 -0
  178. package/src/libs/data-access/datafeeder/src/openapi/model/datasetUploadStatus.api.model.ts +2 -0
  179. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +1 -5
  180. package/src/libs/data-access/gn4/src/spec.yaml +0 -8
  181. package/src/libs/feature/catalog/src/lib/records/records.service.ts +6 -8
  182. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +5 -0
  183. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +2 -2
  184. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +9 -1
  185. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +11 -0
  186. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +11 -5
  187. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +22 -8
  188. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +2 -1
  189. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +110 -19
  190. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +8 -6
  191. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.css +0 -0
  192. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +5 -0
  193. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +22 -0
  194. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.ts +8 -7
  195. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +15 -9
  196. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +15 -2
  197. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +0 -1
  198. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +51 -11
  199. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +15 -8
  200. package/src/libs/feature/editor/src/lib/expressions.ts +1 -1
  201. package/src/libs/feature/editor/src/lib/fields.config.ts +186 -61
  202. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +53 -0
  203. package/src/libs/feature/editor/src/lib/models/index.ts +1 -0
  204. package/src/libs/feature/editor/src/lib/services/editor.service.ts +8 -4
  205. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -4
  206. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +36 -19
  207. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +6 -2
  208. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +11 -0
  209. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +59 -12
  210. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +6 -2
  211. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +3 -1
  212. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +45 -3
  213. package/src/libs/feature/search/src/lib/state/search.facade.ts +6 -0
  214. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +16 -2
  215. package/src/libs/ui/elements/src/index.ts +1 -0
  216. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +29 -29
  217. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.css +0 -0
  218. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.html +12 -0
  219. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.ts +37 -0
  220. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +4 -1
  221. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -1
  222. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +12 -8
  223. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +14 -20
  224. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -10
  225. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.html +1 -1
  226. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.html +3 -1
  227. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.ts +6 -2
  228. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +4 -2
  229. package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -1
  230. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.css +31 -0
  231. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +15 -0
  232. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +38 -0
  233. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
  234. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
  235. package/src/libs/ui/layout/src/lib/max-lines/max-lines.component.html +1 -0
  236. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  237. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +26 -0
  238. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +74 -0
  239. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +15 -1
  240. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +26 -12
  241. package/src/libs/ui/widgets/src/index.ts +1 -0
  242. package/src/libs/ui/widgets/src/lib/popover/popover.component.css +0 -0
  243. package/src/libs/ui/widgets/src/lib/popover/popover.component.html +3 -0
  244. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +85 -0
  245. package/tailwind.base.css +2 -1
  246. package/translations/de.json +87 -40
  247. package/translations/en.json +62 -15
  248. package/translations/es.json +60 -13
  249. package/translations/fr.json +71 -24
  250. package/translations/it.json +61 -14
  251. package/translations/nl.json +60 -13
  252. package/translations/pt.json +60 -13
  253. package/translations/sk.json +61 -14
  254. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +0 -2
  255. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +0 -2
  256. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts +0 -26
  257. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +0 -1
  258. package/libs/feature/editor/src/lib/models/fields.model.d.ts +0 -15
  259. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +0 -1
  260. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.ts +0 -43
  261. package/src/libs/feature/editor/src/lib/models/fields.model.ts +0 -29
@@ -1,7 +1,10 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
+ import GML32 from 'ol/format/GML32';
3
+ import GeoJSON from 'ol/format/GeoJSON';
4
+ import { parse as parse$1 } from 'ol/xml';
2
5
  import format from 'date-fns/format';
3
6
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ElementRef, ViewChildren, ViewContainerRef, HostBinding, ContentChild, ContentChildren, TemplateRef, Host, Pipe, inject } from '@angular/core';
7
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, TemplateRef, ElementRef, ViewChildren, ViewContainerRef, HostBinding, ContentChild, ContentChildren, Host, Pipe, inject } from '@angular/core';
5
8
  import * as i1 from '@angular/common/http';
6
9
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
10
  import * as i1$1 from '@ngx-translate/core';
@@ -12,7 +15,7 @@ import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith,
12
15
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
16
  import * as i1$3 from '@angular/common';
14
17
  import { CommonModule, NgFor, NgComponentOutlet, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, throwError, combineLatest, from, takeLast, forkJoin, firstValueFrom, Subject, merge, BehaviorSubject, fromEvent, timer, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, debounceTime as debounceTime$1, filter as filter$1, animationFrameScheduler, tap as tap$2, Observable, buffer, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, exhaustMap, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
18
+ import { of, map as map$2, lastValueFrom, Subject, switchMap, throwError, combineLatest, from, takeLast, forkJoin, firstValueFrom, merge, BehaviorSubject, fromEvent, timer, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, debounceTime as debounceTime$1, filter as filter$1, animationFrameScheduler, tap as tap$2, Observable, buffer, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, exhaustMap, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
19
  import { valid, coerce, satisfies, ltr } from 'semver';
17
20
  import * as i1$2 from '@ngrx/store';
18
21
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule, Store } from '@ngrx/store';
@@ -23,7 +26,6 @@ import 'ol/Feature';
23
26
  import { Circle, Fill, Stroke, Style as Style$1 } from 'ol/style';
24
27
  import Style, { createDefaultStyle } from 'ol/style/Style';
25
28
  import { extend, isEmpty } from 'ol/extent';
26
- import GeoJSON from 'ol/format/GeoJSON';
27
29
  import { transformExtent, fromLonLat } from 'ol/proj';
28
30
  import ImageWMS from 'ol/source/ImageWMS';
29
31
  import TileWMS from 'ol/source/TileWMS';
@@ -33,7 +35,7 @@ import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } fro
33
35
  import chroma from 'chroma-js';
34
36
  import { WmtsEndpoint, WmsEndpoint, WfsEndpoint, OgcApiEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
35
37
  import { register, fromEPSGCode } from 'ol/proj/proj4';
36
- import proj4 from 'proj4/dist/proj4';
38
+ import proj4 from 'proj4';
37
39
  import { defaults } from 'ol/control/defaults';
38
40
  import * as TOML from '@ltd/j-toml';
39
41
  import CircleStyle from 'ol/style/Circle';
@@ -48,60 +50,64 @@ import { MVT, WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
48
50
  import VectorTileLayer from 'ol/layer/VectorTile';
49
51
  import OGCMapTile from 'ol/source/OGCMapTile.js';
50
52
  import ImageLayer from 'ol/layer/Image';
51
- import * as i2$5 from '@angular/material/tabs';
53
+ import * as i2$4 from '@angular/material/tabs';
52
54
  import { MatTabsModule } from '@angular/material/tabs';
53
55
  import * as i2$2 from '@angular/forms';
54
56
  import { FormsModule, ReactiveFormsModule, UntypedFormControl, FormArray, FormControl } from '@angular/forms';
55
57
  import * as i2$1 from '@angular/material/autocomplete';
56
58
  import { MatAutocompleteTrigger, MatAutocomplete, MatAutocompleteModule } from '@angular/material/autocomplete';
57
- import * as i3$1 from 'ngx-dropzone';
59
+ import * as i3$2 from 'ngx-dropzone';
58
60
  import { NgxDropzoneModule } from 'ngx-dropzone';
59
61
  import * as i5 from 'ngx-chips';
60
62
  import { TagInputModule } from 'ngx-chips';
61
63
  import * as i1$4 from '@angular/material/progress-spinner';
62
64
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
65
+ import tippy from 'tippy.js';
63
66
  import * as i3 from '@angular/material/core';
64
67
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
65
68
  import * as i1$5 from '@angular/material/checkbox';
66
69
  import { MatCheckboxModule } from '@angular/material/checkbox';
67
- import * as i2$3 from '@angular/material/tooltip';
70
+ import * as i3$1 from '@angular/material/tooltip';
68
71
  import { MatTooltipModule } from '@angular/material/tooltip';
69
- import * as i2$4 from '@angular/material/datepicker';
72
+ import * as i2$3 from '@angular/material/datepicker';
70
73
  import { MatDatepickerModule } from '@angular/material/datepicker';
71
74
  import * as i1$6 from '@angular/cdk/overlay';
72
75
  import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
73
76
  import { MatFormFieldModule } from '@angular/material/form-field';
74
77
  import { MatInputModule } from '@angular/material/input';
75
- import * as i1$7 from '@angular/router';
78
+ import * as i1$8 from '@angular/router';
76
79
  import { RouterModule, RouterLink, RouteReuseStrategy } from '@angular/router';
77
80
  import Duration from 'duration-relativetimeformat';
81
+ import * as i1$7 from '@angular/material/dialog';
82
+ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
78
83
  import * as basicLightbox from 'basiclightbox';
79
84
  import { marked } from 'marked';
80
85
  import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
81
86
  import EmblaCarousel from 'embla-carousel';
82
87
  import { formatDistance } from 'date-fns';
83
88
  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 i1$8 from '@ngrx/effects';
89
+ import * as i4 from '@angular/material/menu';
90
+ import { MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
91
+ import * as i1$9 from '@ngrx/effects';
85
92
  import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
86
- import tippy from 'tippy.js';
87
93
  import { valid as valid$1 } from 'geojson-validation';
94
+ import { trigger, transition, animate, keyframes, style } from '@angular/animations';
88
95
  import { Polygon } from 'ol/geom';
89
96
  import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
90
- import { trigger, transition, animate, keyframes, style } from '@angular/animations';
91
97
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
92
- import * as i4 from '@angular/cdk/scrolling';
98
+ import * as i4$1 from '@angular/cdk/scrolling';
93
99
  import { ScrollingModule } from '@angular/cdk/scrolling';
94
- import * as i2$6 from '@angular/material/sort';
100
+ import * as i2$5 from '@angular/material/sort';
95
101
  import { MatSort, MatSortModule } from '@angular/material/sort';
96
- import * as i1$9 from '@angular/material/table';
102
+ import * as i1$a from '@angular/material/table';
97
103
  import { MatTableModule } from '@angular/material/table';
98
- import * as i3$2 from 'ng-table-virtual-scroll';
104
+ import * as i3$3 from 'ng-table-virtual-scroll';
99
105
  import { TableVirtualScrollDataSource, TableVirtualScrollModule } from 'ng-table-virtual-scroll';
100
106
  import * as Papa from 'papaparse';
101
107
  import parseDate from 'date-fns/parse';
102
108
  import parseIsoDate from 'date-fns/parseISO';
103
109
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
104
- import * as i3$3 from '@ngrx/router-store';
110
+ import * as i3$4 from '@ngrx/router-store';
105
111
  import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
106
112
  import { navigation } from '@ngrx/router-store/data-persistence';
107
113
 
@@ -269,6 +275,9 @@ function allChildrenElement(element) {
269
275
  ...element.children.filter((el) => el instanceof XmlElement),
270
276
  ];
271
277
  }
278
+ function firstChildElement(element) {
279
+ return allChildrenElement(element)[0] ?? null;
280
+ }
272
281
  /**
273
282
  * Will return all matching elements nested according to the given
274
283
  * names (similar to a path), starting form the input element;
@@ -427,10 +436,12 @@ function getTreeRoot(element) {
427
436
  }
428
437
  // stays on the parent element
429
438
  // if the given elements are part of a subtree, will add the root of subtree
439
+ // will filter out falsy elements
430
440
  function appendChildren(...childrenFns) {
431
441
  return (element) => {
432
442
  if (!element)
433
443
  return null;
444
+ childrenFns = childrenFns.filter((fn) => fn);
434
445
  element.children.push(...childrenFns.map((fn) => fn()).map(getTreeRoot));
435
446
  element.children.forEach((el) => (el.parent = element));
436
447
  return element;
@@ -559,6 +570,33 @@ function matchMimeType(format) {
559
570
  return format || null;
560
571
  }
561
572
 
573
+ function readGeometry(el) {
574
+ const xmlDoc = createDocument(el);
575
+ xmlDoc.root.attributes['xmlns'] = 'http://www.opengis.net/gml/3.2';
576
+ const gmlString = xmlToString(xmlDoc);
577
+ const doc = parse$1(gmlString);
578
+ // we need an intermediate node to be able to parse the GML
579
+ const node = document.createElement('pre');
580
+ node.appendChild(doc.documentElement);
581
+ const gml32Format = new GML32();
582
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
583
+ // @ts-ignore
584
+ const geometry = gml32Format.readGeometryFromNode(node);
585
+ const geojsonFormat = new GeoJSON();
586
+ return geojsonFormat.writeGeometryObject(geometry);
587
+ }
588
+ function writeGeometry(geometryObject) {
589
+ const geojsonFormat = new GeoJSON();
590
+ const geometry = geojsonFormat.readGeometry(geometryObject);
591
+ const gml32Format = new GML32();
592
+ const node = gml32Format.writeGeometryNode(geometry);
593
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
594
+ // @ts-ignore
595
+ const element = node.firstElementChild;
596
+ const gmlString = new XMLSerializer().serializeToString(element);
597
+ return getRootElement(parseXmlString(gmlString));
598
+ }
599
+
562
600
  /**
563
601
  * Parts are [firstName, lastName]
564
602
  * Second part will be null if no separation could be done
@@ -727,6 +765,9 @@ function extractCharacterString() {
727
765
  function extractDateTime() {
728
766
  return pipe(fallback(findChildElement('gco:DateTime', false), findChildElement('gco:Date', false)), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)));
729
767
  }
768
+ function extractDecimal() {
769
+ return pipe(findChildElement('gco:Decimal', false), readText(), map((numberStr) => (numberStr ? Number(numberStr) : null)));
770
+ }
730
771
  function extractUrl() {
731
772
  const getUrl = pipe(findChildElement('gmd:URL', false), readText());
732
773
  const getCharacterString = pipe(findChildElement('gco:CharacterString', false), readText());
@@ -1084,6 +1125,30 @@ function readTemporalExtents(rootEl) {
1084
1125
  }
1085
1126
  }))(rootEl);
1086
1127
  }
1128
+ function readSpatialExtents(rootEl) {
1129
+ const extractGeometry = (rootEl) => {
1130
+ if (!rootEl)
1131
+ return null;
1132
+ return pipe(findChildElement('gmd:polygon', false), firstChildElement, map((el) => readGeometry(el)))(rootEl);
1133
+ };
1134
+ const extractBBox = (rootEl) => {
1135
+ if (!rootEl)
1136
+ return null;
1137
+ return pipe(combine(pipe(findChildElement('gmd:westBoundLongitude'), extractDecimal()), pipe(findChildElement('gmd:southBoundLatitude'), extractDecimal()), pipe(findChildElement('gmd:eastBoundLongitude'), extractDecimal()), pipe(findChildElement('gmd:northBoundLatitude'), extractDecimal())))(rootEl);
1138
+ };
1139
+ const extractDescription = (rootEl) => {
1140
+ if (!rootEl)
1141
+ return null;
1142
+ return pipe(findNestedElement('gmd:geographicIdentifier', 'gmd:MD_Identifier', 'gmd:code'), extractCharacterString())(rootEl);
1143
+ };
1144
+ return pipe(findIdentification(), findNestedElements('gmd:extent', 'gmd:EX_Extent', 'gmd:geographicElement'), mapArray(combine(pipe(findChildElement('gmd:EX_BoundingPolygon'), extractGeometry), pipe(findChildElement('gmd:EX_GeographicBoundingBox'), extractBBox), pipe(findChildElement('gmd:EX_GeographicDescription'), extractDescription))), mapArray(([geometry, bbox, description]) => {
1145
+ return {
1146
+ ...(geometry && { geometry }),
1147
+ ...(bbox && { bbox }),
1148
+ ...(description && { description }),
1149
+ };
1150
+ }))(rootEl);
1151
+ }
1087
1152
 
1088
1153
  function writeCharacterString(text) {
1089
1154
  return tap(pipe(findChildOrCreate('gco:CharacterString'), setTextContent(text)));
@@ -1100,6 +1165,9 @@ function writeDateTime(date) {
1100
1165
  function writeDate(date) {
1101
1166
  return tap(pipe(findChildOrCreate('gco:Date'), setTextContent(format(date, 'yyyy-MM-dd'))));
1102
1167
  }
1168
+ function writeDecimal(decimal) {
1169
+ return tap(pipe(findChildOrCreate('gco:Decimal'), setTextContent(decimal.toString())));
1170
+ }
1103
1171
  function getProgressCode(status) {
1104
1172
  switch (status) {
1105
1173
  case 'completed':
@@ -1493,6 +1561,24 @@ function writeTemporalExtents(record, rootEl) {
1493
1561
  ? setTextContent(format(extent.start, 'yyyy-MM-dd'))
1494
1562
  : addAttribute('indeterminatePosition', 'unknown'))))))))))(rootEl);
1495
1563
  }
1564
+ function writeSpatialExtents(record, rootEl) {
1565
+ const appendBoundingPolygon = (geometry) => {
1566
+ if (!geometry)
1567
+ return null;
1568
+ return pipe(createElement('gmd:EX_BoundingPolygon'), appendChildren(pipe(createElement('gmd:polygon'), appendChildren(() => writeGeometry(geometry)))));
1569
+ };
1570
+ const appendGeographicBoundingBox = (bbox) => {
1571
+ if (!bbox)
1572
+ return null;
1573
+ return pipe(createElement('gmd:EX_GeographicBoundingBox'), appendChildren(pipe(createElement('gmd:westBoundLongitude'), writeDecimal(bbox[0])), pipe(createElement('gmd:eastBoundLongitude'), writeDecimal(bbox[2])), pipe(createElement('gmd:southBoundLatitude'), writeDecimal(bbox[1])), pipe(createElement('gmd:northBoundLatitude'), writeDecimal(bbox[3]))));
1574
+ };
1575
+ const appendGeographicDescription = (description) => {
1576
+ if (!description)
1577
+ return null;
1578
+ return pipe(createElement('gmd:EX_GeographicDescription'), createChild('gmd:geographicIdentifier'), createChild('gmd:MD_Identifier'), createChild('gmd:code'), writeCharacterString(description));
1579
+ };
1580
+ pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:geographicElement'), appendChildren(...record.spatialExtents.map((extent) => pipe(createElement('gmd:geographicElement'), appendChildren(appendBoundingPolygon(extent.geometry), appendGeographicBoundingBox(extent.bbox), appendGeographicDescription(extent.description))))))(rootEl);
1581
+ }
1496
1582
 
1497
1583
  class Iso19139Converter extends BaseConverter {
1498
1584
  constructor() {
@@ -1525,8 +1611,8 @@ class Iso19139Converter extends BaseConverter {
1525
1611
  distributions: readDistributions$1,
1526
1612
  onlineResources: readOnlineResources,
1527
1613
  temporalExtents: readTemporalExtents,
1614
+ spatialExtents: readSpatialExtents,
1528
1615
  // TODO
1529
- spatialExtents: () => [],
1530
1616
  extras: () => undefined,
1531
1617
  landingPage: () => undefined,
1532
1618
  languages: () => [],
@@ -1559,8 +1645,8 @@ class Iso19139Converter extends BaseConverter {
1559
1645
  distributions: writeDistributions$1,
1560
1646
  onlineResources: writeOnlineResources,
1561
1647
  temporalExtents: writeTemporalExtents,
1648
+ spatialExtents: () => writeSpatialExtents,
1562
1649
  // TODO
1563
- spatialExtents: () => undefined,
1564
1650
  extras: () => undefined,
1565
1651
  landingPage: () => undefined,
1566
1652
  languages: () => undefined,
@@ -2176,6 +2262,7 @@ const mapKeywords = (thesauri, language) => {
2176
2262
  keywords.push({
2177
2263
  label: selectTranslatedValue(keyword, language),
2178
2264
  type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
2265
+ ...(keyword.link && { key: keyword.link }),
2179
2266
  ...(thesaurus && { thesaurus }),
2180
2267
  });
2181
2268
  }
@@ -8641,11 +8728,7 @@ class RecordsApiService {
8641
8728
  headers = headers.set('Accept', httpHeaderAcceptSelected);
8642
8729
  }
8643
8730
  // to determine the Content-Type header
8644
- const consumes = [
8645
- 'application/xml',
8646
- 'application/json',
8647
- 'application/x-www-form-urlencoded',
8648
- ];
8731
+ const consumes = ['application/xml'];
8649
8732
  const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
8650
8733
  if (httpContentTypeSelected !== undefined) {
8651
8734
  headers = headers.set('Content-Type', httpContentTypeSelected);
@@ -17356,6 +17439,8 @@ var de = {
17356
17439
  "datafeeder.datasetValidation.submitButton": "OK, meine Daten sind korrekt",
17357
17440
  "datafeeder.datasetValidation.title": "Stellen Sie sicher, dass Ihre Daten korrekt sind",
17358
17441
  "datafeeder.datasetValidation.unknown": " - ",
17442
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
17443
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
17359
17444
  "datafeeder.form.abstract": "Wie würden Sie Ihren Datensatz beschreiben?",
17360
17445
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
17361
17446
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
@@ -17383,6 +17468,7 @@ var de = {
17383
17468
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
17384
17469
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
17385
17470
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
17471
+ "datafeeder.publishSuccess.ogcFeature": "",
17386
17472
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
17387
17473
  "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
17388
17474
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
@@ -17411,6 +17497,15 @@ var de = {
17411
17497
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
17412
17498
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
17413
17499
  "datafeeder.upload.uploadButton": "Hochladen",
17500
+ "datafeeder.validation.csv.delimiter": "",
17501
+ "datafeeder.validation.csv.delimiter.comma": "",
17502
+ "datafeeder.validation.csv.delimiter.semicolon": "",
17503
+ "datafeeder.validation.csv.lat.field": "",
17504
+ "datafeeder.validation.csv.lng.field": "",
17505
+ "datafeeder.validation.csv.quote.double": "",
17506
+ "datafeeder.validation.csv.quote.none": "",
17507
+ "datafeeder.validation.csv.quote.simple": "",
17508
+ "datafeeder.validation.csv.quoteChar": "",
17414
17509
  "datafeeder.validation.encoding": "Codierung",
17415
17510
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
17416
17511
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
@@ -17424,7 +17519,7 @@ var de = {
17424
17519
  "datahub.header.lastRecords": "Die neuesten",
17425
17520
  "datahub.header.myfavorites": "Meine Favoriten",
17426
17521
  "datahub.header.news": "Startseite",
17427
- "datahub.header.organisations": "Organisationen",
17522
+ "datahub.header.organizations": "Organisationen",
17428
17523
  "datahub.header.popularRecords": "Die beliebtesten",
17429
17524
  "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
17430
17525
  "datahub.news.contact.contactus": "Kontaktieren Sie uns",
@@ -17460,37 +17555,70 @@ var de = {
17460
17555
  "downloads.format.unknown": "unbekannt",
17461
17556
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
17462
17557
  dropFile: dropFile$6,
17463
- "editor.record.form.license": "Lizenz",
17464
- "editor.record.form.license.cc-by": "",
17465
- "editor.record.form.license.cc-by-sa": "",
17466
- "editor.record.form.license.cc-zero": "",
17467
- "editor.record.form.license.etalab": "",
17468
- "editor.record.form.license.etalab-v2": "",
17469
- "editor.record.form.license.odbl": "",
17470
- "editor.record.form.license.odc-by": "",
17471
- "editor.record.form.license.pddl": "",
17558
+ "editor.record.delete.confirmation.cancelText": "Stornieren",
17559
+ "editor.record.delete.confirmation.confirmText": "Löschen",
17560
+ "editor.record.delete.confirmation.message": "Sind Sie sicher, dass Sie diesen Datensatz löschen möchten?",
17561
+ "editor.record.delete.confirmation.title": "Datensatz löschen?",
17562
+ "editor.record.deleteError.body": "Der Datensatz konnte nicht gelöscht werden:",
17563
+ "editor.record.deleteError.closeMessage": "Verstanden",
17564
+ "editor.record.deleteError.title": "Fehler beim Löschen des Datensatzes",
17565
+ "editor.record.form.bottomButtons.comeBackLater": "",
17566
+ "editor.record.form.bottomButtons.next": "",
17567
+ "editor.record.form.bottomButtons.previous": "",
17568
+ "editor.record.form.field.abstract": "Kurzbeschreibung",
17569
+ "editor.record.form.field.keywords": "Schlagwörter",
17570
+ "editor.record.form.field.license": "Lizenz",
17571
+ "editor.record.form.field.overviews": "",
17572
+ "editor.record.form.field.recordUpdated": "Datensatz zuletzt aktualisiert",
17573
+ "editor.record.form.field.resourceUpdated": "Letztes Aktualisierungsdatum",
17574
+ "editor.record.form.field.temporalExtents": "Zeitlicher Umfang",
17575
+ "editor.record.form.field.title": "Metadaten-Titel",
17576
+ "editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
17577
+ "editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
17578
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17579
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17580
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
17581
+ "editor.record.form.license.etalab": "Offene Lizenz (Etalab)",
17582
+ "editor.record.form.license.etalab-v2": "Offene Lizenz v2.0 (Etalab)",
17583
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
17584
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17585
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
17472
17586
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17473
- "editor.record.form.resourceUpdated": "",
17474
- "editor.record.form.temporalExtents": "",
17475
- "editor.record.form.temporalExtents.addDate": "",
17476
- "editor.record.form.temporalExtents.addRange": "",
17477
- "editor.record.form.temporalExtents.date": "",
17478
- "editor.record.form.temporalExtents.range": "",
17479
- "editor.record.form.updateFrequency": "",
17480
- "editor.record.form.updateFrequency.planned": "",
17481
- "editor.record.loadError.body": "",
17482
- "editor.record.loadError.closeMessage": "",
17483
- "editor.record.loadError.title": "",
17484
- "editor.record.publish": "",
17485
- "editor.record.publishError.body": "",
17486
- "editor.record.publishError.closeMessage": "",
17487
- "editor.record.publishError.title": "",
17488
- "editor.record.publishSuccess.body": "",
17489
- "editor.record.publishSuccess.title": "",
17490
- "editor.record.saveStatus.asDraftOnly": "",
17491
- "editor.record.saveStatus.draftWithChangesPending": "",
17492
- "editor.record.saveStatus.recordUpToDate": "",
17493
- "editor.record.upToDate": "",
17587
+ "editor.record.form.page.accessAndContact": "",
17588
+ "editor.record.form.page.description": "",
17589
+ "editor.record.form.page.ressources": "",
17590
+ "editor.record.form.section.about.description": "",
17591
+ "editor.record.form.section.about.label": "",
17592
+ "editor.record.form.section.annexes.label": "",
17593
+ "editor.record.form.section.associatedResources.description": "",
17594
+ "editor.record.form.section.associatedResources.label": "",
17595
+ "editor.record.form.section.classification.description": "",
17596
+ "editor.record.form.section.classification.label": "",
17597
+ "editor.record.form.section.dataManagers.description": "",
17598
+ "editor.record.form.section.dataManagers.label": "",
17599
+ "editor.record.form.section.dataPointOfContact.description": "",
17600
+ "editor.record.form.section.dataPointOfContact.label": "",
17601
+ "editor.record.form.section.geographicalCoverage.label": "",
17602
+ "editor.record.form.section.useAndAccessConditions.label": "",
17603
+ "editor.record.form.temporalExtents.addDate": "Zeitpunkt",
17604
+ "editor.record.form.temporalExtents.addRange": "Zeitraum",
17605
+ "editor.record.form.temporalExtents.date": "Datum",
17606
+ "editor.record.form.temporalExtents.range": "Datumsbereich",
17607
+ "editor.record.form.updateFrequency.planned": "Die Daten sollten regelmäßig aktualisiert werden.",
17608
+ "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
17609
+ "editor.record.loadError.closeMessage": "Verstanden",
17610
+ "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
17611
+ "editor.record.publish": "Diesen Datensatz veröffentlichen",
17612
+ "editor.record.publishError.body": "Der Datensatz konnte nicht veröffentlicht werden:",
17613
+ "editor.record.publishError.closeMessage": "Verstanden",
17614
+ "editor.record.publishError.title": "Fehler beim Veröffentlichen des Datensatzes",
17615
+ "editor.record.publishSuccess.body": "Der Datensatz wurde erfolgreich veröffentlicht!",
17616
+ "editor.record.publishSuccess.title": "Veröffentlichung erfolgreich",
17617
+ "editor.record.saveStatus.asDraftOnly": "Nur als Entwurf gespeichert - noch nicht veröffentlicht",
17618
+ "editor.record.saveStatus.draftWithChangesPending": "Als Entwurf gespeichert - Änderungen stehen aus",
17619
+ "editor.record.saveStatus.recordUpToDate": "Datensatz ist auf dem neuesten Stand",
17620
+ "editor.record.upToDate": "Dieser Datensatz ist auf dem neuesten Stand",
17621
+ "editor.sidebar.menu.editor": "",
17494
17622
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
17495
17623
  "facets.block.title.OrgForResource": "Organisation",
17496
17624
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -17559,17 +17687,17 @@ var de = {
17559
17687
  "organisations.sortBy.nameDesc": "Name Z → A",
17560
17688
  "organisations.sortBy.recordCountAsc": "Veröffentlichungen 0 → 9",
17561
17689
  "organisations.sortBy.recordCountDesc": "Veröffentlichungen 9 → 0",
17562
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
17563
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{}}",
17690
+ "organization.details.lastPublishedDatasets": "",
17691
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
17564
17692
  "organization.details.mailContact": "",
17565
- "organization.datasets": "",
17566
- "organization.lastPublishedDatasets": "",
17567
- "organization.lastPublishedDatasets.searchAllButton": "",
17693
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
17568
17694
  "pagination.nextPage": "Nächste Seite",
17569
17695
  "pagination.page": "Seite",
17570
17696
  "pagination.pageOf": "von",
17571
17697
  previous: previous$6,
17698
+ "record.action.delete": "Löschen",
17572
17699
  "record.action.download": "Herunterladen",
17700
+ "record.action.duplicate": "",
17573
17701
  "record.action.view": "Anzeigen",
17574
17702
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
17575
17703
  "record.metadata.about": "Beschreibung",
@@ -17662,11 +17790,11 @@ var de = {
17662
17790
  "results.sortBy.relevancy": "Relevanz",
17663
17791
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
17664
17792
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
17793
+ "search.error.organizationHasNoDataset": "",
17794
+ "search.error.organizationNotFound": "",
17665
17795
  "search.error.receivedError": "Ein Fehler ist aufgetreten",
17666
17796
  "search.error.recordHasnolink": "",
17667
17797
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
17668
- "search.error.organizationNotFound": "",
17669
- "search.error.organizationHasNoDataset": "",
17670
17798
  "search.field.any.placeholder": "Suche Datensätze ...",
17671
17799
  "search.field.sortBy": "Sortieren nach:",
17672
17800
  "search.filters.clear": "Zurücksetzen",
@@ -17691,14 +17819,16 @@ var de = {
17691
17819
  "search.filters.minimize": "Minimieren",
17692
17820
  "search.filters.myRecords": "Nur meine Datensätze anzeigen",
17693
17821
  "search.filters.myRecordsHelp": "Wenn dies aktiviert ist, werden nur von mir erstellte Datensätze angezeigt; Datensätze, die von anderen erstellt wurden, werden nicht angezeigt.",
17822
+ "search.filters.organization": "",
17694
17823
  "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
17824
+ "search.filters.producerOrg": "",
17695
17825
  "search.filters.publicationYear": "Veröffentlichungsjahr",
17696
- "search.filters.publisher": "Organisationen",
17826
+ "search.filters.publisherOrg": "",
17697
17827
  "search.filters.representationType": "Repräsentationstyp",
17698
17828
  "search.filters.resourceType": "Ressourcentyp",
17699
17829
  "search.filters.standard": "Standard",
17700
17830
  "search.filters.title": "Ergebnisse filtern",
17701
- "search.filters.topic": "Thema",
17831
+ "search.filters.topic": "Themen",
17702
17832
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
17703
17833
  "search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden Datensätze im Bereich des Katalogs zuerst angezeigt. Datensätze außerhalb dieses Bereichs werden nicht angezeigt.",
17704
17834
  "share.tab.permalink": "Teilen",
@@ -17727,7 +17857,7 @@ var en = {
17727
17857
  "Add Layer As": "",
17728
17858
  "button.login": "Log in",
17729
17859
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
17730
- "catalog.figures.organizations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
17860
+ "catalog.figures.organizations": "{count, plural, =0{organizations} one{organization} other{organizations}}",
17731
17861
  "chart.aggregation.average": "average",
17732
17862
  "chart.aggregation.count": "count",
17733
17863
  "chart.aggregation.max": "max",
@@ -17774,6 +17904,8 @@ var en = {
17774
17904
  "datafeeder.datasetValidation.submitButton": "OK, my data are correct",
17775
17905
  "datafeeder.datasetValidation.title": "Make sure your data are correct",
17776
17906
  "datafeeder.datasetValidation.unknown": " - ",
17907
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "*The table must display the first 5 lines (excluding the header)<br>If this is not the case, check that the file is correctly formatted",
17908
+ "datafeeder.datasetValidationCsv.lineNumbers": "Sample of the first 5 lines* of the dataset:",
17777
17909
  "datafeeder.form.abstract": "How would you describe your dataset?",
17778
17910
  "datafeeder.form.datepicker": "Do you know when the dataset was created?",
17779
17911
  "datafeeder.form.description": "Finally, please describe the process that was used to create the dataset",
@@ -17801,6 +17933,7 @@ var en = {
17801
17933
  "datafeeder.publishSuccess.geonetworkRecord": "Metadata record",
17802
17934
  "datafeeder.publishSuccess.illustration.title": "Done, all is good!",
17803
17935
  "datafeeder.publishSuccess.mapViewer": "Map viewer",
17936
+ "datafeeder.publishSuccess.ogcFeature": "OGC API",
17804
17937
  "datafeeder.publishSuccess.subtitle": "View your data in:",
17805
17938
  "datafeeder.publishSuccess.title": "Congratulation! \n Your dataset has been published",
17806
17939
  "datafeeder.publishSuccess.uploadAnotherData": "Upload another dataset",
@@ -17829,6 +17962,15 @@ var en = {
17829
17962
  "datafeeder.upload.maxFileSize": "Maximum file size is {size} MB",
17830
17963
  "datafeeder.upload.title": "Upload your dataset",
17831
17964
  "datafeeder.upload.uploadButton": "Upload",
17965
+ "datafeeder.validation.csv.delimiter": "Delimiter",
17966
+ "datafeeder.validation.csv.delimiter.comma": "Comma",
17967
+ "datafeeder.validation.csv.delimiter.semicolon": "Semicolon",
17968
+ "datafeeder.validation.csv.lat.field": "Latitude column",
17969
+ "datafeeder.validation.csv.lng.field": "Longitude column",
17970
+ "datafeeder.validation.csv.quote.double": "Double quote",
17971
+ "datafeeder.validation.csv.quote.none": "None",
17972
+ "datafeeder.validation.csv.quote.simple": "Simple quote",
17973
+ "datafeeder.validation.csv.quoteChar": "Quote separator",
17832
17974
  "datafeeder.validation.encoding": "encoding",
17833
17975
  "datafeeder.validation.extent.title": "Here is the dataset extent",
17834
17976
  "datafeeder.validation.extent.title.unknown": "The projection system is unknown",
@@ -17842,7 +17984,7 @@ var en = {
17842
17984
  "datahub.header.lastRecords": "The latest",
17843
17985
  "datahub.header.myfavorites": "My favorites",
17844
17986
  "datahub.header.news": "Home",
17845
- "datahub.header.organisations": "Organisations",
17987
+ "datahub.header.organizations": "Organizations",
17846
17988
  "datahub.header.popularRecords": "The most popular",
17847
17989
  "datahub.header.title.html": "<div class=\"text-white\">Discover open<br> data from my Organization</div>",
17848
17990
  "datahub.news.contact.contactus": "Contact us",
@@ -17878,7 +18020,26 @@ var en = {
17878
18020
  "downloads.format.unknown": "unknown",
17879
18021
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17880
18022
  dropFile: dropFile$5,
17881
- "editor.record.form.license": "License",
18023
+ "editor.record.delete.confirmation.cancelText": "Cancel",
18024
+ "editor.record.delete.confirmation.confirmText": "Delete",
18025
+ "editor.record.delete.confirmation.message": "Are you sure you want to delete this record?",
18026
+ "editor.record.delete.confirmation.title": "Delete record?",
18027
+ "editor.record.deleteError.body": "The record could not be deleted:",
18028
+ "editor.record.deleteError.closeMessage": "Understood",
18029
+ "editor.record.deleteError.title": "Error deleting record",
18030
+ "editor.record.form.bottomButtons.comeBackLater": "Come back later",
18031
+ "editor.record.form.bottomButtons.next": "Next",
18032
+ "editor.record.form.bottomButtons.previous": "Previous",
18033
+ "editor.record.form.field.abstract": "Abstract",
18034
+ "editor.record.form.field.keywords": "Keywords",
18035
+ "editor.record.form.field.license": "License",
18036
+ "editor.record.form.field.overviews": "Overviews",
18037
+ "editor.record.form.field.recordUpdated": "Record Updated",
18038
+ "editor.record.form.field.resourceUpdated": "Resource Updated",
18039
+ "editor.record.form.field.temporalExtents": "Temporal extents",
18040
+ "editor.record.form.field.title": "Metadata title",
18041
+ "editor.record.form.field.uniqueIdentifier": "Unique identifier",
18042
+ "editor.record.form.field.updateFrequency": "Update frequency",
17882
18043
  "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17883
18044
  "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17884
18045
  "editor.record.form.license.cc-zero": "Creative Commons CC-0",
@@ -17888,13 +18049,26 @@ var en = {
17888
18049
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17889
18050
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
17890
18051
  "editor.record.form.license.unknown": "Unknown or absent",
17891
- "editor.record.form.resourceUpdated": "Last update date",
17892
- "editor.record.form.temporalExtents": "Temporal extent",
18052
+ "editor.record.form.page.accessAndContact": "Access and contact",
18053
+ "editor.record.form.page.description": "Resource description",
18054
+ "editor.record.form.page.ressources": "Resources",
18055
+ "editor.record.form.section.about.description": "This section describes the resource.",
18056
+ "editor.record.form.section.about.label": "About the resource",
18057
+ "editor.record.form.section.annexes.label": "Annexes",
18058
+ "editor.record.form.section.associatedResources.description": "Drop files here to associate them with the resource.",
18059
+ "editor.record.form.section.associatedResources.label": "Associated resources",
18060
+ "editor.record.form.section.classification.description": "The classification has an impact on the access to the data.",
18061
+ "editor.record.form.section.classification.label": "Classification",
18062
+ "editor.record.form.section.dataManagers.description": "The data managers are responsible for the data.",
18063
+ "editor.record.form.section.dataManagers.label": "Data managers",
18064
+ "editor.record.form.section.dataPointOfContact.description": "This information concerns the metadata.",
18065
+ "editor.record.form.section.dataPointOfContact.label": "Data point of contact",
18066
+ "editor.record.form.section.geographicalCoverage.label": "Geographical coverage",
18067
+ "editor.record.form.section.useAndAccessConditions.label": "Use and access conditions",
17893
18068
  "editor.record.form.temporalExtents.addDate": "Time instant",
17894
18069
  "editor.record.form.temporalExtents.addRange": "Time period",
17895
18070
  "editor.record.form.temporalExtents.date": "Date",
17896
18071
  "editor.record.form.temporalExtents.range": "Date range",
17897
- "editor.record.form.updateFrequency": "Update frequency",
17898
18072
  "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
17899
18073
  "editor.record.loadError.body": "The record could not be loaded:",
17900
18074
  "editor.record.loadError.closeMessage": "Understood",
@@ -17909,6 +18083,7 @@ var en = {
17909
18083
  "editor.record.saveStatus.draftWithChangesPending": "Saved as draft - changes are pending",
17910
18084
  "editor.record.saveStatus.recordUpToDate": "Record is up to date",
17911
18085
  "editor.record.upToDate": "This record is up to date",
18086
+ "editor.sidebar.menu.editor": "Editor",
17912
18087
  "externalviewer.dataset.unnamed": "Datahub layer",
17913
18088
  "facets.block.title.OrgForResource": "Organisation",
17914
18089
  "facets.block.title.availableInServices": "Available for",
@@ -17977,17 +18152,17 @@ var en = {
17977
18152
  "organisations.sortBy.nameDesc": "Name Z → A",
17978
18153
  "organisations.sortBy.recordCountAsc": "Publications 0 → 9",
17979
18154
  "organisations.sortBy.recordCountDesc": "Publications 9 → 0",
17980
- "organization.header.recordCount": "{count, plural, =0{data} one{data} other{datas}}",
17981
- "organization.details.publishedDataset": "{count, plural, =0{published dataset} one{published dataset} other{published datasets}}",
18155
+ "organization.details.lastPublishedDatasets": "",
18156
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
17982
18157
  "organization.details.mailContact": "Contact by email",
17983
- "organization.datasets": "Datasets",
17984
- "organization.lastPublishedDatasets": "Last published datasets",
17985
- "organization.lastPublishedDatasets.searchAllButton": "Search all",
18158
+ "organization.header.recordCount": "{count, plural, =0{data} one{data} other{datas}}",
17986
18159
  "pagination.nextPage": "Next page",
17987
18160
  "pagination.page": "page",
17988
18161
  "pagination.pageOf": "of",
17989
18162
  previous: previous$5,
18163
+ "record.action.delete": "Delete",
17990
18164
  "record.action.download": "Download",
18165
+ "record.action.duplicate": "Duplicate",
17991
18166
  "record.action.view": "View",
17992
18167
  "record.externalViewer.open": "Open in the external map viewer",
17993
18168
  "record.metadata.about": "Description",
@@ -18080,11 +18255,11 @@ var en = {
18080
18255
  "results.sortBy.relevancy": "Relevancy",
18081
18256
  "search.autocomplete.error": "Suggestions could not be fetched:",
18082
18257
  "search.error.couldNotReachApi": "The API could not be reached",
18258
+ "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
18259
+ "search.error.organizationNotFound": "This organization could not be found.",
18083
18260
  "search.error.receivedError": "An error was received",
18084
18261
  "search.error.recordHasnolink": "This record currently has no link yet, please come back later.",
18085
18262
  "search.error.recordNotFound": "The record with identifier \"{ id }\" could not be found.",
18086
- "search.error.organizationNotFound": "This organization could not be found.",
18087
- "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
18088
18263
  "search.field.any.placeholder": "Search datasets ...",
18089
18264
  "search.field.sortBy": "Sort by:",
18090
18265
  "search.filters.clear": "Reset",
@@ -18109,14 +18284,16 @@ var en = {
18109
18284
  "search.filters.minimize": "Minimize",
18110
18285
  "search.filters.myRecords": "Show only my records",
18111
18286
  "search.filters.myRecordsHelp": "When this is enabled, records only created by myself are shown; records created by others will not show up.",
18287
+ "search.filters.organization": "Organization",
18112
18288
  "search.filters.otherRecords": "Showing records from another person",
18289
+ "search.filters.producerOrg": "Producer",
18113
18290
  "search.filters.publicationYear": "Publication year",
18114
- "search.filters.publisher": "Organizations",
18291
+ "search.filters.publisherOrg": "Publisher",
18115
18292
  "search.filters.representationType": "Representation type",
18116
18293
  "search.filters.resourceType": "Resource type",
18117
18294
  "search.filters.standard": "Standard",
18118
18295
  "search.filters.title": "Filter your results",
18119
- "search.filters.topic": "Topic",
18296
+ "search.filters.topic": "Topics",
18120
18297
  "search.filters.useSpatialFilter": "Show records in the area of interest first",
18121
18298
  "search.filters.useSpatialFilterHelp": "When this is enabled, records situated in the catalog's area of interest are shown first; records outside of this area will not show up.",
18122
18299
  "share.tab.permalink": "Share",
@@ -18192,6 +18369,8 @@ var es = {
18192
18369
  "datafeeder.datasetValidation.submitButton": "",
18193
18370
  "datafeeder.datasetValidation.title": "",
18194
18371
  "datafeeder.datasetValidation.unknown": "",
18372
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
18373
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
18195
18374
  "datafeeder.form.abstract": "",
18196
18375
  "datafeeder.form.datepicker": "",
18197
18376
  "datafeeder.form.description": "",
@@ -18219,6 +18398,7 @@ var es = {
18219
18398
  "datafeeder.publishSuccess.geonetworkRecord": "",
18220
18399
  "datafeeder.publishSuccess.illustration.title": "",
18221
18400
  "datafeeder.publishSuccess.mapViewer": "",
18401
+ "datafeeder.publishSuccess.ogcFeature": "",
18222
18402
  "datafeeder.publishSuccess.subtitle": "",
18223
18403
  "datafeeder.publishSuccess.title": "",
18224
18404
  "datafeeder.publishSuccess.uploadAnotherData": "",
@@ -18247,6 +18427,15 @@ var es = {
18247
18427
  "datafeeder.upload.maxFileSize": "",
18248
18428
  "datafeeder.upload.title": "",
18249
18429
  "datafeeder.upload.uploadButton": "",
18430
+ "datafeeder.validation.csv.delimiter": "",
18431
+ "datafeeder.validation.csv.delimiter.comma": "Coma",
18432
+ "datafeeder.validation.csv.delimiter.semicolon": "Punto y coma",
18433
+ "datafeeder.validation.csv.lat.field": "",
18434
+ "datafeeder.validation.csv.lng.field": "",
18435
+ "datafeeder.validation.csv.quote.double": "Comillas dobles",
18436
+ "datafeeder.validation.csv.quote.none": "Ninguno",
18437
+ "datafeeder.validation.csv.quote.simple": "Comillas simples",
18438
+ "datafeeder.validation.csv.quoteChar": "",
18250
18439
  "datafeeder.validation.encoding": "",
18251
18440
  "datafeeder.validation.extent.title": "",
18252
18441
  "datafeeder.validation.extent.title.unknown": "",
@@ -18260,7 +18449,7 @@ var es = {
18260
18449
  "datahub.header.lastRecords": "",
18261
18450
  "datahub.header.myfavorites": "",
18262
18451
  "datahub.header.news": "",
18263
- "datahub.header.organisations": "",
18452
+ "datahub.header.organizations": "",
18264
18453
  "datahub.header.popularRecords": "",
18265
18454
  "datahub.header.title.html": "",
18266
18455
  "datahub.news.contact.contactus": "",
@@ -18296,7 +18485,26 @@ var es = {
18296
18485
  "downloads.format.unknown": "",
18297
18486
  "downloads.wfs.featuretype.not.found": "",
18298
18487
  dropFile: dropFile$4,
18299
- "editor.record.form.license": "",
18488
+ "editor.record.delete.confirmation.cancelText": "",
18489
+ "editor.record.delete.confirmation.confirmText": "",
18490
+ "editor.record.delete.confirmation.message": "",
18491
+ "editor.record.delete.confirmation.title": "",
18492
+ "editor.record.deleteError.body": "",
18493
+ "editor.record.deleteError.closeMessage": "",
18494
+ "editor.record.deleteError.title": "",
18495
+ "editor.record.form.bottomButtons.comeBackLater": "",
18496
+ "editor.record.form.bottomButtons.next": "",
18497
+ "editor.record.form.bottomButtons.previous": "",
18498
+ "editor.record.form.field.abstract": "",
18499
+ "editor.record.form.field.keywords": "",
18500
+ "editor.record.form.field.license": "",
18501
+ "editor.record.form.field.overviews": "",
18502
+ "editor.record.form.field.recordUpdated": "",
18503
+ "editor.record.form.field.resourceUpdated": "",
18504
+ "editor.record.form.field.temporalExtents": "",
18505
+ "editor.record.form.field.title": "",
18506
+ "editor.record.form.field.uniqueIdentifier": "",
18507
+ "editor.record.form.field.updateFrequency": "",
18300
18508
  "editor.record.form.license.cc-by": "",
18301
18509
  "editor.record.form.license.cc-by-sa": "",
18302
18510
  "editor.record.form.license.cc-zero": "",
@@ -18306,13 +18514,26 @@ var es = {
18306
18514
  "editor.record.form.license.odc-by": "",
18307
18515
  "editor.record.form.license.pddl": "",
18308
18516
  "editor.record.form.license.unknown": "",
18309
- "editor.record.form.resourceUpdated": "",
18310
- "editor.record.form.temporalExtents": "",
18517
+ "editor.record.form.page.accessAndContact": "",
18518
+ "editor.record.form.page.description": "",
18519
+ "editor.record.form.page.ressources": "",
18520
+ "editor.record.form.section.about.description": "",
18521
+ "editor.record.form.section.about.label": "",
18522
+ "editor.record.form.section.annexes.label": "",
18523
+ "editor.record.form.section.associatedResources.description": "",
18524
+ "editor.record.form.section.associatedResources.label": "",
18525
+ "editor.record.form.section.classification.description": "",
18526
+ "editor.record.form.section.classification.label": "",
18527
+ "editor.record.form.section.dataManagers.description": "",
18528
+ "editor.record.form.section.dataManagers.label": "",
18529
+ "editor.record.form.section.dataPointOfContact.description": "",
18530
+ "editor.record.form.section.dataPointOfContact.label": "",
18531
+ "editor.record.form.section.geographicalCoverage.label": "",
18532
+ "editor.record.form.section.useAndAccessConditions.label": "",
18311
18533
  "editor.record.form.temporalExtents.addDate": "",
18312
18534
  "editor.record.form.temporalExtents.addRange": "",
18313
18535
  "editor.record.form.temporalExtents.date": "",
18314
18536
  "editor.record.form.temporalExtents.range": "",
18315
- "editor.record.form.updateFrequency": "",
18316
18537
  "editor.record.form.updateFrequency.planned": "",
18317
18538
  "editor.record.loadError.body": "",
18318
18539
  "editor.record.loadError.closeMessage": "",
@@ -18327,6 +18548,7 @@ var es = {
18327
18548
  "editor.record.saveStatus.draftWithChangesPending": "",
18328
18549
  "editor.record.saveStatus.recordUpToDate": "",
18329
18550
  "editor.record.upToDate": "",
18551
+ "editor.sidebar.menu.editor": "",
18330
18552
  "externalviewer.dataset.unnamed": "",
18331
18553
  "facets.block.title.OrgForResource": "",
18332
18554
  "facets.block.title.availableInServices": "",
@@ -18395,17 +18617,17 @@ var es = {
18395
18617
  "organisations.sortBy.nameDesc": "",
18396
18618
  "organisations.sortBy.recordCountAsc": "",
18397
18619
  "organisations.sortBy.recordCountDesc": "",
18398
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
18399
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
18620
+ "organization.details.lastPublishedDatasets": "",
18621
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
18400
18622
  "organization.details.mailContact": "",
18401
- "organization.datasets": "",
18402
- "organization.lastPublishedDatasets": "",
18403
- "organization.lastPublishedDatasets.searchAllButton": "",
18623
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
18404
18624
  "pagination.nextPage": "",
18405
18625
  "pagination.page": "",
18406
18626
  "pagination.pageOf": "",
18407
18627
  previous: previous$4,
18628
+ "record.action.delete": "",
18408
18629
  "record.action.download": "",
18630
+ "record.action.duplicate": "",
18409
18631
  "record.action.view": "",
18410
18632
  "record.externalViewer.open": "",
18411
18633
  "record.metadata.about": "",
@@ -18498,11 +18720,11 @@ var es = {
18498
18720
  "results.sortBy.relevancy": "",
18499
18721
  "search.autocomplete.error": "",
18500
18722
  "search.error.couldNotReachApi": "",
18723
+ "search.error.organizationHasNoDataset": "",
18724
+ "search.error.organizationNotFound": "",
18501
18725
  "search.error.receivedError": "",
18502
18726
  "search.error.recordHasnolink": "",
18503
18727
  "search.error.recordNotFound": "",
18504
- "search.error.organizationNotFound": "",
18505
- "search.error.organizationHasNoDataset": "",
18506
18728
  "search.field.any.placeholder": "",
18507
18729
  "search.field.sortBy": "",
18508
18730
  "search.filters.clear": "",
@@ -18527,9 +18749,11 @@ var es = {
18527
18749
  "search.filters.minimize": "",
18528
18750
  "search.filters.myRecords": "",
18529
18751
  "search.filters.myRecordsHelp": "",
18752
+ "search.filters.organization": "",
18530
18753
  "search.filters.otherRecords": "",
18754
+ "search.filters.producerOrg": "",
18531
18755
  "search.filters.publicationYear": "",
18532
- "search.filters.publisher": "",
18756
+ "search.filters.publisherOrg": "",
18533
18757
  "search.filters.representationType": "",
18534
18758
  "search.filters.resourceType": "",
18535
18759
  "search.filters.standard": "",
@@ -18610,6 +18834,8 @@ var fr = {
18610
18834
  "datafeeder.datasetValidation.submitButton": "OK, mes données sont correctes",
18611
18835
  "datafeeder.datasetValidation.title": "Vérifiez que vos données sont correctes",
18612
18836
  "datafeeder.datasetValidation.unknown": " - ",
18837
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "*Le tableau doit afficher les 5 premières lignes (hors en-tête)<br>Si ce n'est pas le cas, vérifier que le fichier est bien formatté",
18838
+ "datafeeder.datasetValidationCsv.lineNumbers": "Résumé des 5 premières lignes* du CSV :",
18613
18839
  "datafeeder.form.abstract": "Comment décrire votre jeu de données ?",
18614
18840
  "datafeeder.form.datepicker": "Savez-vous quand la donnée a été créée ?",
18615
18841
  "datafeeder.form.description": "Enfin, décrivez le processus utilisé pour créer la donnée",
@@ -18636,7 +18862,8 @@ var fr = {
18636
18862
  "datafeeder.publish.upload": "Upload maintenant",
18637
18863
  "datafeeder.publishSuccess.geonetworkRecord": "Fiche de métadonnée",
18638
18864
  "datafeeder.publishSuccess.illustration.title": "Terminé, tout s'est bien passé !",
18639
- "datafeeder.publishSuccess.mapViewer": "Visualisateur",
18865
+ "datafeeder.publishSuccess.mapViewer": "Visualiseur",
18866
+ "datafeeder.publishSuccess.ogcFeature": "OGC API",
18640
18867
  "datafeeder.publishSuccess.subtitle": "Visualisez vos données :",
18641
18868
  "datafeeder.publishSuccess.title": "Félicitations! \n Vos données ont été publiées",
18642
18869
  "datafeeder.publishSuccess.uploadAnotherData": "Importer une autre donnée",
@@ -18665,6 +18892,15 @@ var fr = {
18665
18892
  "datafeeder.upload.maxFileSize": "La taille maximale est {size} Mo",
18666
18893
  "datafeeder.upload.title": "Importez vos données",
18667
18894
  "datafeeder.upload.uploadButton": "Transférer",
18895
+ "datafeeder.validation.csv.delimiter": "Séparateur de colonne",
18896
+ "datafeeder.validation.csv.delimiter.comma": "Virgule",
18897
+ "datafeeder.validation.csv.delimiter.semicolon": "Point-virgule",
18898
+ "datafeeder.validation.csv.lat.field": "Colonne latitude",
18899
+ "datafeeder.validation.csv.lng.field": "Colonne longitude",
18900
+ "datafeeder.validation.csv.quote.double": "Double guillemets",
18901
+ "datafeeder.validation.csv.quote.none": "Aucun",
18902
+ "datafeeder.validation.csv.quote.simple": "Simple guillemet",
18903
+ "datafeeder.validation.csv.quoteChar": "Séparateur de texte",
18668
18904
  "datafeeder.validation.encoding": "encodage",
18669
18905
  "datafeeder.validation.extent.title": "Voici l'emprise du jeu de données",
18670
18906
  "datafeeder.validation.extent.title.unknown": "Le système de projection est inconnu",
@@ -18678,7 +18914,7 @@ var fr = {
18678
18914
  "datahub.header.lastRecords": "Les plus récentes",
18679
18915
  "datahub.header.myfavorites": "Mes favoris",
18680
18916
  "datahub.header.news": "Accueil",
18681
- "datahub.header.organisations": "Organisations",
18917
+ "datahub.header.organizations": "Organisations",
18682
18918
  "datahub.header.popularRecords": "Les plus appréciées",
18683
18919
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
18684
18920
  "datahub.news.contact.contactus": "Contactez-nous",
@@ -18714,7 +18950,26 @@ var fr = {
18714
18950
  "downloads.format.unknown": "inconnu",
18715
18951
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
18716
18952
  dropFile: dropFile$3,
18717
- "editor.record.form.license": "Licence",
18953
+ "editor.record.delete.confirmation.cancelText": "Annuler",
18954
+ "editor.record.delete.confirmation.confirmText": "Supprimer",
18955
+ "editor.record.delete.confirmation.message": "Etes-vous sûr de vouloir supprimer cette fiche ?",
18956
+ "editor.record.delete.confirmation.title": "Supprimer la fiche",
18957
+ "editor.record.deleteError.body": "La fiche n'a pas pu être supprimée :",
18958
+ "editor.record.deleteError.closeMessage": "Compris",
18959
+ "editor.record.deleteError.title": "Erreur lors de la suppression",
18960
+ "editor.record.form.bottomButtons.comeBackLater": "Revenir plus tard",
18961
+ "editor.record.form.bottomButtons.next": "Suivant",
18962
+ "editor.record.form.bottomButtons.previous": "Précédent",
18963
+ "editor.record.form.field.abstract": "Résumé",
18964
+ "editor.record.form.field.keywords": "Mots-clés",
18965
+ "editor.record.form.field.license": "Licence",
18966
+ "editor.record.form.field.overviews": "Aperçus",
18967
+ "editor.record.form.field.recordUpdated": "Date de dernière révision",
18968
+ "editor.record.form.field.resourceUpdated": "Date de dernière révision",
18969
+ "editor.record.form.field.temporalExtents": "Étendue temporelle",
18970
+ "editor.record.form.field.title": "Titre",
18971
+ "editor.record.form.field.uniqueIdentifier": "Identifiant unique",
18972
+ "editor.record.form.field.updateFrequency": "Fréquence de mise à jour",
18718
18973
  "editor.record.form.license.cc-by": "",
18719
18974
  "editor.record.form.license.cc-by-sa": "",
18720
18975
  "editor.record.form.license.cc-zero": "",
@@ -18724,27 +18979,41 @@ var fr = {
18724
18979
  "editor.record.form.license.odc-by": "",
18725
18980
  "editor.record.form.license.pddl": "",
18726
18981
  "editor.record.form.license.unknown": "Non-reconnue ou absente",
18727
- "editor.record.form.resourceUpdated": "Date de dernière révision",
18728
- "editor.record.form.temporalExtents": "Étendue temporelle",
18982
+ "editor.record.form.page.accessAndContact": "Acces et contact",
18983
+ "editor.record.form.page.description": "Description de la ressource",
18984
+ "editor.record.form.page.ressources": "Ressources",
18985
+ "editor.record.form.section.about.description": "Ces informations concernent la donnée.",
18986
+ "editor.record.form.section.about.label": "A propos de la ressource",
18987
+ "editor.record.form.section.annexes.label": "Annexes",
18988
+ "editor.record.form.section.associatedResources.description": "Déposez les jeux de données associées à cette fiche de métadonnée.",
18989
+ "editor.record.form.section.associatedResources.label": "Ressources associees",
18990
+ "editor.record.form.section.classification.description": "La classification a un impact sur la recherche du jeux de données.",
18991
+ "editor.record.form.section.classification.label": "Classification",
18992
+ "editor.record.form.section.dataManagers.description": "Cette information concerne la donnée.",
18993
+ "editor.record.form.section.dataManagers.label": "Responsables de la donnee",
18994
+ "editor.record.form.section.dataPointOfContact.description": "Cette information concerne la fiche de métadonnée.",
18995
+ "editor.record.form.section.dataPointOfContact.label": "Point de contact de la metadonee",
18996
+ "editor.record.form.section.geographicalCoverage.label": "Couverture geographique",
18997
+ "editor.record.form.section.useAndAccessConditions.label": "Conditions d'acces et usage",
18729
18998
  "editor.record.form.temporalExtents.addDate": "Date déterminée",
18730
18999
  "editor.record.form.temporalExtents.addRange": "Période de temps",
18731
19000
  "editor.record.form.temporalExtents.date": "Date concernée",
18732
19001
  "editor.record.form.temporalExtents.range": "Période concernée",
18733
- "editor.record.form.updateFrequency": "Fréquence de mise à jour",
18734
19002
  "editor.record.form.updateFrequency.planned": "Ces données doivent être mise à jour régulièrement.",
18735
- "editor.record.loadError.body": "",
18736
- "editor.record.loadError.closeMessage": "",
18737
- "editor.record.loadError.title": "",
18738
- "editor.record.publish": "",
18739
- "editor.record.publishError.body": "",
18740
- "editor.record.publishError.closeMessage": "",
18741
- "editor.record.publishError.title": "",
18742
- "editor.record.publishSuccess.body": "",
18743
- "editor.record.publishSuccess.title": "",
19003
+ "editor.record.loadError.body": "La fiche n'a pas pu être chargée :",
19004
+ "editor.record.loadError.closeMessage": "Compris",
19005
+ "editor.record.loadError.title": "Erreur lors du chargement",
19006
+ "editor.record.publish": "Publier cette fiche",
19007
+ "editor.record.publishError.body": "La fiche n'a pas pu être publiée :",
19008
+ "editor.record.publishError.closeMessage": "Compris",
19009
+ "editor.record.publishError.title": "Erreur lors de la publication",
19010
+ "editor.record.publishSuccess.body": "La fiche a bien été publiée !",
19011
+ "editor.record.publishSuccess.title": "Publication réussie",
18744
19012
  "editor.record.saveStatus.asDraftOnly": "Brouillon enregistré - fiche non publiée",
18745
19013
  "editor.record.saveStatus.draftWithChangesPending": "Brouillon enregistré - modifications en cours",
18746
19014
  "editor.record.saveStatus.recordUpToDate": "La fiche publiée est à jour",
18747
19015
  "editor.record.upToDate": "",
19016
+ "editor.sidebar.menu.editor": "",
18748
19017
  "externalviewer.dataset.unnamed": "Couche du datahub",
18749
19018
  "facets.block.title.OrgForResource": "Organisation",
18750
19019
  "facets.block.title.availableInServices": "Disponible pour",
@@ -18813,17 +19082,17 @@ var fr = {
18813
19082
  "organisations.sortBy.nameDesc": "Nom Z → A",
18814
19083
  "organisations.sortBy.recordCountAsc": "Données 0 → 9",
18815
19084
  "organisations.sortBy.recordCountDesc": "Données 9 → 0",
18816
- "organization.header.recordCount": "{count, plural, =0{donnée} one{donnée} other{données}}",
18817
- "organization.details.publishedDataset": "{count, plural, =0{donnée publiée} one{donnée publiée} other{données publiées}}",
19085
+ "organization.details.lastPublishedDatasets": "",
19086
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
18818
19087
  "organization.details.mailContact": "Contacter par mail",
18819
- "organization.datasets": "Données",
18820
- "organization.lastPublishedDatasets": "Dernières données publiées",
18821
- "organization.lastPublishedDatasets.searchAllButton": "Rechercher tous",
19088
+ "organization.header.recordCount": "{count, plural, =0{donnée} one{donnée} other{données}}",
18822
19089
  "pagination.nextPage": "Page suivante",
18823
19090
  "pagination.page": "page",
18824
19091
  "pagination.pageOf": "sur",
18825
19092
  previous: previous$3,
19093
+ "record.action.delete": "Supprimer",
18826
19094
  "record.action.download": "Télécharger",
19095
+ "record.action.duplicate": "Dupliquer",
18827
19096
  "record.action.view": "Voir",
18828
19097
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
18829
19098
  "record.metadata.about": "Description",
@@ -18916,11 +19185,11 @@ var fr = {
18916
19185
  "results.sortBy.relevancy": "Pertinence",
18917
19186
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
18918
19187
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
19188
+ "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
19189
+ "search.error.organizationNotFound": "L'organisation n'a pas pu être trouvée.",
18919
19190
  "search.error.receivedError": "Erreur retournée",
18920
19191
  "search.error.recordHasnolink": "Ce dataset n'a pas encore de lien, réessayez plus tard s'il vous plaît.",
18921
19192
  "search.error.recordNotFound": "Cette donnée n'a pu être trouvée.",
18922
- "search.error.organizationNotFound": "L'organisation n'a pas pu être trouvée.",
18923
- "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
18924
19193
  "search.field.any.placeholder": "Rechercher une donnée...",
18925
19194
  "search.field.sortBy": "Trier par :",
18926
19195
  "search.filters.clear": "Réinitialiser",
@@ -18945,14 +19214,16 @@ var fr = {
18945
19214
  "search.filters.minimize": "Réduire",
18946
19215
  "search.filters.myRecords": "Voir mes données",
18947
19216
  "search.filters.myRecordsHelp": "Quand activé, n'affiche que les données créées avec mon utilisateur. Les données créées par les autres utilisateurs ne sont pas affichées.",
19217
+ "search.filters.organization": "Organisation",
18948
19218
  "search.filters.otherRecords": "Affichage des données d'un autre utilisateur",
19219
+ "search.filters.producerOrg": "Producteur",
18949
19220
  "search.filters.publicationYear": "Année de publication",
18950
- "search.filters.publisher": "Organisations",
19221
+ "search.filters.publisherOrg": "Distributeur",
18951
19222
  "search.filters.representationType": "Type de représentation",
18952
19223
  "search.filters.resourceType": "Type de ressource",
18953
19224
  "search.filters.standard": "Standard",
18954
19225
  "search.filters.title": "Affiner votre recherche",
18955
- "search.filters.topic": "Thème",
19226
+ "search.filters.topic": "Thèmes",
18956
19227
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
18957
19228
  "search.filters.useSpatialFilterHelp": "Si cette option est activée, les fiches portant sur la zone d'intérêt du catalogue seront montrées en premier; les fiches en dehors de cette zone n'apparaîtront pas dans les résultats.",
18958
19229
  "share.tab.permalink": "Partager",
@@ -19028,6 +19299,8 @@ var it = {
19028
19299
  "datafeeder.datasetValidation.submitButton": "OK, i miei dati sono corretti",
19029
19300
  "datafeeder.datasetValidation.title": "Controllare che i dati siano corretti",
19030
19301
  "datafeeder.datasetValidation.unknown": " - ",
19302
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
19303
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
19031
19304
  "datafeeder.form.abstract": "Come descrivere il suo dataset?",
19032
19305
  "datafeeder.form.datepicker": "Sa quando è stato creato il suo dataset ?",
19033
19306
  "datafeeder.form.description": "Infine, descrivere il processo utilizzato per creare il dataset",
@@ -19055,6 +19328,7 @@ var it = {
19055
19328
  "datafeeder.publishSuccess.geonetworkRecord": "Scheda di metadati",
19056
19329
  "datafeeder.publishSuccess.illustration.title": "Completato, tutto è andato bene!",
19057
19330
  "datafeeder.publishSuccess.mapViewer": "Visualizzatore",
19331
+ "datafeeder.publishSuccess.ogcFeature": "",
19058
19332
  "datafeeder.publishSuccess.subtitle": "Visualizzare i dati:",
19059
19333
  "datafeeder.publishSuccess.title": "Congratulazioni! \n I suoi dati sono stati pubblicati",
19060
19334
  "datafeeder.publishSuccess.uploadAnotherData": "Caricare un altro dato",
@@ -19083,6 +19357,15 @@ var it = {
19083
19357
  "datafeeder.upload.maxFileSize": "Dimensione massima: {size} MB",
19084
19358
  "datafeeder.upload.title": "Importa i suoi dati",
19085
19359
  "datafeeder.upload.uploadButton": "Carica",
19360
+ "datafeeder.validation.csv.delimiter": "",
19361
+ "datafeeder.validation.csv.delimiter.comma": "",
19362
+ "datafeeder.validation.csv.delimiter.semicolon": "",
19363
+ "datafeeder.validation.csv.lat.field": "",
19364
+ "datafeeder.validation.csv.lng.field": "",
19365
+ "datafeeder.validation.csv.quote.double": "",
19366
+ "datafeeder.validation.csv.quote.none": "",
19367
+ "datafeeder.validation.csv.quote.simple": "",
19368
+ "datafeeder.validation.csv.quoteChar": "",
19086
19369
  "datafeeder.validation.encoding": "Codifica",
19087
19370
  "datafeeder.validation.extent.title": "Ecco l'estensione del dataset",
19088
19371
  "datafeeder.validation.extent.title.unknown": "Sistema di proiezione sconosciuto",
@@ -19096,7 +19379,7 @@ var it = {
19096
19379
  "datahub.header.lastRecords": "Ultimi",
19097
19380
  "datahub.header.myfavorites": "Miei preferiti",
19098
19381
  "datahub.header.news": "Home",
19099
- "datahub.header.organisations": "Organizzazioni",
19382
+ "datahub.header.organizations": "Organizzazioni",
19100
19383
  "datahub.header.popularRecords": "Più popolari",
19101
19384
  "datahub.header.title.html": "<div class=\"text-white\">Tutti i dati<br>pubblici della mia organizzazione</div>",
19102
19385
  "datahub.news.contact.contactus": "Contattateci",
@@ -19132,7 +19415,26 @@ var it = {
19132
19415
  "downloads.format.unknown": "sconosciuto",
19133
19416
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
19134
19417
  dropFile: dropFile$2,
19135
- "editor.record.form.license": "Licenza",
19418
+ "editor.record.delete.confirmation.cancelText": "",
19419
+ "editor.record.delete.confirmation.confirmText": "",
19420
+ "editor.record.delete.confirmation.message": "",
19421
+ "editor.record.delete.confirmation.title": "",
19422
+ "editor.record.deleteError.body": "",
19423
+ "editor.record.deleteError.closeMessage": "",
19424
+ "editor.record.deleteError.title": "",
19425
+ "editor.record.form.bottomButtons.comeBackLater": "",
19426
+ "editor.record.form.bottomButtons.next": "",
19427
+ "editor.record.form.bottomButtons.previous": "",
19428
+ "editor.record.form.field.abstract": "",
19429
+ "editor.record.form.field.keywords": "",
19430
+ "editor.record.form.field.license": "Licenza",
19431
+ "editor.record.form.field.overviews": "",
19432
+ "editor.record.form.field.recordUpdated": "",
19433
+ "editor.record.form.field.resourceUpdated": "",
19434
+ "editor.record.form.field.temporalExtents": "",
19435
+ "editor.record.form.field.title": "",
19436
+ "editor.record.form.field.uniqueIdentifier": "",
19437
+ "editor.record.form.field.updateFrequency": "",
19136
19438
  "editor.record.form.license.cc-by": "",
19137
19439
  "editor.record.form.license.cc-by-sa": "",
19138
19440
  "editor.record.form.license.cc-zero": "",
@@ -19142,13 +19444,26 @@ var it = {
19142
19444
  "editor.record.form.license.odc-by": "",
19143
19445
  "editor.record.form.license.pddl": "",
19144
19446
  "editor.record.form.license.unknown": "Non riconosciuta o assente",
19145
- "editor.record.form.resourceUpdated": "",
19146
- "editor.record.form.temporalExtents": "",
19447
+ "editor.record.form.page.accessAndContact": "",
19448
+ "editor.record.form.page.description": "",
19449
+ "editor.record.form.page.ressources": "",
19450
+ "editor.record.form.section.about.description": "",
19451
+ "editor.record.form.section.about.label": "",
19452
+ "editor.record.form.section.annexes.label": "",
19453
+ "editor.record.form.section.associatedResources.description": "",
19454
+ "editor.record.form.section.associatedResources.label": "",
19455
+ "editor.record.form.section.classification.description": "",
19456
+ "editor.record.form.section.classification.label": "",
19457
+ "editor.record.form.section.dataManagers.description": "",
19458
+ "editor.record.form.section.dataManagers.label": "",
19459
+ "editor.record.form.section.dataPointOfContact.description": "",
19460
+ "editor.record.form.section.dataPointOfContact.label": "",
19461
+ "editor.record.form.section.geographicalCoverage.label": "",
19462
+ "editor.record.form.section.useAndAccessConditions.label": "",
19147
19463
  "editor.record.form.temporalExtents.addDate": "",
19148
19464
  "editor.record.form.temporalExtents.addRange": "",
19149
19465
  "editor.record.form.temporalExtents.date": "",
19150
19466
  "editor.record.form.temporalExtents.range": "",
19151
- "editor.record.form.updateFrequency": "",
19152
19467
  "editor.record.form.updateFrequency.planned": "",
19153
19468
  "editor.record.loadError.body": "",
19154
19469
  "editor.record.loadError.closeMessage": "",
@@ -19163,6 +19478,7 @@ var it = {
19163
19478
  "editor.record.saveStatus.draftWithChangesPending": "",
19164
19479
  "editor.record.saveStatus.recordUpToDate": "",
19165
19480
  "editor.record.upToDate": "",
19481
+ "editor.sidebar.menu.editor": "",
19166
19482
  "externalviewer.dataset.unnamed": "Layer del datahub",
19167
19483
  "facets.block.title.OrgForResource": "Organizzazione",
19168
19484
  "facets.block.title.availableInServices": "Disponibile per",
@@ -19231,17 +19547,17 @@ var it = {
19231
19547
  "organisations.sortBy.nameDesc": "Nome Z → A",
19232
19548
  "organisations.sortBy.recordCountAsc": "Dati 0 → 9",
19233
19549
  "organisations.sortBy.recordCountDesc": "Dati 9 → 0",
19234
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19235
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
19550
+ "organization.details.lastPublishedDatasets": "",
19551
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
19236
19552
  "organization.details.mailContact": "",
19237
- "organization.datasets": "",
19238
- "organization.lastPublishedDatasets": "",
19239
- "organization.lastPublishedDatasets.searchAllButton": "",
19553
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19240
19554
  "pagination.nextPage": "Pagina successiva",
19241
19555
  "pagination.page": "pagina",
19242
19556
  "pagination.pageOf": "di",
19243
19557
  previous: previous$2,
19558
+ "record.action.delete": "",
19244
19559
  "record.action.download": "Scarica",
19560
+ "record.action.duplicate": "",
19245
19561
  "record.action.view": "Visualizza",
19246
19562
  "record.externalViewer.open": "Apri nell'visualizzatore esterno",
19247
19563
  "record.metadata.about": "Descrizione",
@@ -19334,11 +19650,11 @@ var it = {
19334
19650
  "results.sortBy.relevancy": "Rilevanza",
19335
19651
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
19336
19652
  "search.error.couldNotReachApi": "Problema di connessione all'API",
19653
+ "search.error.organizationHasNoDataset": "",
19654
+ "search.error.organizationNotFound": "",
19337
19655
  "search.error.receivedError": "Errore ricevuto",
19338
19656
  "search.error.recordHasnolink": "",
19339
19657
  "search.error.recordNotFound": "Impossibile trovare questo dato",
19340
- "search.error.organizationNotFound": "",
19341
- "search.error.organizationHasNoDataset": "",
19342
19658
  "search.field.any.placeholder": "Cerca un dato...",
19343
19659
  "search.field.sortBy": "Ordina per:",
19344
19660
  "search.filters.clear": "Ripristina",
@@ -19363,14 +19679,16 @@ var it = {
19363
19679
  "search.filters.minimize": "Riduci",
19364
19680
  "search.filters.myRecords": "Visualizza i miei dati",
19365
19681
  "search.filters.myRecordsHelp": "Quando attivato, mostra solo i dati creati con il mio utente. I dati creati da altri utenti non sono visualizzati.",
19682
+ "search.filters.organization": "",
19366
19683
  "search.filters.otherRecords": "Visualizzazione dei dati di un altro utente",
19684
+ "search.filters.producerOrg": "",
19367
19685
  "search.filters.publicationYear": "Anno di pubblicazione",
19368
- "search.filters.publisher": "Organizzazioni",
19686
+ "search.filters.publisherOrg": "",
19369
19687
  "search.filters.representationType": "Tipo di rappresentazione",
19370
19688
  "search.filters.resourceType": "Tipo di risorsa",
19371
19689
  "search.filters.standard": "Standard",
19372
19690
  "search.filters.title": "Affina la sua ricerca",
19373
- "search.filters.topic": "Argomento",
19691
+ "search.filters.topic": "Argomenti",
19374
19692
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
19375
19693
  "search.filters.useSpatialFilterHelp": "Se attivata, le schede relative all'area di interesse del catalogo saranno mostrate per prime; le schede al di fuori di questa area non appariranno nei risultati.",
19376
19694
  "share.tab.permalink": "Condividere",
@@ -19446,6 +19764,8 @@ var nl = {
19446
19764
  "datafeeder.datasetValidation.submitButton": "",
19447
19765
  "datafeeder.datasetValidation.title": "",
19448
19766
  "datafeeder.datasetValidation.unknown": "",
19767
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
19768
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
19449
19769
  "datafeeder.form.abstract": "",
19450
19770
  "datafeeder.form.datepicker": "",
19451
19771
  "datafeeder.form.description": "",
@@ -19473,6 +19793,7 @@ var nl = {
19473
19793
  "datafeeder.publishSuccess.geonetworkRecord": "",
19474
19794
  "datafeeder.publishSuccess.illustration.title": "",
19475
19795
  "datafeeder.publishSuccess.mapViewer": "",
19796
+ "datafeeder.publishSuccess.ogcFeature": "",
19476
19797
  "datafeeder.publishSuccess.subtitle": "",
19477
19798
  "datafeeder.publishSuccess.title": "",
19478
19799
  "datafeeder.publishSuccess.uploadAnotherData": "",
@@ -19501,6 +19822,15 @@ var nl = {
19501
19822
  "datafeeder.upload.maxFileSize": "",
19502
19823
  "datafeeder.upload.title": "",
19503
19824
  "datafeeder.upload.uploadButton": "",
19825
+ "datafeeder.validation.csv.delimiter": "",
19826
+ "datafeeder.validation.csv.delimiter.comma": "",
19827
+ "datafeeder.validation.csv.delimiter.semicolon": "",
19828
+ "datafeeder.validation.csv.lat.field": "",
19829
+ "datafeeder.validation.csv.lng.field": "",
19830
+ "datafeeder.validation.csv.quote.double": "",
19831
+ "datafeeder.validation.csv.quote.none": "",
19832
+ "datafeeder.validation.csv.quote.simple": "",
19833
+ "datafeeder.validation.csv.quoteChar": "",
19504
19834
  "datafeeder.validation.encoding": "",
19505
19835
  "datafeeder.validation.extent.title": "",
19506
19836
  "datafeeder.validation.extent.title.unknown": "",
@@ -19514,7 +19844,7 @@ var nl = {
19514
19844
  "datahub.header.lastRecords": "",
19515
19845
  "datahub.header.myfavorites": "",
19516
19846
  "datahub.header.news": "",
19517
- "datahub.header.organisations": "",
19847
+ "datahub.header.organizations": "",
19518
19848
  "datahub.header.popularRecords": "",
19519
19849
  "datahub.header.title.html": "",
19520
19850
  "datahub.news.contact.contactus": "",
@@ -19550,7 +19880,26 @@ var nl = {
19550
19880
  "downloads.format.unknown": "",
19551
19881
  "downloads.wfs.featuretype.not.found": "",
19552
19882
  dropFile: dropFile$1,
19553
- "editor.record.form.license": "",
19883
+ "editor.record.delete.confirmation.cancelText": "",
19884
+ "editor.record.delete.confirmation.confirmText": "",
19885
+ "editor.record.delete.confirmation.message": "",
19886
+ "editor.record.delete.confirmation.title": "",
19887
+ "editor.record.deleteError.body": "",
19888
+ "editor.record.deleteError.closeMessage": "",
19889
+ "editor.record.deleteError.title": "",
19890
+ "editor.record.form.bottomButtons.comeBackLater": "",
19891
+ "editor.record.form.bottomButtons.next": "",
19892
+ "editor.record.form.bottomButtons.previous": "",
19893
+ "editor.record.form.field.abstract": "",
19894
+ "editor.record.form.field.keywords": "",
19895
+ "editor.record.form.field.license": "",
19896
+ "editor.record.form.field.overviews": "",
19897
+ "editor.record.form.field.recordUpdated": "",
19898
+ "editor.record.form.field.resourceUpdated": "",
19899
+ "editor.record.form.field.temporalExtents": "",
19900
+ "editor.record.form.field.title": "",
19901
+ "editor.record.form.field.uniqueIdentifier": "",
19902
+ "editor.record.form.field.updateFrequency": "",
19554
19903
  "editor.record.form.license.cc-by": "",
19555
19904
  "editor.record.form.license.cc-by-sa": "",
19556
19905
  "editor.record.form.license.cc-zero": "",
@@ -19560,13 +19909,26 @@ var nl = {
19560
19909
  "editor.record.form.license.odc-by": "",
19561
19910
  "editor.record.form.license.pddl": "",
19562
19911
  "editor.record.form.license.unknown": "",
19563
- "editor.record.form.resourceUpdated": "",
19564
- "editor.record.form.temporalExtents": "",
19912
+ "editor.record.form.page.accessAndContact": "",
19913
+ "editor.record.form.page.description": "",
19914
+ "editor.record.form.page.ressources": "",
19915
+ "editor.record.form.section.about.description": "",
19916
+ "editor.record.form.section.about.label": "",
19917
+ "editor.record.form.section.annexes.label": "",
19918
+ "editor.record.form.section.associatedResources.description": "",
19919
+ "editor.record.form.section.associatedResources.label": "",
19920
+ "editor.record.form.section.classification.description": "",
19921
+ "editor.record.form.section.classification.label": "",
19922
+ "editor.record.form.section.dataManagers.description": "",
19923
+ "editor.record.form.section.dataManagers.label": "",
19924
+ "editor.record.form.section.dataPointOfContact.description": "",
19925
+ "editor.record.form.section.dataPointOfContact.label": "",
19926
+ "editor.record.form.section.geographicalCoverage.label": "",
19927
+ "editor.record.form.section.useAndAccessConditions.label": "",
19565
19928
  "editor.record.form.temporalExtents.addDate": "",
19566
19929
  "editor.record.form.temporalExtents.addRange": "",
19567
19930
  "editor.record.form.temporalExtents.date": "",
19568
19931
  "editor.record.form.temporalExtents.range": "",
19569
- "editor.record.form.updateFrequency": "",
19570
19932
  "editor.record.form.updateFrequency.planned": "",
19571
19933
  "editor.record.loadError.body": "",
19572
19934
  "editor.record.loadError.closeMessage": "",
@@ -19581,6 +19943,7 @@ var nl = {
19581
19943
  "editor.record.saveStatus.draftWithChangesPending": "",
19582
19944
  "editor.record.saveStatus.recordUpToDate": "",
19583
19945
  "editor.record.upToDate": "",
19946
+ "editor.sidebar.menu.editor": "",
19584
19947
  "externalviewer.dataset.unnamed": "",
19585
19948
  "facets.block.title.OrgForResource": "",
19586
19949
  "facets.block.title.availableInServices": "",
@@ -19649,17 +20012,17 @@ var nl = {
19649
20012
  "organisations.sortBy.nameDesc": "",
19650
20013
  "organisations.sortBy.recordCountAsc": "",
19651
20014
  "organisations.sortBy.recordCountDesc": "",
19652
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19653
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
20015
+ "organization.details.lastPublishedDatasets": "",
20016
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
19654
20017
  "organization.details.mailContact": "",
19655
- "organization.datasets": "",
19656
- "organization.lastPublishedDatasets": "",
19657
- "organization.lastPublishedDatasets.searchAllButton": "",
20018
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19658
20019
  "pagination.nextPage": "",
19659
20020
  "pagination.page": "",
19660
20021
  "pagination.pageOf": "",
19661
20022
  previous: previous$1,
20023
+ "record.action.delete": "",
19662
20024
  "record.action.download": "",
20025
+ "record.action.duplicate": "",
19663
20026
  "record.action.view": "",
19664
20027
  "record.externalViewer.open": "",
19665
20028
  "record.metadata.about": "",
@@ -19752,11 +20115,11 @@ var nl = {
19752
20115
  "results.sortBy.relevancy": "",
19753
20116
  "search.autocomplete.error": "",
19754
20117
  "search.error.couldNotReachApi": "",
20118
+ "search.error.organizationHasNoDataset": "",
20119
+ "search.error.organizationNotFound": "",
19755
20120
  "search.error.receivedError": "",
19756
20121
  "search.error.recordHasnolink": "",
19757
20122
  "search.error.recordNotFound": "",
19758
- "search.error.organizationNotFound": "",
19759
- "search.error.organizationHasNoDataset": "",
19760
20123
  "search.field.any.placeholder": "",
19761
20124
  "search.field.sortBy": "",
19762
20125
  "search.filters.clear": "",
@@ -19781,9 +20144,11 @@ var nl = {
19781
20144
  "search.filters.minimize": "",
19782
20145
  "search.filters.myRecords": "",
19783
20146
  "search.filters.myRecordsHelp": "",
20147
+ "search.filters.organization": "",
19784
20148
  "search.filters.otherRecords": "",
20149
+ "search.filters.producerOrg": "",
19785
20150
  "search.filters.publicationYear": "",
19786
- "search.filters.publisher": "",
20151
+ "search.filters.publisherOrg": "",
19787
20152
  "search.filters.representationType": "",
19788
20153
  "search.filters.resourceType": "",
19789
20154
  "search.filters.standard": "",
@@ -19864,6 +20229,8 @@ var pt = {
19864
20229
  "datafeeder.datasetValidation.submitButton": "",
19865
20230
  "datafeeder.datasetValidation.title": "",
19866
20231
  "datafeeder.datasetValidation.unknown": "",
20232
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
20233
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
19867
20234
  "datafeeder.form.abstract": "",
19868
20235
  "datafeeder.form.datepicker": "",
19869
20236
  "datafeeder.form.description": "",
@@ -19891,6 +20258,7 @@ var pt = {
19891
20258
  "datafeeder.publishSuccess.geonetworkRecord": "",
19892
20259
  "datafeeder.publishSuccess.illustration.title": "",
19893
20260
  "datafeeder.publishSuccess.mapViewer": "",
20261
+ "datafeeder.publishSuccess.ogcFeature": "",
19894
20262
  "datafeeder.publishSuccess.subtitle": "",
19895
20263
  "datafeeder.publishSuccess.title": "",
19896
20264
  "datafeeder.publishSuccess.uploadAnotherData": "",
@@ -19919,6 +20287,15 @@ var pt = {
19919
20287
  "datafeeder.upload.maxFileSize": "",
19920
20288
  "datafeeder.upload.title": "",
19921
20289
  "datafeeder.upload.uploadButton": "",
20290
+ "datafeeder.validation.csv.delimiter": "",
20291
+ "datafeeder.validation.csv.delimiter.comma": "",
20292
+ "datafeeder.validation.csv.delimiter.semicolon": "",
20293
+ "datafeeder.validation.csv.lat.field": "",
20294
+ "datafeeder.validation.csv.lng.field": "",
20295
+ "datafeeder.validation.csv.quote.double": "",
20296
+ "datafeeder.validation.csv.quote.none": "",
20297
+ "datafeeder.validation.csv.quote.simple": "",
20298
+ "datafeeder.validation.csv.quoteChar": "",
19922
20299
  "datafeeder.validation.encoding": "",
19923
20300
  "datafeeder.validation.extent.title": "",
19924
20301
  "datafeeder.validation.extent.title.unknown": "",
@@ -19932,7 +20309,7 @@ var pt = {
19932
20309
  "datahub.header.lastRecords": "",
19933
20310
  "datahub.header.myfavorites": "",
19934
20311
  "datahub.header.news": "",
19935
- "datahub.header.organisations": "",
20312
+ "datahub.header.organizations": "",
19936
20313
  "datahub.header.popularRecords": "",
19937
20314
  "datahub.header.title.html": "",
19938
20315
  "datahub.news.contact.contactus": "",
@@ -19968,7 +20345,26 @@ var pt = {
19968
20345
  "downloads.format.unknown": "",
19969
20346
  "downloads.wfs.featuretype.not.found": "",
19970
20347
  dropFile: dropFile,
19971
- "editor.record.form.license": "",
20348
+ "editor.record.delete.confirmation.cancelText": "",
20349
+ "editor.record.delete.confirmation.confirmText": "",
20350
+ "editor.record.delete.confirmation.message": "",
20351
+ "editor.record.delete.confirmation.title": "",
20352
+ "editor.record.deleteError.body": "",
20353
+ "editor.record.deleteError.closeMessage": "",
20354
+ "editor.record.deleteError.title": "",
20355
+ "editor.record.form.bottomButtons.comeBackLater": "",
20356
+ "editor.record.form.bottomButtons.next": "",
20357
+ "editor.record.form.bottomButtons.previous": "",
20358
+ "editor.record.form.field.abstract": "",
20359
+ "editor.record.form.field.keywords": "",
20360
+ "editor.record.form.field.license": "",
20361
+ "editor.record.form.field.overviews": "",
20362
+ "editor.record.form.field.recordUpdated": "",
20363
+ "editor.record.form.field.resourceUpdated": "",
20364
+ "editor.record.form.field.temporalExtents": "",
20365
+ "editor.record.form.field.title": "",
20366
+ "editor.record.form.field.uniqueIdentifier": "",
20367
+ "editor.record.form.field.updateFrequency": "",
19972
20368
  "editor.record.form.license.cc-by": "",
19973
20369
  "editor.record.form.license.cc-by-sa": "",
19974
20370
  "editor.record.form.license.cc-zero": "",
@@ -19978,13 +20374,26 @@ var pt = {
19978
20374
  "editor.record.form.license.odc-by": "",
19979
20375
  "editor.record.form.license.pddl": "",
19980
20376
  "editor.record.form.license.unknown": "",
19981
- "editor.record.form.resourceUpdated": "",
19982
- "editor.record.form.temporalExtents": "",
20377
+ "editor.record.form.page.accessAndContact": "",
20378
+ "editor.record.form.page.description": "",
20379
+ "editor.record.form.page.ressources": "",
20380
+ "editor.record.form.section.about.description": "",
20381
+ "editor.record.form.section.about.label": "",
20382
+ "editor.record.form.section.annexes.label": "",
20383
+ "editor.record.form.section.associatedResources.description": "",
20384
+ "editor.record.form.section.associatedResources.label": "",
20385
+ "editor.record.form.section.classification.description": "",
20386
+ "editor.record.form.section.classification.label": "",
20387
+ "editor.record.form.section.dataManagers.description": "",
20388
+ "editor.record.form.section.dataManagers.label": "",
20389
+ "editor.record.form.section.dataPointOfContact.description": "",
20390
+ "editor.record.form.section.dataPointOfContact.label": "",
20391
+ "editor.record.form.section.geographicalCoverage.label": "",
20392
+ "editor.record.form.section.useAndAccessConditions.label": "",
19983
20393
  "editor.record.form.temporalExtents.addDate": "",
19984
20394
  "editor.record.form.temporalExtents.addRange": "",
19985
20395
  "editor.record.form.temporalExtents.date": "",
19986
20396
  "editor.record.form.temporalExtents.range": "",
19987
- "editor.record.form.updateFrequency": "",
19988
20397
  "editor.record.form.updateFrequency.planned": "",
19989
20398
  "editor.record.loadError.body": "",
19990
20399
  "editor.record.loadError.closeMessage": "",
@@ -19999,6 +20408,7 @@ var pt = {
19999
20408
  "editor.record.saveStatus.draftWithChangesPending": "",
20000
20409
  "editor.record.saveStatus.recordUpToDate": "",
20001
20410
  "editor.record.upToDate": "",
20411
+ "editor.sidebar.menu.editor": "",
20002
20412
  "externalviewer.dataset.unnamed": "",
20003
20413
  "facets.block.title.OrgForResource": "",
20004
20414
  "facets.block.title.availableInServices": "",
@@ -20067,17 +20477,17 @@ var pt = {
20067
20477
  "organisations.sortBy.nameDesc": "",
20068
20478
  "organisations.sortBy.recordCountAsc": "",
20069
20479
  "organisations.sortBy.recordCountDesc": "",
20070
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
20071
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
20480
+ "organization.details.lastPublishedDatasets": "",
20481
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
20072
20482
  "organization.details.mailContact": "",
20073
- "organization.datasets": "",
20074
- "organization.lastPublishedDatasets": "",
20075
- "organization.lastPublishedDatasets.searchAllButton": "",
20483
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
20076
20484
  "pagination.nextPage": "",
20077
20485
  "pagination.page": "",
20078
20486
  "pagination.pageOf": "",
20079
20487
  previous: previous,
20488
+ "record.action.delete": "",
20080
20489
  "record.action.download": "",
20490
+ "record.action.duplicate": "",
20081
20491
  "record.action.view": "",
20082
20492
  "record.externalViewer.open": "",
20083
20493
  "record.metadata.about": "",
@@ -20170,11 +20580,11 @@ var pt = {
20170
20580
  "results.sortBy.relevancy": "",
20171
20581
  "search.autocomplete.error": "",
20172
20582
  "search.error.couldNotReachApi": "",
20583
+ "search.error.organizationHasNoDataset": "",
20584
+ "search.error.organizationNotFound": "",
20173
20585
  "search.error.receivedError": "",
20174
20586
  "search.error.recordHasnolink": "",
20175
20587
  "search.error.recordNotFound": "",
20176
- "search.error.organizationNotFound": "",
20177
- "search.error.organizationHasNoDataset": "",
20178
20588
  "search.field.any.placeholder": "",
20179
20589
  "search.field.sortBy": "",
20180
20590
  "search.filters.clear": "",
@@ -20199,9 +20609,11 @@ var pt = {
20199
20609
  "search.filters.minimize": "",
20200
20610
  "search.filters.myRecords": "",
20201
20611
  "search.filters.myRecordsHelp": "",
20612
+ "search.filters.organization": "",
20202
20613
  "search.filters.otherRecords": "",
20614
+ "search.filters.producerOrg": "",
20203
20615
  "search.filters.publicationYear": "",
20204
- "search.filters.publisher": "",
20616
+ "search.filters.publisherOrg": "",
20205
20617
  "search.filters.representationType": "",
20206
20618
  "search.filters.resourceType": "",
20207
20619
  "search.filters.standard": "",
@@ -21132,12 +21544,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21132
21544
  args: [METADATA_LANGUAGE]
21133
21545
  }] }]; } });
21134
21546
 
21547
+ const TEMPORARY_ID_PREFIX = 'TEMP-ID-';
21135
21548
  class Gn4Repository {
21136
21549
  constructor(gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi) {
21137
21550
  this.gn4SearchApi = gn4SearchApi;
21138
21551
  this.gn4SearchHelper = gn4SearchHelper;
21139
21552
  this.gn4Mapper = gn4Mapper;
21140
21553
  this.gn4RecordsApi = gn4RecordsApi;
21554
+ this._draftsChanged = new Subject();
21555
+ this.draftsChanged$ = this._draftsChanged.asObservable();
21141
21556
  }
21142
21557
  search({ filters, fields, offset, limit, sort, filterIds, filterGeometry, }) {
21143
21558
  return this.gn4SearchApi
@@ -21208,6 +21623,18 @@ class Gn4Repository {
21208
21623
  .then((record) => [record, xml, isSavedAlready]);
21209
21624
  }));
21210
21625
  }
21626
+ openRecordForDuplication(uniqueIdentifier) {
21627
+ return this.loadRecordAsXml(uniqueIdentifier).pipe(switchMap(async (recordAsXml) => {
21628
+ const converter = findConverterForDocument(recordAsXml);
21629
+ const record = await converter.readRecord(recordAsXml);
21630
+ record.uniqueIdentifier = `${TEMPORARY_ID_PREFIX}${Date.now()}`;
21631
+ record.title = `${record.title} (Copy)`;
21632
+ const xml = await converter.writeRecord(record, recordAsXml);
21633
+ window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), xml);
21634
+ this._draftsChanged.next();
21635
+ return [record, xml, false];
21636
+ }));
21637
+ }
21211
21638
  serializeRecordToXml(record, referenceRecordSource) {
21212
21639
  // if there's a reference record, use that standard; otherwise, use iso19139
21213
21640
  const converter = referenceRecordSource
@@ -21223,15 +21650,28 @@ class Gn4Repository {
21223
21650
  return response.metadataInfos[metadataId][0].uuid;
21224
21651
  }))));
21225
21652
  }
21653
+ deleteRecord(uniqueIdentifier) {
21654
+ return this.gn4RecordsApi.deleteRecord(uniqueIdentifier);
21655
+ }
21656
+ generateTemporaryId() {
21657
+ return `${TEMPORARY_ID_PREFIX}${Date.now()}`;
21658
+ }
21226
21659
  saveRecordAsDraft(record, referenceRecordSource) {
21227
- return this.serializeRecordToXml(record, referenceRecordSource).pipe(tap$1((recordXml) => window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), recordXml)));
21660
+ return this.serializeRecordToXml(record, referenceRecordSource).pipe(tap$1((recordXml) => {
21661
+ window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), recordXml);
21662
+ this._draftsChanged.next();
21663
+ }));
21228
21664
  }
21229
21665
  clearRecordDraft(uniqueIdentifier) {
21230
21666
  window.localStorage.removeItem(this.getLocalStorageKeyForRecord(uniqueIdentifier));
21667
+ this._draftsChanged.next();
21231
21668
  }
21232
21669
  recordHasDraft(uniqueIdentifier) {
21233
21670
  return (window.localStorage.getItem(this.getLocalStorageKeyForRecord(uniqueIdentifier)) !== null);
21234
21671
  }
21672
+ isRecordNotYetSaved(uniqueIdentifier) {
21673
+ return uniqueIdentifier.startsWith(TEMPORARY_ID_PREFIX);
21674
+ }
21235
21675
  // generated by copilot
21236
21676
  getAllDrafts() {
21237
21677
  const items = { ...window.localStorage };
@@ -21839,8 +22279,6 @@ class Gn4PlatformService {
21839
22279
  this.allThesaurus$ = this.httpClient
21840
22280
  .get(`${this.registriesApiService.configuration.basePath}/thesaurus?_content_type=json`)
21841
22281
  .pipe(map$1((thesaurus) => {
21842
- // FIXME: find a better way to exclude place keywords
21843
- // thesaurus[0].filter((thes) => thes.dname !== 'place')
21844
22282
  return thesaurus[0];
21845
22283
  }), shareReplay(1));
21846
22284
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
@@ -21884,8 +22322,14 @@ class Gn4PlatformService {
21884
22322
  }
21885
22323
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
21886
22324
  }
21887
- searchKeywords(query) {
21888
- const keywords$ = this.registriesApiService.searchKeywords(query, this.langService.iso3, 10, 0, null, null, null, `*${query}*`);
22325
+ searchKeywords(query, keywordTypes) {
22326
+ const keywords$ = this.allThesaurus$.pipe(switchMap((thesaurus) => {
22327
+ const selectedThesauri = [];
22328
+ keywordTypes.map((keywordType) => {
22329
+ selectedThesauri.push(...thesaurus.filter((thes) => thes.dname === keywordType));
22330
+ });
22331
+ return this.registriesApiService.searchKeywords(query, this.langService.iso3, 10, 0, null, selectedThesauri.map((thes) => thes.key), null, `*${query}*`);
22332
+ }));
21889
22333
  return combineLatest([keywords$, this.allThesaurus$]).pipe(map$1(([keywords, thesaurus]) => {
21890
22334
  return this.mapper.keywordsFromApi(keywords, thesaurus, this.langService.iso3);
21891
22335
  }));
@@ -22977,10 +23421,15 @@ class MapUtilsService {
22977
23421
  if (!('spatialExtents' in record) || record.spatialExtents.length === 0) {
22978
23422
  return null;
22979
23423
  }
22980
- // transform an array of geojson geometries into a bbox
23424
+ // extend all the spatial extents into an including bbox
22981
23425
  const totalExtent = record.spatialExtents.reduce((prev, curr) => {
22982
- const geom = GEOJSON.readGeometry(curr.geometry);
22983
- return extend(prev, geom.getExtent());
23426
+ if ('bbox' in curr)
23427
+ return extend(prev, curr.bbox);
23428
+ else if ('geometry' in curr) {
23429
+ const geom = GEOJSON.readGeometry(curr.geometry);
23430
+ return extend(prev, geom.getExtent());
23431
+ }
23432
+ return prev;
22984
23433
  }, [Infinity, Infinity, -Infinity, -Infinity]);
22985
23434
  return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
22986
23435
  }
@@ -24566,6 +25015,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
24566
25015
  }]
24567
25016
  }] });
24568
25017
 
25018
+ class PopoverComponent {
25019
+ constructor(viewContainerRef, renderer) {
25020
+ this.viewContainerRef = viewContainerRef;
25021
+ this.renderer = renderer;
25022
+ }
25023
+ getContent() {
25024
+ if (this.content instanceof TemplateRef) {
25025
+ if (this.view) {
25026
+ this.view.destroy();
25027
+ }
25028
+ this.view = this.viewContainerRef.createEmbeddedView(this.content);
25029
+ this.view.detectChanges();
25030
+ const wrapper = this.renderer.createElement('div'); // Create a wrapper div
25031
+ this.view.rootNodes.forEach((node) => {
25032
+ this.renderer.appendChild(wrapper, node); // Append each root node to the wrapper
25033
+ });
25034
+ return wrapper;
25035
+ }
25036
+ return this.content;
25037
+ }
25038
+ ngAfterViewInit() {
25039
+ this.tippyInstance = tippy(this.popoverContent.nativeElement, {
25040
+ content: this.getContent(),
25041
+ allowHTML: true,
25042
+ theme: this.theme,
25043
+ });
25044
+ }
25045
+ ngOnChanges(changes) {
25046
+ if (changes['theme']) {
25047
+ this.theme = changes['theme'].currentValue;
25048
+ if (this.tippyInstance) {
25049
+ this.tippyInstance.setProps({ theme: this.theme });
25050
+ }
25051
+ }
25052
+ if (changes['content']) {
25053
+ this.content = changes['content'].currentValue;
25054
+ if (this.tippyInstance) {
25055
+ this.tippyInstance.setContent(this.getContent());
25056
+ }
25057
+ }
25058
+ }
25059
+ ngOnDestroy() {
25060
+ if (this.tippyInstance) {
25061
+ this.tippyInstance.destroy();
25062
+ }
25063
+ if (this.view) {
25064
+ this.view.destroy();
25065
+ }
25066
+ }
25067
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PopoverComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
25068
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PopoverComponent, isStandalone: true, selector: "gn-ui-popover", inputs: { content: "content", theme: "theme" }, viewQueries: [{ propertyName: "popoverContent", first: true, predicate: ["popoverContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
25069
+ }
25070
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PopoverComponent, decorators: [{
25071
+ type: Component,
25072
+ args: [{ selector: 'gn-ui-popover', standalone: true, imports: [CommonModule], template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n" }]
25073
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.Renderer2 }]; }, propDecorators: { popoverContent: [{
25074
+ type: ViewChild,
25075
+ args: ['popoverContent', { static: false }]
25076
+ }], content: [{
25077
+ type: Input
25078
+ }], theme: [{
25079
+ type: Input
25080
+ }] } });
25081
+
24569
25082
  class PopupAlertComponent {
24570
25083
  constructor(changeDetector) {
24571
25084
  this.changeDetector = changeDetector;
@@ -24970,7 +25483,7 @@ class CopyTextButtonComponent {
24970
25483
  event.target.blur();
24971
25484
  }
24972
25485
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24973
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25486
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24974
25487
  }
24975
25488
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24976
25489
  type: Component,
@@ -24990,7 +25503,7 @@ class DatePickerComponent {
24990
25503
  this.dateChange = new EventEmitter();
24991
25504
  }
24992
25505
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24993
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DatePickerComponent, isStandalone: true, selector: "gn-ui-date-picker", inputs: { date: "date" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <input\n class=\"pl-3\"\n [matDatepicker]=\"picker\"\n [value]=\"date\"\n (dateChange)=\"dateChange.emit($event.value)\"\n />\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n</div>\n<mat-datepicker #picker></mat-datepicker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2$4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25506
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DatePickerComponent, isStandalone: true, selector: "gn-ui-date-picker", inputs: { date: "date" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <input\n class=\"pl-3\"\n [matDatepicker]=\"picker\"\n [value]=\"date\"\n (dateChange)=\"dateChange.emit($event.value)\"\n />\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n</div>\n<mat-datepicker #picker></mat-datepicker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24994
25507
  }
24995
25508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatePickerComponent, decorators: [{
24996
25509
  type: Component,
@@ -25007,7 +25520,7 @@ class DateRangePickerComponent {
25007
25520
  this.endDateChange = new EventEmitter();
25008
25521
  }
25009
25522
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25010
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DateRangePickerComponent, isStandalone: true, selector: "gn-ui-date-range-picker", inputs: { startDate: "startDate", endDate: "endDate" }, outputs: { startDateChange: "startDateChange", endDateChange: "endDateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"pl-3 flex justify-center\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n matStartDate\n placeholder=\"Start date\"\n [value]=\"startDate\"\n (dateInput)=\"startDateChange.emit($event.value)\"\n />\n <input\n matEndDate\n placeholder=\"End date\"\n [value]=\"endDate\"\n (dateInput)=\"endDateChange.emit($event.value)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n</div>\n<mat-date-range-picker #picker></mat-date-range-picker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2$4.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2$4.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2$4.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2$4.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25523
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DateRangePickerComponent, isStandalone: true, selector: "gn-ui-date-range-picker", inputs: { startDate: "startDate", endDate: "endDate" }, outputs: { startDateChange: "startDateChange", endDateChange: "endDateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"pl-3 flex justify-center\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n matStartDate\n placeholder=\"Start date\"\n [value]=\"startDate\"\n (dateInput)=\"startDateChange.emit($event.value)\"\n />\n <input\n matEndDate\n placeholder=\"End date\"\n [value]=\"endDate\"\n (dateInput)=\"endDateChange.emit($event.value)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n</div>\n<mat-date-range-picker #picker></mat-date-range-picker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2$3.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2$3.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2$3.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2$3.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25011
25524
  }
25012
25525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateRangePickerComponent, decorators: [{
25013
25526
  type: Component,
@@ -25039,7 +25552,7 @@ class DragAndDropFileInputComponent {
25039
25552
  this.fileChange.emit(this.selectedFile);
25040
25553
  }
25041
25554
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragAndDropFileInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25042
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: { placeholder: "placeholder", accept: "accept" }, outputs: { fileChange: "fileChange" }, ngImport: i0, template: "<div class=\"flex h-full\">\n <ngx-dropzone\n class=\"flex-1\"\n multiple=\"false\"\n (change)=\"selectFile($event)\"\n [accept]=\"accept\"\n >\n <div *ngIf=\"!fileName\" class=\"text-gray-900 pl-2 py-2\" translate=\"\">\n {{ placeholder }}\n </div>\n\n <div *ngIf=\"fileName\" class=\"text-gray-900 pl-2 py-2\">{{ fileName }}</div>\n </ngx-dropzone>\n</div>\n", styles: ["ngx-dropzone{height:auto;border:none}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3$1.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }] }); }
25555
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: { placeholder: "placeholder", accept: "accept" }, outputs: { fileChange: "fileChange" }, ngImport: i0, template: "<div class=\"flex h-full\">\n <ngx-dropzone\n class=\"flex-1\"\n multiple=\"false\"\n (change)=\"selectFile($event)\"\n [accept]=\"accept\"\n >\n <div *ngIf=\"!fileName\" class=\"text-gray-900 pl-2 py-2\" translate=\"\">\n {{ placeholder }}\n </div>\n\n <div *ngIf=\"fileName\" class=\"text-gray-900 pl-2 py-2\">{{ fileName }}</div>\n </ngx-dropzone>\n</div>\n", styles: ["ngx-dropzone{height:auto;border:none}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3$2.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }] }); }
25043
25556
  }
25044
25557
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
25045
25558
  type: Component,
@@ -26680,11 +27193,11 @@ class MetadataQualityItemComponent {
26680
27193
  return `record.metadata.quality.${this.name}.${this.value ? 'success' : 'failed'}`;
26681
27194
  }
26682
27195
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26683
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: { name: "name", value: "value" }, ngImport: i0, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n", dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27196
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: { name: "name", value: "value" }, ngImport: i0, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined min-w-fit\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n", dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26684
27197
  }
26685
27198
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityItemComponent, decorators: [{
26686
27199
  type: Component,
26687
- args: [{ selector: 'gn-ui-metadata-quality-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n" }]
27200
+ args: [{ selector: 'gn-ui-metadata-quality-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ml-4 flex flex-row\">\n <mat-icon class=\"material-symbols-outlined min-w-fit\">{{ icon }}</mat-icon>\n <p class=\"ml-2 text\">{{ labelKey | translate }}</p>\n</div>\n" }]
26688
27201
  }], propDecorators: { name: [{
26689
27202
  type: Input
26690
27203
  }], value: [{
@@ -26695,7 +27208,6 @@ class MetadataQualityComponent {
26695
27208
  constructor() {
26696
27209
  this.smaller = false;
26697
27210
  this.items = [];
26698
- this.isMenuShown = false;
26699
27211
  }
26700
27212
  get qualityScore() {
26701
27213
  const qualityScore = this.metadata?.extras?.qualityScore;
@@ -26706,12 +27218,6 @@ class MetadataQualityComponent {
26706
27218
  get calculatedQualityScore() {
26707
27219
  return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
26708
27220
  }
26709
- showMenu() {
26710
- this.isMenuShown = true;
26711
- }
26712
- hideMenu() {
26713
- this.isMenuShown = false;
26714
- }
26715
27221
  add(name, value) {
26716
27222
  if (this.metadataQualityDisplay?.[name] !== false) {
26717
27223
  this.items.push({ name, value });
@@ -26735,11 +27241,11 @@ class MetadataQualityComponent {
26735
27241
  }
26736
27242
  }
26737
27243
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26738
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: { metadata: "metadata", smaller: "smaller", metadataQualityDisplay: "metadataQualityDisplay" }, usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"mb-6 metadata-quality\"\n (mouseenter)=\"showMenu()\"\n (mouseleave)=\"hideMenu()\"\n>\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n (focus)=\"showMenu()\"\n (blur)=\"hideMenu()\"\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n <div\n class=\"absolute z-10 bg-white border border-black border-opacity-35 rounded-lg shadow-lg p-5 whitespace-nowrap\"\n [class]=\"isMenuShown ? 'block' : 'hidden'\"\n >\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</div>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ 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: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27244
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: { metadata: "metadata", smaller: "smaller", metadataQualityDisplay: "metadataQualityDisplay" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <gn-ui-popover [content]=\"popoverItems\" theme=\"light-border\">\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ 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: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26739
27245
  }
26740
27246
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityComponent, decorators: [{
26741
27247
  type: Component,
26742
- args: [{ selector: 'gn-ui-metadata-quality', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"mb-6 metadata-quality\"\n (mouseenter)=\"showMenu()\"\n (mouseleave)=\"hideMenu()\"\n>\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n (focus)=\"showMenu()\"\n (blur)=\"hideMenu()\"\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n <div\n class=\"absolute z-10 bg-white border border-black border-opacity-35 rounded-lg shadow-lg p-5 whitespace-nowrap\"\n [class]=\"isMenuShown ? 'block' : 'hidden'\"\n >\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</div>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
27248
+ args: [{ selector: 'gn-ui-metadata-quality', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <gn-ui-popover [content]=\"popoverItems\" theme=\"light-border\">\n <div class=\"min-w-[200px]\" [class]=\"smaller ? 'leading-[8px]' : ''\">\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n type=\"primary\"\n ></gn-ui-progress-bar>\n </div>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
26743
27249
  }], propDecorators: { metadata: [{
26744
27250
  type: Input
26745
27251
  }], smaller: [{
@@ -26934,11 +27440,11 @@ class ApiCardComponent {
26934
27440
  }
26935
27441
  }
26936
27442
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26937
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ApiCardComponent, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden\"\n [ngClass]=\"{ 'cursor-pointer': displayApiFormButton }\"\n (click)=\"openRecordApiFormPanel()\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <gn-ui-copy-text-button\n *ngIf=\"!displayApiFormButton\"\n [text]=\"link.url.toString()\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27443
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ApiCardComponent, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26938
27444
  }
26939
27445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiCardComponent, decorators: [{
26940
27446
  type: Component,
26941
- args: [{ selector: 'gn-ui-api-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden\"\n [ngClass]=\"{ 'cursor-pointer': displayApiFormButton }\"\n (click)=\"openRecordApiFormPanel()\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <gn-ui-copy-text-button\n *ngIf=\"!displayApiFormButton\"\n [text]=\"link.url.toString()\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n</div>\n" }]
27447
+ args: [{ selector: 'gn-ui-api-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n </div>\n</div>\n" }]
26942
27448
  }], propDecorators: { link: [{
26943
27449
  type: Input
26944
27450
  }], currentLink: [{
@@ -26963,6 +27469,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
26963
27469
  type: Input
26964
27470
  }] } });
26965
27471
 
27472
+ class ConfirmationDialogComponent {
27473
+ constructor(dialogRef, data) {
27474
+ this.dialogRef = dialogRef;
27475
+ this.data = data;
27476
+ }
27477
+ onConfirm() {
27478
+ this.dialogRef.close(true);
27479
+ }
27480
+ onCancel() {
27481
+ this.dialogRef.close(false);
27482
+ }
27483
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfirmationDialogComponent, deps: [{ token: i1$7.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
27484
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfirmationDialogComponent, isStandalone: true, selector: "gn-ui-confirmation-dialog", ngImport: i0, template: "<h1 mat-dialog-title>{{ data.title }}</h1>\n<div mat-dialog-content>{{ data.message }}</div>\n<div mat-dialog-actions>\n <gn-ui-button (buttonClick)=\"onCancel()\">{{ data.cancelText }}</gn-ui-button>\n <gn-ui-button\n (buttonClick)=\"onConfirm()\"\n cdkFocusInitial\n class=\"ml-2\"\n data-cy=\"confirm-button\"\n >{{ data.confirmText }}</gn-ui-button\n >\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1$7.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$7.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1$7.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27485
+ }
27486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
27487
+ type: Component,
27488
+ args: [{ selector: 'gn-ui-confirmation-dialog', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatDialogModule, ButtonComponent], template: "<h1 mat-dialog-title>{{ data.title }}</h1>\n<div mat-dialog-content>{{ data.message }}</div>\n<div mat-dialog-actions>\n <gn-ui-button (buttonClick)=\"onCancel()\">{{ data.cancelText }}</gn-ui-button>\n <gn-ui-button\n (buttonClick)=\"onConfirm()\"\n cdkFocusInitial\n class=\"ml-2\"\n data-cy=\"confirm-button\"\n >{{ data.confirmText }}</gn-ui-button\n >\n</div>\n" }]
27489
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialogRef }, { type: undefined, decorators: [{
27490
+ type: Inject,
27491
+ args: [MAT_DIALOG_DATA]
27492
+ }] }]; } });
27493
+
26966
27494
  class ContentGhostComponent {
26967
27495
  constructor() {
26968
27496
  this.ghostClass = '';
@@ -27150,11 +27678,11 @@ class MarkdownParserComponent {
27150
27678
  return marked.parse(this.textContent);
27151
27679
  }
27152
27680
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27153
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27681
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;line-height:1.5;word-wrap:break-word;height:100%}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27154
27682
  }
27155
27683
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownParserComponent, decorators: [{
27156
27684
  type: Component,
27157
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
27685
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;line-height:1.5;word-wrap:break-word;height:100%}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
27158
27686
  }], propDecorators: { textContent: [{
27159
27687
  type: Input
27160
27688
  }] } });
@@ -27169,7 +27697,7 @@ class MarkdownEditorComponent {
27169
27697
  this.textContentChanged.emit(this.textContent);
27170
27698
  }
27171
27699
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27172
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MarkdownEditorComponent, isStandalone: true, selector: "gn-ui-markdown-editor", inputs: { preview: "preview", helperText: "helperText", placeholder: "placeholder", textContent: "textContent" }, outputs: { textContentChanged: "textContentChanged" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <p class=\"flex-none mb-2 font-medium text-sm text-gray-900\">\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27700
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MarkdownEditorComponent, isStandalone: true, selector: "gn-ui-markdown-editor", inputs: { preview: "preview", helperText: "helperText", placeholder: "placeholder", textContent: "textContent" }, outputs: { textContentChanged: "textContentChanged" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <p\n *ngIf=\"helperText\"\n class=\"flex-none mb-2 font-medium text-sm text-gray-900\"\n >\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27173
27701
  }
27174
27702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownEditorComponent, decorators: [{
27175
27703
  type: Component,
@@ -27182,7 +27710,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27182
27710
  TextAreaComponent,
27183
27711
  MarkdownParserComponent,
27184
27712
  TranslateModule,
27185
- ], template: "<div class=\"h-full flex flex-col\">\n <p class=\"flex-none mb-2 font-medium text-sm text-gray-900\">\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n" }]
27713
+ ], template: "<div class=\"h-full flex flex-col\">\n <p\n *ngIf=\"helperText\"\n class=\"flex-none mb-2 font-medium text-sm text-gray-900\"\n >\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n" }]
27186
27714
  }], propDecorators: { preview: [{
27187
27715
  type: Input
27188
27716
  }], helperText: [{
@@ -27269,6 +27797,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27269
27797
  args: ['contentDiv']
27270
27798
  }] } });
27271
27799
 
27800
+ class MaxLinesComponent {
27801
+ constructor(cdr) {
27802
+ this.cdr = cdr;
27803
+ this.maxLines = 6;
27804
+ this.isExpanded = false;
27805
+ this.maxHeight = '';
27806
+ this.showToggleButton = false;
27807
+ }
27808
+ ngAfterViewInit() {
27809
+ this.calculateMaxHeight();
27810
+ this.observer = new ResizeObserver((mutations) => {
27811
+ mutations.forEach(() => {
27812
+ this.calculateMaxHeight();
27813
+ });
27814
+ });
27815
+ this.observer.observe(this.container.nativeElement.children[0]);
27816
+ }
27817
+ toggleDisplay() {
27818
+ this.isExpanded = !this.isExpanded;
27819
+ this.calculateMaxHeight();
27820
+ }
27821
+ calculateMaxHeight() {
27822
+ const containerElement = this.container.nativeElement;
27823
+ const contentElement = containerElement.children[0];
27824
+ const contentHeight = contentElement.getBoundingClientRect().height;
27825
+ if (contentHeight) {
27826
+ if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
27827
+ this.showToggleButton = true;
27828
+ this.maxHeight = this.isExpanded
27829
+ ? `${contentHeight}px`
27830
+ : `${this.maxLines * this.getLineHeight(contentElement)}px`;
27831
+ }
27832
+ else {
27833
+ this.showToggleButton = false;
27834
+ this.maxHeight = `${contentHeight}px`;
27835
+ }
27836
+ containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
27837
+ this.cdr.detectChanges();
27838
+ }
27839
+ }
27840
+ getLineHeight(element) {
27841
+ const computedStyle = window.getComputedStyle(element);
27842
+ const lineHeight = parseFloat(computedStyle.lineHeight);
27843
+ const fontSize = parseFloat(computedStyle.fontSize || '14');
27844
+ const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
27845
+ return result;
27846
+ }
27847
+ ngOnDestroy() {
27848
+ if (!this.observer)
27849
+ return;
27850
+ this.observer.unobserve(this.container.nativeElement.children[0]);
27851
+ }
27852
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MaxLinesComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
27853
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MaxLinesComponent, isStandalone: true, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n data-cy=\"readMoreButton\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27854
+ }
27855
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MaxLinesComponent, decorators: [{
27856
+ type: Component,
27857
+ args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule], template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n data-cy=\"readMoreButton\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
27858
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
27859
+ type: Input
27860
+ }], container: [{
27861
+ type: ViewChild,
27862
+ args: ['container']
27863
+ }] } });
27864
+
27272
27865
  /* eslint-disable @angular-eslint/directive-selector */
27273
27866
  class GnUiLinkifyDirective {
27274
27867
  constructor(el, renderer) {
@@ -27408,11 +28001,11 @@ class MetadataInfoComponent {
27408
28001
  this.keyword.emit(keyword);
27409
28002
  }
27410
28003
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27411
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ 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: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28004
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ 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: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27412
28005
  }
27413
28006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataInfoComponent, decorators: [{
27414
28007
  type: Component,
27415
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
28008
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
27416
28009
  }], propDecorators: { metadata: [{
27417
28010
  type: Input
27418
28011
  }], incomplete: [{
@@ -27669,7 +28262,7 @@ class RecordApiFormComponent {
27669
28262
  }
27670
28263
  }
27671
28264
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27672
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div\n *ngIf=\"!supportOffset\"\n class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\"\n >\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28265
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div\n *ngIf=\"!supportOffset\"\n class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\"\n >\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27673
28266
  }
27674
28267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordApiFormComponent, decorators: [{
27675
28268
  type: Component,
@@ -27697,7 +28290,7 @@ class RelatedRecordCardComponent {
27697
28290
  return `${this.baseClasses} ${this.extraClass}`;
27698
28291
  }
27699
28292
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27700
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record", extraClass: "extraClass" }, ngImport: i0, template: "<a\n [class]=\"classList\"\n [routerLink]=\"['/dataset', record.uniqueIdentifier]\"\n target=\"_blank\"\n>\n <div class=\"h-52 bg-gray-100\">\n <gn-ui-thumbnail\n class=\"h-52 w-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col justify-between h-44 px-5 pt-4 pb-6\">\n <h4\n class=\"max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden\"\n >\n {{ record.title }}\n </h4>\n <div>\n <button\n mat-raised-button\n [matTooltip]=\"'tooltip.url.open' | translate\"\n matTooltipPosition=\"above\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle text-secondary\"\n >open_in_new</mat-icon\n >\n </button>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28293
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record", extraClass: "extraClass" }, ngImport: i0, template: "<a\n [class]=\"classList\"\n [routerLink]=\"['/dataset', record.uniqueIdentifier]\"\n target=\"_blank\"\n>\n <div class=\"h-52 bg-gray-100\">\n <gn-ui-thumbnail\n class=\"h-52 w-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col justify-between h-44 px-5 pt-4 pb-6\">\n <h4\n class=\"max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden\"\n >\n {{ record.title }}\n </h4>\n <div>\n <button\n mat-raised-button\n [matTooltip]=\"'tooltip.url.open' | translate\"\n matTooltipPosition=\"above\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle text-secondary\"\n >open_in_new</mat-icon\n >\n </button>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27701
28294
  }
27702
28295
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
27703
28296
  type: Component,
@@ -27721,8 +28314,11 @@ class SortableListComponent {
27721
28314
  this.elements = this.elements.filter((_, i) => i !== index);
27722
28315
  this.elementsChange.emit(this.elements);
27723
28316
  }
28317
+ trackByFn(index) {
28318
+ return index;
28319
+ }
27724
28320
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SortableListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27725
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SortableListComponent, isStandalone: true, selector: "gn-ui-sortable-list", inputs: { elements: "elements", addOptions: "addOptions" }, outputs: { elementsChange: "elementsChange", add: "add" }, ngImport: i0, template: "<div class=\"flex gap-2 mb-2\">\n <gn-ui-button\n *ngFor=\"let addOption of addOptions\"\n (buttonClick)=\"add.emit(addOption.eventName)\"\n >\n <span class=\"material-symbols-outlined gn-ui-icon-small\"> add </span>\n &nbsp;{{ addOption.buttonLabel }}</gn-ui-button\n >\n</div>\n<div\n cdkDropList\n class=\"sortable-list flex flex-col gap-3 p-2\"\n (cdkDropListDropped)=\"drop($event)\"\n>\n <ng-container *ngFor=\"let element of elements; index as index\">\n <div class=\"sortable-box bg-white flex items-center\" cdkDrag>\n <span\n cdkDragHandle\n class=\"material-symbols-outlined mx-[10px] cursor-grab gn-ui-icon-medium flex-none\"\n >\n drag_handle\n </span>\n <div class=\"flex-1\">\n <ng-container\n *ngComponentOutlet=\"element.component; inputs: element.inputs\"\n ></ng-container>\n </div>\n <span\n (click)=\"removeElement(index)\"\n class=\"material-symbols-outlined mx-[10px] cursor-pointer gn-ui-icon-medium flex-none\"\n >\n close\n </span>\n </div>\n </ng-container>\n</div>\n", styles: [".cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.sortable-list.cdk-drop-list-dragging .sortable-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28321
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SortableListComponent, isStandalone: true, selector: "gn-ui-sortable-list", inputs: { elements: "elements", addOptions: "addOptions" }, outputs: { elementsChange: "elementsChange", add: "add" }, ngImport: i0, template: "<div class=\"flex gap-2 mb-2\">\n <gn-ui-button\n *ngFor=\"let addOption of addOptions\"\n (buttonClick)=\"add.emit(addOption.eventName)\"\n >\n <span class=\"material-symbols-outlined gn-ui-icon-small\"> add </span>\n &nbsp;{{ addOption.buttonLabel }}</gn-ui-button\n >\n</div>\n<div\n cdkDropList\n class=\"sortable-list flex flex-col gap-3 p-2\"\n (cdkDropListDropped)=\"drop($event)\"\n>\n <ng-container\n *ngFor=\"let element of elements; index as index; trackBy: trackByFn\"\n >\n <div class=\"sortable-box bg-white flex items-center\" cdkDrag>\n <span\n cdkDragHandle\n class=\"material-symbols-outlined mx-[10px] cursor-grab gn-ui-icon-medium flex-none\"\n >\n drag_handle\n </span>\n <div class=\"flex-1\">\n <ng-container\n *ngComponentOutlet=\"element.component; inputs: element.inputs\"\n ></ng-container>\n </div>\n <span\n (click)=\"removeElement(index)\"\n class=\"material-symbols-outlined mx-[10px] cursor-pointer gn-ui-icon-medium flex-none\"\n >\n close\n </span>\n </div>\n </ng-container>\n</div>\n", styles: [".cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.sortable-list.cdk-drop-list-dragging .sortable-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27726
28322
  }
27727
28323
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SortableListComponent, decorators: [{
27728
28324
  type: Component,
@@ -27734,7 +28330,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27734
28330
  CdkDragHandle,
27735
28331
  MatIconModule,
27736
28332
  ButtonComponent,
27737
- ], template: "<div class=\"flex gap-2 mb-2\">\n <gn-ui-button\n *ngFor=\"let addOption of addOptions\"\n (buttonClick)=\"add.emit(addOption.eventName)\"\n >\n <span class=\"material-symbols-outlined gn-ui-icon-small\"> add </span>\n &nbsp;{{ addOption.buttonLabel }}</gn-ui-button\n >\n</div>\n<div\n cdkDropList\n class=\"sortable-list flex flex-col gap-3 p-2\"\n (cdkDropListDropped)=\"drop($event)\"\n>\n <ng-container *ngFor=\"let element of elements; index as index\">\n <div class=\"sortable-box bg-white flex items-center\" cdkDrag>\n <span\n cdkDragHandle\n class=\"material-symbols-outlined mx-[10px] cursor-grab gn-ui-icon-medium flex-none\"\n >\n drag_handle\n </span>\n <div class=\"flex-1\">\n <ng-container\n *ngComponentOutlet=\"element.component; inputs: element.inputs\"\n ></ng-container>\n </div>\n <span\n (click)=\"removeElement(index)\"\n class=\"material-symbols-outlined mx-[10px] cursor-pointer gn-ui-icon-medium flex-none\"\n >\n close\n </span>\n </div>\n </ng-container>\n</div>\n", styles: [".cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.sortable-list.cdk-drop-list-dragging .sortable-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
28333
+ ], template: "<div class=\"flex gap-2 mb-2\">\n <gn-ui-button\n *ngFor=\"let addOption of addOptions\"\n (buttonClick)=\"add.emit(addOption.eventName)\"\n >\n <span class=\"material-symbols-outlined gn-ui-icon-small\"> add </span>\n &nbsp;{{ addOption.buttonLabel }}</gn-ui-button\n >\n</div>\n<div\n cdkDropList\n class=\"sortable-list flex flex-col gap-3 p-2\"\n (cdkDropListDropped)=\"drop($event)\"\n>\n <ng-container\n *ngFor=\"let element of elements; index as index; trackBy: trackByFn\"\n >\n <div class=\"sortable-box bg-white flex items-center\" cdkDrag>\n <span\n cdkDragHandle\n class=\"material-symbols-outlined mx-[10px] cursor-grab gn-ui-icon-medium flex-none\"\n >\n drag_handle\n </span>\n <div class=\"flex-1\">\n <ng-container\n *ngComponentOutlet=\"element.component; inputs: element.inputs\"\n ></ng-container>\n </div>\n <span\n (click)=\"removeElement(index)\"\n class=\"material-symbols-outlined mx-[10px] cursor-pointer gn-ui-icon-medium flex-none\"\n >\n close\n </span>\n </div>\n </ng-container>\n</div>\n", styles: [".cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.sortable-list.cdk-drop-list-dragging .sortable-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
27738
28334
  }], propDecorators: { elements: [{
27739
28335
  type: Input
27740
28336
  }], addOptions: [{
@@ -27872,82 +28468,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27872
28468
 
27873
28469
  class FormFieldWrapperComponent {
27874
28470
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27875
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28471
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1 overflow-y-auto\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27876
28472
  }
27877
28473
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
27878
28474
  type: Component,
27879
- args: [{ selector: 'gn-ui-form-field-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatIconModule, MatTooltipModule], template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
28475
+ args: [{ selector: 'gn-ui-form-field-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatIconModule, MatTooltipModule], template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1 overflow-y-auto\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
27880
28476
  }], propDecorators: { label: [{
27881
28477
  type: Input
27882
28478
  }], hint: [{
27883
28479
  type: Input
27884
28480
  }] } });
27885
28481
 
27886
- class MaxLinesComponent {
27887
- constructor(cdr) {
27888
- this.cdr = cdr;
27889
- this.maxLines = 6;
27890
- this.isExpanded = false;
27891
- this.maxHeight = '';
27892
- this.showToggleButton = false;
27893
- }
27894
- ngAfterViewInit() {
27895
- this.calculateMaxHeight();
27896
- this.observer = new ResizeObserver((mutations) => {
27897
- mutations.forEach(() => {
27898
- this.calculateMaxHeight();
27899
- });
27900
- });
27901
- this.observer.observe(this.container.nativeElement.children[0]);
27902
- }
27903
- toggleDisplay() {
27904
- this.isExpanded = !this.isExpanded;
27905
- this.calculateMaxHeight();
27906
- }
27907
- calculateMaxHeight() {
27908
- const containerElement = this.container.nativeElement;
27909
- const contentElement = containerElement.children[0];
27910
- const contentHeight = contentElement.getBoundingClientRect().height;
27911
- if (contentHeight) {
27912
- if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
27913
- this.showToggleButton = true;
27914
- this.maxHeight = this.isExpanded
27915
- ? `${contentHeight}px`
27916
- : `${this.maxLines * this.getLineHeight(contentElement)}px`;
27917
- }
27918
- else {
27919
- this.showToggleButton = false;
27920
- this.maxHeight = `${contentHeight}px`;
27921
- }
27922
- containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
27923
- this.cdr.detectChanges();
27924
- }
27925
- }
27926
- getLineHeight(element) {
27927
- const computedStyle = window.getComputedStyle(element);
27928
- const lineHeight = parseFloat(computedStyle.lineHeight);
27929
- const fontSize = parseFloat(computedStyle.fontSize || '14');
27930
- const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
27931
- return result;
27932
- }
27933
- ngOnDestroy() {
27934
- if (!this.observer)
27935
- return;
27936
- this.observer.unobserve(this.container.nativeElement.children[0]);
27937
- }
27938
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MaxLinesComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
27939
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MaxLinesComponent, isStandalone: true, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27940
- }
27941
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MaxLinesComponent, decorators: [{
27942
- type: Component,
27943
- args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule], template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
27944
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
27945
- type: Input
27946
- }], container: [{
27947
- type: ViewChild,
27948
- args: ['container']
27949
- }] } });
27950
-
27951
28482
  class InteractiveTableColumnComponent {
27952
28483
  constructor() {
27953
28484
  this.grow = false;
@@ -27997,11 +28528,11 @@ class InteractiveTableComponent {
27997
28528
  this.itemClick.emit(item);
27998
28529
  }
27999
28530
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28000
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items" }, outputs: { itemClick: "itemClick" }, queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"], 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: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28531
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items" }, outputs: { itemClick: "itemClick" }, queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"], 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: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28001
28532
  }
28002
28533
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InteractiveTableComponent, decorators: [{
28003
28534
  type: Component,
28004
- args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, InteractiveTableColumnComponent, MatIconModule], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"] }]
28535
+ args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, InteractiveTableColumnComponent, MatIconModule], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"] }]
28005
28536
  }], propDecorators: { columns: [{
28006
28537
  type: ContentChildren,
28007
28538
  args: [InteractiveTableColumnComponent]
@@ -28193,11 +28724,11 @@ class UserPreviewComponent {
28193
28724
  return (this.user.name + ' ' + this.user.surname).trim();
28194
28725
  }
28195
28726
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28196
- 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 }); }
28727
+ 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: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28197
28728
  }
28198
28729
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, decorators: [{
28199
28730
  type: Component,
28200
- 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" }]
28731
+ 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" }]
28201
28732
  }], propDecorators: { user: [{
28202
28733
  type: Input
28203
28734
  }], avatarPlaceholder: [{
@@ -28337,10 +28868,12 @@ class UiElementsModule {
28337
28868
  UiInputsModule,
28338
28869
  FormsModule,
28339
28870
  NgOptimizedImage,
28871
+ PopoverComponent,
28340
28872
  MarkdownParserComponent,
28341
28873
  ThumbnailComponent,
28342
28874
  TimeSincePipe,
28343
- BadgeComponent], exports: [MetadataInfoComponent,
28875
+ BadgeComponent,
28876
+ MaxLinesComponent], exports: [MetadataInfoComponent,
28344
28877
  ContentGhostComponent,
28345
28878
  DownloadItemComponent,
28346
28879
  DownloadsListComponent,
@@ -28370,8 +28903,10 @@ class UiElementsModule {
28370
28903
  RouterModule,
28371
28904
  UiInputsModule,
28372
28905
  FormsModule,
28906
+ PopoverComponent,
28373
28907
  ThumbnailComponent,
28374
- BadgeComponent] }); }
28908
+ BadgeComponent,
28909
+ MaxLinesComponent] }); }
28375
28910
  }
28376
28911
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UiElementsModule, decorators: [{
28377
28912
  type: NgModule,
@@ -28388,10 +28923,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28388
28923
  UiInputsModule,
28389
28924
  FormsModule,
28390
28925
  NgOptimizedImage,
28926
+ PopoverComponent,
28391
28927
  MarkdownParserComponent,
28392
28928
  ThumbnailComponent,
28393
28929
  TimeSincePipe,
28394
28930
  BadgeComponent,
28931
+ MaxLinesComponent,
28395
28932
  ],
28396
28933
  declarations: [
28397
28934
  MetadataInfoComponent,
@@ -28543,15 +29080,74 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28543
29080
  }]
28544
29081
  }] });
28545
29082
 
29083
+ class ActionMenuComponent {
29084
+ constructor(dialog, translateService) {
29085
+ this.dialog = dialog;
29086
+ this.translateService = translateService;
29087
+ this.duplicate = new EventEmitter();
29088
+ this.delete = new EventEmitter();
29089
+ }
29090
+ openMenu() {
29091
+ this.trigger.openMenu();
29092
+ }
29093
+ openDeleteConfirmationDialog() {
29094
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
29095
+ data: {
29096
+ title: this.translateService.instant('editor.record.delete.confirmation.title'),
29097
+ message: this.translateService.instant('editor.record.delete.confirmation.message'),
29098
+ confirmText: this.translateService.instant('editor.record.delete.confirmation.confirmText'),
29099
+ cancelText: this.translateService.instant('editor.record.delete.confirmation.cancelText'),
29100
+ },
29101
+ restoreFocus: false,
29102
+ });
29103
+ // Manually restore focus to the menu trigger since the element that
29104
+ // opens the dialog won't be in the DOM any more when the dialog closes.
29105
+ dialogRef.afterClosed().subscribe((confirmed) => {
29106
+ this.trigger.focus();
29107
+ if (confirmed) {
29108
+ this.delete.emit();
29109
+ }
29110
+ });
29111
+ }
29112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ActionMenuComponent, deps: [{ token: i1$7.MatDialog }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
29113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ActionMenuComponent, isStandalone: true, selector: "gn-ui-action-menu", inputs: { canDuplicate: "canDuplicate", canDelete: "canDelete" }, outputs: { duplicate: "duplicate", delete: "delete" }, viewQueries: [{ propertyName: "trigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<gn-ui-button\n type=\"light\"\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 [disabled]=\"!canDuplicate\"\n (click)=\"duplicate.emit()\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span translate>record.action.duplicate</span>\n </button>\n <button\n mat-menu-item\n [disabled]=\"!canDelete\"\n (click)=\"openDeleteConfirmationDialog()\"\n data-test=\"record-menu-delete-button\"\n >\n <span translate>record.action.delete</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: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
29114
+ }
29115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ActionMenuComponent, decorators: [{
29116
+ type: Component,
29117
+ args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [
29118
+ MatIconModule,
29119
+ ButtonComponent,
29120
+ MatMenuModule,
29121
+ MatDialogModule,
29122
+ ConfirmationDialogComponent,
29123
+ TranslateModule,
29124
+ ], template: "<gn-ui-button\n type=\"light\"\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 [disabled]=\"!canDuplicate\"\n (click)=\"duplicate.emit()\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span translate>record.action.duplicate</span>\n </button>\n <button\n mat-menu-item\n [disabled]=\"!canDelete\"\n (click)=\"openDeleteConfirmationDialog()\"\n data-test=\"record-menu-delete-button\"\n >\n <span translate>record.action.delete</span>\n </button>\n</mat-menu>\n" }]
29125
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialog }, { type: i1$1.TranslateService }]; }, propDecorators: { canDuplicate: [{
29126
+ type: Input
29127
+ }], canDelete: [{
29128
+ type: Input
29129
+ }], duplicate: [{
29130
+ type: Output
29131
+ }], delete: [{
29132
+ type: Output
29133
+ }], trigger: [{
29134
+ type: ViewChild,
29135
+ args: [MatMenuTrigger]
29136
+ }] } });
29137
+
28546
29138
  class ResultsTableComponent {
28547
29139
  constructor() {
28548
29140
  this.records = [];
28549
29141
  this.selectedRecordsIdentifiers = [];
28550
29142
  this.sortOrder = null;
28551
- this.recordHasDraft = () => false;
29143
+ this.hasDraft = () => false;
29144
+ this.canDuplicate = () => true;
29145
+ this.canDelete = () => true;
28552
29146
  // emits the column (field) as well as the order
28553
29147
  this.sortByChange = new EventEmitter();
28554
29148
  this.recordClick = new EventEmitter();
29149
+ this.duplicateRecord = new EventEmitter();
29150
+ this.deleteRecord = new EventEmitter();
28555
29151
  this.recordsSelectedChange = new EventEmitter();
28556
29152
  }
28557
29153
  dateToString(date) {
@@ -28586,6 +29182,12 @@ class ResultsTableComponent {
28586
29182
  handleRecordClick(item) {
28587
29183
  this.recordClick.emit(item);
28588
29184
  }
29185
+ handleDuplicate(item) {
29186
+ this.duplicateRecord.emit(item);
29187
+ }
29188
+ handleDelete(item) {
29189
+ this.deleteRecord.emit(item);
29190
+ }
28589
29191
  setSortBy(col, order) {
28590
29192
  this.sortByChange.emit([col, order]);
28591
29193
  }
@@ -28621,7 +29223,7 @@ class ResultsTableComponent {
28621
29223
  return !allSelected && someSelected;
28622
29224
  }
28623
29225
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28624
- 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"] }] }); }
29226
+ 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", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", 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=\"hasDraft(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\n [canDuplicate]=\"canDuplicate(item)\"\n [canDelete]=\"canDelete(item)\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n >\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", inputs: ["canDuplicate", "canDelete"], outputs: ["duplicate", "delete"] }] }); }
28625
29227
  }
28626
29228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, decorators: [{
28627
29229
  type: Component,
@@ -28633,19 +29235,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28633
29235
  MatIconModule,
28634
29236
  TranslateModule,
28635
29237
  BadgeComponent,
28636
- ], 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" }]
29238
+ ActionMenuComponent,
29239
+ ], 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=\"hasDraft(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\n [canDuplicate]=\"canDuplicate(item)\"\n [canDelete]=\"canDelete(item)\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
28637
29240
  }], propDecorators: { records: [{
28638
29241
  type: Input
28639
29242
  }], selectedRecordsIdentifiers: [{
28640
29243
  type: Input
28641
29244
  }], sortOrder: [{
28642
29245
  type: Input
28643
- }], recordHasDraft: [{
29246
+ }], hasDraft: [{
29247
+ type: Input
29248
+ }], canDuplicate: [{
29249
+ type: Input
29250
+ }], canDelete: [{
28644
29251
  type: Input
28645
29252
  }], sortByChange: [{
28646
29253
  type: Output
28647
29254
  }], recordClick: [{
28648
29255
  type: Output
29256
+ }], duplicateRecord: [{
29257
+ type: Output
29258
+ }], deleteRecord: [{
29259
+ type: Output
28649
29260
  }], recordsSelectedChange: [{
28650
29261
  type: Output
28651
29262
  }] } });
@@ -29259,6 +29870,10 @@ class SearchFacade {
29259
29870
  this.store.dispatch(new RequestMoreResults(this.searchId));
29260
29871
  return this;
29261
29872
  }
29873
+ requestNewResults() {
29874
+ this.store.dispatch(new RequestNewResults(this.searchId));
29875
+ return this;
29876
+ }
29262
29877
  requestMoreOnAggregation(key, increment) {
29263
29878
  this.store.dispatch(new RequestMoreOnAggregation(key, increment, this.searchId));
29264
29879
  return this;
@@ -30110,12 +30725,12 @@ class SearchEffects {
30110
30725
  );
30111
30726
  });
30112
30727
  }
30113
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchEffects, deps: [{ token: i1$8.Actions }, { token: i1$2.Store }, { token: RecordsRepositoryInterface }, { token: FavoritesService }, { token: PlatformServiceInterface }, { token: FILTER_GEOMETRY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
30728
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchEffects, deps: [{ token: i1$9.Actions }, { token: i1$2.Store }, { token: RecordsRepositoryInterface }, { token: FavoritesService }, { token: PlatformServiceInterface }, { token: FILTER_GEOMETRY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
30114
30729
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchEffects }); }
30115
30730
  }
30116
30731
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchEffects, decorators: [{
30117
30732
  type: Injectable
30118
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: i1$2.Store }, { type: RecordsRepositoryInterface }, { type: FavoritesService }, { type: PlatformServiceInterface }, { type: Promise, decorators: [{
30733
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }, { type: i1$2.Store }, { type: RecordsRepositoryInterface }, { type: FavoritesService }, { type: PlatformServiceInterface }, { type: Promise, decorators: [{
30119
30734
  type: Optional
30120
30735
  }, {
30121
30736
  type: Inject,
@@ -30420,12 +31035,14 @@ marker('search.filters.keyword');
30420
31035
  marker('search.filters.isSpatial');
30421
31036
  marker('search.filters.license');
30422
31037
  marker('search.filters.publicationYear');
30423
- marker('search.filters.publisher');
31038
+ marker('search.filters.organization');
30424
31039
  marker('search.filters.representationType');
30425
31040
  marker('search.filters.resourceType');
30426
31041
  marker('search.filters.standard');
30427
31042
  marker('search.filters.topic');
30428
31043
  marker('search.filters.contact');
31044
+ marker('search.filters.producerOrg');
31045
+ marker('search.filters.publisherOrg');
30429
31046
  class FieldsService {
30430
31047
  get supportedFields() {
30431
31048
  return Object.keys(this.fields);
@@ -30433,7 +31050,7 @@ class FieldsService {
30433
31050
  constructor(injector) {
30434
31051
  this.injector = injector;
30435
31052
  this.fields = {
30436
- publisher: new OrganizationSearchField(this.injector),
31053
+ organization: new OrganizationSearchField(this.injector),
30437
31054
  format: new SimpleSearchField('format', this.injector, 'asc'),
30438
31055
  resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
30439
31056
  representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
@@ -30446,6 +31063,8 @@ class FieldsService {
30446
31063
  q: new FullTextSearchField(),
30447
31064
  license: new LicenseSearchField(this.injector),
30448
31065
  owner: new OwnerSearchField(this.injector),
31066
+ producerOrg: new MultilingualSearchField('originatorOrgForResourceObject', this.injector, 'asc', 'key'),
31067
+ publisherOrg: new MultilingualSearchField('distributorOrgForResourceObject', this.injector, 'asc', 'key'),
30449
31068
  };
30450
31069
  }
30451
31070
  getAvailableValues(fieldName) {
@@ -30525,7 +31144,7 @@ class FeatureSearchModule {
30525
31144
  ResultsHitsContainerComponent,
30526
31145
  SearchStateContainerDirective,
30527
31146
  FavoriteStarComponent,
30528
- FilterDropdownComponent], imports: [CommonModule, i1$1.TranslateModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule, HttpClientModule,
31147
+ FilterDropdownComponent], imports: [CommonModule, i1$1.TranslateModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule, HttpClientModule,
30529
31148
  HttpClientXsrfModule,
30530
31149
  UiSearchModule,
30531
31150
  UiInputsModule,
@@ -30616,13 +31235,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
30616
31235
  }]
30617
31236
  }] });
30618
31237
 
31238
+ class NotificationsService {
31239
+ constructor() {
31240
+ this.notifications$ = new BehaviorSubject([]);
31241
+ }
31242
+ showNotification(content, timeoutMs) {
31243
+ const id = Math.floor(Math.random() * 1000000);
31244
+ this.notifications$.next([...this.notifications$.value, { ...content, id }]);
31245
+ if (typeof timeoutMs === 'undefined')
31246
+ return;
31247
+ setTimeout(() => {
31248
+ this.removeNotificationById(id);
31249
+ }, timeoutMs);
31250
+ }
31251
+ removeNotificationById(id) {
31252
+ this.notifications$.next(this.notifications$.value.filter((n) => n.id !== id));
31253
+ }
31254
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31255
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, providedIn: 'root' }); }
31256
+ }
31257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, decorators: [{
31258
+ type: Injectable,
31259
+ args: [{
31260
+ providedIn: 'root',
31261
+ }]
31262
+ }] });
31263
+
31264
+ class FeatureNotificationsModule {
31265
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31266
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule }); }
31267
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, providers: [NotificationsService] }); }
31268
+ }
31269
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, decorators: [{
31270
+ type: NgModule,
31271
+ args: [{
31272
+ declarations: [],
31273
+ exports: [],
31274
+ imports: [],
31275
+ providers: [NotificationsService],
31276
+ }]
31277
+ }] });
31278
+
31279
+ class NotificationsContainerComponent {
31280
+ constructor(notificationsService) {
31281
+ this.notificationsService = notificationsService;
31282
+ }
31283
+ trackById(index, notification) {
31284
+ return notification.id;
31285
+ }
31286
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, deps: [{ token: NotificationsService }], target: i0.ɵɵFactoryTarget.Component }); }
31287
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NotificationsContainerComponent, isStandalone: true, selector: "gn-ui-notifications-container", ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-6 items-start pointer-events-none\">\n <gn-ui-notification\n *ngFor=\"\n let notification of notificationsService.notifications$ | async;\n trackBy: trackById\n \"\n class=\"max-w-full pointer-events-auto\"\n [text]=\"notification.text\"\n [type]=\"notification.type\"\n [title]=\"notification.title\"\n [closeMessage]=\"notification.closeMessage\"\n (notificationClose)=\"\n notificationsService.removeNotificationById(notification.id)\n \"\n [@enterExit]\n ></gn-ui-notification>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: NotificationComponent, selector: "gn-ui-notification", inputs: ["type", "title", "text", "closeMessage"], outputs: ["notificationClose"] }], animations: [
31288
+ trigger('enterExit', [
31289
+ transition(':enter', [
31290
+ animate('150ms', keyframes([
31291
+ style({ transform: 'scale(1)', opacity: 0 }),
31292
+ style({ transform: 'scale(1.03)', opacity: 0.5 }),
31293
+ style({ transform: 'scale(1)', opacity: 1 }),
31294
+ ])),
31295
+ ]),
31296
+ transition(':leave', [
31297
+ animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31298
+ ]),
31299
+ ]),
31300
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31301
+ }
31302
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, decorators: [{
31303
+ type: Component,
31304
+ args: [{ selector: 'gn-ui-notifications-container', standalone: true, imports: [CommonModule, NotificationComponent], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
31305
+ trigger('enterExit', [
31306
+ transition(':enter', [
31307
+ animate('150ms', keyframes([
31308
+ style({ transform: 'scale(1)', opacity: 0 }),
31309
+ style({ transform: 'scale(1.03)', opacity: 0.5 }),
31310
+ style({ transform: 'scale(1)', opacity: 1 }),
31311
+ ])),
31312
+ ]),
31313
+ transition(':leave', [
31314
+ animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31315
+ ]),
31316
+ ]),
31317
+ ], template: "<div class=\"flex flex-col gap-6 p-6 items-start pointer-events-none\">\n <gn-ui-notification\n *ngFor=\"\n let notification of notificationsService.notifications$ | async;\n trackBy: trackById\n \"\n class=\"max-w-full pointer-events-auto\"\n [text]=\"notification.text\"\n [type]=\"notification.type\"\n [title]=\"notification.title\"\n [closeMessage]=\"notification.closeMessage\"\n (notificationClose)=\"\n notificationsService.removeNotificationById(notification.id)\n \"\n [@enterExit]\n ></gn-ui-notification>\n</div>\n" }]
31318
+ }], ctorParameters: function () { return [{ type: NotificationsService }]; } });
31319
+
30619
31320
  class ResultsTableContainerComponent {
30620
- constructor(searchFacade, searchService, selectionService, recordsRepository) {
31321
+ constructor(searchFacade, searchService, selectionService, recordsRepository, notificationsService, translateService) {
30621
31322
  this.searchFacade = searchFacade;
30622
31323
  this.searchService = searchService;
30623
31324
  this.selectionService = selectionService;
30624
31325
  this.recordsRepository = recordsRepository;
31326
+ this.notificationsService = notificationsService;
31327
+ this.translateService = translateService;
30625
31328
  this.recordClick = new EventEmitter();
31329
+ this.duplicateRecord = new EventEmitter();
31330
+ this.subscription = new Subscription();
30626
31331
  this.records$ = this.searchFacade.results$;
30627
31332
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
30628
31333
  this.sortBy$ = this.searchFacade.sortBy$;
@@ -30631,6 +31336,26 @@ class ResultsTableContainerComponent {
30631
31336
  handleRecordClick(item) {
30632
31337
  this.recordClick.emit(item);
30633
31338
  }
31339
+ handleDuplicateRecord(item) {
31340
+ this.duplicateRecord.emit(item);
31341
+ }
31342
+ async handleDeleteRecord(item) {
31343
+ const uniqueIdentifier = item.uniqueIdentifier;
31344
+ this.subscription.add(this.recordsRepository.deleteRecord(uniqueIdentifier).subscribe({
31345
+ next: () => {
31346
+ this.recordsRepository.clearRecordDraft(uniqueIdentifier);
31347
+ this.searchFacade.requestNewResults();
31348
+ },
31349
+ error: (error) => {
31350
+ this.notificationsService.showNotification({
31351
+ type: 'error',
31352
+ title: this.translateService.instant('editor.record.deleteError.title'),
31353
+ text: `${this.translateService.instant('editor.record.deleteError.body')} ${error}`,
31354
+ closeMessage: this.translateService.instant('editor.record.deleteError.closeMessage'),
31355
+ });
31356
+ },
31357
+ }));
31358
+ }
30634
31359
  handleSortByChange(col, order) {
30635
31360
  this.searchService.setSortBy([order, col]);
30636
31361
  }
@@ -30642,13 +31367,18 @@ class ResultsTableContainerComponent {
30642
31367
  this.selectionService.selectRecords(records);
30643
31368
  }
30644
31369
  }
30645
- 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 }); }
30646
- 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"] }] }); }
31370
+ ngOnDestroy() {
31371
+ this.subscription.unsubscribe();
31372
+ }
31373
+ 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 }, { token: NotificationsService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
31374
+ 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 [hasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (deleteRecord)=\"handleDeleteRecord($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", "hasDraft", "canDuplicate", "canDelete"], outputs: ["sortByChange", "recordClick", "duplicateRecord", "deleteRecord", "recordsSelectedChange"] }] }); }
30647
31375
  }
30648
31376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
30649
31377
  type: Component,
30650
- 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" }]
30651
- }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }]; }, propDecorators: { recordClick: [{
31378
+ args: [{ selector: 'gn-ui-results-table-container', standalone: true, imports: [CommonModule, ResultsTableComponent], template: "<gn-ui-results-table\n [records]=\"records$ | async\"\n [hasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (deleteRecord)=\"handleDeleteRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n" }]
31379
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }]; }, propDecorators: { recordClick: [{
31380
+ type: Output
31381
+ }], duplicateRecord: [{
30652
31382
  type: Output
30653
31383
  }] } });
30654
31384
 
@@ -30949,7 +31679,7 @@ class LayersPanelComponent {
30949
31679
  this.mapFacade.addLayer(layer);
30950
31680
  }
30951
31681
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
30952
- 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 }); }
31682
+ 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$4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$4.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 }); }
30953
31683
  }
30954
31684
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LayersPanelComponent, decorators: [{
30955
31685
  type: Component,
@@ -30960,12 +31690,12 @@ class MapEffects {
30960
31690
  constructor(actions$) {
30961
31691
  this.actions$ = actions$;
30962
31692
  }
30963
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapEffects, deps: [{ token: i1$8.Actions }], target: i0.ɵɵFactoryTarget.Injectable }); }
31693
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapEffects, deps: [{ token: i1$9.Actions }], target: i0.ɵɵFactoryTarget.Injectable }); }
30964
31694
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapEffects }); }
30965
31695
  }
30966
31696
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapEffects, decorators: [{
30967
31697
  type: Injectable
30968
- }], ctorParameters: function () { return [{ type: i1$8.Actions }]; } });
31698
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }]; } });
30969
31699
 
30970
31700
  class MapContainerComponent {
30971
31701
  constructor(mapFacade) {
@@ -31118,7 +31848,7 @@ class FeatureMapModule {
31118
31848
  MatIconModule,
31119
31849
  MatTabsModule,
31120
31850
  TranslateModule,
31121
- FeatureSearchModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule, UiElementsModule,
31851
+ FeatureSearchModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule, UiElementsModule,
31122
31852
  UiInputsModule,
31123
31853
  AddLayerFromOgcApiComponent], exports: [MapContextComponent,
31124
31854
  MapInstanceDirective,
@@ -31242,88 +31972,6 @@ const DEFAULT_STYLE_HL_FIXTURE = new Style$1({
31242
31972
  }),
31243
31973
  });
31244
31974
 
31245
- class NotificationsService {
31246
- constructor() {
31247
- this.notifications$ = new BehaviorSubject([]);
31248
- }
31249
- showNotification(content, timeoutMs) {
31250
- const id = Math.floor(Math.random() * 1000000);
31251
- this.notifications$.next([...this.notifications$.value, { ...content, id }]);
31252
- if (typeof timeoutMs === 'undefined')
31253
- return;
31254
- setTimeout(() => {
31255
- this.removeNotificationById(id);
31256
- }, timeoutMs);
31257
- }
31258
- removeNotificationById(id) {
31259
- this.notifications$.next(this.notifications$.value.filter((n) => n.id !== id));
31260
- }
31261
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31262
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, providedIn: 'root' }); }
31263
- }
31264
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, decorators: [{
31265
- type: Injectable,
31266
- args: [{
31267
- providedIn: 'root',
31268
- }]
31269
- }] });
31270
-
31271
- class FeatureNotificationsModule {
31272
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31273
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule }); }
31274
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, providers: [NotificationsService] }); }
31275
- }
31276
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, decorators: [{
31277
- type: NgModule,
31278
- args: [{
31279
- declarations: [],
31280
- exports: [],
31281
- imports: [],
31282
- providers: [NotificationsService],
31283
- }]
31284
- }] });
31285
-
31286
- class NotificationsContainerComponent {
31287
- constructor(notificationsService) {
31288
- this.notificationsService = notificationsService;
31289
- }
31290
- trackById(index, notification) {
31291
- return notification.id;
31292
- }
31293
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, deps: [{ token: NotificationsService }], target: i0.ɵɵFactoryTarget.Component }); }
31294
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NotificationsContainerComponent, isStandalone: true, selector: "gn-ui-notifications-container", ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-6 items-start pointer-events-none\">\n <gn-ui-notification\n *ngFor=\"\n let notification of notificationsService.notifications$ | async;\n trackBy: trackById\n \"\n class=\"max-w-full pointer-events-auto\"\n [text]=\"notification.text\"\n [type]=\"notification.type\"\n [title]=\"notification.title\"\n [closeMessage]=\"notification.closeMessage\"\n (notificationClose)=\"\n notificationsService.removeNotificationById(notification.id)\n \"\n [@enterExit]\n ></gn-ui-notification>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: NotificationComponent, selector: "gn-ui-notification", inputs: ["type", "title", "text", "closeMessage"], outputs: ["notificationClose"] }], animations: [
31295
- trigger('enterExit', [
31296
- transition(':enter', [
31297
- animate('150ms', keyframes([
31298
- style({ transform: 'scale(1)', opacity: 0 }),
31299
- style({ transform: 'scale(1.03)', opacity: 0.5 }),
31300
- style({ transform: 'scale(1)', opacity: 1 }),
31301
- ])),
31302
- ]),
31303
- transition(':leave', [
31304
- animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31305
- ]),
31306
- ]),
31307
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31308
- }
31309
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, decorators: [{
31310
- type: Component,
31311
- args: [{ selector: 'gn-ui-notifications-container', standalone: true, imports: [CommonModule, NotificationComponent], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
31312
- trigger('enterExit', [
31313
- transition(':enter', [
31314
- animate('150ms', keyframes([
31315
- style({ transform: 'scale(1)', opacity: 0 }),
31316
- style({ transform: 'scale(1.03)', opacity: 0.5 }),
31317
- style({ transform: 'scale(1)', opacity: 1 }),
31318
- ])),
31319
- ]),
31320
- transition(':leave', [
31321
- animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31322
- ]),
31323
- ]),
31324
- ], template: "<div class=\"flex flex-col gap-6 p-6 items-start pointer-events-none\">\n <gn-ui-notification\n *ngFor=\"\n let notification of notificationsService.notifications$ | async;\n trackBy: trackById\n \"\n class=\"max-w-full pointer-events-auto\"\n [text]=\"notification.text\"\n [type]=\"notification.type\"\n [title]=\"notification.title\"\n [closeMessage]=\"notification.closeMessage\"\n (notificationClose)=\"\n notificationsService.removeNotificationById(notification.id)\n \"\n [@enterExit]\n ></gn-ui-notification>\n</div>\n" }]
31325
- }], ctorParameters: function () { return [{ type: NotificationsService }]; } });
31326
-
31327
31975
  /*
31328
31976
  Metadata actions
31329
31977
  */
@@ -31691,7 +32339,7 @@ class TableComponent {
31691
32339
  return rowIdPrefix + id;
31692
32340
  }
31693
32341
  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 }); }
31694
- 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 }); }
32342
+ 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$a.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$a.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$a.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$a.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$a.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$a.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$a.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$a.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$a.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$a.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$5.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$3.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4$1.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 }); }
31695
32343
  }
31696
32344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, decorators: [{
31697
32345
  type: Component,
@@ -33064,7 +33712,10 @@ class MdViewFacade {
33064
33712
  return collectionRecords && collectionRecords.geometry
33065
33713
  ? link
33066
33714
  : null;
33067
- }), defaultIfEmpty(null));
33715
+ }), defaultIfEmpty(null), catchError((e) => {
33716
+ console.error(e);
33717
+ return of(null);
33718
+ }));
33068
33719
  }
33069
33720
  else {
33070
33721
  return of(link);
@@ -33154,12 +33805,12 @@ class MdViewEffects {
33154
33805
  }));
33155
33806
  })))));
33156
33807
  }
33157
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$8.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
33808
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$9.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
33158
33809
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MdViewEffects }); }
33159
33810
  }
33160
33811
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MdViewEffects, decorators: [{
33161
33812
  type: Injectable
33162
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
33813
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
33163
33814
 
33164
33815
  marker('externalviewer.dataset.unnamed');
33165
33816
  class ExternalViewerButtonComponent {
@@ -33784,9 +34435,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33784
34435
  class RecordsService {
33785
34436
  constructor(recordsRepository) {
33786
34437
  this.recordsRepository = recordsRepository;
33787
- this.recordsCount$ = this.recordsRepository
33788
- .getMatchesCount({})
33789
- .pipe(shareReplay(1), catchError(() => of(0)));
34438
+ this.recordsCount$ = of(true).pipe(switchMap(() => this.recordsRepository.getMatchesCount({})), shareReplay(1));
33790
34439
  }
33791
34440
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordsService, deps: [{ token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
33792
34441
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordsService, providedIn: 'root' }); }
@@ -33836,37 +34485,54 @@ const GN_UI_VERSION = new InjectionToken('gnUiVersion');
33836
34485
 
33837
34486
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
33838
34487
  class DataViewPermalinkComponent {
34488
+ set viewType(value) {
34489
+ this.viewType$.next(value);
34490
+ }
33839
34491
  constructor(config, wcEmbedderBaseUrl, version, facade) {
33840
34492
  this.config = config;
33841
34493
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
33842
34494
  this.version = version;
33843
34495
  this.facade = facade;
34496
+ this.viewType$ = new BehaviorSubject('map');
33844
34497
  this.permalinkUrl$ = combineLatest([
34498
+ this.viewType$,
33845
34499
  this.facade.chartConfig$,
33846
34500
  this.facade.metadata$,
33847
- ]).pipe(map$2(([config, metadata]) => {
33848
- if (config) {
33849
- const { aggregation, xProperty, yProperty, chartType } = config;
33850
- const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
33851
- url.searchParams.set('v', `${this.version}`);
33852
- url.searchParams.append('e', `gn-dataset-view-chart`);
33853
- url.searchParams.append('a', `api-url=${this.config.basePath}`);
33854
- url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
33855
- url.searchParams.append('a', `primary-color=#0f4395`);
33856
- url.searchParams.append('a', `secondary-color=#8bc832`);
33857
- url.searchParams.append('a', `main-color=#555`);
33858
- url.searchParams.append('a', `background-color=#fdfbff`);
33859
- url.searchParams.append('a', `aggregation=${aggregation}`);
33860
- url.searchParams.append('a', `x-property=${xProperty}`);
33861
- url.searchParams.append('a', `y-property=${yProperty}`);
33862
- url.searchParams.append('a', `chart-type=${chartType}`);
33863
- return url.toString();
34501
+ ]).pipe(map$2(([viewType, config, metadata]) => {
34502
+ const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
34503
+ url.searchParams.set('v', `${this.version}`);
34504
+ if (viewType === 'chart') {
34505
+ if (config) {
34506
+ const { aggregation, xProperty, yProperty, chartType } = config;
34507
+ url.searchParams.append('e', `gn-dataset-view-chart`);
34508
+ url.searchParams.append('a', `aggregation=${aggregation}`);
34509
+ url.searchParams.append('a', `x-property=${xProperty}`);
34510
+ url.searchParams.append('a', `y-property=${yProperty}`);
34511
+ url.searchParams.append('a', `chart-type=${chartType}`);
34512
+ }
34513
+ else {
34514
+ return '';
34515
+ }
33864
34516
  }
33865
- return '';
34517
+ else if (viewType === 'table') {
34518
+ // table
34519
+ url.searchParams.append('e', `gn-dataset-view-table`);
34520
+ }
34521
+ else {
34522
+ // map
34523
+ url.searchParams.append('e', `gn-dataset-view-map`);
34524
+ }
34525
+ url.searchParams.append('a', `api-url=${this.config.basePath}`);
34526
+ url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
34527
+ url.searchParams.append('a', `primary-color=#0f4395`);
34528
+ url.searchParams.append('a', `secondary-color=#8bc832`);
34529
+ url.searchParams.append('a', `main-color=#555`);
34530
+ url.searchParams.append('a', `background-color=#fdfbff`);
34531
+ return url.toString();
33866
34532
  }));
33867
34533
  }
33868
34534
  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 }); }
33869
- 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 }); }
34535
+ 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 }); }
33870
34536
  }
33871
34537
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
33872
34538
  type: Component,
@@ -33882,37 +34548,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33882
34548
  }] }, { type: undefined, decorators: [{
33883
34549
  type: Inject,
33884
34550
  args: [GN_UI_VERSION]
33885
- }] }, { type: MdViewFacade }]; } });
34551
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34552
+ type: Input
34553
+ }] } });
33886
34554
 
33887
34555
  class DataViewWebComponentComponent {
34556
+ set viewType(value) {
34557
+ this.viewType$.next(value);
34558
+ }
33888
34559
  constructor(config, version, facade) {
33889
34560
  this.config = config;
33890
34561
  this.version = version;
33891
34562
  this.facade = facade;
33892
- this.webComponentHtml$ = combineLatest(this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([config, metadata]) => {
33893
- if (config) {
33894
- const { aggregation, xProperty, yProperty, chartType } = config;
34563
+ this.viewType$ = new BehaviorSubject('map');
34564
+ this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
34565
+ if (viewType === 'chart') {
34566
+ if (config) {
34567
+ const { aggregation, xProperty, yProperty, chartType } = config;
34568
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34569
+ <gn-dataset-view-chart
34570
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34571
+ dataset-id="${metadata.uniqueIdentifier}"
34572
+ aggregation="${aggregation}"
34573
+ x-property="${xProperty}"
34574
+ y-property="${yProperty}"
34575
+ chart-type="${chartType}"
34576
+ primary-color="#0f4395"
34577
+ secondary-color="#8bc832"
34578
+ main-color="#555"
34579
+ background-color="#fdfbff"
34580
+ main-font="'Inter', sans-serif"
34581
+ title-font="'DM Serif Display', serif"
34582
+ ></gn-dataset-view-chart>`;
34583
+ }
34584
+ return '';
34585
+ }
34586
+ else if (viewType === 'table') {
34587
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34588
+ <gn-dataset-view-table
34589
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34590
+ dataset-id="${metadata.uniqueIdentifier}"
34591
+ primary-color="#0f4395"
34592
+ secondary-color="#8bc832"
34593
+ main-color="#555"
34594
+ background-color="#fdfbff"
34595
+ main-font="'Inter', sans-serif"
34596
+ title-font="'DM Serif Display', serif"
34597
+ ></gn-dataset-view-table>`;
34598
+ }
34599
+ else {
33895
34600
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
33896
- <gn-dataset-view-chart
34601
+ <gn-dataset-view-map
33897
34602
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
33898
34603
  dataset-id="${metadata.uniqueIdentifier}"
33899
- aggregation="${aggregation}"
33900
- x-property="${xProperty}"
33901
- y-property="${yProperty}"
33902
- chart-type="${chartType}"
33903
34604
  primary-color="#0f4395"
33904
34605
  secondary-color="#8bc832"
33905
34606
  main-color="#555"
33906
34607
  background-color="#fdfbff"
33907
34608
  main-font="'Inter', sans-serif"
33908
34609
  title-font="'DM Serif Display', serif"
33909
- ></gn-dataset-view-chart>`;
34610
+ ></gn-dataset-view-map>`;
33910
34611
  }
33911
- return '';
33912
34612
  }));
33913
34613
  }
33914
34614
  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 }); }
33915
- 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 }); }
34615
+ 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 }); }
33916
34616
  }
33917
34617
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
33918
34618
  type: Component,
@@ -33923,24 +34623,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33923
34623
  }] }, { type: undefined, decorators: [{
33924
34624
  type: Inject,
33925
34625
  args: [GN_UI_VERSION]
33926
- }] }, { type: MdViewFacade }]; } });
34626
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34627
+ type: Input
34628
+ }] } });
33927
34629
 
33928
34630
  class DataViewShareComponent {
34631
+ set viewType(value) {
34632
+ this._viewType = value;
34633
+ }
34634
+ get viewType() {
34635
+ return this._viewType;
34636
+ }
33929
34637
  constructor(wcEmbedderBaseUrl) {
33930
34638
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
33931
34639
  }
33932
34640
  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 }); }
33933
- 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 }); }
34641
+ 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$4.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2$4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$4.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 }); }
33934
34642
  }
33935
34643
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewShareComponent, decorators: [{
33936
34644
  type: Component,
33937
- 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"] }]
34645
+ 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"] }]
33938
34646
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
33939
34647
  type: Optional
33940
34648
  }, {
33941
34649
  type: Inject,
33942
34650
  args: [WEB_COMPONENT_EMBEDDER_URL]
33943
- }] }]; } });
34651
+ }] }]; }, propDecorators: { viewType: [{
34652
+ type: Input
34653
+ }] } });
33944
34654
 
33945
34655
  class FeatureRecordModule {
33946
34656
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureRecordModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -33949,7 +34659,7 @@ class FeatureRecordModule {
33949
34659
  ExternalViewerButtonComponent,
33950
34660
  DataViewPermalinkComponent,
33951
34661
  DataViewWebComponentComponent,
33952
- DataViewShareComponent], imports: [CommonModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule, UiLayoutModule,
34662
+ DataViewShareComponent], imports: [CommonModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule, UiLayoutModule,
33953
34663
  FeatureMapModule,
33954
34664
  FeatureCatalogModule,
33955
34665
  UiMapModule,
@@ -34030,75 +34740,169 @@ const saveRecord = createAction('[Editor] Save record');
34030
34740
  const saveRecordSuccess = createAction('[Editor] Save record success');
34031
34741
  const saveRecordFailure = createAction('[Editor] Save record failure', props());
34032
34742
  const draftSaveSuccess = createAction('[Editor] Draft save success');
34743
+ const setCurrentPage = createAction('[Editor] Set current page', props());
34033
34744
 
34034
- const DEFAULT_FIELDS = [
34035
- {
34036
- model: 'title',
34037
- formFieldConfig: {
34038
- labelKey: 'Metadata title',
34039
- type: 'text',
34040
- },
34745
+ /**
34746
+ * This file contains the configuration of the fields that will be displayed in the editor.
34747
+ * To add a new field, you need to create a new EditorField object in the fields part of this file.
34748
+ * Then add it to the corresponding section in the sections part of this file.
34749
+ * Finally, add the section to the corresponding page in the pages part of this file.
34750
+ */
34751
+ /************************************************************
34752
+ *************** FIELDS *****************
34753
+ ************************************************************
34754
+ */
34755
+ const RECORD_LICENSE_FIELD = {
34756
+ model: 'licenses',
34757
+ formFieldConfig: {
34758
+ labelKey: marker('editor.record.form.field.license'),
34041
34759
  },
34042
- {
34043
- model: 'abstract',
34044
- formFieldConfig: {
34045
- labelKey: 'Abstract',
34046
- type: 'rich',
34047
- },
34760
+ };
34761
+ const RECORD_KEYWORDS_FIELD = {
34762
+ model: 'keywords',
34763
+ formFieldConfig: {
34764
+ labelKey: marker('editor.record.form.field.keywords'),
34048
34765
  },
34049
- {
34050
- model: 'uniqueIdentifier',
34051
- formFieldConfig: {
34052
- labelKey: 'Unique identifier',
34053
- type: 'text',
34054
- locked: true,
34055
- },
34766
+ };
34767
+ const RECORD_UNIQUE_IDENTIFIER_FIELD = {
34768
+ model: 'uniqueIdentifier',
34769
+ formFieldConfig: {
34770
+ labelKey: marker('editor.record.form.field.uniqueIdentifier'),
34771
+ locked: true,
34056
34772
  },
34057
- {
34058
- model: 'recordUpdated',
34059
- formFieldConfig: {
34060
- labelKey: 'Record Updated',
34061
- type: 'text',
34062
- locked: true,
34063
- },
34064
- onSaveProcess: '${dateNow()}',
34773
+ };
34774
+ const RECORD_RESOURCE_UPDATED_FIELD = {
34775
+ model: 'resourceUpdated',
34776
+ formFieldConfig: {
34777
+ labelKey: marker('editor.record.form.field.resourceUpdated'),
34065
34778
  },
34066
- {
34067
- model: 'licenses',
34068
- formFieldConfig: {
34069
- labelKey: marker('editor.record.form.license'),
34070
- type: 'list',
34071
- },
34779
+ };
34780
+ const RECORD_UPDATED_FIELD = {
34781
+ model: 'recordUpdated',
34782
+ formFieldConfig: {
34783
+ labelKey: marker('editor.record.form.field.recordUpdated'),
34784
+ locked: true,
34072
34785
  },
34073
- {
34074
- model: 'resourceUpdated',
34075
- formFieldConfig: {
34076
- labelKey: marker('editor.record.form.resourceUpdated'),
34077
- type: 'date',
34078
- },
34786
+ onSaveProcess: '${dateNow()}',
34787
+ };
34788
+ const RECORD_UPDATE_FREQUENCY_FIELD = {
34789
+ model: 'updateFrequency',
34790
+ formFieldConfig: {
34791
+ labelKey: marker('editor.record.form.field.updateFrequency'),
34079
34792
  },
34080
- {
34081
- model: 'updateFrequency',
34082
- formFieldConfig: {
34083
- labelKey: marker('editor.record.form.updateFrequency'),
34084
- type: 'text',
34085
- },
34793
+ };
34794
+ const RECORD_TEMPORAL_EXTENTS_FIELD = {
34795
+ model: 'temporalExtents',
34796
+ formFieldConfig: {
34797
+ labelKey: marker('editor.record.form.field.temporalExtents'),
34086
34798
  },
34087
- {
34088
- model: 'temporalExtents',
34089
- formFieldConfig: {
34090
- labelKey: marker('editor.record.form.temporalExtents'),
34091
- type: 'list',
34092
- },
34799
+ };
34800
+ const RECORD_TITLE_FIELD = {
34801
+ model: 'title',
34802
+ formFieldConfig: {
34803
+ labelKey: marker('editor.record.form.field.title'),
34093
34804
  },
34094
- {
34095
- model: 'keywords',
34096
- formFieldConfig: {
34097
- labelKey: marker('editor.record.form.keywords'),
34098
- type: 'list',
34099
- },
34805
+ };
34806
+ const RECORD_ABSTRACT_FIELD = {
34807
+ model: 'abstract',
34808
+ formFieldConfig: {
34809
+ labelKey: marker('editor.record.form.field.abstract'),
34100
34810
  },
34101
- ];
34811
+ };
34812
+ const RECORD_GRAPHICAL_OVERVIEW_FIELD = {
34813
+ model: 'overviews',
34814
+ formFieldConfig: {
34815
+ labelKey: marker('editor.record.form.field.overviews'),
34816
+ },
34817
+ };
34818
+ /************************************************************
34819
+ *************** SECTIONS *****************
34820
+ ************************************************************
34821
+ */
34822
+ const TITLE_SECTION = {
34823
+ hidden: false,
34824
+ fields: [
34825
+ RECORD_TITLE_FIELD,
34826
+ RECORD_ABSTRACT_FIELD,
34827
+ RECORD_GRAPHICAL_OVERVIEW_FIELD,
34828
+ ],
34829
+ };
34830
+ const ABOUT_SECTION = {
34831
+ labelKey: marker('editor.record.form.section.about.label'),
34832
+ descriptionKey: marker('editor.record.form.section.about.description'),
34833
+ hidden: false,
34834
+ fields: [
34835
+ RECORD_UNIQUE_IDENTIFIER_FIELD,
34836
+ RECORD_RESOURCE_UPDATED_FIELD,
34837
+ RECORD_UPDATED_FIELD,
34838
+ RECORD_UPDATE_FREQUENCY_FIELD,
34839
+ RECORD_TEMPORAL_EXTENTS_FIELD,
34840
+ ],
34841
+ };
34842
+ const GEOGRAPHICAL_COVERAGE_SECTION = {
34843
+ labelKey: marker('editor.record.form.section.geographicalCoverage.label'),
34844
+ hidden: false,
34845
+ fields: [],
34846
+ };
34847
+ const ASSOCIATED_RESOURCES_SECTION = {
34848
+ labelKey: marker('editor.record.form.section.associatedResources.label'),
34849
+ descriptionKey: marker('editor.record.form.section.associatedResources.description'),
34850
+ hidden: false,
34851
+ fields: [],
34852
+ };
34853
+ const ANNEXES_SECTION = {
34854
+ labelKey: marker('editor.record.form.section.annexes.label'),
34855
+ hidden: false,
34856
+ fields: [],
34857
+ };
34858
+ const CLASSIFICATION_SECTION = {
34859
+ labelKey: marker('editor.record.form.section.classification.label'),
34860
+ descriptionKey: marker('editor.record.form.section.classification.description'),
34861
+ hidden: false,
34862
+ fields: [RECORD_KEYWORDS_FIELD],
34863
+ };
34864
+ const USE_AND_ACCESS_CONDITIONS_SECTION = {
34865
+ labelKey: marker('editor.record.form.section.useAndAccessConditions.label'),
34866
+ hidden: false,
34867
+ fields: [RECORD_LICENSE_FIELD],
34868
+ };
34869
+ const DATA_MANAGERS_SECTION = {
34870
+ labelKey: marker('editor.record.form.section.dataManagers.label'),
34871
+ descriptionKey: marker('editor.record.form.section.dataManagers.description'),
34872
+ hidden: false,
34873
+ fields: [],
34874
+ };
34875
+ const DATA_POINT_OF_CONTACT_SECTION = {
34876
+ labelKey: marker('editor.record.form.section.dataPointOfContact.label'),
34877
+ descriptionKey: marker('editor.record.form.section.dataPointOfContact.description'),
34878
+ hidden: false,
34879
+ fields: [],
34880
+ };
34881
+ /************************************************************
34882
+ *************** PAGES *****************
34883
+ ************************************************************
34884
+ */
34885
+ const DEFAULT_CONFIGURATION = {
34886
+ pages: [
34887
+ {
34888
+ labelKey: marker('editor.record.form.page.description'),
34889
+ sections: [TITLE_SECTION, ABOUT_SECTION, GEOGRAPHICAL_COVERAGE_SECTION],
34890
+ },
34891
+ {
34892
+ labelKey: marker('editor.record.form.page.ressources'),
34893
+ sections: [ASSOCIATED_RESOURCES_SECTION, ANNEXES_SECTION],
34894
+ },
34895
+ {
34896
+ labelKey: marker('editor.record.form.page.accessAndContact'),
34897
+ sections: [
34898
+ CLASSIFICATION_SECTION,
34899
+ USE_AND_ACCESS_CONDITIONS_SECTION,
34900
+ DATA_MANAGERS_SECTION,
34901
+ DATA_POINT_OF_CONTACT_SECTION,
34902
+ ],
34903
+ },
34904
+ ],
34905
+ };
34102
34906
 
34103
34907
  const EDITOR_FEATURE_KEY = 'editor';
34104
34908
  const initialEditorState = {
@@ -34108,7 +34912,8 @@ const initialEditorState = {
34108
34912
  saving: false,
34109
34913
  saveError: null,
34110
34914
  changedSinceSave: false,
34111
- fieldsConfig: DEFAULT_FIELDS,
34915
+ editorConfig: DEFAULT_CONFIGURATION,
34916
+ currentPage: 0,
34112
34917
  };
34113
34918
  const reducer = createReducer(initialEditorState, on(openRecord, (state, { record, recordSource, alreadySavedOnce }) => ({
34114
34919
  ...state,
@@ -34138,6 +34943,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
34138
34943
  })), on(markRecordAsChanged, (state) => ({
34139
34944
  ...state,
34140
34945
  changedSinceSave: true,
34946
+ })), on(setCurrentPage, (state, { page }) => ({
34947
+ ...state,
34948
+ currentPage: page,
34141
34949
  })));
34142
34950
  function editorReducer(state, action) {
34143
34951
  return reducer(state, action);
@@ -34150,11 +34958,21 @@ const selectRecordSaving = createSelector(selectEditorState, (state) => state.sa
34150
34958
  const selectRecordSaveError = createSelector(selectEditorState, (state) => state.saveError);
34151
34959
  const selectRecordChangedSinceSave = createSelector(selectEditorState, (state) => state.changedSinceSave);
34152
34960
  const selectRecordAlreadySavedOnce = createSelector(selectEditorState, (state) => state.alreadySavedOnce);
34153
- const selectRecordFieldsConfig = createSelector(selectEditorState, (state) => state.fieldsConfig);
34154
- const selectRecordFields = createSelector(selectEditorState, (state) => state.fieldsConfig.map((fieldConfig) => ({
34155
- config: fieldConfig,
34156
- value: state.record?.[fieldConfig.model] ?? null,
34157
- })));
34961
+ const selectEditorConfig = createSelector(selectEditorState, (state) => state.editorConfig);
34962
+ const selectCurrentPage = createSelector(selectEditorState, (state) => state.currentPage);
34963
+ const selectRecordSections = createSelector(selectEditorState, (state) => {
34964
+ const currentPage = state.editorConfig.pages[state.currentPage];
34965
+ if (!currentPage) {
34966
+ return [];
34967
+ }
34968
+ return currentPage.sections.map((section) => ({
34969
+ ...section,
34970
+ fieldsWithValues: section.fields.map((fieldConfig) => ({
34971
+ config: fieldConfig,
34972
+ value: state.record?.[fieldConfig.model] ?? null,
34973
+ })),
34974
+ }));
34975
+ });
34158
34976
 
34159
34977
  class EditorFacade {
34160
34978
  constructor() {
@@ -34167,8 +34985,10 @@ class EditorFacade {
34167
34985
  this.saveError$ = this.store.pipe(select(selectRecordSaveError), filter$1((error) => !!error));
34168
34986
  this.saveSuccess$ = this.actions$.pipe(ofType(saveRecordSuccess));
34169
34987
  this.changedSinceSave$ = this.store.pipe(select(selectRecordChangedSinceSave));
34170
- this.recordFields$ = this.store.pipe(select(selectRecordFields));
34988
+ this.currentSections$ = this.store.pipe(select(selectRecordSections));
34171
34989
  this.draftSaveSuccess$ = this.actions$.pipe(ofType(draftSaveSuccess));
34990
+ this.currentPage$ = this.store.pipe(select(selectCurrentPage));
34991
+ this.editorConfig$ = this.store.pipe(select(selectEditorConfig));
34172
34992
  }
34173
34993
  openRecord(record, recordSource, alreadySavedOnce) {
34174
34994
  this.store.dispatch(openRecord({ record, recordSource, alreadySavedOnce }));
@@ -34179,6 +34999,9 @@ class EditorFacade {
34179
34999
  updateRecordField(field, value) {
34180
35000
  this.store.dispatch(updateRecordField({ field, value }));
34181
35001
  }
35002
+ setCurrentPage(page) {
35003
+ this.store.dispatch(setCurrentPage({ page }));
35004
+ }
34182
35005
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34183
35006
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade }); }
34184
35007
  }
@@ -34206,12 +35029,13 @@ class EditorService {
34206
35029
  // returns the record as it was when saved, alongside its source
34207
35030
  saveRecord(record, fieldsConfig, generateNewUniqueIdentifier = false) {
34208
35031
  const savedRecord = { ...record };
35032
+ const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
34209
35033
  // run onSave processes
34210
- for (const field of fieldsConfig) {
35034
+ for (const field of fields) {
34211
35035
  if (field.onSaveProcess && field.model) {
34212
35036
  const evaluator = evaluate(field.onSaveProcess);
34213
35037
  savedRecord[field.model] = evaluator({
34214
- config: field,
35038
+ model: field.model,
34215
35039
  value: record[field.model],
34216
35040
  });
34217
35041
  }
@@ -34248,7 +35072,7 @@ class EditorEffects {
34248
35072
  this.editorService = inject(EditorService);
34249
35073
  this.recordsRepository = inject(RecordsRepositoryInterface);
34250
35074
  this.store = inject(Store);
34251
- 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
35075
+ 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
34252
35076
  .saveRecord(record, fieldsConfig, !alreadySavedOnce)
34253
35077
  .pipe(switchMap$1(([record, recordSource]) => of(saveRecordSuccess(), openRecord({
34254
35078
  record,
@@ -34489,7 +35313,7 @@ class WizardFieldComponent {
34489
35313
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
34490
35314
  },
34491
35315
  { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
34492
- ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i2$4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35316
+ ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i2$3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34493
35317
  }
34494
35318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WizardFieldComponent, decorators: [{
34495
35319
  type: Component,
@@ -34639,7 +35463,7 @@ class FeatureEditorModule {
34639
35463
  MatNativeDateModule,
34640
35464
  MatFormFieldModule,
34641
35465
  HttpClientModule,
34642
- HttpClientXsrfModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
35466
+ HttpClientXsrfModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
34643
35467
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade, Gn4PlatformService], imports: [CommonModule,
34644
35468
  UiInputsModule,
34645
35469
  UiWidgetsModule,
@@ -34685,7 +35509,9 @@ class FormFieldKeywordsComponent {
34685
35509
  return `${item.title} (${item.value.thesaurus?.name})`;
34686
35510
  };
34687
35511
  this.autoCompleteAction = (query) => {
34688
- return this.platformService.searchKeywords(query).pipe(map$2((keywords) => keywords.map((keyword) => {
35512
+ return this.platformService
35513
+ .searchKeywords(query, ['temporal', 'theme', 'other'])
35514
+ .pipe(map$2((keywords) => keywords.map((keyword) => {
34689
35515
  return { title: keyword.label, value: keyword };
34690
35516
  })));
34691
35517
  };
@@ -34867,7 +35693,7 @@ class FormFieldTemporalExtentsComponent {
34867
35693
  }
34868
35694
  resetValueFromInput(value) {
34869
35695
  this.array.clear({ emitEvent: false });
34870
- this.elements = [];
35696
+ let newElements = [];
34871
35697
  value.forEach((v) => {
34872
35698
  if ('start' in v && 'end' in v) {
34873
35699
  const rangeControl = new FormControl({
@@ -34875,8 +35701,8 @@ class FormFieldTemporalExtentsComponent {
34875
35701
  end: v.end,
34876
35702
  });
34877
35703
  this.array.push(rangeControl, { emitEvent: false });
34878
- this.elements = [
34879
- ...this.elements,
35704
+ newElements = [
35705
+ ...newElements,
34880
35706
  {
34881
35707
  component: FormFieldTemporalExtentsRangeComponent,
34882
35708
  inputs: {
@@ -34888,8 +35714,8 @@ class FormFieldTemporalExtentsComponent {
34888
35714
  else {
34889
35715
  const dateControl = new FormControl({ start: v.start });
34890
35716
  this.array.push(dateControl, { emitEvent: false });
34891
- this.elements = [
34892
- ...this.elements,
35717
+ newElements = [
35718
+ ...newElements,
34893
35719
  {
34894
35720
  component: FormFieldTemporalExtentsDateComponent,
34895
35721
  inputs: {
@@ -34899,6 +35725,7 @@ class FormFieldTemporalExtentsComponent {
34899
35725
  ];
34900
35726
  }
34901
35727
  });
35728
+ this.elements = newElements;
34902
35729
  }
34903
35730
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldTemporalExtentsComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
34904
35731
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldTemporalExtentsComponent, isStandalone: true, selector: "gn-ui-form-field-temporal-extents", inputs: { control: "control" }, ngImport: i0, template: "<gn-ui-sortable-list\n [elements]=\"elements\"\n (elementsChange)=\"onElementsChange($event)\"\n [addOptions]=\"addOptions$ | async\"\n (add)=\"onAdd($event)\"\n></gn-ui-sortable-list>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "component", type: SortableListComponent, selector: "gn-ui-sortable-list", inputs: ["elements", "addOptions"], outputs: ["elementsChange", "add"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -35152,13 +35979,154 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35152
35979
  type: Input
35153
35980
  }] } });
35154
35981
 
35982
+ class OverviewUploadComponent {
35983
+ constructor(recordsApiService, cd) {
35984
+ this.recordsApiService = recordsApiService;
35985
+ this.cd = cd;
35986
+ this.overviewChange = new EventEmitter();
35987
+ this.altTextChange = new EventEmitter();
35988
+ this.errorHandle = (error) => {
35989
+ console.error(error);
35990
+ this.resourceUrl = '';
35991
+ this.resourceAltText = '';
35992
+ this.resourceFileName = '';
35993
+ this.overviewChange.emit(null);
35994
+ this.cd.markForCheck();
35995
+ };
35996
+ }
35997
+ ngOnInit() {
35998
+ this.recordsApiService.getAllResources(this.metadataUuid).subscribe({
35999
+ next: (resources) => {
36000
+ if (resources && resources.length > 0) {
36001
+ this.resourceUrl = resources[0].url;
36002
+ this.resourceFileName = resources[0].filename;
36003
+ if (!this.resourceAltText) {
36004
+ this.resourceAltText = this.resourceFileName;
36005
+ }
36006
+ }
36007
+ else {
36008
+ this.resourceUrl = '';
36009
+ this.resourceAltText = '';
36010
+ this.resourceFileName = '';
36011
+ }
36012
+ this.cd.markForCheck();
36013
+ },
36014
+ error: this.errorHandle,
36015
+ });
36016
+ }
36017
+ handleFileChange(file) {
36018
+ this.recordsApiService
36019
+ .putResource(this.metadataUuid, file, 'public')
36020
+ .subscribe({
36021
+ next: (resource) => {
36022
+ this.resourceUrl = resource.url;
36023
+ this.resourceAltText = resource.filename;
36024
+ this.overviewChange.emit({
36025
+ url: new URL(resource.url),
36026
+ description: resource.filename,
36027
+ });
36028
+ this.cd.markForCheck();
36029
+ },
36030
+ error: this.errorHandle,
36031
+ });
36032
+ }
36033
+ handleUrlChange(url) {
36034
+ this.recordsApiService
36035
+ .putResourceFromURL(this.metadataUuid, url, 'public')
36036
+ .subscribe({
36037
+ next: (resource) => {
36038
+ this.resourceUrl = resource.url;
36039
+ this.resourceAltText = resource.filename;
36040
+ this.overviewChange.emit({
36041
+ url: new URL(resource.url),
36042
+ description: resource.filename,
36043
+ });
36044
+ this.cd.markForCheck();
36045
+ },
36046
+ error: this.errorHandle,
36047
+ });
36048
+ }
36049
+ handleAltTextChange(newAltText) {
36050
+ this.resourceAltText = newAltText;
36051
+ this.overviewChange.emit({
36052
+ url: new URL(this.resourceUrl),
36053
+ description: this.resourceAltText,
36054
+ });
36055
+ this.cd.markForCheck();
36056
+ }
36057
+ handleDelete() {
36058
+ //this.formControl.markAsDirty()
36059
+ this.recordsApiService
36060
+ .delResource(this.metadataUuid, this.resourceFileName)
36061
+ .subscribe({
36062
+ next: () => {
36063
+ this.resourceAltText = '';
36064
+ this.resourceUrl = '';
36065
+ this.overviewChange.emit(null);
36066
+ this.cd.markForCheck();
36067
+ },
36068
+ error: this.errorHandle,
36069
+ });
36070
+ }
36071
+ ngOnChanges(changes) {
36072
+ const overviewChanges = changes['formControl'];
36073
+ if (overviewChanges &&
36074
+ overviewChanges.currentValue !== overviewChanges.previousValue) {
36075
+ let overview;
36076
+ if (overviewChanges.currentValue.value &&
36077
+ overviewChanges.currentValue.value.length > 0) {
36078
+ overview = overviewChanges.currentValue.value[0];
36079
+ }
36080
+ else {
36081
+ return;
36082
+ }
36083
+ if (overview.description) {
36084
+ this.resourceAltText = overview.description;
36085
+ this.cd.markForCheck();
36086
+ }
36087
+ }
36088
+ }
36089
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OverviewUploadComponent, deps: [{ token: RecordsApiService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
36090
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OverviewUploadComponent, isStandalone: true, selector: "gn-ui-overview-upload", inputs: { metadataUuid: "metadataUuid", formControl: "formControl" }, outputs: { overviewChange: "overviewChange", altTextChange: "altTextChange" }, usesOnChanges: true, ngImport: i0, template: "<gn-ui-image-input\n [maxSizeMB]=\"5\"\n [previewUrl]=\"resourceUrl\"\n [altText]=\"resourceAltText\"\n (fileChange)=\"handleFileChange($event)\"\n (urlChange)=\"handleUrlChange($event)\"\n (altTextChange)=\"handleAltTextChange($event)\"\n (delete)=\"handleDelete()\"\n></gn-ui-image-input>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ImageInputComponent, selector: "gn-ui-image-input", inputs: ["maxSizeMB", "previewUrl", "altText", "uploadProgress", "uploadError"], outputs: ["fileChange", "urlChange", "uploadCancel", "delete", "altTextChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36091
+ }
36092
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OverviewUploadComponent, decorators: [{
36093
+ type: Component,
36094
+ args: [{ selector: 'gn-ui-overview-upload', standalone: true, imports: [CommonModule, UiInputsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-image-input\n [maxSizeMB]=\"5\"\n [previewUrl]=\"resourceUrl\"\n [altText]=\"resourceAltText\"\n (fileChange)=\"handleFileChange($event)\"\n (urlChange)=\"handleUrlChange($event)\"\n (altTextChange)=\"handleAltTextChange($event)\"\n (delete)=\"handleDelete()\"\n></gn-ui-image-input>\n" }]
36095
+ }], ctorParameters: function () { return [{ type: RecordsApiService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { metadataUuid: [{
36096
+ type: Input
36097
+ }], formControl: [{
36098
+ type: Input
36099
+ }], overviewChange: [{
36100
+ type: Output
36101
+ }], altTextChange: [{
36102
+ type: Output
36103
+ }] } });
36104
+
36105
+ class FormFieldOverviewsComponent {
36106
+ handleOverviewChange(overView) {
36107
+ this.control.setValue(overView ? [overView] : []);
36108
+ }
36109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldOverviewsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36110
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldOverviewsComponent, isStandalone: true, selector: "gn-ui-form-field-overviews", inputs: { metadataUuid: "metadataUuid", control: "control" }, ngImport: i0, template: "<gn-ui-overview-upload\n [metadataUuid]=\"metadataUuid\"\n [formControl]=\"control\"\n (overviewChange)=\"handleOverviewChange($event)\"\n></gn-ui-overview-upload>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OverviewUploadComponent, selector: "gn-ui-overview-upload", inputs: ["metadataUuid", "formControl"], outputs: ["overviewChange", "altTextChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36111
+ }
36112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldOverviewsComponent, decorators: [{
36113
+ type: Component,
36114
+ args: [{ selector: 'gn-ui-form-field-overviews', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, OverviewUploadComponent], template: "<gn-ui-overview-upload\n [metadataUuid]=\"metadataUuid\"\n [formControl]=\"control\"\n (overviewChange)=\"handleOverviewChange($event)\"\n></gn-ui-overview-upload>\n" }]
36115
+ }], propDecorators: { metadataUuid: [{
36116
+ type: Input
36117
+ }], control: [{
36118
+ type: Input
36119
+ }] } });
36120
+
35155
36121
  class FormFieldComponent {
35156
36122
  set value(v) {
35157
36123
  this.formControl.setValue(v, {
35158
36124
  emitEvent: false,
35159
36125
  });
35160
36126
  }
35161
- constructor() {
36127
+ constructor(facade) {
36128
+ this.facade = facade;
36129
+ this.metadataUuid$ = this.facade.record$.pipe(take(1), map$1((record) => record.uniqueIdentifier));
35162
36130
  this.formControl = new FormControl();
35163
36131
  this.valueChange = this.formControl.valueChanges;
35164
36132
  }
@@ -35186,6 +36154,9 @@ class FormFieldComponent {
35186
36154
  get isSpatialExtentField() {
35187
36155
  return this.model === 'spatialExtents';
35188
36156
  }
36157
+ get isGraphicOverview() {
36158
+ return this.model === 'overviews';
36159
+ }
35189
36160
  get isSimpleField() {
35190
36161
  return this.model === 'uniqueIdentifier' || this.model === 'recordUpdated';
35191
36162
  }
@@ -35198,8 +36169,8 @@ class FormFieldComponent {
35198
36169
  get withoutWrapper() {
35199
36170
  return this.model === 'title' || this.model === 'abstract';
35200
36171
  }
35201
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35202
- 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 }); }
36172
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
36173
+ 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=\"isGraphicOverview\">\n <gn-ui-form-field-overviews\n [control]=\"formControl\"\n [metadataUuid]=\"metadataUuid$ | async\"\n ></gn-ui-form-field-overviews>\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: "pipe", type: i1$3.AsyncPipe, name: "async" }, { 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: i3$1.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" }, { kind: "component", type: FormFieldOverviewsComponent, selector: "gn-ui-form-field-overviews", inputs: ["metadataUuid", "control"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35203
36174
  }
35204
36175
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, decorators: [{
35205
36176
  type: Component,
@@ -35222,8 +36193,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35222
36193
  FormFieldArrayComponent,
35223
36194
  FormFieldKeywordsComponent,
35224
36195
  TranslateModule,
35225
- ], 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" }]
35226
- }], ctorParameters: function () { return []; }, propDecorators: { model: [{
36196
+ FormFieldOverviewsComponent,
36197
+ ], 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=\"isGraphicOverview\">\n <gn-ui-form-field-overviews\n [control]=\"formControl\"\n [metadataUuid]=\"metadataUuid$ | async\"\n ></gn-ui-form-field-overviews>\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" }]
36198
+ }], ctorParameters: function () { return [{ type: EditorFacade }]; }, propDecorators: { model: [{
35227
36199
  type: Input
35228
36200
  }], config: [{
35229
36201
  type: Input
@@ -35239,23 +36211,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35239
36211
  class RecordFormComponent {
35240
36212
  constructor(facade) {
35241
36213
  this.facade = facade;
35242
- this.fields$ = this.facade.recordFields$;
35243
36214
  }
35244
- handleFieldValueChange(field, newValue) {
35245
- if (!field.config.model) {
36215
+ handleFieldValueChange(model, newValue) {
36216
+ if (!model) {
35246
36217
  return;
35247
36218
  }
35248
- this.facade.updateRecordField(field.config.model, newValue);
36219
+ this.facade.updateRecordField(model, newValue);
35249
36220
  }
35250
36221
  fieldTracker(index, field) {
35251
36222
  return field.config.model;
35252
36223
  }
36224
+ sectionTracker(index, section) {
36225
+ return section.labelKey;
36226
+ }
35253
36227
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
35254
- 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 }); }
36228
+ 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 }); }
35255
36229
  }
35256
36230
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, decorators: [{
35257
36231
  type: Component,
35258
- 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" }]
36232
+ 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" }]
35259
36233
  }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
35260
36234
 
35261
36235
  const ROUTER_STATE_KEY = 'router';
@@ -35305,7 +36279,7 @@ class RouterService {
35305
36279
  getOrganizationPageRoute() {
35306
36280
  return ROUTER_ROUTE_ORGANIZATION;
35307
36281
  }
35308
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$7.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
36282
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$8.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
35309
36283
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterService, providedIn: 'root' }); }
35310
36284
  }
35311
36285
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterService, decorators: [{
@@ -35316,7 +36290,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35316
36290
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
35317
36291
  type: Inject,
35318
36292
  args: [ROUTER_CONFIG]
35319
- }] }, { type: i1$7.Router }]; } });
36293
+ }] }, { type: i1$8.Router }]; } });
35320
36294
 
35321
36295
  const goAction = createAction('[Router] Go', props());
35322
36296
  const backAction = createAction('[Router] Back');
@@ -35573,12 +36547,12 @@ class RouterEffects {
35573
36547
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
35574
36548
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
35575
36549
  }
35576
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterEffects, deps: [{ token: i1$8.Actions }, { token: i1$7.Router }, { token: i1$3.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
36550
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterEffects, deps: [{ token: i1$9.Actions }, { token: i1$8.Router }, { token: i1$3.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
35577
36551
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterEffects }); }
35578
36552
  }
35579
36553
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterEffects, decorators: [{
35580
36554
  type: Injectable
35581
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: i1$7.Router }, { type: i1$3.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
36555
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }, { type: i1$8.Router }, { type: i1$3.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
35582
36556
  type: Inject,
35583
36557
  args: [ROUTER_CONFIG]
35584
36558
  }] }, { type: FieldsService }]; } });
@@ -35595,7 +36569,7 @@ class DefaultRouterModule {
35595
36569
  };
35596
36570
  }
35597
36571
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
35598
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$3.StoreRouterConnectingModule, i1$8.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
36572
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$4.StoreRouterConnectingModule, i1$9.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
35599
36573
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, providers: [
35600
36574
  RouterFacade,
35601
36575
  {
@@ -35638,5 +36612,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35638
36612
  * Generated bundle index. Do not edit.
35639
36613
  */
35640
36614
 
35641
- 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 };
36615
+ 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, ConfirmationDialogComponent, 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, PopoverComponent, 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 };
35642
36616
  //# sourceMappingURL=geonetwork-ui.mjs.map