geonetwork-ui 2.4.0-dev.81e72b2e → 2.4.0-dev.825a487d

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 (279) 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 +10 -3
  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/contact.model.mjs +28 -1
  11. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  12. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  14. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +2 -6
  15. package/esm2022/libs/feature/catalog/src/lib/records/records.service.mjs +4 -6
  16. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +2 -1
  17. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +3 -3
  18. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +7 -2
  19. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +1 -1
  20. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +7 -3
  21. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +16 -6
  22. package/esm2022/libs/feature/editor/src/lib/components/contact-card/contact-card.component.mjs +29 -0
  23. package/esm2022/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.mjs +131 -0
  24. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.mjs +170 -0
  25. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +6 -4
  26. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.mjs +21 -0
  27. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.mjs +7 -6
  28. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +24 -9
  29. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +1 -2
  30. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +11 -7
  31. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +1 -1
  32. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +159 -60
  33. package/esm2022/libs/feature/editor/src/lib/models/editor-config.model.mjs +2 -0
  34. package/esm2022/libs/feature/editor/src/lib/models/index.mjs +2 -1
  35. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +4 -3
  36. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +10 -5
  37. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +42 -23
  38. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +13 -5
  39. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +49 -15
  40. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +3 -3
  41. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +46 -7
  42. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +6 -2
  43. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +7 -3
  44. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  45. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  46. package/esm2022/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.mjs +27 -0
  47. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +4 -3
  48. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  49. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +6 -5
  50. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +5 -11
  51. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +3 -3
  52. package/esm2022/libs/ui/elements/src/lib/sortable-list/sortable-list.component.mjs +7 -3
  53. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +11 -5
  54. package/esm2022/libs/ui/elements/src/lib/user-preview/user-preview.component.mjs +3 -3
  55. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +19 -5
  56. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
  57. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
  58. package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +3 -3
  59. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +67 -0
  60. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +28 -8
  61. package/esm2022/libs/ui/widgets/src/index.mjs +2 -1
  62. package/esm2022/libs/ui/widgets/src/lib/popover/popover.component.mjs +68 -0
  63. package/esm2022/translations/de.json +103 -41
  64. package/esm2022/translations/en.json +76 -17
  65. package/esm2022/translations/es.json +75 -13
  66. package/esm2022/translations/fr.json +84 -25
  67. package/esm2022/translations/it.json +76 -14
  68. package/esm2022/translations/nl.json +75 -13
  69. package/esm2022/translations/pt.json +75 -13
  70. package/fesm2022/geonetwork-ui.mjs +1861 -514
  71. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  72. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  73. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +1 -0
  74. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  75. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  76. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +8 -1
  77. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  78. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts +5 -0
  79. package/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.d.ts.map +1 -0
  80. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -1
  81. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  82. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -0
  83. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  84. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +7 -1
  85. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  86. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -1
  87. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  88. package/libs/common/domain/src/lib/model/record/contact.model.d.ts +1 -0
  89. package/libs/common/domain/src/lib/model/record/contact.model.d.ts.map +1 -1
  90. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -1
  91. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  92. package/libs/common/domain/src/lib/platform.service.interface.d.ts +2 -1
  93. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  94. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +17 -0
  95. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  96. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  97. package/libs/feature/catalog/src/lib/records/records.service.d.ts.map +1 -1
  98. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +5 -0
  99. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -1
  100. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +4 -4
  101. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  102. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +8 -0
  103. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -1
  104. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +4 -3
  105. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -1
  106. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +4 -8
  107. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -1
  108. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts +12 -0
  109. package/libs/feature/editor/src/lib/components/contact-card/contact-card.component.d.ts.map +1 -0
  110. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts +27 -0
  111. package/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.d.ts.map +1 -0
  112. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts +47 -0
  113. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.d.ts.map +1 -0
  114. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  115. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts +11 -0
  116. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.d.ts.map +1 -0
  117. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.d.ts +3 -1
  118. 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
  119. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +7 -2
  120. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  121. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +0 -1
  122. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
  123. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts +5 -7
  124. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  125. package/libs/feature/editor/src/lib/expressions.d.ts +1 -1
  126. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -1
  127. package/libs/feature/editor/src/lib/fields.config.d.ts +40 -2
  128. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  129. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts +36 -0
  130. package/libs/feature/editor/src/lib/models/editor-config.model.d.ts.map +1 -0
  131. package/libs/feature/editor/src/lib/models/index.d.ts +1 -0
  132. package/libs/feature/editor/src/lib/models/index.d.ts.map +1 -1
  133. package/libs/feature/editor/src/lib/services/editor.service.d.ts +2 -2
  134. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  135. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  136. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +4 -1
  137. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  138. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +4 -1
  139. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  140. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +4 -1
  141. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  142. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +14 -4
  143. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  144. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -0
  145. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  146. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  147. package/libs/ui/elements/src/index.d.ts +1 -0
  148. package/libs/ui/elements/src/index.d.ts.map +1 -1
  149. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts +18 -0
  150. package/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.d.ts.map +1 -0
  151. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  152. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -3
  153. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  154. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +1 -1
  155. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts +4 -4
  156. package/libs/ui/elements/src/lib/sortable-list/sortable-list.component.d.ts.map +1 -1
  157. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +7 -5
  158. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  159. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts +9 -1
  160. package/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.d.ts.map +1 -1
  161. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +20 -0
  162. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -0
  163. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +9 -3
  164. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  165. package/libs/ui/widgets/src/index.d.ts +1 -0
  166. package/libs/ui/widgets/src/index.d.ts.map +1 -1
  167. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts +19 -0
  168. package/libs/ui/widgets/src/lib/popover/popover.component.d.ts.map +1 -0
  169. package/package.json +1 -1
  170. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -1
  171. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +37 -12
  172. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +5 -1
  173. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +1 -0
  174. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  175. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +4 -2
  176. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +72 -2
  177. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/geometry.ts +39 -0
  178. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +70 -1
  179. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +13 -5
  180. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +42 -2
  181. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +26 -15
  182. package/src/libs/common/domain/src/lib/model/record/contact.model.ts +28 -0
  183. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -1
  184. package/src/libs/common/domain/src/lib/platform.service.interface.ts +5 -1
  185. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +22 -0
  186. package/src/libs/common/fixtures/src/index.ts +2 -0
  187. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +156 -0
  188. package/src/libs/common/fixtures/src/lib/editor/index.ts +1 -0
  189. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +1 -5
  190. package/src/libs/data-access/gn4/src/spec.yaml +0 -8
  191. package/src/libs/feature/catalog/src/lib/records/records.service.ts +6 -8
  192. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +5 -0
  193. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +2 -2
  194. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +9 -1
  195. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +11 -0
  196. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +11 -5
  197. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +22 -8
  198. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.css +0 -0
  199. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.html +25 -0
  200. package/src/libs/feature/editor/src/lib/components/contact-card/contact-card.component.ts +30 -0
  201. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +2 -1
  202. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +110 -19
  203. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.css +0 -0
  204. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.html +76 -0
  205. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-contacts-for-resource/form-field-contacts-for-resource.component.ts +271 -0
  206. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.html +1 -1
  207. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +8 -6
  208. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.css +0 -0
  209. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.html +5 -0
  210. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-overviews/form-field-overviews.component.ts +22 -0
  211. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extents/form-field-temporal-extents.component.ts +8 -7
  212. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +20 -9
  213. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +20 -2
  214. package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +0 -1
  215. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.html +51 -11
  216. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +15 -8
  217. package/src/libs/feature/editor/src/lib/expressions.ts +1 -1
  218. package/src/libs/feature/editor/src/lib/fields.config.ts +193 -61
  219. package/src/libs/feature/editor/src/lib/models/editor-config.model.ts +53 -0
  220. package/src/libs/feature/editor/src/lib/models/index.ts +1 -0
  221. package/src/libs/feature/editor/src/lib/services/editor.service.ts +8 -4
  222. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -4
  223. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +36 -19
  224. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +6 -2
  225. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +11 -0
  226. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +59 -12
  227. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  228. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +3 -1
  229. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +57 -3
  230. package/src/libs/feature/search/src/lib/state/search.facade.ts +6 -0
  231. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +16 -2
  232. package/src/libs/ui/elements/src/index.ts +1 -0
  233. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +29 -29
  234. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.css +0 -0
  235. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.html +12 -0
  236. package/src/libs/ui/elements/src/lib/confirmation-dialog/confirmation-dialog.component.ts +37 -0
  237. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +4 -1
  238. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -1
  239. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +12 -8
  240. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +14 -20
  241. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -10
  242. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.html +1 -1
  243. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.html +3 -1
  244. package/src/libs/ui/elements/src/lib/sortable-list/sortable-list.component.ts +8 -4
  245. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +4 -2
  246. package/src/libs/ui/elements/src/lib/user-preview/user-preview.component.html +1 -1
  247. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +15 -3
  248. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.css +31 -0
  249. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +15 -0
  250. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +38 -0
  251. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
  252. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
  253. package/src/libs/ui/layout/src/lib/max-lines/max-lines.component.html +1 -0
  254. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.css +0 -0
  255. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +26 -0
  256. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +74 -0
  257. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +15 -1
  258. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +26 -12
  259. package/src/libs/ui/widgets/src/index.ts +1 -0
  260. package/src/libs/ui/widgets/src/lib/popover/popover.component.css +0 -0
  261. package/src/libs/ui/widgets/src/lib/popover/popover.component.html +3 -0
  262. package/src/libs/ui/widgets/src/lib/popover/popover.component.ts +85 -0
  263. package/tailwind.base.css +2 -1
  264. package/translations/de.json +103 -41
  265. package/translations/en.json +76 -17
  266. package/translations/es.json +75 -13
  267. package/translations/fr.json +84 -25
  268. package/translations/it.json +76 -14
  269. package/translations/nl.json +75 -13
  270. package/translations/pt.json +75 -13
  271. package/translations/sk.json +76 -14
  272. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +0 -2
  273. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +0 -2
  274. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts +0 -26
  275. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +0 -1
  276. package/libs/feature/editor/src/lib/models/fields.model.d.ts +0 -15
  277. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +0 -1
  278. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.ts +0 -43
  279. 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;
@@ -319,10 +328,12 @@ function findParent(parentName) {
319
328
  }
320
329
  function readText() {
321
330
  return (el) => {
322
- const textNode = el && Array.isArray(el.children)
331
+ if (!el)
332
+ return null;
333
+ const textNode = Array.isArray(el.children)
323
334
  ? el.children.find((node) => node.type === 'text')
324
335
  : null;
325
- return textNode ? textNode.text : null;
336
+ return textNode ? textNode.text : '';
326
337
  };
327
338
  }
328
339
  function readAttribute(attrName) {
@@ -427,10 +438,12 @@ function getTreeRoot(element) {
427
438
  }
428
439
  // stays on the parent element
429
440
  // if the given elements are part of a subtree, will add the root of subtree
441
+ // will filter out falsy elements
430
442
  function appendChildren(...childrenFns) {
431
443
  return (element) => {
432
444
  if (!element)
433
445
  return null;
446
+ childrenFns = childrenFns.filter((fn) => fn);
434
447
  element.children.push(...childrenFns.map((fn) => fn()).map(getTreeRoot));
435
448
  element.children.forEach((el) => (el.parent = element));
436
449
  return element;
@@ -559,6 +572,33 @@ function matchMimeType(format) {
559
572
  return format || null;
560
573
  }
561
574
 
575
+ function readGeometry(el) {
576
+ const xmlDoc = createDocument(el);
577
+ xmlDoc.root.attributes['xmlns'] = 'http://www.opengis.net/gml/3.2';
578
+ const gmlString = xmlToString(xmlDoc);
579
+ const doc = parse$1(gmlString);
580
+ // we need an intermediate node to be able to parse the GML
581
+ const node = document.createElement('pre');
582
+ node.appendChild(doc.documentElement);
583
+ const gml32Format = new GML32();
584
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
585
+ // @ts-ignore
586
+ const geometry = gml32Format.readGeometryFromNode(node);
587
+ const geojsonFormat = new GeoJSON();
588
+ return geojsonFormat.writeGeometryObject(geometry);
589
+ }
590
+ function writeGeometry(geometryObject) {
591
+ const geojsonFormat = new GeoJSON();
592
+ const geometry = geojsonFormat.readGeometry(geometryObject);
593
+ const gml32Format = new GML32();
594
+ const node = gml32Format.writeGeometryNode(geometry);
595
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
596
+ // @ts-ignore
597
+ const element = node.firstElementChild;
598
+ const gmlString = new XMLSerializer().serializeToString(element);
599
+ return getRootElement(parseXmlString(gmlString));
600
+ }
601
+
562
602
  /**
563
603
  * Parts are [firstName, lastName]
564
604
  * Second part will be null if no separation could be done
@@ -727,6 +767,9 @@ function extractCharacterString() {
727
767
  function extractDateTime() {
728
768
  return pipe(fallback(findChildElement('gco:DateTime', false), findChildElement('gco:Date', false)), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)));
729
769
  }
770
+ function extractDecimal() {
771
+ return pipe(findChildElement('gco:Decimal', false), readText(), map((numberStr) => (numberStr ? Number(numberStr) : null)));
772
+ }
730
773
  function extractUrl() {
731
774
  const getUrl = pipe(findChildElement('gmd:URL', false), readText());
732
775
  const getCharacterString = pipe(findChildElement('gco:CharacterString', false), readText());
@@ -1084,6 +1127,30 @@ function readTemporalExtents(rootEl) {
1084
1127
  }
1085
1128
  }))(rootEl);
1086
1129
  }
1130
+ function readSpatialExtents(rootEl) {
1131
+ const extractGeometry = (rootEl) => {
1132
+ if (!rootEl)
1133
+ return null;
1134
+ return pipe(findChildElement('gmd:polygon', false), firstChildElement, map((el) => readGeometry(el)))(rootEl);
1135
+ };
1136
+ const extractBBox = (rootEl) => {
1137
+ if (!rootEl)
1138
+ return null;
1139
+ return pipe(combine(pipe(findChildElement('gmd:westBoundLongitude'), extractDecimal()), pipe(findChildElement('gmd:southBoundLatitude'), extractDecimal()), pipe(findChildElement('gmd:eastBoundLongitude'), extractDecimal()), pipe(findChildElement('gmd:northBoundLatitude'), extractDecimal())))(rootEl);
1140
+ };
1141
+ const extractDescription = (rootEl) => {
1142
+ if (!rootEl)
1143
+ return null;
1144
+ return pipe(findNestedElement('gmd:geographicIdentifier', 'gmd:MD_Identifier', 'gmd:code'), extractCharacterString())(rootEl);
1145
+ };
1146
+ 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]) => {
1147
+ return {
1148
+ ...(geometry && { geometry }),
1149
+ ...(bbox && { bbox }),
1150
+ ...(description && { description }),
1151
+ };
1152
+ }))(rootEl);
1153
+ }
1087
1154
 
1088
1155
  function writeCharacterString(text) {
1089
1156
  return tap(pipe(findChildOrCreate('gco:CharacterString'), setTextContent(text)));
@@ -1100,6 +1167,9 @@ function writeDateTime(date) {
1100
1167
  function writeDate(date) {
1101
1168
  return tap(pipe(findChildOrCreate('gco:Date'), setTextContent(format(date, 'yyyy-MM-dd'))));
1102
1169
  }
1170
+ function writeDecimal(decimal) {
1171
+ return tap(pipe(findChildOrCreate('gco:Decimal'), setTextContent(decimal.toString())));
1172
+ }
1103
1173
  function getProgressCode(status) {
1104
1174
  switch (status) {
1105
1175
  case 'completed':
@@ -1493,6 +1563,24 @@ function writeTemporalExtents(record, rootEl) {
1493
1563
  ? setTextContent(format(extent.start, 'yyyy-MM-dd'))
1494
1564
  : addAttribute('indeterminatePosition', 'unknown'))))))))))(rootEl);
1495
1565
  }
1566
+ function writeSpatialExtents(record, rootEl) {
1567
+ const appendBoundingPolygon = (geometry) => {
1568
+ if (!geometry)
1569
+ return null;
1570
+ return pipe(createElement('gmd:EX_BoundingPolygon'), appendChildren(pipe(createElement('gmd:polygon'), appendChildren(() => writeGeometry(geometry)))));
1571
+ };
1572
+ const appendGeographicBoundingBox = (bbox) => {
1573
+ if (!bbox)
1574
+ return null;
1575
+ 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]))));
1576
+ };
1577
+ const appendGeographicDescription = (description) => {
1578
+ if (!description)
1579
+ return null;
1580
+ return pipe(createElement('gmd:EX_GeographicDescription'), createChild('gmd:geographicIdentifier'), createChild('gmd:MD_Identifier'), createChild('gmd:code'), writeCharacterString(description));
1581
+ };
1582
+ 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);
1583
+ }
1496
1584
 
1497
1585
  class Iso19139Converter extends BaseConverter {
1498
1586
  constructor() {
@@ -1525,8 +1613,8 @@ class Iso19139Converter extends BaseConverter {
1525
1613
  distributions: readDistributions$1,
1526
1614
  onlineResources: readOnlineResources,
1527
1615
  temporalExtents: readTemporalExtents,
1616
+ spatialExtents: readSpatialExtents,
1528
1617
  // TODO
1529
- spatialExtents: () => [],
1530
1618
  extras: () => undefined,
1531
1619
  landingPage: () => undefined,
1532
1620
  languages: () => [],
@@ -1559,8 +1647,8 @@ class Iso19139Converter extends BaseConverter {
1559
1647
  distributions: writeDistributions$1,
1560
1648
  onlineResources: writeOnlineResources,
1561
1649
  temporalExtents: writeTemporalExtents,
1650
+ spatialExtents: () => writeSpatialExtents,
1562
1651
  // TODO
1563
- spatialExtents: () => undefined,
1564
1652
  extras: () => undefined,
1565
1653
  landingPage: () => undefined,
1566
1654
  languages: () => undefined,
@@ -2176,6 +2264,7 @@ const mapKeywords = (thesauri, language) => {
2176
2264
  keywords.push({
2177
2265
  label: selectTranslatedValue(keyword, language),
2178
2266
  type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
2267
+ ...(keyword.link && { key: keyword.link }),
2179
2268
  ...(thesaurus && { thesaurus }),
2180
2269
  });
2181
2270
  }
@@ -8641,11 +8730,7 @@ class RecordsApiService {
8641
8730
  headers = headers.set('Accept', httpHeaderAcceptSelected);
8642
8731
  }
8643
8732
  // to determine the Content-Type header
8644
- const consumes = [
8645
- 'application/xml',
8646
- 'application/json',
8647
- 'application/x-www-form-urlencoded',
8648
- ];
8733
+ const consumes = ['application/xml'];
8649
8734
  const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
8650
8735
  if (httpContentTypeSelected !== undefined) {
8651
8736
  headers = headers.set('Content-Type', httpContentTypeSelected);
@@ -17356,6 +17441,8 @@ var de = {
17356
17441
  "datafeeder.datasetValidation.submitButton": "OK, meine Daten sind korrekt",
17357
17442
  "datafeeder.datasetValidation.title": "Stellen Sie sicher, dass Ihre Daten korrekt sind",
17358
17443
  "datafeeder.datasetValidation.unknown": " - ",
17444
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
17445
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
17359
17446
  "datafeeder.form.abstract": "Wie würden Sie Ihren Datensatz beschreiben?",
17360
17447
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
17361
17448
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
@@ -17383,6 +17470,7 @@ var de = {
17383
17470
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
17384
17471
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
17385
17472
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
17473
+ "datafeeder.publishSuccess.ogcFeature": "",
17386
17474
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
17387
17475
  "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
17388
17476
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
@@ -17411,7 +17499,6 @@ var de = {
17411
17499
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
17412
17500
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
17413
17501
  "datafeeder.upload.uploadButton": "Hochladen",
17414
- "datafeeder.validation.encoding": "Codierung",
17415
17502
  "datafeeder.validation.csv.delimiter": "",
17416
17503
  "datafeeder.validation.csv.delimiter.comma": "",
17417
17504
  "datafeeder.validation.csv.delimiter.semicolon": "",
@@ -17421,6 +17508,7 @@ var de = {
17421
17508
  "datafeeder.validation.csv.quote.none": "",
17422
17509
  "datafeeder.validation.csv.quote.simple": "",
17423
17510
  "datafeeder.validation.csv.quoteChar": "",
17511
+ "datafeeder.validation.encoding": "Codierung",
17424
17512
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
17425
17513
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
17426
17514
  "datafeeder.validation.projection": "Raumbezugssystem:",
@@ -17433,7 +17521,7 @@ var de = {
17433
17521
  "datahub.header.lastRecords": "Die neuesten",
17434
17522
  "datahub.header.myfavorites": "Meine Favoriten",
17435
17523
  "datahub.header.news": "Startseite",
17436
- "datahub.header.organisations": "Organisationen",
17524
+ "datahub.header.organizations": "Organisationen",
17437
17525
  "datahub.header.popularRecords": "Die beliebtesten",
17438
17526
  "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
17439
17527
  "datahub.news.contact.contactus": "Kontaktieren Sie uns",
@@ -17451,6 +17539,27 @@ var de = {
17451
17539
  "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
17452
17540
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
17453
17541
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
17542
+ "domain.contact.role.author": "",
17543
+ "domain.contact.role.collaborator": "",
17544
+ "domain.contact.role.contributor": "",
17545
+ "domain.contact.role.custodian": "",
17546
+ "domain.contact.role.distributor": "",
17547
+ "domain.contact.role.editor": "",
17548
+ "domain.contact.role.funder": "",
17549
+ "domain.contact.role.mediator": "",
17550
+ "domain.contact.role.originator": "",
17551
+ "domain.contact.role.other": "",
17552
+ "domain.contact.role.owner": "",
17553
+ "domain.contact.role.point_of_contact": "",
17554
+ "domain.contact.role.principal_investigator": "",
17555
+ "domain.contact.role.processor": "",
17556
+ "domain.contact.role.publisher": "",
17557
+ "domain.contact.role.resource_provider": "",
17558
+ "domain.contact.role.rights_holder": "",
17559
+ "domain.contact.role.sponsor": "",
17560
+ "domain.contact.role.stakeholder": "",
17561
+ "domain.contact.role.unspecified": "",
17562
+ "domain.contact.role.user": "",
17454
17563
  "domain.record.status.completed": "Abgeschlossen",
17455
17564
  "domain.record.status.deprecated": "Veraltet",
17456
17565
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
@@ -17469,37 +17578,73 @@ var de = {
17469
17578
  "downloads.format.unknown": "unbekannt",
17470
17579
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
17471
17580
  dropFile: dropFile$6,
17472
- "editor.record.form.license": "Lizenz",
17473
- "editor.record.form.license.cc-by": "",
17474
- "editor.record.form.license.cc-by-sa": "",
17475
- "editor.record.form.license.cc-zero": "",
17476
- "editor.record.form.license.etalab": "",
17477
- "editor.record.form.license.etalab-v2": "",
17478
- "editor.record.form.license.odbl": "",
17479
- "editor.record.form.license.odc-by": "",
17480
- "editor.record.form.license.pddl": "",
17581
+ "editor.record.delete.confirmation.cancelText": "Stornieren",
17582
+ "editor.record.delete.confirmation.confirmText": "Löschen",
17583
+ "editor.record.delete.confirmation.message": "Sind Sie sicher, dass Sie diesen Datensatz löschen möchten?",
17584
+ "editor.record.delete.confirmation.title": "Datensatz löschen?",
17585
+ "editor.record.deleteError.body": "Der Datensatz konnte nicht gelöscht werden:",
17586
+ "editor.record.deleteError.closeMessage": "Verstanden",
17587
+ "editor.record.deleteError.title": "Fehler beim Löschen des Datensatzes",
17588
+ "editor.record.deleteSuccess.body": "",
17589
+ "editor.record.deleteSuccess.title": "",
17590
+ "editor.record.form.bottomButtons.comeBackLater": "",
17591
+ "editor.record.form.bottomButtons.next": "",
17592
+ "editor.record.form.bottomButtons.previous": "",
17593
+ "editor.record.form.field.abstract": "Kurzbeschreibung",
17594
+ "editor.record.form.field.contactsForResource.noContact": "",
17595
+ "editor.record.form.field.keywords": "Schlagwörter",
17596
+ "editor.record.form.field.license": "Lizenz",
17597
+ "editor.record.form.field.overviews": "",
17598
+ "editor.record.form.field.recordUpdated": "Datensatz zuletzt aktualisiert",
17599
+ "editor.record.form.field.resourceUpdated": "Letztes Aktualisierungsdatum",
17600
+ "editor.record.form.field.temporalExtents": "Zeitlicher Umfang",
17601
+ "editor.record.form.field.title": "Metadaten-Titel",
17602
+ "editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
17603
+ "editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
17604
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17605
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17606
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
17607
+ "editor.record.form.license.etalab": "Offene Lizenz (Etalab)",
17608
+ "editor.record.form.license.etalab-v2": "Offene Lizenz v2.0 (Etalab)",
17609
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
17610
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17611
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
17481
17612
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17482
- "editor.record.form.resourceUpdated": "",
17483
- "editor.record.form.temporalExtents": "",
17484
- "editor.record.form.temporalExtents.addDate": "",
17485
- "editor.record.form.temporalExtents.addRange": "",
17486
- "editor.record.form.temporalExtents.date": "",
17487
- "editor.record.form.temporalExtents.range": "",
17488
- "editor.record.form.updateFrequency": "",
17489
- "editor.record.form.updateFrequency.planned": "",
17490
- "editor.record.loadError.body": "",
17491
- "editor.record.loadError.closeMessage": "",
17492
- "editor.record.loadError.title": "",
17493
- "editor.record.publish": "",
17494
- "editor.record.publishError.body": "",
17495
- "editor.record.publishError.closeMessage": "",
17496
- "editor.record.publishError.title": "",
17497
- "editor.record.publishSuccess.body": "",
17498
- "editor.record.publishSuccess.title": "",
17499
- "editor.record.saveStatus.asDraftOnly": "",
17500
- "editor.record.saveStatus.draftWithChangesPending": "",
17501
- "editor.record.saveStatus.recordUpToDate": "",
17502
- "editor.record.upToDate": "",
17613
+ "editor.record.form.page.accessAndContact": "",
17614
+ "editor.record.form.page.description": "",
17615
+ "editor.record.form.page.ressources": "",
17616
+ "editor.record.form.section.about.description": "",
17617
+ "editor.record.form.section.about.label": "",
17618
+ "editor.record.form.section.annexes.label": "",
17619
+ "editor.record.form.section.associatedResources.description": "",
17620
+ "editor.record.form.section.associatedResources.label": "",
17621
+ "editor.record.form.section.classification.description": "",
17622
+ "editor.record.form.section.classification.label": "",
17623
+ "editor.record.form.section.dataManagers.description": "",
17624
+ "editor.record.form.section.dataManagers.label": "",
17625
+ "editor.record.form.section.dataPointOfContact.description": "",
17626
+ "editor.record.form.section.dataPointOfContact.label": "",
17627
+ "editor.record.form.section.geographicalCoverage.label": "",
17628
+ "editor.record.form.section.useAndAccessConditions.label": "",
17629
+ "editor.record.form.temporalExtents.addDate": "Zeitpunkt",
17630
+ "editor.record.form.temporalExtents.addRange": "Zeitraum",
17631
+ "editor.record.form.temporalExtents.date": "Datum",
17632
+ "editor.record.form.temporalExtents.range": "Datumsbereich",
17633
+ "editor.record.form.updateFrequency.planned": "Die Daten sollten regelmäßig aktualisiert werden.",
17634
+ "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
17635
+ "editor.record.loadError.closeMessage": "Verstanden",
17636
+ "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
17637
+ "editor.record.publish": "Diesen Datensatz veröffentlichen",
17638
+ "editor.record.publishError.body": "Der Datensatz konnte nicht veröffentlicht werden:",
17639
+ "editor.record.publishError.closeMessage": "Verstanden",
17640
+ "editor.record.publishError.title": "Fehler beim Veröffentlichen des Datensatzes",
17641
+ "editor.record.publishSuccess.body": "Der Datensatz wurde erfolgreich veröffentlicht!",
17642
+ "editor.record.publishSuccess.title": "Veröffentlichung erfolgreich",
17643
+ "editor.record.saveStatus.asDraftOnly": "Nur als Entwurf gespeichert - noch nicht veröffentlicht",
17644
+ "editor.record.saveStatus.draftWithChangesPending": "Als Entwurf gespeichert - Änderungen stehen aus",
17645
+ "editor.record.saveStatus.recordUpToDate": "Datensatz ist auf dem neuesten Stand",
17646
+ "editor.record.upToDate": "Dieser Datensatz ist auf dem neuesten Stand",
17647
+ "editor.sidebar.menu.editor": "",
17503
17648
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
17504
17649
  "facets.block.title.OrgForResource": "Organisation",
17505
17650
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -17568,17 +17713,17 @@ var de = {
17568
17713
  "organisations.sortBy.nameDesc": "Name Z → A",
17569
17714
  "organisations.sortBy.recordCountAsc": "Veröffentlichungen 0 → 9",
17570
17715
  "organisations.sortBy.recordCountDesc": "Veröffentlichungen 9 → 0",
17571
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
17572
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{}}",
17716
+ "organization.details.lastPublishedDatasets": "",
17717
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
17573
17718
  "organization.details.mailContact": "",
17574
- "organization.datasets": "",
17575
- "organization.lastPublishedDatasets": "",
17576
- "organization.lastPublishedDatasets.searchAllButton": "",
17719
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
17577
17720
  "pagination.nextPage": "Nächste Seite",
17578
17721
  "pagination.page": "Seite",
17579
17722
  "pagination.pageOf": "von",
17580
17723
  previous: previous$6,
17724
+ "record.action.delete": "Löschen",
17581
17725
  "record.action.download": "Herunterladen",
17726
+ "record.action.duplicate": "",
17582
17727
  "record.action.view": "Anzeigen",
17583
17728
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
17584
17729
  "record.metadata.about": "Beschreibung",
@@ -17671,11 +17816,11 @@ var de = {
17671
17816
  "results.sortBy.relevancy": "Relevanz",
17672
17817
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
17673
17818
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
17819
+ "search.error.organizationHasNoDataset": "",
17820
+ "search.error.organizationNotFound": "",
17674
17821
  "search.error.receivedError": "Ein Fehler ist aufgetreten",
17675
17822
  "search.error.recordHasnolink": "",
17676
17823
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
17677
- "search.error.organizationNotFound": "",
17678
- "search.error.organizationHasNoDataset": "",
17679
17824
  "search.field.any.placeholder": "Suche Datensätze ...",
17680
17825
  "search.field.sortBy": "Sortieren nach:",
17681
17826
  "search.filters.clear": "Zurücksetzen",
@@ -17700,14 +17845,16 @@ var de = {
17700
17845
  "search.filters.minimize": "Minimieren",
17701
17846
  "search.filters.myRecords": "Nur meine Datensätze anzeigen",
17702
17847
  "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.",
17848
+ "search.filters.organization": "",
17703
17849
  "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
17850
+ "search.filters.producerOrg": "",
17704
17851
  "search.filters.publicationYear": "Veröffentlichungsjahr",
17705
- "search.filters.publisher": "Organisationen",
17852
+ "search.filters.publisherOrg": "",
17706
17853
  "search.filters.representationType": "Repräsentationstyp",
17707
17854
  "search.filters.resourceType": "Ressourcentyp",
17708
17855
  "search.filters.standard": "Standard",
17709
17856
  "search.filters.title": "Ergebnisse filtern",
17710
- "search.filters.topic": "Thema",
17857
+ "search.filters.topic": "Themen",
17711
17858
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
17712
17859
  "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.",
17713
17860
  "share.tab.permalink": "Teilen",
@@ -17736,7 +17883,7 @@ var en = {
17736
17883
  "Add Layer As": "",
17737
17884
  "button.login": "Log in",
17738
17885
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
17739
- "catalog.figures.organizations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
17886
+ "catalog.figures.organizations": "{count, plural, =0{organizations} one{organization} other{organizations}}",
17740
17887
  "chart.aggregation.average": "average",
17741
17888
  "chart.aggregation.count": "count",
17742
17889
  "chart.aggregation.max": "max",
@@ -17780,11 +17927,11 @@ var en = {
17780
17927
  "datafeeder.analysisProgressBar.subtitle": "The analysis may take several minutes, please wait.",
17781
17928
  "datafeeder.analysisProgressBar.title": "Analyze in progress",
17782
17929
  "datafeeder.datasetValidation.datasetInformation": "The provided dataset contains {number} entities",
17783
- "datafeeder.datasetValidationCsv.lineNumbers": "Sample of the first 5 lines* of the dataset:",
17784
- "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",
17785
17930
  "datafeeder.datasetValidation.submitButton": "OK, my data are correct",
17786
17931
  "datafeeder.datasetValidation.title": "Make sure your data are correct",
17787
17932
  "datafeeder.datasetValidation.unknown": " - ",
17933
+ "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",
17934
+ "datafeeder.datasetValidationCsv.lineNumbers": "Sample of the first 5 lines* of the dataset:",
17788
17935
  "datafeeder.form.abstract": "How would you describe your dataset?",
17789
17936
  "datafeeder.form.datepicker": "Do you know when the dataset was created?",
17790
17937
  "datafeeder.form.description": "Finally, please describe the process that was used to create the dataset",
@@ -17863,7 +18010,7 @@ var en = {
17863
18010
  "datahub.header.lastRecords": "The latest",
17864
18011
  "datahub.header.myfavorites": "My favorites",
17865
18012
  "datahub.header.news": "Home",
17866
- "datahub.header.organisations": "Organisations",
18013
+ "datahub.header.organizations": "Organizations",
17867
18014
  "datahub.header.popularRecords": "The most popular",
17868
18015
  "datahub.header.title.html": "<div class=\"text-white\">Discover open<br> data from my Organization</div>",
17869
18016
  "datahub.news.contact.contactus": "Contact us",
@@ -17881,6 +18028,27 @@ var en = {
17881
18028
  "dataset.error.parse": "The data was loaded but could not be parsed: \"{ info }\"",
17882
18029
  "dataset.error.unknown": "The data cannot be displayed: \"{ info }\"",
17883
18030
  "dataset.error.unsupportedType": "The following content type is unsupported: \"{ info }\"",
18031
+ "domain.contact.role.author": "Author",
18032
+ "domain.contact.role.collaborator": "Collaborator",
18033
+ "domain.contact.role.contributor": "Contributor",
18034
+ "domain.contact.role.custodian": "Custodian",
18035
+ "domain.contact.role.distributor": "Distributor",
18036
+ "domain.contact.role.editor": "Editor",
18037
+ "domain.contact.role.funder": "Funder",
18038
+ "domain.contact.role.mediator": "Mediator",
18039
+ "domain.contact.role.originator": "Originator",
18040
+ "domain.contact.role.other": "Other",
18041
+ "domain.contact.role.owner": "Owner",
18042
+ "domain.contact.role.point_of_contact": "Point of contact",
18043
+ "domain.contact.role.principal_investigator": "Principal investigator",
18044
+ "domain.contact.role.processor": "Processor",
18045
+ "domain.contact.role.publisher": "Publisher",
18046
+ "domain.contact.role.resource_provider": "Resource provider",
18047
+ "domain.contact.role.rights_holder": "Rights holder",
18048
+ "domain.contact.role.sponsor": "Sponsor",
18049
+ "domain.contact.role.stakeholder": "Stakeholder",
18050
+ "domain.contact.role.unspecified": "Unspecified",
18051
+ "domain.contact.role.user": "User",
17884
18052
  "domain.record.status.completed": "Completed",
17885
18053
  "domain.record.status.deprecated": "Deprecated",
17886
18054
  "domain.record.status.ongoing": "On going",
@@ -17899,7 +18067,29 @@ var en = {
17899
18067
  "downloads.format.unknown": "unknown",
17900
18068
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17901
18069
  dropFile: dropFile$5,
17902
- "editor.record.form.license": "License",
18070
+ "editor.record.delete.confirmation.cancelText": "Cancel",
18071
+ "editor.record.delete.confirmation.confirmText": "Delete",
18072
+ "editor.record.delete.confirmation.message": "Are you sure you want to delete this record?",
18073
+ "editor.record.delete.confirmation.title": "Delete record?",
18074
+ "editor.record.deleteError.body": "The record could not be deleted:",
18075
+ "editor.record.deleteError.closeMessage": "Understood",
18076
+ "editor.record.deleteError.title": "Error deleting record",
18077
+ "editor.record.deleteSuccess.body": "The record was successfully deleted !",
18078
+ "editor.record.deleteSuccess.title": "Delete success",
18079
+ "editor.record.form.bottomButtons.comeBackLater": "Come back later",
18080
+ "editor.record.form.bottomButtons.next": "Next",
18081
+ "editor.record.form.bottomButtons.previous": "Previous",
18082
+ "editor.record.form.field.abstract": "Abstract",
18083
+ "editor.record.form.field.contactsForResource.noContact": "Please provide at least one point of contact responsible for the data.",
18084
+ "editor.record.form.field.keywords": "Keywords",
18085
+ "editor.record.form.field.license": "License",
18086
+ "editor.record.form.field.overviews": "Overviews",
18087
+ "editor.record.form.field.recordUpdated": "Record Updated",
18088
+ "editor.record.form.field.resourceUpdated": "Resource Updated",
18089
+ "editor.record.form.field.temporalExtents": "Temporal extents",
18090
+ "editor.record.form.field.title": "Metadata title",
18091
+ "editor.record.form.field.uniqueIdentifier": "Unique identifier",
18092
+ "editor.record.form.field.updateFrequency": "Update frequency",
17903
18093
  "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17904
18094
  "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17905
18095
  "editor.record.form.license.cc-zero": "Creative Commons CC-0",
@@ -17909,13 +18099,26 @@ var en = {
17909
18099
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17910
18100
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
17911
18101
  "editor.record.form.license.unknown": "Unknown or absent",
17912
- "editor.record.form.resourceUpdated": "Last update date",
17913
- "editor.record.form.temporalExtents": "Temporal extent",
18102
+ "editor.record.form.page.accessAndContact": "Access and contact",
18103
+ "editor.record.form.page.description": "Resource description",
18104
+ "editor.record.form.page.ressources": "Resources",
18105
+ "editor.record.form.section.about.description": "This section describes the resource.",
18106
+ "editor.record.form.section.about.label": "About the resource",
18107
+ "editor.record.form.section.annexes.label": "Annexes",
18108
+ "editor.record.form.section.associatedResources.description": "Drop files here to associate them with the resource.",
18109
+ "editor.record.form.section.associatedResources.label": "Associated resources",
18110
+ "editor.record.form.section.classification.description": "The classification has an impact on the access to the data.",
18111
+ "editor.record.form.section.classification.label": "Classification",
18112
+ "editor.record.form.section.dataManagers.description": "The data managers are responsible for the data.",
18113
+ "editor.record.form.section.dataManagers.label": "Data managers",
18114
+ "editor.record.form.section.dataPointOfContact.description": "This information concerns the metadata.",
18115
+ "editor.record.form.section.dataPointOfContact.label": "Data point of contact",
18116
+ "editor.record.form.section.geographicalCoverage.label": "Geographical coverage",
18117
+ "editor.record.form.section.useAndAccessConditions.label": "Use and access conditions",
17914
18118
  "editor.record.form.temporalExtents.addDate": "Time instant",
17915
18119
  "editor.record.form.temporalExtents.addRange": "Time period",
17916
18120
  "editor.record.form.temporalExtents.date": "Date",
17917
18121
  "editor.record.form.temporalExtents.range": "Date range",
17918
- "editor.record.form.updateFrequency": "Update frequency",
17919
18122
  "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
17920
18123
  "editor.record.loadError.body": "The record could not be loaded:",
17921
18124
  "editor.record.loadError.closeMessage": "Understood",
@@ -17930,6 +18133,7 @@ var en = {
17930
18133
  "editor.record.saveStatus.draftWithChangesPending": "Saved as draft - changes are pending",
17931
18134
  "editor.record.saveStatus.recordUpToDate": "Record is up to date",
17932
18135
  "editor.record.upToDate": "This record is up to date",
18136
+ "editor.sidebar.menu.editor": "Editor",
17933
18137
  "externalviewer.dataset.unnamed": "Datahub layer",
17934
18138
  "facets.block.title.OrgForResource": "Organisation",
17935
18139
  "facets.block.title.availableInServices": "Available for",
@@ -17998,17 +18202,17 @@ var en = {
17998
18202
  "organisations.sortBy.nameDesc": "Name Z → A",
17999
18203
  "organisations.sortBy.recordCountAsc": "Publications 0 → 9",
18000
18204
  "organisations.sortBy.recordCountDesc": "Publications 9 → 0",
18001
- "organization.header.recordCount": "{count, plural, =0{data} one{data} other{datas}}",
18002
- "organization.details.publishedDataset": "{count, plural, =0{published dataset} one{published dataset} other{published datasets}}",
18205
+ "organization.details.lastPublishedDatasets": "",
18206
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
18003
18207
  "organization.details.mailContact": "Contact by email",
18004
- "organization.datasets": "Datasets",
18005
- "organization.lastPublishedDatasets": "Last published datasets",
18006
- "organization.lastPublishedDatasets.searchAllButton": "Search all",
18208
+ "organization.header.recordCount": "{count, plural, =0{data} one{data} other{datas}}",
18007
18209
  "pagination.nextPage": "Next page",
18008
18210
  "pagination.page": "page",
18009
18211
  "pagination.pageOf": "of",
18010
18212
  previous: previous$5,
18213
+ "record.action.delete": "Delete",
18011
18214
  "record.action.download": "Download",
18215
+ "record.action.duplicate": "Duplicate",
18012
18216
  "record.action.view": "View",
18013
18217
  "record.externalViewer.open": "Open in the external map viewer",
18014
18218
  "record.metadata.about": "Description",
@@ -18101,11 +18305,11 @@ var en = {
18101
18305
  "results.sortBy.relevancy": "Relevancy",
18102
18306
  "search.autocomplete.error": "Suggestions could not be fetched:",
18103
18307
  "search.error.couldNotReachApi": "The API could not be reached",
18308
+ "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
18309
+ "search.error.organizationNotFound": "This organization could not be found.",
18104
18310
  "search.error.receivedError": "An error was received",
18105
18311
  "search.error.recordHasnolink": "This record currently has no link yet, please come back later.",
18106
18312
  "search.error.recordNotFound": "The record with identifier \"{ id }\" could not be found.",
18107
- "search.error.organizationNotFound": "This organization could not be found.",
18108
- "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
18109
18313
  "search.field.any.placeholder": "Search datasets ...",
18110
18314
  "search.field.sortBy": "Sort by:",
18111
18315
  "search.filters.clear": "Reset",
@@ -18130,14 +18334,16 @@ var en = {
18130
18334
  "search.filters.minimize": "Minimize",
18131
18335
  "search.filters.myRecords": "Show only my records",
18132
18336
  "search.filters.myRecordsHelp": "When this is enabled, records only created by myself are shown; records created by others will not show up.",
18337
+ "search.filters.organization": "Organization",
18133
18338
  "search.filters.otherRecords": "Showing records from another person",
18339
+ "search.filters.producerOrg": "Producer",
18134
18340
  "search.filters.publicationYear": "Publication year",
18135
- "search.filters.publisher": "Organizations",
18341
+ "search.filters.publisherOrg": "Publisher",
18136
18342
  "search.filters.representationType": "Representation type",
18137
18343
  "search.filters.resourceType": "Resource type",
18138
18344
  "search.filters.standard": "Standard",
18139
18345
  "search.filters.title": "Filter your results",
18140
- "search.filters.topic": "Topic",
18346
+ "search.filters.topic": "Topics",
18141
18347
  "search.filters.useSpatialFilter": "Show records in the area of interest first",
18142
18348
  "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.",
18143
18349
  "share.tab.permalink": "Share",
@@ -18213,6 +18419,8 @@ var es = {
18213
18419
  "datafeeder.datasetValidation.submitButton": "",
18214
18420
  "datafeeder.datasetValidation.title": "",
18215
18421
  "datafeeder.datasetValidation.unknown": "",
18422
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
18423
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
18216
18424
  "datafeeder.form.abstract": "",
18217
18425
  "datafeeder.form.datepicker": "",
18218
18426
  "datafeeder.form.description": "",
@@ -18240,6 +18448,7 @@ var es = {
18240
18448
  "datafeeder.publishSuccess.geonetworkRecord": "",
18241
18449
  "datafeeder.publishSuccess.illustration.title": "",
18242
18450
  "datafeeder.publishSuccess.mapViewer": "",
18451
+ "datafeeder.publishSuccess.ogcFeature": "",
18243
18452
  "datafeeder.publishSuccess.subtitle": "",
18244
18453
  "datafeeder.publishSuccess.title": "",
18245
18454
  "datafeeder.publishSuccess.uploadAnotherData": "",
@@ -18290,7 +18499,7 @@ var es = {
18290
18499
  "datahub.header.lastRecords": "",
18291
18500
  "datahub.header.myfavorites": "",
18292
18501
  "datahub.header.news": "",
18293
- "datahub.header.organisations": "",
18502
+ "datahub.header.organizations": "",
18294
18503
  "datahub.header.popularRecords": "",
18295
18504
  "datahub.header.title.html": "",
18296
18505
  "datahub.news.contact.contactus": "",
@@ -18308,6 +18517,27 @@ var es = {
18308
18517
  "dataset.error.parse": "",
18309
18518
  "dataset.error.unknown": "",
18310
18519
  "dataset.error.unsupportedType": "",
18520
+ "domain.contact.role.author": "",
18521
+ "domain.contact.role.collaborator": "",
18522
+ "domain.contact.role.contributor": "",
18523
+ "domain.contact.role.custodian": "",
18524
+ "domain.contact.role.distributor": "",
18525
+ "domain.contact.role.editor": "",
18526
+ "domain.contact.role.funder": "",
18527
+ "domain.contact.role.mediator": "",
18528
+ "domain.contact.role.originator": "",
18529
+ "domain.contact.role.other": "",
18530
+ "domain.contact.role.owner": "",
18531
+ "domain.contact.role.point_of_contact": "",
18532
+ "domain.contact.role.principal_investigator": "",
18533
+ "domain.contact.role.processor": "",
18534
+ "domain.contact.role.publisher": "",
18535
+ "domain.contact.role.resource_provider": "",
18536
+ "domain.contact.role.rights_holder": "",
18537
+ "domain.contact.role.sponsor": "",
18538
+ "domain.contact.role.stakeholder": "",
18539
+ "domain.contact.role.unspecified": "",
18540
+ "domain.contact.role.user": "",
18311
18541
  "domain.record.status.completed": "",
18312
18542
  "domain.record.status.deprecated": "",
18313
18543
  "domain.record.status.ongoing": "",
@@ -18326,7 +18556,29 @@ var es = {
18326
18556
  "downloads.format.unknown": "",
18327
18557
  "downloads.wfs.featuretype.not.found": "",
18328
18558
  dropFile: dropFile$4,
18329
- "editor.record.form.license": "",
18559
+ "editor.record.delete.confirmation.cancelText": "",
18560
+ "editor.record.delete.confirmation.confirmText": "",
18561
+ "editor.record.delete.confirmation.message": "",
18562
+ "editor.record.delete.confirmation.title": "",
18563
+ "editor.record.deleteError.body": "",
18564
+ "editor.record.deleteError.closeMessage": "",
18565
+ "editor.record.deleteError.title": "",
18566
+ "editor.record.deleteSuccess.body": "",
18567
+ "editor.record.deleteSuccess.title": "",
18568
+ "editor.record.form.bottomButtons.comeBackLater": "",
18569
+ "editor.record.form.bottomButtons.next": "",
18570
+ "editor.record.form.bottomButtons.previous": "",
18571
+ "editor.record.form.field.abstract": "",
18572
+ "editor.record.form.field.contactsForResource.noContact": "",
18573
+ "editor.record.form.field.keywords": "",
18574
+ "editor.record.form.field.license": "",
18575
+ "editor.record.form.field.overviews": "",
18576
+ "editor.record.form.field.recordUpdated": "",
18577
+ "editor.record.form.field.resourceUpdated": "",
18578
+ "editor.record.form.field.temporalExtents": "",
18579
+ "editor.record.form.field.title": "",
18580
+ "editor.record.form.field.uniqueIdentifier": "",
18581
+ "editor.record.form.field.updateFrequency": "",
18330
18582
  "editor.record.form.license.cc-by": "",
18331
18583
  "editor.record.form.license.cc-by-sa": "",
18332
18584
  "editor.record.form.license.cc-zero": "",
@@ -18336,13 +18588,26 @@ var es = {
18336
18588
  "editor.record.form.license.odc-by": "",
18337
18589
  "editor.record.form.license.pddl": "",
18338
18590
  "editor.record.form.license.unknown": "",
18339
- "editor.record.form.resourceUpdated": "",
18340
- "editor.record.form.temporalExtents": "",
18591
+ "editor.record.form.page.accessAndContact": "",
18592
+ "editor.record.form.page.description": "",
18593
+ "editor.record.form.page.ressources": "",
18594
+ "editor.record.form.section.about.description": "",
18595
+ "editor.record.form.section.about.label": "",
18596
+ "editor.record.form.section.annexes.label": "",
18597
+ "editor.record.form.section.associatedResources.description": "",
18598
+ "editor.record.form.section.associatedResources.label": "",
18599
+ "editor.record.form.section.classification.description": "",
18600
+ "editor.record.form.section.classification.label": "",
18601
+ "editor.record.form.section.dataManagers.description": "",
18602
+ "editor.record.form.section.dataManagers.label": "",
18603
+ "editor.record.form.section.dataPointOfContact.description": "",
18604
+ "editor.record.form.section.dataPointOfContact.label": "",
18605
+ "editor.record.form.section.geographicalCoverage.label": "",
18606
+ "editor.record.form.section.useAndAccessConditions.label": "",
18341
18607
  "editor.record.form.temporalExtents.addDate": "",
18342
18608
  "editor.record.form.temporalExtents.addRange": "",
18343
18609
  "editor.record.form.temporalExtents.date": "",
18344
18610
  "editor.record.form.temporalExtents.range": "",
18345
- "editor.record.form.updateFrequency": "",
18346
18611
  "editor.record.form.updateFrequency.planned": "",
18347
18612
  "editor.record.loadError.body": "",
18348
18613
  "editor.record.loadError.closeMessage": "",
@@ -18357,6 +18622,7 @@ var es = {
18357
18622
  "editor.record.saveStatus.draftWithChangesPending": "",
18358
18623
  "editor.record.saveStatus.recordUpToDate": "",
18359
18624
  "editor.record.upToDate": "",
18625
+ "editor.sidebar.menu.editor": "",
18360
18626
  "externalviewer.dataset.unnamed": "",
18361
18627
  "facets.block.title.OrgForResource": "",
18362
18628
  "facets.block.title.availableInServices": "",
@@ -18425,17 +18691,17 @@ var es = {
18425
18691
  "organisations.sortBy.nameDesc": "",
18426
18692
  "organisations.sortBy.recordCountAsc": "",
18427
18693
  "organisations.sortBy.recordCountDesc": "",
18428
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
18429
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
18694
+ "organization.details.lastPublishedDatasets": "",
18695
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
18430
18696
  "organization.details.mailContact": "",
18431
- "organization.datasets": "",
18432
- "organization.lastPublishedDatasets": "",
18433
- "organization.lastPublishedDatasets.searchAllButton": "",
18697
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
18434
18698
  "pagination.nextPage": "",
18435
18699
  "pagination.page": "",
18436
18700
  "pagination.pageOf": "",
18437
18701
  previous: previous$4,
18702
+ "record.action.delete": "",
18438
18703
  "record.action.download": "",
18704
+ "record.action.duplicate": "",
18439
18705
  "record.action.view": "",
18440
18706
  "record.externalViewer.open": "",
18441
18707
  "record.metadata.about": "",
@@ -18528,11 +18794,11 @@ var es = {
18528
18794
  "results.sortBy.relevancy": "",
18529
18795
  "search.autocomplete.error": "",
18530
18796
  "search.error.couldNotReachApi": "",
18797
+ "search.error.organizationHasNoDataset": "",
18798
+ "search.error.organizationNotFound": "",
18531
18799
  "search.error.receivedError": "",
18532
18800
  "search.error.recordHasnolink": "",
18533
18801
  "search.error.recordNotFound": "",
18534
- "search.error.organizationNotFound": "",
18535
- "search.error.organizationHasNoDataset": "",
18536
18802
  "search.field.any.placeholder": "",
18537
18803
  "search.field.sortBy": "",
18538
18804
  "search.filters.clear": "",
@@ -18557,9 +18823,11 @@ var es = {
18557
18823
  "search.filters.minimize": "",
18558
18824
  "search.filters.myRecords": "",
18559
18825
  "search.filters.myRecordsHelp": "",
18826
+ "search.filters.organization": "",
18560
18827
  "search.filters.otherRecords": "",
18828
+ "search.filters.producerOrg": "",
18561
18829
  "search.filters.publicationYear": "",
18562
- "search.filters.publisher": "",
18830
+ "search.filters.publisherOrg": "",
18563
18831
  "search.filters.representationType": "",
18564
18832
  "search.filters.resourceType": "",
18565
18833
  "search.filters.standard": "",
@@ -18637,11 +18905,11 @@ var fr = {
18637
18905
  "datafeeder.analysisProgressBar.subtitle": "L'analyse peut prendre plusieurs minutes, merci d'attendre.",
18638
18906
  "datafeeder.analysisProgressBar.title": "Analyse en cours",
18639
18907
  "datafeeder.datasetValidation.datasetInformation": "Le jeu de données fourni contient {number} entités",
18640
- "datafeeder.datasetValidationCsv.lineNumbers": "Résumé des 5 premières lignes* du CSV :",
18641
- "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é",
18642
18908
  "datafeeder.datasetValidation.submitButton": "OK, mes données sont correctes",
18643
18909
  "datafeeder.datasetValidation.title": "Vérifiez que vos données sont correctes",
18644
18910
  "datafeeder.datasetValidation.unknown": " - ",
18911
+ "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é",
18912
+ "datafeeder.datasetValidationCsv.lineNumbers": "Résumé des 5 premières lignes* du CSV :",
18645
18913
  "datafeeder.form.abstract": "Comment décrire votre jeu de données ?",
18646
18914
  "datafeeder.form.datepicker": "Savez-vous quand la donnée a été créée ?",
18647
18915
  "datafeeder.form.description": "Enfin, décrivez le processus utilisé pour créer la donnée",
@@ -18720,7 +18988,7 @@ var fr = {
18720
18988
  "datahub.header.lastRecords": "Les plus récentes",
18721
18989
  "datahub.header.myfavorites": "Mes favoris",
18722
18990
  "datahub.header.news": "Accueil",
18723
- "datahub.header.organisations": "Organisations",
18991
+ "datahub.header.organizations": "Organisations",
18724
18992
  "datahub.header.popularRecords": "Les plus appréciées",
18725
18993
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
18726
18994
  "datahub.news.contact.contactus": "Contactez-nous",
@@ -18738,6 +19006,27 @@ var fr = {
18738
19006
  "dataset.error.parse": "Les données ont été chargées mais leur décodage a échoué: \"{ info }\"",
18739
19007
  "dataset.error.unknown": "Les données ne peuvent être affichées: \"{ info }\"",
18740
19008
  "dataset.error.unsupportedType": "Le type de contenu suivant n'est pas pris en charge: \"{ info }\"",
19009
+ "domain.contact.role.author": "Auteur",
19010
+ "domain.contact.role.collaborator": "Collaborateur",
19011
+ "domain.contact.role.contributor": "Contributeur",
19012
+ "domain.contact.role.custodian": "Gestionnaire",
19013
+ "domain.contact.role.distributor": "Distributeur",
19014
+ "domain.contact.role.editor": "Éditeur",
19015
+ "domain.contact.role.funder": "Financeur",
19016
+ "domain.contact.role.mediator": "Médiateur",
19017
+ "domain.contact.role.originator": "Créateur",
19018
+ "domain.contact.role.other": "Autre",
19019
+ "domain.contact.role.owner": "Propriétaire",
19020
+ "domain.contact.role.point_of_contact": "Point de contact",
19021
+ "domain.contact.role.principal_investigator": "Chercheur principal",
19022
+ "domain.contact.role.processor": "Processeur",
19023
+ "domain.contact.role.publisher": "Éditeur",
19024
+ "domain.contact.role.resource_provider": "Fournisseur",
19025
+ "domain.contact.role.rights_holder": "Détenteur des droits",
19026
+ "domain.contact.role.sponsor": "Sponsor",
19027
+ "domain.contact.role.stakeholder": "Partie prenante",
19028
+ "domain.contact.role.unspecified": "Non spécifié",
19029
+ "domain.contact.role.user": "Utilisateur",
18741
19030
  "domain.record.status.completed": "Finalisé",
18742
19031
  "domain.record.status.deprecated": "Obsolète",
18743
19032
  "domain.record.status.ongoing": "Mise à jour continue",
@@ -18756,7 +19045,29 @@ var fr = {
18756
19045
  "downloads.format.unknown": "inconnu",
18757
19046
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
18758
19047
  dropFile: dropFile$3,
18759
- "editor.record.form.license": "Licence",
19048
+ "editor.record.delete.confirmation.cancelText": "Annuler",
19049
+ "editor.record.delete.confirmation.confirmText": "Supprimer",
19050
+ "editor.record.delete.confirmation.message": "Etes-vous sûr de vouloir supprimer cette fiche ?",
19051
+ "editor.record.delete.confirmation.title": "Supprimer la fiche",
19052
+ "editor.record.deleteError.body": "La fiche n'a pas pu être supprimée :",
19053
+ "editor.record.deleteError.closeMessage": "Compris",
19054
+ "editor.record.deleteError.title": "Erreur lors de la suppression",
19055
+ "editor.record.deleteSuccess.body": "La fiche a bien été supprimée !",
19056
+ "editor.record.deleteSuccess.title": "Suppression réussie",
19057
+ "editor.record.form.bottomButtons.comeBackLater": "Revenir plus tard",
19058
+ "editor.record.form.bottomButtons.next": "Suivant",
19059
+ "editor.record.form.bottomButtons.previous": "Précédent",
19060
+ "editor.record.form.field.abstract": "Résumé",
19061
+ "editor.record.form.field.contactsForResource.noContact": "Veuillez renseigner au moins un point de contact responsable de la donnée.",
19062
+ "editor.record.form.field.keywords": "Mots-clés",
19063
+ "editor.record.form.field.license": "Licence",
19064
+ "editor.record.form.field.overviews": "Aperçus",
19065
+ "editor.record.form.field.recordUpdated": "Date de dernière révision",
19066
+ "editor.record.form.field.resourceUpdated": "Date de dernière révision",
19067
+ "editor.record.form.field.temporalExtents": "Étendue temporelle",
19068
+ "editor.record.form.field.title": "",
19069
+ "editor.record.form.field.uniqueIdentifier": "Identifiant unique",
19070
+ "editor.record.form.field.updateFrequency": "Fréquence de mise à jour",
18760
19071
  "editor.record.form.license.cc-by": "",
18761
19072
  "editor.record.form.license.cc-by-sa": "",
18762
19073
  "editor.record.form.license.cc-zero": "",
@@ -18766,27 +19077,41 @@ var fr = {
18766
19077
  "editor.record.form.license.odc-by": "",
18767
19078
  "editor.record.form.license.pddl": "",
18768
19079
  "editor.record.form.license.unknown": "Non-reconnue ou absente",
18769
- "editor.record.form.resourceUpdated": "Date de dernière révision",
18770
- "editor.record.form.temporalExtents": "Étendue temporelle",
19080
+ "editor.record.form.page.accessAndContact": "Acces et contact",
19081
+ "editor.record.form.page.description": "Description de la ressource",
19082
+ "editor.record.form.page.ressources": "Ressources",
19083
+ "editor.record.form.section.about.description": "Ces informations concernent la donnée.",
19084
+ "editor.record.form.section.about.label": "A propos de la ressource",
19085
+ "editor.record.form.section.annexes.label": "Annexes",
19086
+ "editor.record.form.section.associatedResources.description": "Déposez les jeux de données associées à cette fiche de métadonnée.",
19087
+ "editor.record.form.section.associatedResources.label": "Ressources associees",
19088
+ "editor.record.form.section.classification.description": "La classification a un impact sur la recherche du jeux de données.",
19089
+ "editor.record.form.section.classification.label": "Classification",
19090
+ "editor.record.form.section.dataManagers.description": "Cette information concerne la donnée.",
19091
+ "editor.record.form.section.dataManagers.label": "Responsables de la donnee",
19092
+ "editor.record.form.section.dataPointOfContact.description": "Cette information concerne la fiche de métadonnée.",
19093
+ "editor.record.form.section.dataPointOfContact.label": "Point de contact de la metadonee",
19094
+ "editor.record.form.section.geographicalCoverage.label": "Couverture geographique",
19095
+ "editor.record.form.section.useAndAccessConditions.label": "Conditions d'acces et usage",
18771
19096
  "editor.record.form.temporalExtents.addDate": "Date déterminée",
18772
19097
  "editor.record.form.temporalExtents.addRange": "Période de temps",
18773
19098
  "editor.record.form.temporalExtents.date": "Date concernée",
18774
19099
  "editor.record.form.temporalExtents.range": "Période concernée",
18775
- "editor.record.form.updateFrequency": "Fréquence de mise à jour",
18776
19100
  "editor.record.form.updateFrequency.planned": "Ces données doivent être mise à jour régulièrement.",
18777
- "editor.record.loadError.body": "",
18778
- "editor.record.loadError.closeMessage": "",
18779
- "editor.record.loadError.title": "",
18780
- "editor.record.publish": "",
18781
- "editor.record.publishError.body": "",
18782
- "editor.record.publishError.closeMessage": "",
18783
- "editor.record.publishError.title": "",
18784
- "editor.record.publishSuccess.body": "",
18785
- "editor.record.publishSuccess.title": "",
19101
+ "editor.record.loadError.body": "La fiche n'a pas pu être chargée :",
19102
+ "editor.record.loadError.closeMessage": "Compris",
19103
+ "editor.record.loadError.title": "Erreur lors du chargement",
19104
+ "editor.record.publish": "Publier cette fiche",
19105
+ "editor.record.publishError.body": "La fiche n'a pas pu être publiée :",
19106
+ "editor.record.publishError.closeMessage": "Compris",
19107
+ "editor.record.publishError.title": "Erreur lors de la publication",
19108
+ "editor.record.publishSuccess.body": "La fiche a bien été publiée !",
19109
+ "editor.record.publishSuccess.title": "Publication réussie",
18786
19110
  "editor.record.saveStatus.asDraftOnly": "Brouillon enregistré - fiche non publiée",
18787
19111
  "editor.record.saveStatus.draftWithChangesPending": "Brouillon enregistré - modifications en cours",
18788
19112
  "editor.record.saveStatus.recordUpToDate": "La fiche publiée est à jour",
18789
19113
  "editor.record.upToDate": "",
19114
+ "editor.sidebar.menu.editor": "",
18790
19115
  "externalviewer.dataset.unnamed": "Couche du datahub",
18791
19116
  "facets.block.title.OrgForResource": "Organisation",
18792
19117
  "facets.block.title.availableInServices": "Disponible pour",
@@ -18855,17 +19180,17 @@ var fr = {
18855
19180
  "organisations.sortBy.nameDesc": "Nom Z → A",
18856
19181
  "organisations.sortBy.recordCountAsc": "Données 0 → 9",
18857
19182
  "organisations.sortBy.recordCountDesc": "Données 9 → 0",
18858
- "organization.header.recordCount": "{count, plural, =0{donnée} one{donnée} other{données}}",
18859
- "organization.details.publishedDataset": "{count, plural, =0{donnée publiée} one{donnée publiée} other{données publiées}}",
19183
+ "organization.details.lastPublishedDatasets": "",
19184
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
18860
19185
  "organization.details.mailContact": "Contacter par mail",
18861
- "organization.datasets": "Données",
18862
- "organization.lastPublishedDatasets": "Dernières données publiées",
18863
- "organization.lastPublishedDatasets.searchAllButton": "Rechercher tous",
19186
+ "organization.header.recordCount": "{count, plural, =0{donnée} one{donnée} other{données}}",
18864
19187
  "pagination.nextPage": "Page suivante",
18865
19188
  "pagination.page": "page",
18866
19189
  "pagination.pageOf": "sur",
18867
19190
  previous: previous$3,
19191
+ "record.action.delete": "Supprimer",
18868
19192
  "record.action.download": "Télécharger",
19193
+ "record.action.duplicate": "Dupliquer",
18869
19194
  "record.action.view": "Voir",
18870
19195
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
18871
19196
  "record.metadata.about": "Description",
@@ -18958,11 +19283,11 @@ var fr = {
18958
19283
  "results.sortBy.relevancy": "Pertinence",
18959
19284
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
18960
19285
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
19286
+ "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
19287
+ "search.error.organizationNotFound": "L'organisation n'a pas pu être trouvée.",
18961
19288
  "search.error.receivedError": "Erreur retournée",
18962
19289
  "search.error.recordHasnolink": "Ce dataset n'a pas encore de lien, réessayez plus tard s'il vous plaît.",
18963
19290
  "search.error.recordNotFound": "Cette donnée n'a pu être trouvée.",
18964
- "search.error.organizationNotFound": "L'organisation n'a pas pu être trouvée.",
18965
- "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
18966
19291
  "search.field.any.placeholder": "Rechercher une donnée...",
18967
19292
  "search.field.sortBy": "Trier par :",
18968
19293
  "search.filters.clear": "Réinitialiser",
@@ -18987,14 +19312,16 @@ var fr = {
18987
19312
  "search.filters.minimize": "Réduire",
18988
19313
  "search.filters.myRecords": "Voir mes données",
18989
19314
  "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.",
19315
+ "search.filters.organization": "Organisation",
18990
19316
  "search.filters.otherRecords": "Affichage des données d'un autre utilisateur",
19317
+ "search.filters.producerOrg": "Producteur",
18991
19318
  "search.filters.publicationYear": "Année de publication",
18992
- "search.filters.publisher": "Organisations",
19319
+ "search.filters.publisherOrg": "Distributeur",
18993
19320
  "search.filters.representationType": "Type de représentation",
18994
19321
  "search.filters.resourceType": "Type de ressource",
18995
19322
  "search.filters.standard": "Standard",
18996
19323
  "search.filters.title": "Affiner votre recherche",
18997
- "search.filters.topic": "Thème",
19324
+ "search.filters.topic": "Thèmes",
18998
19325
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
18999
19326
  "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.",
19000
19327
  "share.tab.permalink": "Partager",
@@ -19070,6 +19397,8 @@ var it = {
19070
19397
  "datafeeder.datasetValidation.submitButton": "OK, i miei dati sono corretti",
19071
19398
  "datafeeder.datasetValidation.title": "Controllare che i dati siano corretti",
19072
19399
  "datafeeder.datasetValidation.unknown": " - ",
19400
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
19401
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
19073
19402
  "datafeeder.form.abstract": "Come descrivere il suo dataset?",
19074
19403
  "datafeeder.form.datepicker": "Sa quando è stato creato il suo dataset ?",
19075
19404
  "datafeeder.form.description": "Infine, descrivere il processo utilizzato per creare il dataset",
@@ -19097,6 +19426,7 @@ var it = {
19097
19426
  "datafeeder.publishSuccess.geonetworkRecord": "Scheda di metadati",
19098
19427
  "datafeeder.publishSuccess.illustration.title": "Completato, tutto è andato bene!",
19099
19428
  "datafeeder.publishSuccess.mapViewer": "Visualizzatore",
19429
+ "datafeeder.publishSuccess.ogcFeature": "",
19100
19430
  "datafeeder.publishSuccess.subtitle": "Visualizzare i dati:",
19101
19431
  "datafeeder.publishSuccess.title": "Congratulazioni! \n I suoi dati sono stati pubblicati",
19102
19432
  "datafeeder.publishSuccess.uploadAnotherData": "Caricare un altro dato",
@@ -19147,7 +19477,7 @@ var it = {
19147
19477
  "datahub.header.lastRecords": "Ultimi",
19148
19478
  "datahub.header.myfavorites": "Miei preferiti",
19149
19479
  "datahub.header.news": "Home",
19150
- "datahub.header.organisations": "Organizzazioni",
19480
+ "datahub.header.organizations": "Organizzazioni",
19151
19481
  "datahub.header.popularRecords": "Più popolari",
19152
19482
  "datahub.header.title.html": "<div class=\"text-white\">Tutti i dati<br>pubblici della mia organizzazione</div>",
19153
19483
  "datahub.news.contact.contactus": "Contattateci",
@@ -19165,6 +19495,27 @@ var it = {
19165
19495
  "dataset.error.parse": "I dati sono stati caricati ma la decodifica non è riuscita: \"{info}\"",
19166
19496
  "dataset.error.unknown": "Impossibile visualizzare i dati: \"{info}\"",
19167
19497
  "dataset.error.unsupportedType": "Il seguente tipo di contenuto non è supportato: \"{info}\"",
19498
+ "domain.contact.role.author": "",
19499
+ "domain.contact.role.collaborator": "",
19500
+ "domain.contact.role.contributor": "",
19501
+ "domain.contact.role.custodian": "",
19502
+ "domain.contact.role.distributor": "",
19503
+ "domain.contact.role.editor": "",
19504
+ "domain.contact.role.funder": "",
19505
+ "domain.contact.role.mediator": "",
19506
+ "domain.contact.role.originator": "",
19507
+ "domain.contact.role.other": "",
19508
+ "domain.contact.role.owner": "",
19509
+ "domain.contact.role.point_of_contact": "",
19510
+ "domain.contact.role.principal_investigator": "",
19511
+ "domain.contact.role.processor": "",
19512
+ "domain.contact.role.publisher": "",
19513
+ "domain.contact.role.resource_provider": "",
19514
+ "domain.contact.role.rights_holder": "",
19515
+ "domain.contact.role.sponsor": "",
19516
+ "domain.contact.role.stakeholder": "",
19517
+ "domain.contact.role.unspecified": "",
19518
+ "domain.contact.role.user": "",
19168
19519
  "domain.record.status.completed": "Completato",
19169
19520
  "domain.record.status.deprecated": "Deprecato",
19170
19521
  "domain.record.status.ongoing": "Aggiornamento continuo",
@@ -19183,7 +19534,29 @@ var it = {
19183
19534
  "downloads.format.unknown": "sconosciuto",
19184
19535
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
19185
19536
  dropFile: dropFile$2,
19186
- "editor.record.form.license": "Licenza",
19537
+ "editor.record.delete.confirmation.cancelText": "",
19538
+ "editor.record.delete.confirmation.confirmText": "",
19539
+ "editor.record.delete.confirmation.message": "",
19540
+ "editor.record.delete.confirmation.title": "",
19541
+ "editor.record.deleteError.body": "",
19542
+ "editor.record.deleteError.closeMessage": "",
19543
+ "editor.record.deleteError.title": "",
19544
+ "editor.record.deleteSuccess.body": "",
19545
+ "editor.record.deleteSuccess.title": "",
19546
+ "editor.record.form.bottomButtons.comeBackLater": "",
19547
+ "editor.record.form.bottomButtons.next": "",
19548
+ "editor.record.form.bottomButtons.previous": "",
19549
+ "editor.record.form.field.abstract": "",
19550
+ "editor.record.form.field.contactsForResource.noContact": "",
19551
+ "editor.record.form.field.keywords": "",
19552
+ "editor.record.form.field.license": "Licenza",
19553
+ "editor.record.form.field.overviews": "",
19554
+ "editor.record.form.field.recordUpdated": "",
19555
+ "editor.record.form.field.resourceUpdated": "",
19556
+ "editor.record.form.field.temporalExtents": "",
19557
+ "editor.record.form.field.title": "",
19558
+ "editor.record.form.field.uniqueIdentifier": "",
19559
+ "editor.record.form.field.updateFrequency": "",
19187
19560
  "editor.record.form.license.cc-by": "",
19188
19561
  "editor.record.form.license.cc-by-sa": "",
19189
19562
  "editor.record.form.license.cc-zero": "",
@@ -19193,13 +19566,26 @@ var it = {
19193
19566
  "editor.record.form.license.odc-by": "",
19194
19567
  "editor.record.form.license.pddl": "",
19195
19568
  "editor.record.form.license.unknown": "Non riconosciuta o assente",
19196
- "editor.record.form.resourceUpdated": "",
19197
- "editor.record.form.temporalExtents": "",
19569
+ "editor.record.form.page.accessAndContact": "",
19570
+ "editor.record.form.page.description": "",
19571
+ "editor.record.form.page.ressources": "",
19572
+ "editor.record.form.section.about.description": "",
19573
+ "editor.record.form.section.about.label": "",
19574
+ "editor.record.form.section.annexes.label": "",
19575
+ "editor.record.form.section.associatedResources.description": "",
19576
+ "editor.record.form.section.associatedResources.label": "",
19577
+ "editor.record.form.section.classification.description": "",
19578
+ "editor.record.form.section.classification.label": "",
19579
+ "editor.record.form.section.dataManagers.description": "",
19580
+ "editor.record.form.section.dataManagers.label": "",
19581
+ "editor.record.form.section.dataPointOfContact.description": "",
19582
+ "editor.record.form.section.dataPointOfContact.label": "",
19583
+ "editor.record.form.section.geographicalCoverage.label": "",
19584
+ "editor.record.form.section.useAndAccessConditions.label": "",
19198
19585
  "editor.record.form.temporalExtents.addDate": "",
19199
19586
  "editor.record.form.temporalExtents.addRange": "",
19200
19587
  "editor.record.form.temporalExtents.date": "",
19201
19588
  "editor.record.form.temporalExtents.range": "",
19202
- "editor.record.form.updateFrequency": "",
19203
19589
  "editor.record.form.updateFrequency.planned": "",
19204
19590
  "editor.record.loadError.body": "",
19205
19591
  "editor.record.loadError.closeMessage": "",
@@ -19214,6 +19600,7 @@ var it = {
19214
19600
  "editor.record.saveStatus.draftWithChangesPending": "",
19215
19601
  "editor.record.saveStatus.recordUpToDate": "",
19216
19602
  "editor.record.upToDate": "",
19603
+ "editor.sidebar.menu.editor": "",
19217
19604
  "externalviewer.dataset.unnamed": "Layer del datahub",
19218
19605
  "facets.block.title.OrgForResource": "Organizzazione",
19219
19606
  "facets.block.title.availableInServices": "Disponibile per",
@@ -19282,17 +19669,17 @@ var it = {
19282
19669
  "organisations.sortBy.nameDesc": "Nome Z → A",
19283
19670
  "organisations.sortBy.recordCountAsc": "Dati 0 → 9",
19284
19671
  "organisations.sortBy.recordCountDesc": "Dati 9 → 0",
19285
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19286
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
19672
+ "organization.details.lastPublishedDatasets": "",
19673
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
19287
19674
  "organization.details.mailContact": "",
19288
- "organization.datasets": "",
19289
- "organization.lastPublishedDatasets": "",
19290
- "organization.lastPublishedDatasets.searchAllButton": "",
19675
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19291
19676
  "pagination.nextPage": "Pagina successiva",
19292
19677
  "pagination.page": "pagina",
19293
19678
  "pagination.pageOf": "di",
19294
19679
  previous: previous$2,
19680
+ "record.action.delete": "",
19295
19681
  "record.action.download": "Scarica",
19682
+ "record.action.duplicate": "",
19296
19683
  "record.action.view": "Visualizza",
19297
19684
  "record.externalViewer.open": "Apri nell'visualizzatore esterno",
19298
19685
  "record.metadata.about": "Descrizione",
@@ -19385,11 +19772,11 @@ var it = {
19385
19772
  "results.sortBy.relevancy": "Rilevanza",
19386
19773
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
19387
19774
  "search.error.couldNotReachApi": "Problema di connessione all'API",
19775
+ "search.error.organizationHasNoDataset": "",
19776
+ "search.error.organizationNotFound": "",
19388
19777
  "search.error.receivedError": "Errore ricevuto",
19389
19778
  "search.error.recordHasnolink": "",
19390
19779
  "search.error.recordNotFound": "Impossibile trovare questo dato",
19391
- "search.error.organizationNotFound": "",
19392
- "search.error.organizationHasNoDataset": "",
19393
19780
  "search.field.any.placeholder": "Cerca un dato...",
19394
19781
  "search.field.sortBy": "Ordina per:",
19395
19782
  "search.filters.clear": "Ripristina",
@@ -19414,14 +19801,16 @@ var it = {
19414
19801
  "search.filters.minimize": "Riduci",
19415
19802
  "search.filters.myRecords": "Visualizza i miei dati",
19416
19803
  "search.filters.myRecordsHelp": "Quando attivato, mostra solo i dati creati con il mio utente. I dati creati da altri utenti non sono visualizzati.",
19804
+ "search.filters.organization": "",
19417
19805
  "search.filters.otherRecords": "Visualizzazione dei dati di un altro utente",
19806
+ "search.filters.producerOrg": "",
19418
19807
  "search.filters.publicationYear": "Anno di pubblicazione",
19419
- "search.filters.publisher": "Organizzazioni",
19808
+ "search.filters.publisherOrg": "",
19420
19809
  "search.filters.representationType": "Tipo di rappresentazione",
19421
19810
  "search.filters.resourceType": "Tipo di risorsa",
19422
19811
  "search.filters.standard": "Standard",
19423
19812
  "search.filters.title": "Affina la sua ricerca",
19424
- "search.filters.topic": "Argomento",
19813
+ "search.filters.topic": "Argomenti",
19425
19814
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
19426
19815
  "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.",
19427
19816
  "share.tab.permalink": "Condividere",
@@ -19497,6 +19886,8 @@ var nl = {
19497
19886
  "datafeeder.datasetValidation.submitButton": "",
19498
19887
  "datafeeder.datasetValidation.title": "",
19499
19888
  "datafeeder.datasetValidation.unknown": "",
19889
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
19890
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
19500
19891
  "datafeeder.form.abstract": "",
19501
19892
  "datafeeder.form.datepicker": "",
19502
19893
  "datafeeder.form.description": "",
@@ -19524,6 +19915,7 @@ var nl = {
19524
19915
  "datafeeder.publishSuccess.geonetworkRecord": "",
19525
19916
  "datafeeder.publishSuccess.illustration.title": "",
19526
19917
  "datafeeder.publishSuccess.mapViewer": "",
19918
+ "datafeeder.publishSuccess.ogcFeature": "",
19527
19919
  "datafeeder.publishSuccess.subtitle": "",
19528
19920
  "datafeeder.publishSuccess.title": "",
19529
19921
  "datafeeder.publishSuccess.uploadAnotherData": "",
@@ -19574,7 +19966,7 @@ var nl = {
19574
19966
  "datahub.header.lastRecords": "",
19575
19967
  "datahub.header.myfavorites": "",
19576
19968
  "datahub.header.news": "",
19577
- "datahub.header.organisations": "",
19969
+ "datahub.header.organizations": "",
19578
19970
  "datahub.header.popularRecords": "",
19579
19971
  "datahub.header.title.html": "",
19580
19972
  "datahub.news.contact.contactus": "",
@@ -19592,6 +19984,27 @@ var nl = {
19592
19984
  "dataset.error.parse": "",
19593
19985
  "dataset.error.unknown": "",
19594
19986
  "dataset.error.unsupportedType": "",
19987
+ "domain.contact.role.author": "",
19988
+ "domain.contact.role.collaborator": "",
19989
+ "domain.contact.role.contributor": "",
19990
+ "domain.contact.role.custodian": "",
19991
+ "domain.contact.role.distributor": "",
19992
+ "domain.contact.role.editor": "",
19993
+ "domain.contact.role.funder": "",
19994
+ "domain.contact.role.mediator": "",
19995
+ "domain.contact.role.originator": "",
19996
+ "domain.contact.role.other": "",
19997
+ "domain.contact.role.owner": "",
19998
+ "domain.contact.role.point_of_contact": "",
19999
+ "domain.contact.role.principal_investigator": "",
20000
+ "domain.contact.role.processor": "",
20001
+ "domain.contact.role.publisher": "",
20002
+ "domain.contact.role.resource_provider": "",
20003
+ "domain.contact.role.rights_holder": "",
20004
+ "domain.contact.role.sponsor": "",
20005
+ "domain.contact.role.stakeholder": "",
20006
+ "domain.contact.role.unspecified": "",
20007
+ "domain.contact.role.user": "",
19595
20008
  "domain.record.status.completed": "",
19596
20009
  "domain.record.status.deprecated": "",
19597
20010
  "domain.record.status.ongoing": "",
@@ -19610,7 +20023,29 @@ var nl = {
19610
20023
  "downloads.format.unknown": "",
19611
20024
  "downloads.wfs.featuretype.not.found": "",
19612
20025
  dropFile: dropFile$1,
19613
- "editor.record.form.license": "",
20026
+ "editor.record.delete.confirmation.cancelText": "",
20027
+ "editor.record.delete.confirmation.confirmText": "",
20028
+ "editor.record.delete.confirmation.message": "",
20029
+ "editor.record.delete.confirmation.title": "",
20030
+ "editor.record.deleteError.body": "",
20031
+ "editor.record.deleteError.closeMessage": "",
20032
+ "editor.record.deleteError.title": "",
20033
+ "editor.record.deleteSuccess.body": "",
20034
+ "editor.record.deleteSuccess.title": "",
20035
+ "editor.record.form.bottomButtons.comeBackLater": "",
20036
+ "editor.record.form.bottomButtons.next": "",
20037
+ "editor.record.form.bottomButtons.previous": "",
20038
+ "editor.record.form.field.abstract": "",
20039
+ "editor.record.form.field.contactsForResource.noContact": "",
20040
+ "editor.record.form.field.keywords": "",
20041
+ "editor.record.form.field.license": "",
20042
+ "editor.record.form.field.overviews": "",
20043
+ "editor.record.form.field.recordUpdated": "",
20044
+ "editor.record.form.field.resourceUpdated": "",
20045
+ "editor.record.form.field.temporalExtents": "",
20046
+ "editor.record.form.field.title": "",
20047
+ "editor.record.form.field.uniqueIdentifier": "",
20048
+ "editor.record.form.field.updateFrequency": "",
19614
20049
  "editor.record.form.license.cc-by": "",
19615
20050
  "editor.record.form.license.cc-by-sa": "",
19616
20051
  "editor.record.form.license.cc-zero": "",
@@ -19620,13 +20055,26 @@ var nl = {
19620
20055
  "editor.record.form.license.odc-by": "",
19621
20056
  "editor.record.form.license.pddl": "",
19622
20057
  "editor.record.form.license.unknown": "",
19623
- "editor.record.form.resourceUpdated": "",
19624
- "editor.record.form.temporalExtents": "",
20058
+ "editor.record.form.page.accessAndContact": "",
20059
+ "editor.record.form.page.description": "",
20060
+ "editor.record.form.page.ressources": "",
20061
+ "editor.record.form.section.about.description": "",
20062
+ "editor.record.form.section.about.label": "",
20063
+ "editor.record.form.section.annexes.label": "",
20064
+ "editor.record.form.section.associatedResources.description": "",
20065
+ "editor.record.form.section.associatedResources.label": "",
20066
+ "editor.record.form.section.classification.description": "",
20067
+ "editor.record.form.section.classification.label": "",
20068
+ "editor.record.form.section.dataManagers.description": "",
20069
+ "editor.record.form.section.dataManagers.label": "",
20070
+ "editor.record.form.section.dataPointOfContact.description": "",
20071
+ "editor.record.form.section.dataPointOfContact.label": "",
20072
+ "editor.record.form.section.geographicalCoverage.label": "",
20073
+ "editor.record.form.section.useAndAccessConditions.label": "",
19625
20074
  "editor.record.form.temporalExtents.addDate": "",
19626
20075
  "editor.record.form.temporalExtents.addRange": "",
19627
20076
  "editor.record.form.temporalExtents.date": "",
19628
20077
  "editor.record.form.temporalExtents.range": "",
19629
- "editor.record.form.updateFrequency": "",
19630
20078
  "editor.record.form.updateFrequency.planned": "",
19631
20079
  "editor.record.loadError.body": "",
19632
20080
  "editor.record.loadError.closeMessage": "",
@@ -19641,6 +20089,7 @@ var nl = {
19641
20089
  "editor.record.saveStatus.draftWithChangesPending": "",
19642
20090
  "editor.record.saveStatus.recordUpToDate": "",
19643
20091
  "editor.record.upToDate": "",
20092
+ "editor.sidebar.menu.editor": "",
19644
20093
  "externalviewer.dataset.unnamed": "",
19645
20094
  "facets.block.title.OrgForResource": "",
19646
20095
  "facets.block.title.availableInServices": "",
@@ -19709,17 +20158,17 @@ var nl = {
19709
20158
  "organisations.sortBy.nameDesc": "",
19710
20159
  "organisations.sortBy.recordCountAsc": "",
19711
20160
  "organisations.sortBy.recordCountDesc": "",
19712
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19713
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
20161
+ "organization.details.lastPublishedDatasets": "",
20162
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
19714
20163
  "organization.details.mailContact": "",
19715
- "organization.datasets": "",
19716
- "organization.lastPublishedDatasets": "",
19717
- "organization.lastPublishedDatasets.searchAllButton": "",
20164
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
19718
20165
  "pagination.nextPage": "",
19719
20166
  "pagination.page": "",
19720
20167
  "pagination.pageOf": "",
19721
20168
  previous: previous$1,
20169
+ "record.action.delete": "",
19722
20170
  "record.action.download": "",
20171
+ "record.action.duplicate": "",
19723
20172
  "record.action.view": "",
19724
20173
  "record.externalViewer.open": "",
19725
20174
  "record.metadata.about": "",
@@ -19812,11 +20261,11 @@ var nl = {
19812
20261
  "results.sortBy.relevancy": "",
19813
20262
  "search.autocomplete.error": "",
19814
20263
  "search.error.couldNotReachApi": "",
20264
+ "search.error.organizationHasNoDataset": "",
20265
+ "search.error.organizationNotFound": "",
19815
20266
  "search.error.receivedError": "",
19816
20267
  "search.error.recordHasnolink": "",
19817
20268
  "search.error.recordNotFound": "",
19818
- "search.error.organizationNotFound": "",
19819
- "search.error.organizationHasNoDataset": "",
19820
20269
  "search.field.any.placeholder": "",
19821
20270
  "search.field.sortBy": "",
19822
20271
  "search.filters.clear": "",
@@ -19841,9 +20290,11 @@ var nl = {
19841
20290
  "search.filters.minimize": "",
19842
20291
  "search.filters.myRecords": "",
19843
20292
  "search.filters.myRecordsHelp": "",
20293
+ "search.filters.organization": "",
19844
20294
  "search.filters.otherRecords": "",
20295
+ "search.filters.producerOrg": "",
19845
20296
  "search.filters.publicationYear": "",
19846
- "search.filters.publisher": "",
20297
+ "search.filters.publisherOrg": "",
19847
20298
  "search.filters.representationType": "",
19848
20299
  "search.filters.resourceType": "",
19849
20300
  "search.filters.standard": "",
@@ -19924,6 +20375,8 @@ var pt = {
19924
20375
  "datafeeder.datasetValidation.submitButton": "",
19925
20376
  "datafeeder.datasetValidation.title": "",
19926
20377
  "datafeeder.datasetValidation.unknown": "",
20378
+ "datafeeder.datasetValidationCsv.explicitLineNumbers": "",
20379
+ "datafeeder.datasetValidationCsv.lineNumbers": "",
19927
20380
  "datafeeder.form.abstract": "",
19928
20381
  "datafeeder.form.datepicker": "",
19929
20382
  "datafeeder.form.description": "",
@@ -19951,6 +20404,7 @@ var pt = {
19951
20404
  "datafeeder.publishSuccess.geonetworkRecord": "",
19952
20405
  "datafeeder.publishSuccess.illustration.title": "",
19953
20406
  "datafeeder.publishSuccess.mapViewer": "",
20407
+ "datafeeder.publishSuccess.ogcFeature": "",
19954
20408
  "datafeeder.publishSuccess.subtitle": "",
19955
20409
  "datafeeder.publishSuccess.title": "",
19956
20410
  "datafeeder.publishSuccess.uploadAnotherData": "",
@@ -20001,7 +20455,7 @@ var pt = {
20001
20455
  "datahub.header.lastRecords": "",
20002
20456
  "datahub.header.myfavorites": "",
20003
20457
  "datahub.header.news": "",
20004
- "datahub.header.organisations": "",
20458
+ "datahub.header.organizations": "",
20005
20459
  "datahub.header.popularRecords": "",
20006
20460
  "datahub.header.title.html": "",
20007
20461
  "datahub.news.contact.contactus": "",
@@ -20019,6 +20473,27 @@ var pt = {
20019
20473
  "dataset.error.parse": "",
20020
20474
  "dataset.error.unknown": "",
20021
20475
  "dataset.error.unsupportedType": "",
20476
+ "domain.contact.role.author": "",
20477
+ "domain.contact.role.collaborator": "",
20478
+ "domain.contact.role.contributor": "",
20479
+ "domain.contact.role.custodian": "",
20480
+ "domain.contact.role.distributor": "",
20481
+ "domain.contact.role.editor": "",
20482
+ "domain.contact.role.funder": "",
20483
+ "domain.contact.role.mediator": "",
20484
+ "domain.contact.role.originator": "",
20485
+ "domain.contact.role.other": "",
20486
+ "domain.contact.role.owner": "",
20487
+ "domain.contact.role.point_of_contact": "",
20488
+ "domain.contact.role.principal_investigator": "",
20489
+ "domain.contact.role.processor": "",
20490
+ "domain.contact.role.publisher": "",
20491
+ "domain.contact.role.resource_provider": "",
20492
+ "domain.contact.role.rights_holder": "",
20493
+ "domain.contact.role.sponsor": "",
20494
+ "domain.contact.role.stakeholder": "",
20495
+ "domain.contact.role.unspecified": "",
20496
+ "domain.contact.role.user": "",
20022
20497
  "domain.record.status.completed": "",
20023
20498
  "domain.record.status.deprecated": "",
20024
20499
  "domain.record.status.ongoing": "",
@@ -20037,7 +20512,29 @@ var pt = {
20037
20512
  "downloads.format.unknown": "",
20038
20513
  "downloads.wfs.featuretype.not.found": "",
20039
20514
  dropFile: dropFile,
20040
- "editor.record.form.license": "",
20515
+ "editor.record.delete.confirmation.cancelText": "",
20516
+ "editor.record.delete.confirmation.confirmText": "",
20517
+ "editor.record.delete.confirmation.message": "",
20518
+ "editor.record.delete.confirmation.title": "",
20519
+ "editor.record.deleteError.body": "",
20520
+ "editor.record.deleteError.closeMessage": "",
20521
+ "editor.record.deleteError.title": "",
20522
+ "editor.record.deleteSuccess.body": "",
20523
+ "editor.record.deleteSuccess.title": "",
20524
+ "editor.record.form.bottomButtons.comeBackLater": "",
20525
+ "editor.record.form.bottomButtons.next": "",
20526
+ "editor.record.form.bottomButtons.previous": "",
20527
+ "editor.record.form.field.abstract": "",
20528
+ "editor.record.form.field.contactsForResource.noContact": "",
20529
+ "editor.record.form.field.keywords": "",
20530
+ "editor.record.form.field.license": "",
20531
+ "editor.record.form.field.overviews": "",
20532
+ "editor.record.form.field.recordUpdated": "",
20533
+ "editor.record.form.field.resourceUpdated": "",
20534
+ "editor.record.form.field.temporalExtents": "",
20535
+ "editor.record.form.field.title": "",
20536
+ "editor.record.form.field.uniqueIdentifier": "",
20537
+ "editor.record.form.field.updateFrequency": "",
20041
20538
  "editor.record.form.license.cc-by": "",
20042
20539
  "editor.record.form.license.cc-by-sa": "",
20043
20540
  "editor.record.form.license.cc-zero": "",
@@ -20047,13 +20544,26 @@ var pt = {
20047
20544
  "editor.record.form.license.odc-by": "",
20048
20545
  "editor.record.form.license.pddl": "",
20049
20546
  "editor.record.form.license.unknown": "",
20050
- "editor.record.form.resourceUpdated": "",
20051
- "editor.record.form.temporalExtents": "",
20547
+ "editor.record.form.page.accessAndContact": "",
20548
+ "editor.record.form.page.description": "",
20549
+ "editor.record.form.page.ressources": "",
20550
+ "editor.record.form.section.about.description": "",
20551
+ "editor.record.form.section.about.label": "",
20552
+ "editor.record.form.section.annexes.label": "",
20553
+ "editor.record.form.section.associatedResources.description": "",
20554
+ "editor.record.form.section.associatedResources.label": "",
20555
+ "editor.record.form.section.classification.description": "",
20556
+ "editor.record.form.section.classification.label": "",
20557
+ "editor.record.form.section.dataManagers.description": "",
20558
+ "editor.record.form.section.dataManagers.label": "",
20559
+ "editor.record.form.section.dataPointOfContact.description": "",
20560
+ "editor.record.form.section.dataPointOfContact.label": "",
20561
+ "editor.record.form.section.geographicalCoverage.label": "",
20562
+ "editor.record.form.section.useAndAccessConditions.label": "",
20052
20563
  "editor.record.form.temporalExtents.addDate": "",
20053
20564
  "editor.record.form.temporalExtents.addRange": "",
20054
20565
  "editor.record.form.temporalExtents.date": "",
20055
20566
  "editor.record.form.temporalExtents.range": "",
20056
- "editor.record.form.updateFrequency": "",
20057
20567
  "editor.record.form.updateFrequency.planned": "",
20058
20568
  "editor.record.loadError.body": "",
20059
20569
  "editor.record.loadError.closeMessage": "",
@@ -20068,6 +20578,7 @@ var pt = {
20068
20578
  "editor.record.saveStatus.draftWithChangesPending": "",
20069
20579
  "editor.record.saveStatus.recordUpToDate": "",
20070
20580
  "editor.record.upToDate": "",
20581
+ "editor.sidebar.menu.editor": "",
20071
20582
  "externalviewer.dataset.unnamed": "",
20072
20583
  "facets.block.title.OrgForResource": "",
20073
20584
  "facets.block.title.availableInServices": "",
@@ -20136,17 +20647,17 @@ var pt = {
20136
20647
  "organisations.sortBy.nameDesc": "",
20137
20648
  "organisations.sortBy.recordCountAsc": "",
20138
20649
  "organisations.sortBy.recordCountDesc": "",
20139
- "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
20140
- "organization.details.publishedDataset": "{count, plural, =0{} one{} other{{}}",
20650
+ "organization.details.lastPublishedDatasets": "",
20651
+ "organization.details.lastPublishedDatasets.searchAllButton": "",
20141
20652
  "organization.details.mailContact": "",
20142
- "organization.datasets": "",
20143
- "organization.lastPublishedDatasets": "",
20144
- "organization.lastPublishedDatasets.searchAllButton": "",
20653
+ "organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
20145
20654
  "pagination.nextPage": "",
20146
20655
  "pagination.page": "",
20147
20656
  "pagination.pageOf": "",
20148
20657
  previous: previous,
20658
+ "record.action.delete": "",
20149
20659
  "record.action.download": "",
20660
+ "record.action.duplicate": "",
20150
20661
  "record.action.view": "",
20151
20662
  "record.externalViewer.open": "",
20152
20663
  "record.metadata.about": "",
@@ -20239,11 +20750,11 @@ var pt = {
20239
20750
  "results.sortBy.relevancy": "",
20240
20751
  "search.autocomplete.error": "",
20241
20752
  "search.error.couldNotReachApi": "",
20753
+ "search.error.organizationHasNoDataset": "",
20754
+ "search.error.organizationNotFound": "",
20242
20755
  "search.error.receivedError": "",
20243
20756
  "search.error.recordHasnolink": "",
20244
20757
  "search.error.recordNotFound": "",
20245
- "search.error.organizationNotFound": "",
20246
- "search.error.organizationHasNoDataset": "",
20247
20758
  "search.field.any.placeholder": "",
20248
20759
  "search.field.sortBy": "",
20249
20760
  "search.filters.clear": "",
@@ -20268,9 +20779,11 @@ var pt = {
20268
20779
  "search.filters.minimize": "",
20269
20780
  "search.filters.myRecords": "",
20270
20781
  "search.filters.myRecordsHelp": "",
20782
+ "search.filters.organization": "",
20271
20783
  "search.filters.otherRecords": "",
20784
+ "search.filters.producerOrg": "",
20272
20785
  "search.filters.publicationYear": "",
20273
- "search.filters.publisher": "",
20786
+ "search.filters.publisherOrg": "",
20274
20787
  "search.filters.representationType": "",
20275
20788
  "search.filters.resourceType": "",
20276
20789
  "search.filters.standard": "",
@@ -21201,12 +21714,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21201
21714
  args: [METADATA_LANGUAGE]
21202
21715
  }] }]; } });
21203
21716
 
21717
+ const TEMPORARY_ID_PREFIX = 'TEMP-ID-';
21204
21718
  class Gn4Repository {
21205
21719
  constructor(gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi) {
21206
21720
  this.gn4SearchApi = gn4SearchApi;
21207
21721
  this.gn4SearchHelper = gn4SearchHelper;
21208
21722
  this.gn4Mapper = gn4Mapper;
21209
21723
  this.gn4RecordsApi = gn4RecordsApi;
21724
+ this._draftsChanged = new Subject();
21725
+ this.draftsChanged$ = this._draftsChanged.asObservable();
21210
21726
  }
21211
21727
  search({ filters, fields, offset, limit, sort, filterIds, filterGeometry, }) {
21212
21728
  return this.gn4SearchApi
@@ -21277,6 +21793,18 @@ class Gn4Repository {
21277
21793
  .then((record) => [record, xml, isSavedAlready]);
21278
21794
  }));
21279
21795
  }
21796
+ openRecordForDuplication(uniqueIdentifier) {
21797
+ return this.loadRecordAsXml(uniqueIdentifier).pipe(switchMap(async (recordAsXml) => {
21798
+ const converter = findConverterForDocument(recordAsXml);
21799
+ const record = await converter.readRecord(recordAsXml);
21800
+ record.uniqueIdentifier = `${TEMPORARY_ID_PREFIX}${Date.now()}`;
21801
+ record.title = `${record.title} (Copy)`;
21802
+ const xml = await converter.writeRecord(record, recordAsXml);
21803
+ window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), xml);
21804
+ this._draftsChanged.next();
21805
+ return [record, xml, false];
21806
+ }));
21807
+ }
21280
21808
  serializeRecordToXml(record, referenceRecordSource) {
21281
21809
  // if there's a reference record, use that standard; otherwise, use iso19139
21282
21810
  const converter = referenceRecordSource
@@ -21292,15 +21820,28 @@ class Gn4Repository {
21292
21820
  return response.metadataInfos[metadataId][0].uuid;
21293
21821
  }))));
21294
21822
  }
21823
+ deleteRecord(uniqueIdentifier) {
21824
+ return this.gn4RecordsApi.deleteRecord(uniqueIdentifier);
21825
+ }
21826
+ generateTemporaryId() {
21827
+ return `${TEMPORARY_ID_PREFIX}${Date.now()}`;
21828
+ }
21295
21829
  saveRecordAsDraft(record, referenceRecordSource) {
21296
- return this.serializeRecordToXml(record, referenceRecordSource).pipe(tap$1((recordXml) => window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), recordXml)));
21830
+ return this.serializeRecordToXml(record, referenceRecordSource).pipe(tap$1((recordXml) => {
21831
+ window.localStorage.setItem(this.getLocalStorageKeyForRecord(record.uniqueIdentifier), recordXml);
21832
+ this._draftsChanged.next();
21833
+ }));
21297
21834
  }
21298
21835
  clearRecordDraft(uniqueIdentifier) {
21299
21836
  window.localStorage.removeItem(this.getLocalStorageKeyForRecord(uniqueIdentifier));
21837
+ this._draftsChanged.next();
21300
21838
  }
21301
21839
  recordHasDraft(uniqueIdentifier) {
21302
21840
  return (window.localStorage.getItem(this.getLocalStorageKeyForRecord(uniqueIdentifier)) !== null);
21303
21841
  }
21842
+ isRecordNotYetSaved(uniqueIdentifier) {
21843
+ return uniqueIdentifier.startsWith(TEMPORARY_ID_PREFIX);
21844
+ }
21304
21845
  // generated by copilot
21305
21846
  getAllDrafts() {
21306
21847
  const items = { ...window.localStorage };
@@ -21908,8 +22449,6 @@ class Gn4PlatformService {
21908
22449
  this.allThesaurus$ = this.httpClient
21909
22450
  .get(`${this.registriesApiService.configuration.basePath}/thesaurus?_content_type=json`)
21910
22451
  .pipe(map$1((thesaurus) => {
21911
- // FIXME: find a better way to exclude place keywords
21912
- // thesaurus[0].filter((thes) => thes.dname !== 'place')
21913
22452
  return thesaurus[0];
21914
22453
  }), shareReplay(1));
21915
22454
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
@@ -21953,8 +22492,14 @@ class Gn4PlatformService {
21953
22492
  }
21954
22493
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
21955
22494
  }
21956
- searchKeywords(query) {
21957
- const keywords$ = this.registriesApiService.searchKeywords(query, this.langService.iso3, 10, 0, null, null, null, `*${query}*`);
22495
+ searchKeywords(query, keywordTypes) {
22496
+ const keywords$ = this.allThesaurus$.pipe(switchMap((thesaurus) => {
22497
+ const selectedThesauri = [];
22498
+ keywordTypes.map((keywordType) => {
22499
+ selectedThesauri.push(...thesaurus.filter((thes) => thes.dname === keywordType));
22500
+ });
22501
+ return this.registriesApiService.searchKeywords(query, this.langService.iso3, 10, 0, null, selectedThesauri.map((thes) => thes.key), null, `*${query}*`);
22502
+ }));
21958
22503
  return combineLatest([keywords$, this.allThesaurus$]).pipe(map$1(([keywords, thesaurus]) => {
21959
22504
  return this.mapper.keywordsFromApi(keywords, thesaurus, this.langService.iso3);
21960
22505
  }));
@@ -23046,10 +23591,15 @@ class MapUtilsService {
23046
23591
  if (!('spatialExtents' in record) || record.spatialExtents.length === 0) {
23047
23592
  return null;
23048
23593
  }
23049
- // transform an array of geojson geometries into a bbox
23594
+ // extend all the spatial extents into an including bbox
23050
23595
  const totalExtent = record.spatialExtents.reduce((prev, curr) => {
23051
- const geom = GEOJSON.readGeometry(curr.geometry);
23052
- return extend(prev, geom.getExtent());
23596
+ if ('bbox' in curr)
23597
+ return extend(prev, curr.bbox);
23598
+ else if ('geometry' in curr) {
23599
+ const geom = GEOJSON.readGeometry(curr.geometry);
23600
+ return extend(prev, geom.getExtent());
23601
+ }
23602
+ return prev;
23053
23603
  }, [Infinity, Infinity, -Infinity, -Infinity]);
23054
23604
  return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
23055
23605
  }
@@ -24635,6 +25185,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
24635
25185
  }]
24636
25186
  }] });
24637
25187
 
25188
+ class PopoverComponent {
25189
+ constructor(viewContainerRef, renderer) {
25190
+ this.viewContainerRef = viewContainerRef;
25191
+ this.renderer = renderer;
25192
+ }
25193
+ getContent() {
25194
+ if (this.content instanceof TemplateRef) {
25195
+ if (this.view) {
25196
+ this.view.destroy();
25197
+ }
25198
+ this.view = this.viewContainerRef.createEmbeddedView(this.content);
25199
+ this.view.detectChanges();
25200
+ const wrapper = this.renderer.createElement('div'); // Create a wrapper div
25201
+ this.view.rootNodes.forEach((node) => {
25202
+ this.renderer.appendChild(wrapper, node); // Append each root node to the wrapper
25203
+ });
25204
+ return wrapper;
25205
+ }
25206
+ return this.content;
25207
+ }
25208
+ ngAfterViewInit() {
25209
+ this.tippyInstance = tippy(this.popoverContent.nativeElement, {
25210
+ content: this.getContent(),
25211
+ allowHTML: true,
25212
+ theme: this.theme,
25213
+ });
25214
+ }
25215
+ ngOnChanges(changes) {
25216
+ if (changes['theme']) {
25217
+ this.theme = changes['theme'].currentValue;
25218
+ if (this.tippyInstance) {
25219
+ this.tippyInstance.setProps({ theme: this.theme });
25220
+ }
25221
+ }
25222
+ if (changes['content']) {
25223
+ this.content = changes['content'].currentValue;
25224
+ if (this.tippyInstance) {
25225
+ this.tippyInstance.setContent(this.getContent());
25226
+ }
25227
+ }
25228
+ }
25229
+ ngOnDestroy() {
25230
+ if (this.tippyInstance) {
25231
+ this.tippyInstance.destroy();
25232
+ }
25233
+ if (this.view) {
25234
+ this.view.destroy();
25235
+ }
25236
+ }
25237
+ 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 }); }
25238
+ 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 }] }); }
25239
+ }
25240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PopoverComponent, decorators: [{
25241
+ type: Component,
25242
+ args: [{ selector: 'gn-ui-popover', standalone: true, imports: [CommonModule], template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n" }]
25243
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.Renderer2 }]; }, propDecorators: { popoverContent: [{
25244
+ type: ViewChild,
25245
+ args: ['popoverContent', { static: false }]
25246
+ }], content: [{
25247
+ type: Input
25248
+ }], theme: [{
25249
+ type: Input
25250
+ }] } });
25251
+
24638
25252
  class PopupAlertComponent {
24639
25253
  constructor(changeDetector) {
24640
25254
  this.changeDetector = changeDetector;
@@ -24685,6 +25299,7 @@ class AutocompleteComponent {
24685
25299
  constructor(cdRef) {
24686
25300
  this.cdRef = cdRef;
24687
25301
  this.clearOnSelection = false;
25302
+ this.preventCompleteOnSelection = false;
24688
25303
  this.autoFocus = false;
24689
25304
  this.minCharacterCount = 3;
24690
25305
  this.allowSubmit = true;
@@ -24777,17 +25392,28 @@ class AutocompleteComponent {
24777
25392
  handleClickSearch() {
24778
25393
  this.inputSubmitted.emit(this.inputRef.nativeElement.value);
24779
25394
  }
25395
+ /**
25396
+ * This function is triggered when an item is selected in the list of displayed items.
25397
+ * If preventCompleteOnSelection is true then the input will be left as entered by the user.
25398
+ * If preventCompleteOnSelection is false (by default) then the input will be completed with the item selected by the user.
25399
+ * If clearOnSelection is true then the input will be cleared upon selection.
25400
+ * @param event
25401
+ */
24780
25402
  handleSelection(event) {
24781
25403
  this.cancelEnter = true;
24782
25404
  this.itemSelected.emit(event.option.value);
24783
- if (this.clearOnSelection) {
24784
- this.lastInputValue$.pipe(first()).subscribe((any) => {
24785
- this.inputRef.nativeElement.value = any;
25405
+ if (this.preventCompleteOnSelection) {
25406
+ this.lastInputValue$.pipe(first()).subscribe((lastInputValue) => {
25407
+ this.inputRef.nativeElement.value = lastInputValue;
24786
25408
  });
25409
+ return;
25410
+ }
25411
+ if (this.clearOnSelection) {
25412
+ this.inputRef.nativeElement.value = '';
24787
25413
  }
24788
25414
  }
24789
25415
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24790
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AutocompleteComponent, isStandalone: true, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", minCharacterCount: "minCharacterCount", allowSubmit: "allowSubmit", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <div class=\"flex flex-row absolute inset-y-0 right-0\">\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 transition-all duration-100 clear-btn\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 transition-all duration-100 search-btn rounded-r\"\n aria-label=\"Trigger search\"\n *ngIf=\"allowSubmit\"\n data-test=\"autocomplete-submit-btn\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n </div>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFnInternal(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i2$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { 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: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25416
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AutocompleteComponent, isStandalone: true, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", preventCompleteOnSelection: "preventCompleteOnSelection", autoFocus: "autoFocus", minCharacterCount: "minCharacterCount", allowSubmit: "allowSubmit", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <div class=\"flex flex-row absolute inset-y-0 right-0\">\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 transition-all duration-100 clear-btn\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 transition-all duration-100 search-btn rounded-r\"\n aria-label=\"Trigger search\"\n *ngIf=\"allowSubmit\"\n data-test=\"autocomplete-submit-btn\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n </div>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFnInternal(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i2$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { 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: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24791
25417
  }
24792
25418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AutocompleteComponent, decorators: [{
24793
25419
  type: Component,
@@ -24807,6 +25433,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
24807
25433
  type: Input
24808
25434
  }], clearOnSelection: [{
24809
25435
  type: Input
25436
+ }], preventCompleteOnSelection: [{
25437
+ type: Input
24810
25438
  }], autoFocus: [{
24811
25439
  type: Input
24812
25440
  }], minCharacterCount: [{
@@ -25039,7 +25667,7 @@ class CopyTextButtonComponent {
25039
25667
  event.target.blur();
25040
25668
  }
25041
25669
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25042
- 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 }); }
25670
+ 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 }); }
25043
25671
  }
25044
25672
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
25045
25673
  type: Component,
@@ -25059,7 +25687,7 @@ class DatePickerComponent {
25059
25687
  this.dateChange = new EventEmitter();
25060
25688
  }
25061
25689
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25062
- 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 }); }
25690
+ 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 }); }
25063
25691
  }
25064
25692
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatePickerComponent, decorators: [{
25065
25693
  type: Component,
@@ -25076,7 +25704,7 @@ class DateRangePickerComponent {
25076
25704
  this.endDateChange = new EventEmitter();
25077
25705
  }
25078
25706
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25079
- 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 }); }
25707
+ 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 }); }
25080
25708
  }
25081
25709
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateRangePickerComponent, decorators: [{
25082
25710
  type: Component,
@@ -25108,7 +25736,7 @@ class DragAndDropFileInputComponent {
25108
25736
  this.fileChange.emit(this.selectedFile);
25109
25737
  }
25110
25738
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragAndDropFileInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25111
- 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"] }] }); }
25739
+ 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"] }] }); }
25112
25740
  }
25113
25741
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
25114
25742
  type: Component,
@@ -26749,11 +27377,11 @@ class MetadataQualityItemComponent {
26749
27377
  return `record.metadata.quality.${this.name}.${this.value ? 'success' : 'failed'}`;
26750
27378
  }
26751
27379
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26752
- 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 }); }
27380
+ 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 }); }
26753
27381
  }
26754
27382
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityItemComponent, decorators: [{
26755
27383
  type: Component,
26756
- 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" }]
27384
+ 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" }]
26757
27385
  }], propDecorators: { name: [{
26758
27386
  type: Input
26759
27387
  }], value: [{
@@ -26764,7 +27392,6 @@ class MetadataQualityComponent {
26764
27392
  constructor() {
26765
27393
  this.smaller = false;
26766
27394
  this.items = [];
26767
- this.isMenuShown = false;
26768
27395
  }
26769
27396
  get qualityScore() {
26770
27397
  const qualityScore = this.metadata?.extras?.qualityScore;
@@ -26775,12 +27402,6 @@ class MetadataQualityComponent {
26775
27402
  get calculatedQualityScore() {
26776
27403
  return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
26777
27404
  }
26778
- showMenu() {
26779
- this.isMenuShown = true;
26780
- }
26781
- hideMenu() {
26782
- this.isMenuShown = false;
26783
- }
26784
27405
  add(name, value) {
26785
27406
  if (this.metadataQualityDisplay?.[name] !== false) {
26786
27407
  this.items.push({ name, value });
@@ -26804,11 +27425,11 @@ class MetadataQualityComponent {
26804
27425
  }
26805
27426
  }
26806
27427
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26807
- 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 }); }
27428
+ 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 }); }
26808
27429
  }
26809
27430
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataQualityComponent, decorators: [{
26810
27431
  type: Component,
26811
- 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"] }]
27432
+ 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"] }]
26812
27433
  }], propDecorators: { metadata: [{
26813
27434
  type: Input
26814
27435
  }], smaller: [{
@@ -27003,11 +27624,11 @@ class ApiCardComponent {
27003
27624
  }
27004
27625
  }
27005
27626
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27006
- 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 }); }
27627
+ 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 }); }
27007
27628
  }
27008
27629
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiCardComponent, decorators: [{
27009
27630
  type: Component,
27010
- 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" }]
27631
+ 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" }]
27011
27632
  }], propDecorators: { link: [{
27012
27633
  type: Input
27013
27634
  }], currentLink: [{
@@ -27032,6 +27653,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27032
27653
  type: Input
27033
27654
  }] } });
27034
27655
 
27656
+ class ConfirmationDialogComponent {
27657
+ constructor(dialogRef, data) {
27658
+ this.dialogRef = dialogRef;
27659
+ this.data = data;
27660
+ }
27661
+ onConfirm() {
27662
+ this.dialogRef.close(true);
27663
+ }
27664
+ onCancel() {
27665
+ this.dialogRef.close(false);
27666
+ }
27667
+ 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 }); }
27668
+ 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 }); }
27669
+ }
27670
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
27671
+ type: Component,
27672
+ 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" }]
27673
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialogRef }, { type: undefined, decorators: [{
27674
+ type: Inject,
27675
+ args: [MAT_DIALOG_DATA]
27676
+ }] }]; } });
27677
+
27035
27678
  class ContentGhostComponent {
27036
27679
  constructor() {
27037
27680
  this.ghostClass = '';
@@ -27219,11 +27862,11 @@ class MarkdownParserComponent {
27219
27862
  return marked.parse(this.textContent);
27220
27863
  }
27221
27864
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27222
- 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 }); }
27865
+ 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 }); }
27223
27866
  }
27224
27867
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownParserComponent, decorators: [{
27225
27868
  type: Component,
27226
- 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"] }]
27869
+ 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"] }]
27227
27870
  }], propDecorators: { textContent: [{
27228
27871
  type: Input
27229
27872
  }] } });
@@ -27238,7 +27881,7 @@ class MarkdownEditorComponent {
27238
27881
  this.textContentChanged.emit(this.textContent);
27239
27882
  }
27240
27883
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27241
- 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 }); }
27884
+ 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 }); }
27242
27885
  }
27243
27886
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarkdownEditorComponent, decorators: [{
27244
27887
  type: Component,
@@ -27251,7 +27894,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27251
27894
  TextAreaComponent,
27252
27895
  MarkdownParserComponent,
27253
27896
  TranslateModule,
27254
- ], 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" }]
27897
+ ], 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" }]
27255
27898
  }], propDecorators: { preview: [{
27256
27899
  type: Input
27257
27900
  }], helperText: [{
@@ -27338,6 +27981,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27338
27981
  args: ['contentDiv']
27339
27982
  }] } });
27340
27983
 
27984
+ class MaxLinesComponent {
27985
+ constructor(cdr) {
27986
+ this.cdr = cdr;
27987
+ this.maxLines = 6;
27988
+ this.isExpanded = false;
27989
+ this.maxHeight = '';
27990
+ this.showToggleButton = false;
27991
+ }
27992
+ ngAfterViewInit() {
27993
+ this.calculateMaxHeight();
27994
+ this.observer = new ResizeObserver((mutations) => {
27995
+ mutations.forEach(() => {
27996
+ this.calculateMaxHeight();
27997
+ });
27998
+ });
27999
+ this.observer.observe(this.container.nativeElement.children[0]);
28000
+ }
28001
+ toggleDisplay() {
28002
+ this.isExpanded = !this.isExpanded;
28003
+ this.calculateMaxHeight();
28004
+ }
28005
+ calculateMaxHeight() {
28006
+ const containerElement = this.container.nativeElement;
28007
+ const contentElement = containerElement.children[0];
28008
+ const contentHeight = contentElement.getBoundingClientRect().height;
28009
+ if (contentHeight) {
28010
+ if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
28011
+ this.showToggleButton = true;
28012
+ this.maxHeight = this.isExpanded
28013
+ ? `${contentHeight}px`
28014
+ : `${this.maxLines * this.getLineHeight(contentElement)}px`;
28015
+ }
28016
+ else {
28017
+ this.showToggleButton = false;
28018
+ this.maxHeight = `${contentHeight}px`;
28019
+ }
28020
+ containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
28021
+ this.cdr.detectChanges();
28022
+ }
28023
+ }
28024
+ getLineHeight(element) {
28025
+ const computedStyle = window.getComputedStyle(element);
28026
+ const lineHeight = parseFloat(computedStyle.lineHeight);
28027
+ const fontSize = parseFloat(computedStyle.fontSize || '14');
28028
+ const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
28029
+ return result;
28030
+ }
28031
+ ngOnDestroy() {
28032
+ if (!this.observer)
28033
+ return;
28034
+ this.observer.unobserve(this.container.nativeElement.children[0]);
28035
+ }
28036
+ 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 }); }
28037
+ 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 }); }
28038
+ }
28039
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MaxLinesComponent, decorators: [{
28040
+ type: Component,
28041
+ 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" }]
28042
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
28043
+ type: Input
28044
+ }], container: [{
28045
+ type: ViewChild,
28046
+ args: ['container']
28047
+ }] } });
28048
+
27341
28049
  /* eslint-disable @angular-eslint/directive-selector */
27342
28050
  class GnUiLinkifyDirective {
27343
28051
  constructor(el, renderer) {
@@ -27477,11 +28185,11 @@ class MetadataInfoComponent {
27477
28185
  this.keyword.emit(keyword);
27478
28186
  }
27479
28187
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27480
- 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 }); }
28188
+ 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 }); }
27481
28189
  }
27482
28190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MetadataInfoComponent, decorators: [{
27483
28191
  type: Component,
27484
- 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"] }]
28192
+ 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"] }]
27485
28193
  }], propDecorators: { metadata: [{
27486
28194
  type: Input
27487
28195
  }], incomplete: [{
@@ -27738,7 +28446,7 @@ class RecordApiFormComponent {
27738
28446
  }
27739
28447
  }
27740
28448
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27741
- 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 }); }
28449
+ 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 }); }
27742
28450
  }
27743
28451
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordApiFormComponent, decorators: [{
27744
28452
  type: Component,
@@ -27766,7 +28474,7 @@ class RelatedRecordCardComponent {
27766
28474
  return `${this.baseClasses} ${this.extraClass}`;
27767
28475
  }
27768
28476
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27769
- 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 }); }
28477
+ 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 }); }
27770
28478
  }
27771
28479
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
27772
28480
  type: Component,
@@ -27779,6 +28487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27779
28487
 
27780
28488
  class SortableListComponent {
27781
28489
  constructor() {
28490
+ this.addOptions = [];
27782
28491
  this.elementsChange = new EventEmitter();
27783
28492
  this.add = new EventEmitter();
27784
28493
  }
@@ -27790,8 +28499,11 @@ class SortableListComponent {
27790
28499
  this.elements = this.elements.filter((_, i) => i !== index);
27791
28500
  this.elementsChange.emit(this.elements);
27792
28501
  }
28502
+ trackByFn(index) {
28503
+ return index;
28504
+ }
27793
28505
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SortableListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27794
- 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 }); }
28506
+ 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 }); }
27795
28507
  }
27796
28508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SortableListComponent, decorators: [{
27797
28509
  type: Component,
@@ -27803,7 +28515,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27803
28515
  CdkDragHandle,
27804
28516
  MatIconModule,
27805
28517
  ButtonComponent,
27806
- ], 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"] }]
28518
+ ], 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"] }]
27807
28519
  }], propDecorators: { elements: [{
27808
28520
  type: Input
27809
28521
  }], addOptions: [{
@@ -27941,82 +28653,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
27941
28653
 
27942
28654
  class FormFieldWrapperComponent {
27943
28655
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27944
- 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 }); }
28656
+ 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 }); }
27945
28657
  }
27946
28658
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
27947
28659
  type: Component,
27948
- 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" }]
28660
+ 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" }]
27949
28661
  }], propDecorators: { label: [{
27950
28662
  type: Input
27951
28663
  }], hint: [{
27952
28664
  type: Input
27953
28665
  }] } });
27954
28666
 
27955
- class MaxLinesComponent {
27956
- constructor(cdr) {
27957
- this.cdr = cdr;
27958
- this.maxLines = 6;
27959
- this.isExpanded = false;
27960
- this.maxHeight = '';
27961
- this.showToggleButton = false;
27962
- }
27963
- ngAfterViewInit() {
27964
- this.calculateMaxHeight();
27965
- this.observer = new ResizeObserver((mutations) => {
27966
- mutations.forEach(() => {
27967
- this.calculateMaxHeight();
27968
- });
27969
- });
27970
- this.observer.observe(this.container.nativeElement.children[0]);
27971
- }
27972
- toggleDisplay() {
27973
- this.isExpanded = !this.isExpanded;
27974
- this.calculateMaxHeight();
27975
- }
27976
- calculateMaxHeight() {
27977
- const containerElement = this.container.nativeElement;
27978
- const contentElement = containerElement.children[0];
27979
- const contentHeight = contentElement.getBoundingClientRect().height;
27980
- if (contentHeight) {
27981
- if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
27982
- this.showToggleButton = true;
27983
- this.maxHeight = this.isExpanded
27984
- ? `${contentHeight}px`
27985
- : `${this.maxLines * this.getLineHeight(contentElement)}px`;
27986
- }
27987
- else {
27988
- this.showToggleButton = false;
27989
- this.maxHeight = `${contentHeight}px`;
27990
- }
27991
- containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
27992
- this.cdr.detectChanges();
27993
- }
27994
- }
27995
- getLineHeight(element) {
27996
- const computedStyle = window.getComputedStyle(element);
27997
- const lineHeight = parseFloat(computedStyle.lineHeight);
27998
- const fontSize = parseFloat(computedStyle.fontSize || '14');
27999
- const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
28000
- return result;
28001
- }
28002
- ngOnDestroy() {
28003
- if (!this.observer)
28004
- return;
28005
- this.observer.unobserve(this.container.nativeElement.children[0]);
28006
- }
28007
- 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 }); }
28008
- 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 }); }
28009
- }
28010
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MaxLinesComponent, decorators: [{
28011
- type: Component,
28012
- 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" }]
28013
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
28014
- type: Input
28015
- }], container: [{
28016
- type: ViewChild,
28017
- args: ['container']
28018
- }] } });
28019
-
28020
28667
  class InteractiveTableColumnComponent {
28021
28668
  constructor() {
28022
28669
  this.grow = false;
@@ -28066,11 +28713,11 @@ class InteractiveTableComponent {
28066
28713
  this.itemClick.emit(item);
28067
28714
  }
28068
28715
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28069
- 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 }); }
28716
+ 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 }); }
28070
28717
  }
28071
28718
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InteractiveTableComponent, decorators: [{
28072
28719
  type: Component,
28073
- 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"] }]
28720
+ 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"] }]
28074
28721
  }], propDecorators: { columns: [{
28075
28722
  type: ContentChildren,
28076
28723
  args: [InteractiveTableColumnComponent]
@@ -28262,11 +28909,11 @@ class UserPreviewComponent {
28262
28909
  return (this.user.name + ' ' + this.user.surname).trim();
28263
28910
  }
28264
28911
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28265
- 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 }); }
28912
+ 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 }); }
28266
28913
  }
28267
28914
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserPreviewComponent, decorators: [{
28268
28915
  type: Component,
28269
- 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" }]
28916
+ 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" }]
28270
28917
  }], propDecorators: { user: [{
28271
28918
  type: Input
28272
28919
  }], avatarPlaceholder: [{
@@ -28406,10 +29053,12 @@ class UiElementsModule {
28406
29053
  UiInputsModule,
28407
29054
  FormsModule,
28408
29055
  NgOptimizedImage,
29056
+ PopoverComponent,
28409
29057
  MarkdownParserComponent,
28410
29058
  ThumbnailComponent,
28411
29059
  TimeSincePipe,
28412
- BadgeComponent], exports: [MetadataInfoComponent,
29060
+ BadgeComponent,
29061
+ MaxLinesComponent], exports: [MetadataInfoComponent,
28413
29062
  ContentGhostComponent,
28414
29063
  DownloadItemComponent,
28415
29064
  DownloadsListComponent,
@@ -28439,8 +29088,10 @@ class UiElementsModule {
28439
29088
  RouterModule,
28440
29089
  UiInputsModule,
28441
29090
  FormsModule,
29091
+ PopoverComponent,
28442
29092
  ThumbnailComponent,
28443
- BadgeComponent] }); }
29093
+ BadgeComponent,
29094
+ MaxLinesComponent] }); }
28444
29095
  }
28445
29096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UiElementsModule, decorators: [{
28446
29097
  type: NgModule,
@@ -28457,10 +29108,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28457
29108
  UiInputsModule,
28458
29109
  FormsModule,
28459
29110
  NgOptimizedImage,
29111
+ PopoverComponent,
28460
29112
  MarkdownParserComponent,
28461
29113
  ThumbnailComponent,
28462
29114
  TimeSincePipe,
28463
29115
  BadgeComponent,
29116
+ MaxLinesComponent,
28464
29117
  ],
28465
29118
  declarations: [
28466
29119
  MetadataInfoComponent,
@@ -28612,15 +29265,74 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28612
29265
  }]
28613
29266
  }] });
28614
29267
 
29268
+ class ActionMenuComponent {
29269
+ constructor(dialog, translateService) {
29270
+ this.dialog = dialog;
29271
+ this.translateService = translateService;
29272
+ this.duplicate = new EventEmitter();
29273
+ this.delete = new EventEmitter();
29274
+ }
29275
+ openMenu() {
29276
+ this.trigger.openMenu();
29277
+ }
29278
+ openDeleteConfirmationDialog() {
29279
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
29280
+ data: {
29281
+ title: this.translateService.instant('editor.record.delete.confirmation.title'),
29282
+ message: this.translateService.instant('editor.record.delete.confirmation.message'),
29283
+ confirmText: this.translateService.instant('editor.record.delete.confirmation.confirmText'),
29284
+ cancelText: this.translateService.instant('editor.record.delete.confirmation.cancelText'),
29285
+ },
29286
+ restoreFocus: false,
29287
+ });
29288
+ // Manually restore focus to the menu trigger since the element that
29289
+ // opens the dialog won't be in the DOM any more when the dialog closes.
29290
+ dialogRef.afterClosed().subscribe((confirmed) => {
29291
+ this.trigger.focus();
29292
+ if (confirmed) {
29293
+ this.delete.emit();
29294
+ }
29295
+ });
29296
+ }
29297
+ 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 }); }
29298
+ 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"] }] }); }
29299
+ }
29300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ActionMenuComponent, decorators: [{
29301
+ type: Component,
29302
+ args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [
29303
+ MatIconModule,
29304
+ ButtonComponent,
29305
+ MatMenuModule,
29306
+ MatDialogModule,
29307
+ ConfirmationDialogComponent,
29308
+ TranslateModule,
29309
+ ], 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" }]
29310
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialog }, { type: i1$1.TranslateService }]; }, propDecorators: { canDuplicate: [{
29311
+ type: Input
29312
+ }], canDelete: [{
29313
+ type: Input
29314
+ }], duplicate: [{
29315
+ type: Output
29316
+ }], delete: [{
29317
+ type: Output
29318
+ }], trigger: [{
29319
+ type: ViewChild,
29320
+ args: [MatMenuTrigger]
29321
+ }] } });
29322
+
28615
29323
  class ResultsTableComponent {
28616
29324
  constructor() {
28617
29325
  this.records = [];
28618
29326
  this.selectedRecordsIdentifiers = [];
28619
29327
  this.sortOrder = null;
28620
- this.recordHasDraft = () => false;
29328
+ this.hasDraft = () => false;
29329
+ this.canDuplicate = () => true;
29330
+ this.canDelete = () => true;
28621
29331
  // emits the column (field) as well as the order
28622
29332
  this.sortByChange = new EventEmitter();
28623
29333
  this.recordClick = new EventEmitter();
29334
+ this.duplicateRecord = new EventEmitter();
29335
+ this.deleteRecord = new EventEmitter();
28624
29336
  this.recordsSelectedChange = new EventEmitter();
28625
29337
  }
28626
29338
  dateToString(date) {
@@ -28655,6 +29367,12 @@ class ResultsTableComponent {
28655
29367
  handleRecordClick(item) {
28656
29368
  this.recordClick.emit(item);
28657
29369
  }
29370
+ handleDuplicate(item) {
29371
+ this.duplicateRecord.emit(item);
29372
+ }
29373
+ handleDelete(item) {
29374
+ this.deleteRecord.emit(item);
29375
+ }
28658
29376
  setSortBy(col, order) {
28659
29377
  this.sortByChange.emit([col, order]);
28660
29378
  }
@@ -28690,7 +29408,7 @@ class ResultsTableComponent {
28690
29408
  return !allSelected && someSelected;
28691
29409
  }
28692
29410
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28693
- 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"] }] }); }
29411
+ 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"] }] }); }
28694
29412
  }
28695
29413
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableComponent, decorators: [{
28696
29414
  type: Component,
@@ -28702,19 +29420,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
28702
29420
  MatIconModule,
28703
29421
  TranslateModule,
28704
29422
  BadgeComponent,
28705
- ], 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" }]
29423
+ ActionMenuComponent,
29424
+ ], 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" }]
28706
29425
  }], propDecorators: { records: [{
28707
29426
  type: Input
28708
29427
  }], selectedRecordsIdentifiers: [{
28709
29428
  type: Input
28710
29429
  }], sortOrder: [{
28711
29430
  type: Input
28712
- }], recordHasDraft: [{
29431
+ }], hasDraft: [{
29432
+ type: Input
29433
+ }], canDuplicate: [{
29434
+ type: Input
29435
+ }], canDelete: [{
28713
29436
  type: Input
28714
29437
  }], sortByChange: [{
28715
29438
  type: Output
28716
29439
  }], recordClick: [{
28717
29440
  type: Output
29441
+ }], duplicateRecord: [{
29442
+ type: Output
29443
+ }], deleteRecord: [{
29444
+ type: Output
28718
29445
  }], recordsSelectedChange: [{
28719
29446
  type: Output
28720
29447
  }] } });
@@ -29328,6 +30055,10 @@ class SearchFacade {
29328
30055
  this.store.dispatch(new RequestMoreResults(this.searchId));
29329
30056
  return this;
29330
30057
  }
30058
+ requestNewResults() {
30059
+ this.store.dispatch(new RequestNewResults(this.searchId));
30060
+ return this;
30061
+ }
29331
30062
  requestMoreOnAggregation(key, increment) {
29332
30063
  this.store.dispatch(new RequestMoreOnAggregation(key, increment, this.searchId));
29333
30064
  return this;
@@ -29773,11 +30504,11 @@ class FuzzySearchComponent {
29773
30504
  }
29774
30505
  }
29775
30506
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FuzzySearchComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
29776
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n [value]=\"searchInputValue$ | async\"\n [clearOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30507
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29777
30508
  }
29778
30509
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FuzzySearchComponent, decorators: [{
29779
30510
  type: Component,
29780
- args: [{ selector: 'gn-ui-fuzzy-search', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n [value]=\"searchInputValue$ | async\"\n [clearOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n></gn-ui-autocomplete>\n" }]
30511
+ args: [{ selector: 'gn-ui-fuzzy-search', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n></gn-ui-autocomplete>\n" }]
29781
30512
  }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: RecordsRepositoryInterface }]; }, propDecorators: { autocomplete: [{
29782
30513
  type: ViewChild,
29783
30514
  args: [AutocompleteComponent]
@@ -30179,12 +30910,12 @@ class SearchEffects {
30179
30910
  );
30180
30911
  });
30181
30912
  }
30182
- 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 }); }
30913
+ 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 }); }
30183
30914
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchEffects }); }
30184
30915
  }
30185
30916
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchEffects, decorators: [{
30186
30917
  type: Injectable
30187
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: i1$2.Store }, { type: RecordsRepositoryInterface }, { type: FavoritesService }, { type: PlatformServiceInterface }, { type: Promise, decorators: [{
30918
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }, { type: i1$2.Store }, { type: RecordsRepositoryInterface }, { type: FavoritesService }, { type: PlatformServiceInterface }, { type: Promise, decorators: [{
30188
30919
  type: Optional
30189
30920
  }, {
30190
30921
  type: Inject,
@@ -30489,12 +31220,14 @@ marker('search.filters.keyword');
30489
31220
  marker('search.filters.isSpatial');
30490
31221
  marker('search.filters.license');
30491
31222
  marker('search.filters.publicationYear');
30492
- marker('search.filters.publisher');
31223
+ marker('search.filters.organization');
30493
31224
  marker('search.filters.representationType');
30494
31225
  marker('search.filters.resourceType');
30495
31226
  marker('search.filters.standard');
30496
31227
  marker('search.filters.topic');
30497
31228
  marker('search.filters.contact');
31229
+ marker('search.filters.producerOrg');
31230
+ marker('search.filters.publisherOrg');
30498
31231
  class FieldsService {
30499
31232
  get supportedFields() {
30500
31233
  return Object.keys(this.fields);
@@ -30502,7 +31235,7 @@ class FieldsService {
30502
31235
  constructor(injector) {
30503
31236
  this.injector = injector;
30504
31237
  this.fields = {
30505
- publisher: new OrganizationSearchField(this.injector),
31238
+ organization: new OrganizationSearchField(this.injector),
30506
31239
  format: new SimpleSearchField('format', this.injector, 'asc'),
30507
31240
  resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
30508
31241
  representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
@@ -30515,6 +31248,8 @@ class FieldsService {
30515
31248
  q: new FullTextSearchField(),
30516
31249
  license: new LicenseSearchField(this.injector),
30517
31250
  owner: new OwnerSearchField(this.injector),
31251
+ producerOrg: new MultilingualSearchField('originatorOrgForResourceObject', this.injector, 'asc', 'key'),
31252
+ publisherOrg: new MultilingualSearchField('distributorOrgForResourceObject', this.injector, 'asc', 'key'),
30518
31253
  };
30519
31254
  }
30520
31255
  getAvailableValues(fieldName) {
@@ -30594,7 +31329,7 @@ class FeatureSearchModule {
30594
31329
  ResultsHitsContainerComponent,
30595
31330
  SearchStateContainerDirective,
30596
31331
  FavoriteStarComponent,
30597
- FilterDropdownComponent], imports: [CommonModule, i1$1.TranslateModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule, HttpClientModule,
31332
+ FilterDropdownComponent], imports: [CommonModule, i1$1.TranslateModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule, HttpClientModule,
30598
31333
  HttpClientXsrfModule,
30599
31334
  UiSearchModule,
30600
31335
  UiInputsModule,
@@ -30685,13 +31420,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
30685
31420
  }]
30686
31421
  }] });
30687
31422
 
31423
+ class NotificationsService {
31424
+ constructor() {
31425
+ this.notifications$ = new BehaviorSubject([]);
31426
+ }
31427
+ showNotification(content, timeoutMs) {
31428
+ const id = Math.floor(Math.random() * 1000000);
31429
+ this.notifications$.next([...this.notifications$.value, { ...content, id }]);
31430
+ if (typeof timeoutMs === 'undefined')
31431
+ return;
31432
+ setTimeout(() => {
31433
+ this.removeNotificationById(id);
31434
+ }, timeoutMs);
31435
+ }
31436
+ removeNotificationById(id) {
31437
+ this.notifications$.next(this.notifications$.value.filter((n) => n.id !== id));
31438
+ }
31439
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31440
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, providedIn: 'root' }); }
31441
+ }
31442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, decorators: [{
31443
+ type: Injectable,
31444
+ args: [{
31445
+ providedIn: 'root',
31446
+ }]
31447
+ }] });
31448
+
31449
+ class FeatureNotificationsModule {
31450
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31451
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule }); }
31452
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, providers: [NotificationsService] }); }
31453
+ }
31454
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, decorators: [{
31455
+ type: NgModule,
31456
+ args: [{
31457
+ declarations: [],
31458
+ exports: [],
31459
+ imports: [],
31460
+ providers: [NotificationsService],
31461
+ }]
31462
+ }] });
31463
+
31464
+ class NotificationsContainerComponent {
31465
+ constructor(notificationsService) {
31466
+ this.notificationsService = notificationsService;
31467
+ }
31468
+ trackById(index, notification) {
31469
+ return notification.id;
31470
+ }
31471
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, deps: [{ token: NotificationsService }], target: i0.ɵɵFactoryTarget.Component }); }
31472
+ 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: [
31473
+ trigger('enterExit', [
31474
+ transition(':enter', [
31475
+ animate('150ms', keyframes([
31476
+ style({ transform: 'scale(1)', opacity: 0 }),
31477
+ style({ transform: 'scale(1.03)', opacity: 0.5 }),
31478
+ style({ transform: 'scale(1)', opacity: 1 }),
31479
+ ])),
31480
+ ]),
31481
+ transition(':leave', [
31482
+ animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31483
+ ]),
31484
+ ]),
31485
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31486
+ }
31487
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, decorators: [{
31488
+ type: Component,
31489
+ args: [{ selector: 'gn-ui-notifications-container', standalone: true, imports: [CommonModule, NotificationComponent], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
31490
+ trigger('enterExit', [
31491
+ transition(':enter', [
31492
+ animate('150ms', keyframes([
31493
+ style({ transform: 'scale(1)', opacity: 0 }),
31494
+ style({ transform: 'scale(1.03)', opacity: 0.5 }),
31495
+ style({ transform: 'scale(1)', opacity: 1 }),
31496
+ ])),
31497
+ ]),
31498
+ transition(':leave', [
31499
+ animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31500
+ ]),
31501
+ ]),
31502
+ ], 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" }]
31503
+ }], ctorParameters: function () { return [{ type: NotificationsService }]; } });
31504
+
30688
31505
  class ResultsTableContainerComponent {
30689
- constructor(searchFacade, searchService, selectionService, recordsRepository) {
31506
+ constructor(searchFacade, searchService, selectionService, recordsRepository, notificationsService, translateService) {
30690
31507
  this.searchFacade = searchFacade;
30691
31508
  this.searchService = searchService;
30692
31509
  this.selectionService = selectionService;
30693
31510
  this.recordsRepository = recordsRepository;
31511
+ this.notificationsService = notificationsService;
31512
+ this.translateService = translateService;
30694
31513
  this.recordClick = new EventEmitter();
31514
+ this.duplicateRecord = new EventEmitter();
31515
+ this.subscription = new Subscription();
30695
31516
  this.records$ = this.searchFacade.results$;
30696
31517
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
30697
31518
  this.sortBy$ = this.searchFacade.sortBy$;
@@ -30700,6 +31521,31 @@ class ResultsTableContainerComponent {
30700
31521
  handleRecordClick(item) {
30701
31522
  this.recordClick.emit(item);
30702
31523
  }
31524
+ handleDuplicateRecord(item) {
31525
+ this.duplicateRecord.emit(item);
31526
+ }
31527
+ async handleDeleteRecord(item) {
31528
+ const uniqueIdentifier = item.uniqueIdentifier;
31529
+ this.subscription.add(this.recordsRepository.deleteRecord(uniqueIdentifier).subscribe({
31530
+ next: () => {
31531
+ this.recordsRepository.clearRecordDraft(uniqueIdentifier);
31532
+ this.searchFacade.requestNewResults();
31533
+ this.notificationsService.showNotification({
31534
+ type: 'success',
31535
+ title: this.translateService.instant('editor.record.deleteSuccess.title'),
31536
+ text: `${this.translateService.instant('editor.record.deleteSuccess.body')}`,
31537
+ }, 2500);
31538
+ },
31539
+ error: (error) => {
31540
+ this.notificationsService.showNotification({
31541
+ type: 'error',
31542
+ title: this.translateService.instant('editor.record.deleteError.title'),
31543
+ text: `${this.translateService.instant('editor.record.deleteError.body')} ${error}`,
31544
+ closeMessage: this.translateService.instant('editor.record.deleteError.closeMessage'),
31545
+ });
31546
+ },
31547
+ }));
31548
+ }
30703
31549
  handleSortByChange(col, order) {
30704
31550
  this.searchService.setSortBy([order, col]);
30705
31551
  }
@@ -30711,13 +31557,18 @@ class ResultsTableContainerComponent {
30711
31557
  this.selectionService.selectRecords(records);
30712
31558
  }
30713
31559
  }
30714
- 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 }); }
30715
- 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"] }] }); }
31560
+ ngOnDestroy() {
31561
+ this.subscription.unsubscribe();
31562
+ }
31563
+ 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 }); }
31564
+ 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"] }] }); }
30716
31565
  }
30717
31566
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
30718
31567
  type: Component,
30719
- 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" }]
30720
- }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }]; }, propDecorators: { recordClick: [{
31568
+ 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" }]
31569
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }]; }, propDecorators: { recordClick: [{
31570
+ type: Output
31571
+ }], duplicateRecord: [{
30721
31572
  type: Output
30722
31573
  }] } });
30723
31574
 
@@ -31018,7 +31869,7 @@ class LayersPanelComponent {
31018
31869
  this.mapFacade.addLayer(layer);
31019
31870
  }
31020
31871
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
31021
- 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 }); }
31872
+ 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 }); }
31022
31873
  }
31023
31874
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LayersPanelComponent, decorators: [{
31024
31875
  type: Component,
@@ -31029,12 +31880,12 @@ class MapEffects {
31029
31880
  constructor(actions$) {
31030
31881
  this.actions$ = actions$;
31031
31882
  }
31032
- 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 }); }
31883
+ 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 }); }
31033
31884
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapEffects }); }
31034
31885
  }
31035
31886
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapEffects, decorators: [{
31036
31887
  type: Injectable
31037
- }], ctorParameters: function () { return [{ type: i1$8.Actions }]; } });
31888
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }]; } });
31038
31889
 
31039
31890
  class MapContainerComponent {
31040
31891
  constructor(mapFacade) {
@@ -31187,7 +32038,7 @@ class FeatureMapModule {
31187
32038
  MatIconModule,
31188
32039
  MatTabsModule,
31189
32040
  TranslateModule,
31190
- FeatureSearchModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule, UiElementsModule,
32041
+ FeatureSearchModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule, UiElementsModule,
31191
32042
  UiInputsModule,
31192
32043
  AddLayerFromOgcApiComponent], exports: [MapContextComponent,
31193
32044
  MapInstanceDirective,
@@ -31311,88 +32162,6 @@ const DEFAULT_STYLE_HL_FIXTURE = new Style$1({
31311
32162
  }),
31312
32163
  });
31313
32164
 
31314
- class NotificationsService {
31315
- constructor() {
31316
- this.notifications$ = new BehaviorSubject([]);
31317
- }
31318
- showNotification(content, timeoutMs) {
31319
- const id = Math.floor(Math.random() * 1000000);
31320
- this.notifications$.next([...this.notifications$.value, { ...content, id }]);
31321
- if (typeof timeoutMs === 'undefined')
31322
- return;
31323
- setTimeout(() => {
31324
- this.removeNotificationById(id);
31325
- }, timeoutMs);
31326
- }
31327
- removeNotificationById(id) {
31328
- this.notifications$.next(this.notifications$.value.filter((n) => n.id !== id));
31329
- }
31330
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31331
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, providedIn: 'root' }); }
31332
- }
31333
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsService, decorators: [{
31334
- type: Injectable,
31335
- args: [{
31336
- providedIn: 'root',
31337
- }]
31338
- }] });
31339
-
31340
- class FeatureNotificationsModule {
31341
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31342
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule }); }
31343
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, providers: [NotificationsService] }); }
31344
- }
31345
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureNotificationsModule, decorators: [{
31346
- type: NgModule,
31347
- args: [{
31348
- declarations: [],
31349
- exports: [],
31350
- imports: [],
31351
- providers: [NotificationsService],
31352
- }]
31353
- }] });
31354
-
31355
- class NotificationsContainerComponent {
31356
- constructor(notificationsService) {
31357
- this.notificationsService = notificationsService;
31358
- }
31359
- trackById(index, notification) {
31360
- return notification.id;
31361
- }
31362
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, deps: [{ token: NotificationsService }], target: i0.ɵɵFactoryTarget.Component }); }
31363
- 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: [
31364
- trigger('enterExit', [
31365
- transition(':enter', [
31366
- animate('150ms', keyframes([
31367
- style({ transform: 'scale(1)', opacity: 0 }),
31368
- style({ transform: 'scale(1.03)', opacity: 0.5 }),
31369
- style({ transform: 'scale(1)', opacity: 1 }),
31370
- ])),
31371
- ]),
31372
- transition(':leave', [
31373
- animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31374
- ]),
31375
- ]),
31376
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31377
- }
31378
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationsContainerComponent, decorators: [{
31379
- type: Component,
31380
- args: [{ selector: 'gn-ui-notifications-container', standalone: true, imports: [CommonModule, NotificationComponent], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
31381
- trigger('enterExit', [
31382
- transition(':enter', [
31383
- animate('150ms', keyframes([
31384
- style({ transform: 'scale(1)', opacity: 0 }),
31385
- style({ transform: 'scale(1.03)', opacity: 0.5 }),
31386
- style({ transform: 'scale(1)', opacity: 1 }),
31387
- ])),
31388
- ]),
31389
- transition(':leave', [
31390
- animate('200ms', style({ transform: 'translateX(50px)', opacity: 0 })),
31391
- ]),
31392
- ]),
31393
- ], 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" }]
31394
- }], ctorParameters: function () { return [{ type: NotificationsService }]; } });
31395
-
31396
32165
  /*
31397
32166
  Metadata actions
31398
32167
  */
@@ -31760,7 +32529,7 @@ class TableComponent {
31760
32529
  return rowIdPrefix + id;
31761
32530
  }
31762
32531
  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 }); }
31763
- 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 }); }
32532
+ 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 }); }
31764
32533
  }
31765
32534
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, decorators: [{
31766
32535
  type: Component,
@@ -33226,12 +33995,12 @@ class MdViewEffects {
33226
33995
  }));
33227
33996
  })))));
33228
33997
  }
33229
- 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 }); }
33998
+ 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 }); }
33230
33999
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MdViewEffects }); }
33231
34000
  }
33232
34001
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MdViewEffects, decorators: [{
33233
34002
  type: Injectable
33234
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
34003
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
33235
34004
 
33236
34005
  marker('externalviewer.dataset.unnamed');
33237
34006
  class ExternalViewerButtonComponent {
@@ -33856,9 +34625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33856
34625
  class RecordsService {
33857
34626
  constructor(recordsRepository) {
33858
34627
  this.recordsRepository = recordsRepository;
33859
- this.recordsCount$ = this.recordsRepository
33860
- .getMatchesCount({})
33861
- .pipe(shareReplay(1), catchError(() => of(0)));
34628
+ this.recordsCount$ = of(true).pipe(switchMap(() => this.recordsRepository.getMatchesCount({})), shareReplay(1));
33862
34629
  }
33863
34630
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordsService, deps: [{ token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
33864
34631
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordsService, providedIn: 'root' }); }
@@ -33908,37 +34675,54 @@ const GN_UI_VERSION = new InjectionToken('gnUiVersion');
33908
34675
 
33909
34676
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
33910
34677
  class DataViewPermalinkComponent {
34678
+ set viewType(value) {
34679
+ this.viewType$.next(value);
34680
+ }
33911
34681
  constructor(config, wcEmbedderBaseUrl, version, facade) {
33912
34682
  this.config = config;
33913
34683
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
33914
34684
  this.version = version;
33915
34685
  this.facade = facade;
34686
+ this.viewType$ = new BehaviorSubject('map');
33916
34687
  this.permalinkUrl$ = combineLatest([
34688
+ this.viewType$,
33917
34689
  this.facade.chartConfig$,
33918
34690
  this.facade.metadata$,
33919
- ]).pipe(map$2(([config, metadata]) => {
33920
- if (config) {
33921
- const { aggregation, xProperty, yProperty, chartType } = config;
33922
- const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
33923
- url.searchParams.set('v', `${this.version}`);
33924
- url.searchParams.append('e', `gn-dataset-view-chart`);
33925
- url.searchParams.append('a', `api-url=${this.config.basePath}`);
33926
- url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
33927
- url.searchParams.append('a', `primary-color=#0f4395`);
33928
- url.searchParams.append('a', `secondary-color=#8bc832`);
33929
- url.searchParams.append('a', `main-color=#555`);
33930
- url.searchParams.append('a', `background-color=#fdfbff`);
33931
- url.searchParams.append('a', `aggregation=${aggregation}`);
33932
- url.searchParams.append('a', `x-property=${xProperty}`);
33933
- url.searchParams.append('a', `y-property=${yProperty}`);
33934
- url.searchParams.append('a', `chart-type=${chartType}`);
33935
- return url.toString();
34691
+ ]).pipe(map$2(([viewType, config, metadata]) => {
34692
+ const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
34693
+ url.searchParams.set('v', `${this.version}`);
34694
+ if (viewType === 'chart') {
34695
+ if (config) {
34696
+ const { aggregation, xProperty, yProperty, chartType } = config;
34697
+ url.searchParams.append('e', `gn-dataset-view-chart`);
34698
+ url.searchParams.append('a', `aggregation=${aggregation}`);
34699
+ url.searchParams.append('a', `x-property=${xProperty}`);
34700
+ url.searchParams.append('a', `y-property=${yProperty}`);
34701
+ url.searchParams.append('a', `chart-type=${chartType}`);
34702
+ }
34703
+ else {
34704
+ return '';
34705
+ }
33936
34706
  }
33937
- return '';
34707
+ else if (viewType === 'table') {
34708
+ // table
34709
+ url.searchParams.append('e', `gn-dataset-view-table`);
34710
+ }
34711
+ else {
34712
+ // map
34713
+ url.searchParams.append('e', `gn-dataset-view-map`);
34714
+ }
34715
+ url.searchParams.append('a', `api-url=${this.config.basePath}`);
34716
+ url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
34717
+ url.searchParams.append('a', `primary-color=#0f4395`);
34718
+ url.searchParams.append('a', `secondary-color=#8bc832`);
34719
+ url.searchParams.append('a', `main-color=#555`);
34720
+ url.searchParams.append('a', `background-color=#fdfbff`);
34721
+ return url.toString();
33938
34722
  }));
33939
34723
  }
33940
34724
  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 }); }
33941
- 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 }); }
34725
+ 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 }); }
33942
34726
  }
33943
34727
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
33944
34728
  type: Component,
@@ -33954,37 +34738,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33954
34738
  }] }, { type: undefined, decorators: [{
33955
34739
  type: Inject,
33956
34740
  args: [GN_UI_VERSION]
33957
- }] }, { type: MdViewFacade }]; } });
34741
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34742
+ type: Input
34743
+ }] } });
33958
34744
 
33959
34745
  class DataViewWebComponentComponent {
34746
+ set viewType(value) {
34747
+ this.viewType$.next(value);
34748
+ }
33960
34749
  constructor(config, version, facade) {
33961
34750
  this.config = config;
33962
34751
  this.version = version;
33963
34752
  this.facade = facade;
33964
- this.webComponentHtml$ = combineLatest(this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([config, metadata]) => {
33965
- if (config) {
33966
- const { aggregation, xProperty, yProperty, chartType } = config;
34753
+ this.viewType$ = new BehaviorSubject('map');
34754
+ this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
34755
+ if (viewType === 'chart') {
34756
+ if (config) {
34757
+ const { aggregation, xProperty, yProperty, chartType } = config;
34758
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34759
+ <gn-dataset-view-chart
34760
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34761
+ dataset-id="${metadata.uniqueIdentifier}"
34762
+ aggregation="${aggregation}"
34763
+ x-property="${xProperty}"
34764
+ y-property="${yProperty}"
34765
+ chart-type="${chartType}"
34766
+ primary-color="#0f4395"
34767
+ secondary-color="#8bc832"
34768
+ main-color="#555"
34769
+ background-color="#fdfbff"
34770
+ main-font="'Inter', sans-serif"
34771
+ title-font="'DM Serif Display', serif"
34772
+ ></gn-dataset-view-chart>`;
34773
+ }
34774
+ return '';
34775
+ }
34776
+ else if (viewType === 'table') {
33967
34777
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
33968
- <gn-dataset-view-chart
34778
+ <gn-dataset-view-table
34779
+ api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
34780
+ dataset-id="${metadata.uniqueIdentifier}"
34781
+ primary-color="#0f4395"
34782
+ secondary-color="#8bc832"
34783
+ main-color="#555"
34784
+ background-color="#fdfbff"
34785
+ main-font="'Inter', sans-serif"
34786
+ title-font="'DM Serif Display', serif"
34787
+ ></gn-dataset-view-table>`;
34788
+ }
34789
+ else {
34790
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
34791
+ <gn-dataset-view-map
33969
34792
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
33970
34793
  dataset-id="${metadata.uniqueIdentifier}"
33971
- aggregation="${aggregation}"
33972
- x-property="${xProperty}"
33973
- y-property="${yProperty}"
33974
- chart-type="${chartType}"
33975
34794
  primary-color="#0f4395"
33976
34795
  secondary-color="#8bc832"
33977
34796
  main-color="#555"
33978
34797
  background-color="#fdfbff"
33979
34798
  main-font="'Inter', sans-serif"
33980
34799
  title-font="'DM Serif Display', serif"
33981
- ></gn-dataset-view-chart>`;
34800
+ ></gn-dataset-view-map>`;
33982
34801
  }
33983
- return '';
33984
34802
  }));
33985
34803
  }
33986
34804
  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 }); }
33987
- 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 }); }
34805
+ 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 }); }
33988
34806
  }
33989
34807
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
33990
34808
  type: Component,
@@ -33995,24 +34813,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33995
34813
  }] }, { type: undefined, decorators: [{
33996
34814
  type: Inject,
33997
34815
  args: [GN_UI_VERSION]
33998
- }] }, { type: MdViewFacade }]; } });
34816
+ }] }, { type: MdViewFacade }]; }, propDecorators: { viewType: [{
34817
+ type: Input
34818
+ }] } });
33999
34819
 
34000
34820
  class DataViewShareComponent {
34821
+ set viewType(value) {
34822
+ this._viewType = value;
34823
+ }
34824
+ get viewType() {
34825
+ return this._viewType;
34826
+ }
34001
34827
  constructor(wcEmbedderBaseUrl) {
34002
34828
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
34003
34829
  }
34004
34830
  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 }); }
34005
- 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 }); }
34831
+ 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 }); }
34006
34832
  }
34007
34833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataViewShareComponent, decorators: [{
34008
34834
  type: Component,
34009
- 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"] }]
34835
+ 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"] }]
34010
34836
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
34011
34837
  type: Optional
34012
34838
  }, {
34013
34839
  type: Inject,
34014
34840
  args: [WEB_COMPONENT_EMBEDDER_URL]
34015
- }] }]; } });
34841
+ }] }]; }, propDecorators: { viewType: [{
34842
+ type: Input
34843
+ }] } });
34016
34844
 
34017
34845
  class FeatureRecordModule {
34018
34846
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureRecordModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -34021,7 +34849,7 @@ class FeatureRecordModule {
34021
34849
  ExternalViewerButtonComponent,
34022
34850
  DataViewPermalinkComponent,
34023
34851
  DataViewWebComponentComponent,
34024
- DataViewShareComponent], imports: [CommonModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule, UiLayoutModule,
34852
+ DataViewShareComponent], imports: [CommonModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule, UiLayoutModule,
34025
34853
  FeatureMapModule,
34026
34854
  FeatureCatalogModule,
34027
34855
  UiMapModule,
@@ -34102,75 +34930,175 @@ const saveRecord = createAction('[Editor] Save record');
34102
34930
  const saveRecordSuccess = createAction('[Editor] Save record success');
34103
34931
  const saveRecordFailure = createAction('[Editor] Save record failure', props());
34104
34932
  const draftSaveSuccess = createAction('[Editor] Draft save success');
34933
+ const setCurrentPage = createAction('[Editor] Set current page', props());
34105
34934
 
34106
- const DEFAULT_FIELDS = [
34107
- {
34108
- model: 'title',
34109
- formFieldConfig: {
34110
- labelKey: 'Metadata title',
34111
- type: 'text',
34112
- },
34935
+ /**
34936
+ * This file contains the configuration of the fields that will be displayed in the editor.
34937
+ * To add a new field, you need to create a new EditorField object in the fields part of this file.
34938
+ * Then add it to the corresponding section in the sections part of this file.
34939
+ * Finally, add the section to the corresponding page in the pages part of this file.
34940
+ */
34941
+ /************************************************************
34942
+ *************** FIELDS *****************
34943
+ ************************************************************
34944
+ */
34945
+ const RECORD_LICENSE_FIELD = {
34946
+ model: 'licenses',
34947
+ formFieldConfig: {
34948
+ labelKey: marker('editor.record.form.field.license'),
34113
34949
  },
34114
- {
34115
- model: 'abstract',
34116
- formFieldConfig: {
34117
- labelKey: 'Abstract',
34118
- type: 'rich',
34119
- },
34950
+ };
34951
+ const RECORD_KEYWORDS_FIELD = {
34952
+ model: 'keywords',
34953
+ formFieldConfig: {
34954
+ labelKey: marker('editor.record.form.field.keywords'),
34120
34955
  },
34121
- {
34122
- model: 'uniqueIdentifier',
34123
- formFieldConfig: {
34124
- labelKey: 'Unique identifier',
34125
- type: 'text',
34126
- locked: true,
34127
- },
34956
+ };
34957
+ const RECORD_UNIQUE_IDENTIFIER_FIELD = {
34958
+ model: 'uniqueIdentifier',
34959
+ formFieldConfig: {
34960
+ labelKey: marker('editor.record.form.field.uniqueIdentifier'),
34961
+ locked: true,
34128
34962
  },
34129
- {
34130
- model: 'recordUpdated',
34131
- formFieldConfig: {
34132
- labelKey: 'Record Updated',
34133
- type: 'text',
34134
- locked: true,
34135
- },
34136
- onSaveProcess: '${dateNow()}',
34963
+ };
34964
+ const RECORD_RESOURCE_UPDATED_FIELD = {
34965
+ model: 'resourceUpdated',
34966
+ formFieldConfig: {
34967
+ labelKey: marker('editor.record.form.field.resourceUpdated'),
34137
34968
  },
34138
- {
34139
- model: 'licenses',
34140
- formFieldConfig: {
34141
- labelKey: marker('editor.record.form.license'),
34142
- type: 'list',
34143
- },
34969
+ };
34970
+ const RECORD_UPDATED_FIELD = {
34971
+ model: 'recordUpdated',
34972
+ formFieldConfig: {
34973
+ labelKey: marker('editor.record.form.field.recordUpdated'),
34974
+ locked: true,
34144
34975
  },
34145
- {
34146
- model: 'resourceUpdated',
34147
- formFieldConfig: {
34148
- labelKey: marker('editor.record.form.resourceUpdated'),
34149
- type: 'date',
34150
- },
34976
+ onSaveProcess: '${dateNow()}',
34977
+ };
34978
+ const RECORD_UPDATE_FREQUENCY_FIELD = {
34979
+ model: 'updateFrequency',
34980
+ formFieldConfig: {
34981
+ labelKey: marker('editor.record.form.field.updateFrequency'),
34151
34982
  },
34152
- {
34153
- model: 'updateFrequency',
34154
- formFieldConfig: {
34155
- labelKey: marker('editor.record.form.updateFrequency'),
34156
- type: 'text',
34157
- },
34983
+ };
34984
+ const RECORD_TEMPORAL_EXTENTS_FIELD = {
34985
+ model: 'temporalExtents',
34986
+ formFieldConfig: {
34987
+ labelKey: marker('editor.record.form.field.temporalExtents'),
34158
34988
  },
34159
- {
34160
- model: 'temporalExtents',
34161
- formFieldConfig: {
34162
- labelKey: marker('editor.record.form.temporalExtents'),
34163
- type: 'list',
34164
- },
34989
+ };
34990
+ const RECORD_TITLE_FIELD = {
34991
+ model: 'title',
34992
+ formFieldConfig: {
34993
+ labelKey: marker('editor.record.form.field.title'),
34165
34994
  },
34166
- {
34167
- model: 'keywords',
34168
- formFieldConfig: {
34169
- labelKey: marker('editor.record.form.keywords'),
34170
- type: 'list',
34171
- },
34995
+ };
34996
+ const RECORD_ABSTRACT_FIELD = {
34997
+ model: 'abstract',
34998
+ formFieldConfig: {
34999
+ labelKey: marker('editor.record.form.field.abstract'),
34172
35000
  },
34173
- ];
35001
+ };
35002
+ const CONTACTS_FOR_RESOURCE_FIELD = {
35003
+ model: 'contactsForResource',
35004
+ formFieldConfig: {
35005
+ labelKey: '',
35006
+ },
35007
+ };
35008
+ const RECORD_GRAPHICAL_OVERVIEW_FIELD = {
35009
+ model: 'overviews',
35010
+ formFieldConfig: {
35011
+ labelKey: marker('editor.record.form.field.overviews'),
35012
+ },
35013
+ };
35014
+ /************************************************************
35015
+ *************** SECTIONS *****************
35016
+ ************************************************************
35017
+ */
35018
+ const TITLE_SECTION = {
35019
+ hidden: false,
35020
+ fields: [
35021
+ RECORD_TITLE_FIELD,
35022
+ RECORD_ABSTRACT_FIELD,
35023
+ RECORD_GRAPHICAL_OVERVIEW_FIELD,
35024
+ ],
35025
+ };
35026
+ const ABOUT_SECTION = {
35027
+ labelKey: marker('editor.record.form.section.about.label'),
35028
+ descriptionKey: marker('editor.record.form.section.about.description'),
35029
+ hidden: false,
35030
+ fields: [
35031
+ RECORD_UNIQUE_IDENTIFIER_FIELD,
35032
+ RECORD_RESOURCE_UPDATED_FIELD,
35033
+ RECORD_UPDATED_FIELD,
35034
+ RECORD_UPDATE_FREQUENCY_FIELD,
35035
+ RECORD_TEMPORAL_EXTENTS_FIELD,
35036
+ ],
35037
+ };
35038
+ const GEOGRAPHICAL_COVERAGE_SECTION = {
35039
+ labelKey: marker('editor.record.form.section.geographicalCoverage.label'),
35040
+ hidden: false,
35041
+ fields: [],
35042
+ };
35043
+ const ASSOCIATED_RESOURCES_SECTION = {
35044
+ labelKey: marker('editor.record.form.section.associatedResources.label'),
35045
+ descriptionKey: marker('editor.record.form.section.associatedResources.description'),
35046
+ hidden: false,
35047
+ fields: [],
35048
+ };
35049
+ const ANNEXES_SECTION = {
35050
+ labelKey: marker('editor.record.form.section.annexes.label'),
35051
+ hidden: false,
35052
+ fields: [],
35053
+ };
35054
+ const CLASSIFICATION_SECTION = {
35055
+ labelKey: marker('editor.record.form.section.classification.label'),
35056
+ descriptionKey: marker('editor.record.form.section.classification.description'),
35057
+ hidden: false,
35058
+ fields: [RECORD_KEYWORDS_FIELD],
35059
+ };
35060
+ const USE_AND_ACCESS_CONDITIONS_SECTION = {
35061
+ labelKey: marker('editor.record.form.section.useAndAccessConditions.label'),
35062
+ hidden: false,
35063
+ fields: [RECORD_LICENSE_FIELD],
35064
+ };
35065
+ const DATA_MANAGERS_SECTION = {
35066
+ labelKey: marker('editor.record.form.section.dataManagers.label'),
35067
+ descriptionKey: marker('editor.record.form.section.dataManagers.description'),
35068
+ hidden: false,
35069
+ fields: [CONTACTS_FOR_RESOURCE_FIELD],
35070
+ };
35071
+ const DATA_POINT_OF_CONTACT_SECTION = {
35072
+ labelKey: marker('editor.record.form.section.dataPointOfContact.label'),
35073
+ descriptionKey: marker('editor.record.form.section.dataPointOfContact.description'),
35074
+ hidden: false,
35075
+ fields: [],
35076
+ };
35077
+ /************************************************************
35078
+ *************** PAGES *****************
35079
+ ************************************************************
35080
+ */
35081
+ const DEFAULT_CONFIGURATION = {
35082
+ pages: [
35083
+ {
35084
+ labelKey: marker('editor.record.form.page.description'),
35085
+ sections: [TITLE_SECTION, ABOUT_SECTION, GEOGRAPHICAL_COVERAGE_SECTION],
35086
+ },
35087
+ {
35088
+ labelKey: marker('editor.record.form.page.ressources'),
35089
+ sections: [ASSOCIATED_RESOURCES_SECTION, ANNEXES_SECTION],
35090
+ },
35091
+ {
35092
+ labelKey: marker('editor.record.form.page.accessAndContact'),
35093
+ sections: [
35094
+ CLASSIFICATION_SECTION,
35095
+ USE_AND_ACCESS_CONDITIONS_SECTION,
35096
+ DATA_MANAGERS_SECTION,
35097
+ DATA_POINT_OF_CONTACT_SECTION,
35098
+ ],
35099
+ },
35100
+ ],
35101
+ };
34174
35102
 
34175
35103
  const EDITOR_FEATURE_KEY = 'editor';
34176
35104
  const initialEditorState = {
@@ -34180,7 +35108,8 @@ const initialEditorState = {
34180
35108
  saving: false,
34181
35109
  saveError: null,
34182
35110
  changedSinceSave: false,
34183
- fieldsConfig: DEFAULT_FIELDS,
35111
+ editorConfig: DEFAULT_CONFIGURATION,
35112
+ currentPage: 0,
34184
35113
  };
34185
35114
  const reducer = createReducer(initialEditorState, on(openRecord, (state, { record, recordSource, alreadySavedOnce }) => ({
34186
35115
  ...state,
@@ -34210,6 +35139,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
34210
35139
  })), on(markRecordAsChanged, (state) => ({
34211
35140
  ...state,
34212
35141
  changedSinceSave: true,
35142
+ })), on(setCurrentPage, (state, { page }) => ({
35143
+ ...state,
35144
+ currentPage: page,
34213
35145
  })));
34214
35146
  function editorReducer(state, action) {
34215
35147
  return reducer(state, action);
@@ -34222,11 +35154,21 @@ const selectRecordSaving = createSelector(selectEditorState, (state) => state.sa
34222
35154
  const selectRecordSaveError = createSelector(selectEditorState, (state) => state.saveError);
34223
35155
  const selectRecordChangedSinceSave = createSelector(selectEditorState, (state) => state.changedSinceSave);
34224
35156
  const selectRecordAlreadySavedOnce = createSelector(selectEditorState, (state) => state.alreadySavedOnce);
34225
- const selectRecordFieldsConfig = createSelector(selectEditorState, (state) => state.fieldsConfig);
34226
- const selectRecordFields = createSelector(selectEditorState, (state) => state.fieldsConfig.map((fieldConfig) => ({
34227
- config: fieldConfig,
34228
- value: state.record?.[fieldConfig.model] ?? null,
34229
- })));
35157
+ const selectEditorConfig = createSelector(selectEditorState, (state) => state.editorConfig);
35158
+ const selectCurrentPage = createSelector(selectEditorState, (state) => state.currentPage);
35159
+ const selectRecordSections = createSelector(selectEditorState, (state) => {
35160
+ const currentPage = state.editorConfig.pages[state.currentPage];
35161
+ if (!currentPage) {
35162
+ return [];
35163
+ }
35164
+ return currentPage.sections.map((section) => ({
35165
+ ...section,
35166
+ fieldsWithValues: section.fields.map((fieldConfig) => ({
35167
+ config: fieldConfig,
35168
+ value: state.record?.[fieldConfig.model] ?? null,
35169
+ })),
35170
+ }));
35171
+ });
34230
35172
 
34231
35173
  class EditorFacade {
34232
35174
  constructor() {
@@ -34239,8 +35181,10 @@ class EditorFacade {
34239
35181
  this.saveError$ = this.store.pipe(select(selectRecordSaveError), filter$1((error) => !!error));
34240
35182
  this.saveSuccess$ = this.actions$.pipe(ofType(saveRecordSuccess));
34241
35183
  this.changedSinceSave$ = this.store.pipe(select(selectRecordChangedSinceSave));
34242
- this.recordFields$ = this.store.pipe(select(selectRecordFields));
35184
+ this.currentSections$ = this.store.pipe(select(selectRecordSections));
34243
35185
  this.draftSaveSuccess$ = this.actions$.pipe(ofType(draftSaveSuccess));
35186
+ this.currentPage$ = this.store.pipe(select(selectCurrentPage));
35187
+ this.editorConfig$ = this.store.pipe(select(selectEditorConfig));
34244
35188
  }
34245
35189
  openRecord(record, recordSource, alreadySavedOnce) {
34246
35190
  this.store.dispatch(openRecord({ record, recordSource, alreadySavedOnce }));
@@ -34251,6 +35195,9 @@ class EditorFacade {
34251
35195
  updateRecordField(field, value) {
34252
35196
  this.store.dispatch(updateRecordField({ field, value }));
34253
35197
  }
35198
+ setCurrentPage(page) {
35199
+ this.store.dispatch(setCurrentPage({ page }));
35200
+ }
34254
35201
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34255
35202
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorFacade }); }
34256
35203
  }
@@ -34278,12 +35225,13 @@ class EditorService {
34278
35225
  // returns the record as it was when saved, alongside its source
34279
35226
  saveRecord(record, fieldsConfig, generateNewUniqueIdentifier = false) {
34280
35227
  const savedRecord = { ...record };
35228
+ const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
34281
35229
  // run onSave processes
34282
- for (const field of fieldsConfig) {
35230
+ for (const field of fields) {
34283
35231
  if (field.onSaveProcess && field.model) {
34284
35232
  const evaluator = evaluate(field.onSaveProcess);
34285
35233
  savedRecord[field.model] = evaluator({
34286
- config: field,
35234
+ model: field.model,
34287
35235
  value: record[field.model],
34288
35236
  });
34289
35237
  }
@@ -34320,7 +35268,7 @@ class EditorEffects {
34320
35268
  this.editorService = inject(EditorService);
34321
35269
  this.recordsRepository = inject(RecordsRepositoryInterface);
34322
35270
  this.store = inject(Store);
34323
- 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
35271
+ 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
34324
35272
  .saveRecord(record, fieldsConfig, !alreadySavedOnce)
34325
35273
  .pipe(switchMap$1(([record, recordSource]) => of(saveRecordSuccess(), openRecord({
34326
35274
  record,
@@ -34561,7 +35509,7 @@ class WizardFieldComponent {
34561
35509
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
34562
35510
  },
34563
35511
  { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
34564
- ], 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 }); }
35512
+ ], 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 }); }
34565
35513
  }
34566
35514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WizardFieldComponent, decorators: [{
34567
35515
  type: Component,
@@ -34711,7 +35659,7 @@ class FeatureEditorModule {
34711
35659
  MatNativeDateModule,
34712
35660
  MatFormFieldModule,
34713
35661
  HttpClientModule,
34714
- HttpClientXsrfModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
35662
+ HttpClientXsrfModule, i1$2.StoreFeatureModule, i1$9.EffectsFeatureModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
34715
35663
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade, Gn4PlatformService], imports: [CommonModule,
34716
35664
  UiInputsModule,
34717
35665
  UiWidgetsModule,
@@ -34757,7 +35705,9 @@ class FormFieldKeywordsComponent {
34757
35705
  return `${item.title} (${item.value.thesaurus?.name})`;
34758
35706
  };
34759
35707
  this.autoCompleteAction = (query) => {
34760
- return this.platformService.searchKeywords(query).pipe(map$2((keywords) => keywords.map((keyword) => {
35708
+ return this.platformService
35709
+ .searchKeywords(query, ['temporal', 'theme', 'other'])
35710
+ .pipe(map$2((keywords) => keywords.map((keyword) => {
34761
35711
  return { title: keyword.label, value: keyword };
34762
35712
  })));
34763
35713
  };
@@ -34781,7 +35731,7 @@ class FormFieldKeywordsComponent {
34781
35731
  this.control.setValue(removeKeywords);
34782
35732
  }
34783
35733
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldKeywordsComponent, deps: [{ token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Component }); }
34784
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldKeywordsComponent, isStandalone: true, selector: "gn-ui-form-field-keywords", inputs: { control: "control" }, ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-autocomplete\n [placeholder]=\"'Search for keywords in all thesaurus'\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n [clearOnSelection]=\"true\"\n [minCharacterCount]=\"0\"\n [allowSubmit]=\"false\"\n ></gn-ui-autocomplete>\n <div class=\"flex gap-2 flex-wrap\">\n <gn-ui-badge\n *ngFor=\"let keyword of control.value; let index = index\"\n [removable]=\"true\"\n (badgeRemoveClicked)=\"removeKeyword(index)\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: UiWidgetsModule }, { kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35734
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldKeywordsComponent, isStandalone: true, selector: "gn-ui-form-field-keywords", inputs: { control: "control" }, ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-autocomplete\n [placeholder]=\"'Search for keywords in all thesaurus'\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n [preventCompleteOnSelection]=\"true\"\n [minCharacterCount]=\"0\"\n [allowSubmit]=\"false\"\n ></gn-ui-autocomplete>\n <div class=\"flex gap-2 flex-wrap\">\n <gn-ui-badge\n *ngFor=\"let keyword of control.value; let index = index\"\n [removable]=\"true\"\n (badgeRemoveClicked)=\"removeKeyword(index)\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: UiWidgetsModule }, { kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34785
35735
  }
34786
35736
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldKeywordsComponent, decorators: [{
34787
35737
  type: Component,
@@ -34791,7 +35741,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34791
35741
  CommonModule,
34792
35742
  UiWidgetsModule,
34793
35743
  AutocompleteComponent,
34794
- ], template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-autocomplete\n [placeholder]=\"'Search for keywords in all thesaurus'\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n [clearOnSelection]=\"true\"\n [minCharacterCount]=\"0\"\n [allowSubmit]=\"false\"\n ></gn-ui-autocomplete>\n <div class=\"flex gap-2 flex-wrap\">\n <gn-ui-badge\n *ngFor=\"let keyword of control.value; let index = index\"\n [removable]=\"true\"\n (badgeRemoveClicked)=\"removeKeyword(index)\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n</div>\n" }]
35744
+ ], template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-autocomplete\n [placeholder]=\"'Search for keywords in all thesaurus'\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n [preventCompleteOnSelection]=\"true\"\n [minCharacterCount]=\"0\"\n [allowSubmit]=\"false\"\n ></gn-ui-autocomplete>\n <div class=\"flex gap-2 flex-wrap\">\n <gn-ui-badge\n *ngFor=\"let keyword of control.value; let index = index\"\n [removable]=\"true\"\n (badgeRemoveClicked)=\"removeKeyword(index)\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n</div>\n" }]
34795
35745
  }], ctorParameters: function () { return [{ type: PlatformServiceInterface }]; }, propDecorators: { control: [{
34796
35746
  type: Input
34797
35747
  }] } });
@@ -34939,7 +35889,7 @@ class FormFieldTemporalExtentsComponent {
34939
35889
  }
34940
35890
  resetValueFromInput(value) {
34941
35891
  this.array.clear({ emitEvent: false });
34942
- this.elements = [];
35892
+ let newElements = [];
34943
35893
  value.forEach((v) => {
34944
35894
  if ('start' in v && 'end' in v) {
34945
35895
  const rangeControl = new FormControl({
@@ -34947,8 +35897,8 @@ class FormFieldTemporalExtentsComponent {
34947
35897
  end: v.end,
34948
35898
  });
34949
35899
  this.array.push(rangeControl, { emitEvent: false });
34950
- this.elements = [
34951
- ...this.elements,
35900
+ newElements = [
35901
+ ...newElements,
34952
35902
  {
34953
35903
  component: FormFieldTemporalExtentsRangeComponent,
34954
35904
  inputs: {
@@ -34960,8 +35910,8 @@ class FormFieldTemporalExtentsComponent {
34960
35910
  else {
34961
35911
  const dateControl = new FormControl({ start: v.start });
34962
35912
  this.array.push(dateControl, { emitEvent: false });
34963
- this.elements = [
34964
- ...this.elements,
35913
+ newElements = [
35914
+ ...newElements,
34965
35915
  {
34966
35916
  component: FormFieldTemporalExtentsDateComponent,
34967
35917
  inputs: {
@@ -34971,6 +35921,7 @@ class FormFieldTemporalExtentsComponent {
34971
35921
  ];
34972
35922
  }
34973
35923
  });
35924
+ this.elements = newElements;
34974
35925
  }
34975
35926
  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 }); }
34976
35927
  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 }); }
@@ -35224,13 +36175,399 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35224
36175
  type: Input
35225
36176
  }] } });
35226
36177
 
36178
+ class OverviewUploadComponent {
36179
+ constructor(recordsApiService, cd) {
36180
+ this.recordsApiService = recordsApiService;
36181
+ this.cd = cd;
36182
+ this.overviewChange = new EventEmitter();
36183
+ this.altTextChange = new EventEmitter();
36184
+ this.errorHandle = (error) => {
36185
+ console.error(error);
36186
+ this.resourceUrl = '';
36187
+ this.resourceAltText = '';
36188
+ this.resourceFileName = '';
36189
+ this.overviewChange.emit(null);
36190
+ this.cd.markForCheck();
36191
+ };
36192
+ }
36193
+ ngOnInit() {
36194
+ this.recordsApiService.getAllResources(this.metadataUuid).subscribe({
36195
+ next: (resources) => {
36196
+ if (resources && resources.length > 0) {
36197
+ this.resourceUrl = resources[0].url;
36198
+ this.resourceFileName = resources[0].filename;
36199
+ if (!this.resourceAltText) {
36200
+ this.resourceAltText = this.resourceFileName;
36201
+ }
36202
+ }
36203
+ else {
36204
+ this.resourceUrl = '';
36205
+ this.resourceAltText = '';
36206
+ this.resourceFileName = '';
36207
+ }
36208
+ this.cd.markForCheck();
36209
+ },
36210
+ error: this.errorHandle,
36211
+ });
36212
+ }
36213
+ handleFileChange(file) {
36214
+ this.recordsApiService
36215
+ .putResource(this.metadataUuid, file, 'public')
36216
+ .subscribe({
36217
+ next: (resource) => {
36218
+ this.resourceUrl = resource.url;
36219
+ this.resourceAltText = resource.filename;
36220
+ this.overviewChange.emit({
36221
+ url: new URL(resource.url),
36222
+ description: resource.filename,
36223
+ });
36224
+ this.cd.markForCheck();
36225
+ },
36226
+ error: this.errorHandle,
36227
+ });
36228
+ }
36229
+ handleUrlChange(url) {
36230
+ this.recordsApiService
36231
+ .putResourceFromURL(this.metadataUuid, url, 'public')
36232
+ .subscribe({
36233
+ next: (resource) => {
36234
+ this.resourceUrl = resource.url;
36235
+ this.resourceAltText = resource.filename;
36236
+ this.overviewChange.emit({
36237
+ url: new URL(resource.url),
36238
+ description: resource.filename,
36239
+ });
36240
+ this.cd.markForCheck();
36241
+ },
36242
+ error: this.errorHandle,
36243
+ });
36244
+ }
36245
+ handleAltTextChange(newAltText) {
36246
+ this.resourceAltText = newAltText;
36247
+ this.overviewChange.emit({
36248
+ url: new URL(this.resourceUrl),
36249
+ description: this.resourceAltText,
36250
+ });
36251
+ this.cd.markForCheck();
36252
+ }
36253
+ handleDelete() {
36254
+ //this.formControl.markAsDirty()
36255
+ this.recordsApiService
36256
+ .delResource(this.metadataUuid, this.resourceFileName)
36257
+ .subscribe({
36258
+ next: () => {
36259
+ this.resourceAltText = '';
36260
+ this.resourceUrl = '';
36261
+ this.overviewChange.emit(null);
36262
+ this.cd.markForCheck();
36263
+ },
36264
+ error: this.errorHandle,
36265
+ });
36266
+ }
36267
+ ngOnChanges(changes) {
36268
+ const overviewChanges = changes['formControl'];
36269
+ if (overviewChanges &&
36270
+ overviewChanges.currentValue !== overviewChanges.previousValue) {
36271
+ let overview;
36272
+ if (overviewChanges.currentValue.value &&
36273
+ overviewChanges.currentValue.value.length > 0) {
36274
+ overview = overviewChanges.currentValue.value[0];
36275
+ }
36276
+ else {
36277
+ return;
36278
+ }
36279
+ if (overview.description) {
36280
+ this.resourceAltText = overview.description;
36281
+ this.cd.markForCheck();
36282
+ }
36283
+ }
36284
+ }
36285
+ 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 }); }
36286
+ 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 }); }
36287
+ }
36288
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OverviewUploadComponent, decorators: [{
36289
+ type: Component,
36290
+ 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" }]
36291
+ }], ctorParameters: function () { return [{ type: RecordsApiService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { metadataUuid: [{
36292
+ type: Input
36293
+ }], formControl: [{
36294
+ type: Input
36295
+ }], overviewChange: [{
36296
+ type: Output
36297
+ }], altTextChange: [{
36298
+ type: Output
36299
+ }] } });
36300
+
36301
+ class FormFieldOverviewsComponent {
36302
+ handleOverviewChange(overView) {
36303
+ this.control.setValue(overView ? [overView] : []);
36304
+ }
36305
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldOverviewsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36306
+ 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 }); }
36307
+ }
36308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldOverviewsComponent, decorators: [{
36309
+ type: Component,
36310
+ 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" }]
36311
+ }], propDecorators: { metadataUuid: [{
36312
+ type: Input
36313
+ }], control: [{
36314
+ type: Input
36315
+ }] } });
36316
+
36317
+ const RoleValues = [
36318
+ 'unspecified',
36319
+ 'other',
36320
+ 'author',
36321
+ 'collaborator',
36322
+ 'contributor',
36323
+ 'custodian',
36324
+ 'distributor',
36325
+ 'editor',
36326
+ 'funder',
36327
+ 'mediator',
36328
+ 'originator',
36329
+ 'owner',
36330
+ 'point_of_contact',
36331
+ 'principal_investigator',
36332
+ 'processor',
36333
+ 'publisher',
36334
+ 'resource_provider',
36335
+ 'rights_holder',
36336
+ 'sponsor',
36337
+ 'stakeholder',
36338
+ 'user', // Party who uses the resource
36339
+ ];
36340
+ const RoleLabels = new Map([
36341
+ ['unspecified', marker('domain.contact.role.unspecified')],
36342
+ ['other', marker('domain.contact.role.other')],
36343
+ ['author', marker('domain.contact.role.author')],
36344
+ ['collaborator', marker('domain.contact.role.collaborator')],
36345
+ ['contributor', marker('domain.contact.role.contributor')],
36346
+ ['custodian', marker('domain.contact.role.custodian')],
36347
+ ['distributor', marker('domain.contact.role.distributor')],
36348
+ ['editor', marker('domain.contact.role.editor')],
36349
+ ['funder', marker('domain.contact.role.funder')],
36350
+ ['mediator', marker('domain.contact.role.mediator')],
36351
+ ['originator', marker('domain.contact.role.originator')],
36352
+ ['owner', marker('domain.contact.role.owner')],
36353
+ ['point_of_contact', marker('domain.contact.role.point_of_contact')],
36354
+ [
36355
+ 'principal_investigator',
36356
+ marker('domain.contact.role.principal_investigator'),
36357
+ ],
36358
+ ['processor', marker('domain.contact.role.processor')],
36359
+ ['publisher', marker('domain.contact.role.publisher')],
36360
+ ['resource_provider', marker('domain.contact.role.resource_provider')],
36361
+ ['rights_holder', marker('domain.contact.role.rights_holder')],
36362
+ ['sponsor', marker('domain.contact.role.sponsor')],
36363
+ ['stakeholder', marker('domain.contact.role.stakeholder')],
36364
+ ['user', marker('domain.contact.role.user')],
36365
+ ]);
36366
+
36367
+ marker('domain.record.updateFrequency.unknown');
36368
+ marker('domain.record.updateFrequency.notPlanned');
36369
+ marker('domain.record.updateFrequency.asNeeded');
36370
+ marker('domain.record.updateFrequency.irregular');
36371
+ marker('domain.record.updateFrequency.continual');
36372
+ marker('domain.record.updateFrequency.periodic');
36373
+ marker('domain.record.updateFrequency.day');
36374
+ marker('domain.record.updateFrequency.week');
36375
+ marker('domain.record.updateFrequency.month');
36376
+ marker('domain.record.updateFrequency.year');
36377
+ marker('domain.record.status.completed');
36378
+ marker('domain.record.status.ongoing');
36379
+ marker('domain.record.status.under_development');
36380
+ marker('domain.record.status.deprecated');
36381
+ marker('domain.record.status.removed');
36382
+ const RecordStatusValues = [
36383
+ 'completed',
36384
+ 'ongoing',
36385
+ 'under_development',
36386
+ 'deprecated',
36387
+ 'removed',
36388
+ ];
36389
+
36390
+ class ContactCardComponent {
36391
+ constructor() {
36392
+ this.removable = true;
36393
+ this.contactRemoved = new EventEmitter();
36394
+ }
36395
+ removeContact(contact) {
36396
+ this.contactRemoved.emit(contact);
36397
+ }
36398
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContactCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36399
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ContactCardComponent, isStandalone: true, selector: "gn-ui-contact-card", inputs: { contact: "contact", removable: "removable" }, outputs: { contactRemoved: "contactRemoved" }, ngImport: i0, template: "<div class=\"flex flex-row gap-4 items-center\">\n <div class=\"flex flex-row border border-gray-200 rounded-xl p-4 gap-4 w-full\">\n <gn-ui-thumbnail\n class=\"w-[56px] h-[56px] rounded-[4px]\"\n [thumbnailUrl]=\"contact.organization.logoUrl?.href\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n <div class=\"flex flex-col w-full\">\n <div class=\"flex flex-row justify-between\">\n <span class=\"flex flex-wrap font-bold w-full\"\n >{{ contact.firstName }} {{ contact.lastName }}</span\n >\n </div>\n <div>{{ contact.email }}</div>\n </div>\n </div>\n <gn-ui-button\n *ngIf=\"removable\"\n data-test=\"removeContactButton\"\n type=\"light\"\n extraClass=\"w-[20px] h-[20px] flex items-center justify-center\"\n (buttonClick)=\"removeContact(contact)\"\n ><span class=\"material-symbols-outlined\"> close </span>\n </gn-ui-button>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36400
+ }
36401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContactCardComponent, decorators: [{
36402
+ type: Component,
36403
+ args: [{ selector: 'gn-ui-contact-card', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, MatIconModule, ButtonComponent, ThumbnailComponent], template: "<div class=\"flex flex-row gap-4 items-center\">\n <div class=\"flex flex-row border border-gray-200 rounded-xl p-4 gap-4 w-full\">\n <gn-ui-thumbnail\n class=\"w-[56px] h-[56px] rounded-[4px]\"\n [thumbnailUrl]=\"contact.organization.logoUrl?.href\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n <div class=\"flex flex-col w-full\">\n <div class=\"flex flex-row justify-between\">\n <span class=\"flex flex-wrap font-bold w-full\"\n >{{ contact.firstName }} {{ contact.lastName }}</span\n >\n </div>\n <div>{{ contact.email }}</div>\n </div>\n </div>\n <gn-ui-button\n *ngIf=\"removable\"\n data-test=\"removeContactButton\"\n type=\"light\"\n extraClass=\"w-[20px] h-[20px] flex items-center justify-center\"\n (buttonClick)=\"removeContact(contact)\"\n ><span class=\"material-symbols-outlined\"> close </span>\n </gn-ui-button>\n</div>\n" }]
36404
+ }], propDecorators: { contact: [{
36405
+ type: Input
36406
+ }], removable: [{
36407
+ type: Input
36408
+ }], contactRemoved: [{
36409
+ type: Output
36410
+ }] } });
36411
+
36412
+ class FormFieldContactsForResourceComponent {
36413
+ constructor(platformServiceInterface, organizationsServiceInterface, changeDetectorRef) {
36414
+ this.platformServiceInterface = platformServiceInterface;
36415
+ this.organizationsServiceInterface = organizationsServiceInterface;
36416
+ this.changeDetectorRef = changeDetectorRef;
36417
+ this.subscription = new Subscription();
36418
+ this.contactsForRessourceByRole = new Map();
36419
+ this.contactsAsDynElemByRole = new Map();
36420
+ this.rolesToPick = [
36421
+ 'resource_provider',
36422
+ 'custodian',
36423
+ 'owner',
36424
+ 'point_of_contact',
36425
+ 'author',
36426
+ ];
36427
+ this.roleSectionsToDisplay = [];
36428
+ this.allOrganizations = new Map();
36429
+ /**
36430
+ * gn-ui-autocomplete
36431
+ */
36432
+ this.displayWithFn = (user) => `${user.name} ${user.surname} ${user.organisation ? `(${user.organisation})` : ''}`;
36433
+ /**
36434
+ * gn-ui-autocomplete
36435
+ */
36436
+ this.autoCompleteAction = (query) => {
36437
+ const fuzzyFilter = createFuzzyFilter(query);
36438
+ return this.allUsers$.pipe(switchMap((users) => [
36439
+ users.filter((user) => fuzzyFilter(user.username)),
36440
+ ]), map$1((results) => results.slice(0, 10)), debounceTime$1(300), distinctUntilChanged$1());
36441
+ };
36442
+ this.allUsers$ = this.platformServiceInterface.getUsers();
36443
+ }
36444
+ async ngOnInit() {
36445
+ this.allOrganizations = new Map((await firstValueFrom(this.organizationsServiceInterface.organisations$)).map((organization) => [organization.name, organization]));
36446
+ this.updateContactsForRessource();
36447
+ this.manageRoleSectionsToDisplay(this.control.value);
36448
+ this.filterRolesToPick();
36449
+ this.changeDetectorRef.markForCheck();
36450
+ this.subscription.add(this.control.valueChanges.subscribe((contactsForResource) => {
36451
+ this.updateContactsForRessource();
36452
+ this.manageRoleSectionsToDisplay(contactsForResource);
36453
+ this.filterRolesToPick();
36454
+ this.changeDetectorRef.markForCheck();
36455
+ }));
36456
+ }
36457
+ addRoleToDisplay(roleToAdd) {
36458
+ this.roleSectionsToDisplay.push(roleToAdd);
36459
+ this.filterRolesToPick();
36460
+ }
36461
+ filterRolesToPick() {
36462
+ this.rolesToPick = this.rolesToPick.filter((role) => !this.roleSectionsToDisplay.includes(role));
36463
+ }
36464
+ updateContactsForRessource() {
36465
+ this.contactsForRessourceByRole = this.control.value.reduce((acc, contact) => {
36466
+ const completeOrganization = this.allOrganizations.get(contact.organization.name);
36467
+ const updatedContact = {
36468
+ ...contact,
36469
+ organization: completeOrganization ??
36470
+ { name: contact.organization.name },
36471
+ };
36472
+ if (!acc.has(contact.role)) {
36473
+ acc.set(contact.role, []);
36474
+ }
36475
+ acc.get(contact.role).push(updatedContact);
36476
+ return acc;
36477
+ }, new Map());
36478
+ this.contactsAsDynElemByRole = this.control.value.reduce((acc, contact) => {
36479
+ const completeOrganization = this.allOrganizations.get(contact.organization.name);
36480
+ const updatedContact = {
36481
+ ...contact,
36482
+ organization: completeOrganization ??
36483
+ { name: contact.organization.name },
36484
+ };
36485
+ const contactAsDynElem = {
36486
+ component: ContactCardComponent,
36487
+ inputs: {
36488
+ contact: updatedContact,
36489
+ removable: false,
36490
+ },
36491
+ };
36492
+ if (!acc.has(contact.role)) {
36493
+ acc.set(contact.role, []);
36494
+ }
36495
+ acc.get(contact.role).push(contactAsDynElem);
36496
+ return acc;
36497
+ }, new Map());
36498
+ this.changeDetectorRef.markForCheck();
36499
+ }
36500
+ manageRoleSectionsToDisplay(contactsForResource) {
36501
+ const roles = contactsForResource.map((contact) => contact.role);
36502
+ roles.forEach((role) => {
36503
+ if (!this.roleSectionsToDisplay.includes(role)) {
36504
+ this.roleSectionsToDisplay.push(role);
36505
+ }
36506
+ });
36507
+ }
36508
+ removeContact(index) {
36509
+ const newContactsforRessource = this.control.value.filter((_, i) => i !== index);
36510
+ this.control.setValue(newContactsforRessource);
36511
+ }
36512
+ handleContactsChanged(event) {
36513
+ const newContactsOrdered = event.map((contactAsDynElem) => contactAsDynElem.inputs['contact']);
36514
+ const role = newContactsOrdered[0].role;
36515
+ this.contactsForRessourceByRole.set(role, newContactsOrdered);
36516
+ const newControlValue = Array.from(this.contactsForRessourceByRole.values()).flat();
36517
+ this.control.setValue(newControlValue);
36518
+ }
36519
+ roleToLabel(role) {
36520
+ return RoleLabels.get(role);
36521
+ }
36522
+ /**
36523
+ * gn-ui-autocomplete
36524
+ */
36525
+ addContact(contact, role) {
36526
+ const newContactsForRessource = {
36527
+ firstName: contact.name ?? '',
36528
+ lastName: contact.surname ?? '',
36529
+ organization: this.allOrganizations.get(contact.organisation) ??
36530
+ { name: contact.organisation },
36531
+ email: contact.email ?? '',
36532
+ role,
36533
+ address: '',
36534
+ phone: '',
36535
+ position: '',
36536
+ };
36537
+ const newControlValue = [...this.control.value, newContactsForRessource];
36538
+ this.control.setValue(newControlValue);
36539
+ }
36540
+ ngOnDestroy() {
36541
+ this.subscription.unsubscribe();
36542
+ }
36543
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldContactsForResourceComponent, deps: [{ token: PlatformServiceInterface }, { token: OrganizationsServiceInterface }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
36544
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FormFieldContactsForResourceComponent, isStandalone: true, selector: "gn-ui-form-field-contacts-for-resource", inputs: { control: "control" }, ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row flex-wrap gap-2\" data-test=\"rolesToPick\">\n <ng-container *ngFor=\"let role of rolesToPick\">\n <gn-ui-button\n extraClass=\"px-2 py-1.5\"\n (buttonClick)=\"addRoleToDisplay(role)\"\n >\n <div class=\"flex flex-row gap-1 items-center\">\n <span class=\"text-primary text-[20px] leading-[0] font-bold pb-[5px]\"\n >&#8330;</span\n >\n <span class=\"font-bold\" translate>{{ roleToLabel(role) }}</span>\n </div>\n </gn-ui-button>\n </ng-container>\n </div>\n <div\n class=\"mt-8\"\n *ngIf=\"\n roleSectionsToDisplay && roleSectionsToDisplay.length > 0;\n else noContact\n \"\n data-test=\"displayedRoles\"\n >\n <div\n *ngFor=\"\n let role of roleSectionsToDisplay;\n let index = index;\n let isLast = last\n \"\n class=\"flex flex-col gap-4\"\n >\n <div class=\"flex flex-row justify-between\">\n <span class=\"font-bold text-base\" translate>{{\n roleToLabel(role)\n }}</span>\n </div>\n\n <gn-ui-autocomplete\n [placeholder]=\"'Choose a contact'\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"addContact($event, role)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"1\"\n [clearOnSelection]=\"true\"\n >\n </gn-ui-autocomplete>\n\n <ng-container *ngIf=\"contactsForRessourceByRole.get(role) as contacts\">\n <ng-container *ngIf=\"contacts.length > 1\">\n <gn-ui-sortable-list\n [elements]=\"contactsAsDynElemByRole.get(role)\"\n (elementsChange)=\"handleContactsChanged($event)\"\n ></gn-ui-sortable-list>\n </ng-container>\n <ng-container *ngIf=\"contacts.length === 1\">\n <ng-container *ngFor=\"let contact of contacts\">\n <gn-ui-contact-card\n [contact]=\"contact\"\n (contactRemoved)=\"removeContact(index)\"\n ></gn-ui-contact-card> </ng-container\n ></ng-container>\n </ng-container>\n\n <hr class=\"border-t-[#D6D3D1] mt-4 mb-6\" *ngIf=\"!isLast\" />\n </div>\n </div>\n <ng-template #noContact>\n <div\n class=\"p-4 border border-primary bg-primary-lightest rounded-lg\"\n translate\n >\n editor.record.form.field.contactsForResource.noContact\n </div>\n </ng-template>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { 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: "ngmodule", type: UiWidgetsModule }, { kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ContactCardComponent, selector: "gn-ui-contact-card", inputs: ["contact", "removable"], outputs: ["contactRemoved"] }, { kind: "component", type: SortableListComponent, selector: "gn-ui-sortable-list", inputs: ["elements", "addOptions"], outputs: ["elementsChange", "add"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36545
+ }
36546
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldContactsForResourceComponent, decorators: [{
36547
+ type: Component,
36548
+ args: [{ selector: 'gn-ui-form-field-contacts-for-resource', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
36549
+ DropdownSelectorComponent,
36550
+ UiInputsModule,
36551
+ CommonModule,
36552
+ UiWidgetsModule,
36553
+ AutocompleteComponent,
36554
+ TranslateModule,
36555
+ ContactCardComponent,
36556
+ SortableListComponent,
36557
+ ], template: "<div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row flex-wrap gap-2\" data-test=\"rolesToPick\">\n <ng-container *ngFor=\"let role of rolesToPick\">\n <gn-ui-button\n extraClass=\"px-2 py-1.5\"\n (buttonClick)=\"addRoleToDisplay(role)\"\n >\n <div class=\"flex flex-row gap-1 items-center\">\n <span class=\"text-primary text-[20px] leading-[0] font-bold pb-[5px]\"\n >&#8330;</span\n >\n <span class=\"font-bold\" translate>{{ roleToLabel(role) }}</span>\n </div>\n </gn-ui-button>\n </ng-container>\n </div>\n <div\n class=\"mt-8\"\n *ngIf=\"\n roleSectionsToDisplay && roleSectionsToDisplay.length > 0;\n else noContact\n \"\n data-test=\"displayedRoles\"\n >\n <div\n *ngFor=\"\n let role of roleSectionsToDisplay;\n let index = index;\n let isLast = last\n \"\n class=\"flex flex-col gap-4\"\n >\n <div class=\"flex flex-row justify-between\">\n <span class=\"font-bold text-base\" translate>{{\n roleToLabel(role)\n }}</span>\n </div>\n\n <gn-ui-autocomplete\n [placeholder]=\"'Choose a contact'\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"addContact($event, role)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"1\"\n [clearOnSelection]=\"true\"\n >\n </gn-ui-autocomplete>\n\n <ng-container *ngIf=\"contactsForRessourceByRole.get(role) as contacts\">\n <ng-container *ngIf=\"contacts.length > 1\">\n <gn-ui-sortable-list\n [elements]=\"contactsAsDynElemByRole.get(role)\"\n (elementsChange)=\"handleContactsChanged($event)\"\n ></gn-ui-sortable-list>\n </ng-container>\n <ng-container *ngIf=\"contacts.length === 1\">\n <ng-container *ngFor=\"let contact of contacts\">\n <gn-ui-contact-card\n [contact]=\"contact\"\n (contactRemoved)=\"removeContact(index)\"\n ></gn-ui-contact-card> </ng-container\n ></ng-container>\n </ng-container>\n\n <hr class=\"border-t-[#D6D3D1] mt-4 mb-6\" *ngIf=\"!isLast\" />\n </div>\n </div>\n <ng-template #noContact>\n <div\n class=\"p-4 border border-primary bg-primary-lightest rounded-lg\"\n translate\n >\n editor.record.form.field.contactsForResource.noContact\n </div>\n </ng-template>\n</div>\n" }]
36558
+ }], ctorParameters: function () { return [{ type: PlatformServiceInterface }, { type: OrganizationsServiceInterface }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { control: [{
36559
+ type: Input
36560
+ }] } });
36561
+
35227
36562
  class FormFieldComponent {
35228
36563
  set value(v) {
35229
36564
  this.formControl.setValue(v, {
35230
36565
  emitEvent: false,
35231
36566
  });
35232
36567
  }
35233
- constructor() {
36568
+ constructor(facade) {
36569
+ this.facade = facade;
36570
+ this.metadataUuid$ = this.facade.record$.pipe(take(1), map$1((record) => record.uniqueIdentifier));
35234
36571
  this.formControl = new FormControl();
35235
36572
  this.valueChange = this.formControl.valueChanges;
35236
36573
  }
@@ -35258,6 +36595,9 @@ class FormFieldComponent {
35258
36595
  get isSpatialExtentField() {
35259
36596
  return this.model === 'spatialExtents';
35260
36597
  }
36598
+ get isGraphicOverview() {
36599
+ return this.model === 'overviews';
36600
+ }
35261
36601
  get isSimpleField() {
35262
36602
  return this.model === 'uniqueIdentifier' || this.model === 'recordUpdated';
35263
36603
  }
@@ -35267,11 +36607,14 @@ class FormFieldComponent {
35267
36607
  get isKeywords() {
35268
36608
  return this.model === 'keywords';
35269
36609
  }
36610
+ get isContactsForResource() {
36611
+ return this.model === 'contactsForResource';
36612
+ }
35270
36613
  get withoutWrapper() {
35271
36614
  return this.model === 'title' || this.model === 'abstract';
35272
36615
  }
35273
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35274
- 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 }); }
36616
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
36617
+ 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-container *ngIf=\"isContactsForResource\">\n <gn-ui-form-field-contacts-for-resource\n [control]=\"formControl\"\n ></gn-ui-form-field-contacts-for-resource>\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"] }, { kind: "component", type: FormFieldContactsForResourceComponent, selector: "gn-ui-form-field-contacts-for-resource", inputs: ["control"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35275
36618
  }
35276
36619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormFieldComponent, decorators: [{
35277
36620
  type: Component,
@@ -35294,8 +36637,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35294
36637
  FormFieldArrayComponent,
35295
36638
  FormFieldKeywordsComponent,
35296
36639
  TranslateModule,
35297
- ], 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" }]
35298
- }], ctorParameters: function () { return []; }, propDecorators: { model: [{
36640
+ FormFieldOverviewsComponent,
36641
+ FormFieldContactsForResourceComponent,
36642
+ ], 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-container *ngIf=\"isContactsForResource\">\n <gn-ui-form-field-contacts-for-resource\n [control]=\"formControl\"\n ></gn-ui-form-field-contacts-for-resource>\n </ng-container>\n</ng-template>\n" }]
36643
+ }], ctorParameters: function () { return [{ type: EditorFacade }]; }, propDecorators: { model: [{
35299
36644
  type: Input
35300
36645
  }], config: [{
35301
36646
  type: Input
@@ -35311,23 +36656,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35311
36656
  class RecordFormComponent {
35312
36657
  constructor(facade) {
35313
36658
  this.facade = facade;
35314
- this.fields$ = this.facade.recordFields$;
35315
36659
  }
35316
- handleFieldValueChange(field, newValue) {
35317
- if (!field.config.model) {
36660
+ handleFieldValueChange(model, newValue) {
36661
+ if (!model) {
35318
36662
  return;
35319
36663
  }
35320
- this.facade.updateRecordField(field.config.model, newValue);
36664
+ this.facade.updateRecordField(model, newValue);
35321
36665
  }
35322
36666
  fieldTracker(index, field) {
35323
36667
  return field.config.model;
35324
36668
  }
36669
+ sectionTracker(index, section) {
36670
+ return section.labelKey;
36671
+ }
35325
36672
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
35326
- 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 }); }
36673
+ 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-title 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 }); }
35327
36674
  }
35328
36675
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RecordFormComponent, decorators: [{
35329
36676
  type: Component,
35330
- 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" }]
36677
+ 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-title 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" }]
35331
36678
  }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
35332
36679
 
35333
36680
  const ROUTER_STATE_KEY = 'router';
@@ -35377,7 +36724,7 @@ class RouterService {
35377
36724
  getOrganizationPageRoute() {
35378
36725
  return ROUTER_ROUTE_ORGANIZATION;
35379
36726
  }
35380
- 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 }); }
36727
+ 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 }); }
35381
36728
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterService, providedIn: 'root' }); }
35382
36729
  }
35383
36730
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterService, decorators: [{
@@ -35388,7 +36735,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35388
36735
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
35389
36736
  type: Inject,
35390
36737
  args: [ROUTER_CONFIG]
35391
- }] }, { type: i1$7.Router }]; } });
36738
+ }] }, { type: i1$8.Router }]; } });
35392
36739
 
35393
36740
  const goAction = createAction('[Router] Go', props());
35394
36741
  const backAction = createAction('[Router] Back');
@@ -35645,12 +36992,12 @@ class RouterEffects {
35645
36992
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
35646
36993
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
35647
36994
  }
35648
- 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 }); }
36995
+ 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 }); }
35649
36996
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterEffects }); }
35650
36997
  }
35651
36998
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RouterEffects, decorators: [{
35652
36999
  type: Injectable
35653
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: i1$7.Router }, { type: i1$3.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
37000
+ }], ctorParameters: function () { return [{ type: i1$9.Actions }, { type: i1$8.Router }, { type: i1$3.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
35654
37001
  type: Inject,
35655
37002
  args: [ROUTER_CONFIG]
35656
37003
  }] }, { type: FieldsService }]; } });
@@ -35667,7 +37014,7 @@ class DefaultRouterModule {
35667
37014
  };
35668
37015
  }
35669
37016
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
35670
- 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] }); }
37017
+ 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] }); }
35671
37018
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultRouterModule, providers: [
35672
37019
  RouterFacade,
35673
37020
  {
@@ -35710,5 +37057,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
35710
37057
  * Generated bundle index. Do not edit.
35711
37058
  */
35712
37059
 
35713
- 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 };
37060
+ 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 };
35714
37061
  //# sourceMappingURL=geonetwork-ui.mjs.map