geonetwork-ui 2.2.0-dev.81737006 → 2.2.0-dev.8cce3b0e

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 (372) 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/gn4.field.mapper.mjs +77 -52
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +5 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +16 -11
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -16
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +21 -18
  7. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  10. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  11. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  12. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  15. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  16. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  17. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  19. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  20. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  21. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  22. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  23. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  24. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +1 -1
  25. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +106 -0
  26. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +64 -0
  27. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +63 -0
  28. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  29. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  30. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +26 -3
  31. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  32. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  33. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +6 -3
  34. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +11 -1
  35. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  36. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  37. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  38. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  39. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  40. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +7 -4
  41. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  42. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  43. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  44. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  45. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  46. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +3 -3
  47. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  48. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  49. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  50. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  51. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  52. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +4 -4
  53. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +1 -1
  54. package/esm2022/libs/ui/elements/src/index.mjs +4 -1
  55. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  56. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +27 -0
  57. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +17 -0
  58. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  59. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -16
  60. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +2 -3
  61. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  62. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +3 -3
  63. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +7 -3
  64. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +16 -4
  65. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  66. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  67. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +3 -3
  68. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  69. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  70. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  71. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  72. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +2 -2
  73. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  74. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +12 -7
  75. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  76. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  77. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  78. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  79. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  80. package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +1 -1
  81. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +1 -1
  82. package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +1 -1
  83. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +1 -1
  84. package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +1 -1
  85. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  86. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  87. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  88. package/esm2022/translations/de.json +106 -89
  89. package/esm2022/translations/en.json +42 -25
  90. package/esm2022/translations/es.json +21 -4
  91. package/esm2022/translations/fr.json +26 -9
  92. package/esm2022/translations/it.json +33 -16
  93. package/esm2022/translations/nl.json +21 -4
  94. package/esm2022/translations/pt.json +21 -4
  95. package/fesm2022/geonetwork-ui.mjs +1380 -793
  96. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  97. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  98. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  99. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  100. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  101. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  102. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  103. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
  104. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  105. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  106. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  107. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  108. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  109. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  110. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  111. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  112. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  113. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  114. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  115. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  116. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +15 -15
  117. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  118. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  119. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  120. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  121. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  122. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  123. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  124. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  125. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  126. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  127. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  128. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  129. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  130. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  131. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  132. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  133. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  134. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  135. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  136. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  137. package/libs/feature/map/src/index.d.ts +1 -0
  138. package/libs/feature/map/src/index.d.ts.map +1 -1
  139. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +22 -0
  140. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -0
  141. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +22 -0
  142. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -0
  143. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +22 -0
  144. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -0
  145. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  146. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  147. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  148. package/libs/feature/map/src/lib/feature-map.module.d.ts +16 -12
  149. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  150. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  151. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  152. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  153. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  154. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +2 -0
  155. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  156. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  157. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  158. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  159. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  160. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  161. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  162. package/libs/feature/search/src/index.d.ts +3 -0
  163. package/libs/feature/search/src/index.d.ts.map +1 -1
  164. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +5 -4
  165. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  166. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  167. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  168. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  169. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  170. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  171. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  172. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  173. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  174. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  175. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  176. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  177. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  178. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  179. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  180. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  181. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  182. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  183. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  184. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  185. package/libs/ui/elements/src/index.d.ts +3 -0
  186. package/libs/ui/elements/src/index.d.ts.map +1 -1
  187. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  188. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +10 -0
  189. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -0
  190. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +8 -0
  191. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -0
  192. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +7 -2
  193. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  194. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  195. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  196. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  197. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +3 -2
  198. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  199. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -11
  200. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  201. package/libs/ui/inputs/src/index.d.ts +1 -0
  202. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  203. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  204. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  205. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  206. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  207. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  208. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  209. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -39
  210. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  211. package/libs/ui/layout/src/index.d.ts +2 -0
  212. package/libs/ui/layout/src/index.d.ts.map +1 -1
  213. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  214. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  215. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  216. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  217. package/libs/ui/search/src/index.d.ts +0 -1
  218. package/libs/ui/search/src/index.d.ts.map +1 -1
  219. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  220. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  221. package/libs/util/i18n/src/index.d.ts +0 -1
  222. package/libs/util/i18n/src/index.d.ts.map +1 -1
  223. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  224. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  225. package/package.json +4 -1
  226. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
  227. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
  228. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
  229. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  230. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +112 -65
  231. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +4 -2
  232. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
  233. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
  234. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
  235. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  236. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  237. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  238. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  239. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  240. package/src/libs/common/domain/src/lib/index.ts +2 -0
  241. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +17 -18
  242. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  243. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  244. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  245. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  246. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  247. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  248. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  249. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  250. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  251. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -2
  252. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  253. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  254. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  255. package/src/libs/feature/map/src/index.ts +1 -0
  256. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.css +0 -0
  257. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +21 -0
  258. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +107 -0
  259. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.css +0 -0
  260. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +37 -0
  261. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +64 -0
  262. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.css +0 -0
  263. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +55 -0
  264. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +63 -0
  265. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  266. package/src/libs/feature/map/src/lib/feature-map.module.ts +14 -0
  267. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  268. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  269. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  270. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  271. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +9 -3
  272. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +16 -0
  273. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  274. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  275. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  276. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  277. package/src/libs/feature/search/src/index.ts +3 -0
  278. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +12 -4
  279. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +2 -1
  280. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  281. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  282. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  283. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  284. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  285. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  286. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  287. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  288. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  289. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  290. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  291. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  292. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  293. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -0
  294. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.ts +1 -1
  295. package/src/libs/ui/elements/src/index.ts +3 -0
  296. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  297. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +0 -0
  298. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +30 -0
  299. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
  300. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  301. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  302. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  303. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +264 -0
  304. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.html +1 -0
  305. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +17 -0
  306. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +2 -2
  307. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +4 -0
  308. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +104 -50
  309. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +31 -7
  310. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +1 -2
  311. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  312. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  313. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  314. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +4 -0
  315. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +7 -0
  316. package/src/libs/ui/inputs/src/index.ts +1 -0
  317. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  318. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  319. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -0
  320. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  321. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  322. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  323. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +8 -3
  324. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.css +1 -0
  325. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  326. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +5 -2
  327. package/src/libs/ui/layout/src/index.ts +2 -0
  328. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  329. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  330. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  331. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  332. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  333. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  334. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  335. package/src/libs/ui/search/src/index.ts +0 -1
  336. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  337. package/src/libs/util/i18n/src/index.ts +0 -1
  338. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  339. package/translations/de.json +106 -89
  340. package/translations/en.json +42 -25
  341. package/translations/es.json +21 -4
  342. package/translations/fr.json +26 -9
  343. package/translations/it.json +33 -16
  344. package/translations/nl.json +21 -4
  345. package/translations/pt.json +21 -4
  346. package/translations/sk.json +21 -4
  347. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  348. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  349. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  350. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  351. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  352. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  353. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  354. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  355. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  356. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  357. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  358. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  359. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  360. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  361. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  362. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  363. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  364. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  365. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  366. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  367. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  368. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  369. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  370. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  371. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  372. /package/src/libs/feature/map/src/lib/{utils → constant}/projections.ts +0 -0
@@ -1,18 +1,18 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
2
  import format from 'date-fns/format';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ElementRef, ViewChildren } from '@angular/core';
4
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, ElementRef, ViewChildren } from '@angular/core';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
7
  import * as i1$1 from '@ngx-translate/core';
8
- import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService, TranslateFakeCompiler, TranslateDefaultParser, FakeMissingTranslationHandler } from '@ngx-translate/core';
8
+ import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
10
10
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
11
- import { map as map$1, shareReplay, filter, tap as tap$1, startWith, switchMap as switchMap$1, catchError, take, withLatestFrom, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
11
+ import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestFrom, switchMap as switchMap$1, catchError, take, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, tap as tap$2, fromEvent, timer, from, Subscription, animationFrameScheduler, firstValueFrom, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, EMPTY, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, from, Subscription, animationFrameScheduler, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
18
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
@@ -32,8 +32,8 @@ import WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';
32
32
  import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
33
33
  import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
34
34
  import WMTSCapabilities from 'ol/format/WMTSCapabilities';
35
- import { WmsEndpoint, sharedFetch, useCache, WfsEndpoint } from '@camptocamp/ogc-client';
36
35
  import chroma from 'chroma-js';
36
+ import { WmsEndpoint, WfsEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
37
37
  import { register, fromEPSGCode } from 'ol/proj/proj4';
38
38
  import proj4 from 'proj4/dist/proj4';
39
39
  import * as TOML from '@ltd/j-toml';
@@ -58,6 +58,7 @@ import * as i1$4 from '@angular/material/progress-spinner';
58
58
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
59
59
  import * as i3 from '@angular/material/tooltip';
60
60
  import { MatTooltipModule } from '@angular/material/tooltip';
61
+ import { marked } from 'marked';
61
62
  import EmblaCarousel from 'embla-carousel';
62
63
  import * as i1$6 from '@angular/cdk/overlay';
63
64
  import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
@@ -72,10 +73,13 @@ import { MatFormFieldModule } from '@angular/material/form-field';
72
73
  import * as i3$2 from '@angular/material/datepicker';
73
74
  import { MatDatepickerModule } from '@angular/material/datepicker';
74
75
  import { MatInputModule } from '@angular/material/input';
76
+ import * as basicLightbox from 'basiclightbox';
75
77
  import * as i1$8 from '@ngrx/effects';
76
78
  import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
77
79
  import tippy from 'tippy.js';
78
80
  import { valid as valid$1 } from 'geojson-validation';
81
+ import { Polygon } from 'ol/geom';
82
+ import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
79
83
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
80
84
  import * as i4$1 from '@angular/cdk/scrolling';
81
85
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -645,28 +649,32 @@ function extractStatus() {
645
649
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
646
650
  }
647
651
  // from gmd:resourceConstraints
648
- function extractAccessConstraints() {
649
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
650
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
652
+ function extractLegalConstraints() {
653
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
654
+ ...(url && { url }),
651
655
  text,
652
- type: 'other',
653
656
  })));
654
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
657
+ }
658
+ // from gmd:resourceConstraints
659
+ function extractSecurityConstraints() {
660
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
661
+ ...(url && { url }),
655
662
  text,
656
- type: 'security',
657
663
  })));
658
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
659
664
  }
660
665
  // from gmd:resourceConstraints
661
- function extractUseLimitations() {
662
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
666
+ function extractOtherConstraints() {
667
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
669
+ text,
670
+ })));
663
671
  }
664
672
  // from gmd:resourceConstraints
665
673
  function extractLicenses() {
666
- return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(pipe(findChildElement('gmd:otherConstraints'), combine(extractCharacterString(), extractUrl()), map(([text, url]) => ({
674
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
667
675
  ...(url && { url }),
668
676
  text,
669
- })))));
677
+ })));
670
678
  }
671
679
  // from gmd:MD_Distribution
672
680
  function extractDatasetDistributions() {
@@ -838,11 +846,14 @@ function readStatus(rootEl) {
838
846
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
839
847
  }
840
848
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
841
- function readAccessConstraints(rootEl) {
842
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
849
+ function readLegalConstraints(rootEl) {
850
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
843
851
  }
844
- function readUseLimitations(rootEl) {
845
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
852
+ function readSecurityConstraints(rootEl) {
853
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
854
+ }
855
+ function readOtherConstraints(rootEl) {
856
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
846
857
  }
847
858
  function readLicenses(rootEl) {
848
859
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
@@ -1075,23 +1086,23 @@ function appendKeywords(keywords, type) {
1075
1086
  ? appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', type)))
1076
1087
  : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1077
1088
  }
1078
- function removeAccessConstraints() {
1079
- const securityConstraintsFilter = pipe(findChildrenElement('gmd:MD_SecurityConstraints'), (array) => array.length > 0);
1080
- // remove legal constraints that *only* have 'otherRestrictions'
1081
- const otherConstraintsFilter = pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code === 'otherRestrictions'));
1082
- return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray((el) => securityConstraintsFilter(el) || otherConstraintsFilter(el))));
1083
- }
1084
- function createAccessConstraint(constraint) {
1085
- if (constraint.type === 'security') {
1089
+ function createConstraint(constraint, type) {
1090
+ if (type === 'security') {
1086
1091
  return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_SecurityConstraints'), appendChildren(pipe(createElement('gmd:classification'), createChild('gmd:MD_ClassificationCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode'), addAttribute('codeListValue', 'restricted')), pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1087
1092
  }
1088
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1093
+ else if (type === 'legal') {
1094
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1095
+ }
1096
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1089
1097
  }
1090
- function removeUseLimitations() {
1098
+ function removeOtherConstraints() {
1091
1099
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1092
1100
  }
1093
- function createUseLimitation(useLimitation) {
1094
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1101
+ function removeSecurityConstraints() {
1102
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1103
+ }
1104
+ function removeLegalConstraints() {
1105
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code !== 'license')))));
1095
1106
  }
1096
1107
  function removeLicenses() {
1097
1108
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.some((code) => code === 'license')))));
@@ -1195,14 +1206,17 @@ function writeKeywords(record, rootEl) {
1195
1206
  function writeThemes(record, rootEl) {
1196
1207
  pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1197
1208
  }
1198
- function writeAccessConstraints(record, rootEl) {
1199
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1200
- }
1201
1209
  function writeLicenses(record, rootEl) {
1202
1210
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1203
1211
  }
1204
- function writeUseLimitations(record, rootEl) {
1205
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1212
+ function writeLegalConstraints(record, rootEl) {
1213
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1214
+ }
1215
+ function writeSecurityConstraints(record, rootEl) {
1216
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1217
+ }
1218
+ function writeOtherConstraints(record, rootEl) {
1219
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1206
1220
  }
1207
1221
  function writeUpdateFrequency(record, rootEl) {
1208
1222
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1300,8 +1314,9 @@ function toModel(xml) {
1300
1314
  const recordCreated = recordUpdated;
1301
1315
  const keywords = readKeywords(rootEl);
1302
1316
  const themes = readThemes(rootEl);
1303
- const accessConstraints = readAccessConstraints(rootEl);
1304
- const useLimitations = readUseLimitations(rootEl);
1317
+ const legalConstraints = readLegalConstraints(rootEl);
1318
+ const otherConstraints = readOtherConstraints(rootEl);
1319
+ const securityConstraints = readSecurityConstraints(rootEl);
1305
1320
  const licenses = readLicenses(rootEl);
1306
1321
  const overviews = readOverviews(rootEl);
1307
1322
  // not used yet
@@ -1329,9 +1344,10 @@ function toModel(xml) {
1329
1344
  contactsForResource: [],
1330
1345
  keywords,
1331
1346
  themes,
1332
- accessConstraints,
1333
- useLimitations,
1334
1347
  licenses,
1348
+ legalConstraints,
1349
+ securityConstraints,
1350
+ otherConstraints,
1335
1351
  ...(datasetCreated && { datasetCreated }),
1336
1352
  ...(datasetUpdated && { datasetUpdated }),
1337
1353
  lineage,
@@ -1356,9 +1372,10 @@ function toModel(xml) {
1356
1372
  contacts,
1357
1373
  keywords,
1358
1374
  themes,
1359
- accessConstraints,
1360
- useLimitations,
1361
1375
  licenses,
1376
+ legalConstraints,
1377
+ securityConstraints,
1378
+ otherConstraints,
1362
1379
  overviews,
1363
1380
  onlineResources,
1364
1381
  };
@@ -1384,9 +1401,11 @@ function toXml(record, originalXml) {
1384
1401
  fieldChanged('contacts') && writeContacts(record, rootEl);
1385
1402
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1386
1403
  fieldChanged('themes') && writeThemes(record, rootEl);
1387
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1404
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1405
+ fieldChanged('securityConstraints') &&
1406
+ writeSecurityConstraints(record, rootEl);
1388
1407
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1389
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1408
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1390
1409
  if (record.kind === 'dataset') {
1391
1410
  writeStatus(record, rootEl);
1392
1411
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1412,6 +1431,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1412
1431
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1413
1432
  const toDate = (field) => new Date(field);
1414
1433
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1434
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1415
1435
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1416
1436
  const getAsUrl = (field, location = window.location.toString()) => {
1417
1437
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -16538,133 +16558,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16538
16558
  }]
16539
16559
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16540
16560
 
16541
- // IMPORTANT:
16542
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/test-translate-loader.service.ts
16543
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16544
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16545
- class TestTranslateLoader extends TranslateLoader {
16546
- constructor(_translations = {}) {
16547
- super();
16548
- this._translations = _translations;
16549
- }
16550
- /**
16551
- * Returns an {Observable} of translations for the specified language. If the
16552
- * language is not recognized, an empty translations object will be returned.
16553
- *
16554
- * @param language the language for which the translations should be retrieved.
16555
- * @returns the translations for the specified
16556
- * language or an empty set of translations if the language is not recognized.
16557
- */
16558
- getTranslation(language) {
16559
- return of(this._translations[language] || {});
16560
- }
16561
- }
16562
-
16563
- // IMPORTANT:
16564
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/testing.module.ts
16565
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16566
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16567
- /**
16568
- * The TranslateTestingModule provides the {TranslateModule} as well as a
16569
- * {TranslateService} configured to return translations specific for the
16570
- * test environment.
16571
- *
16572
- * @export
16573
- */
16574
- class TranslateTestingModule {
16575
- constructor() {
16576
- this._translations = {};
16577
- }
16578
- static withTranslations(languageOrTranslations, translations) {
16579
- const translateTestingModule = new TranslateTestingModule();
16580
- if (typeof languageOrTranslations === 'string') {
16581
- return translateTestingModule.withTranslations(languageOrTranslations, translations);
16582
- }
16583
- return translateTestingModule.withTranslations(languageOrTranslations);
16584
- }
16585
- get ngModule() {
16586
- return TranslateTestingModule;
16587
- }
16588
- get providers() {
16589
- const translateService = new TranslateService(null, new TestTranslateLoader(this._translations), this._compiler || new TranslateFakeCompiler(), new TranslateDefaultParser(), new FakeMissingTranslationHandler(), true, true, false, this._defaultLanguage);
16590
- return [
16591
- {
16592
- provide: TranslateService,
16593
- useValue: translateService,
16594
- },
16595
- ];
16596
- }
16597
- withTranslations(languageOrTranslations, translations) {
16598
- if (typeof languageOrTranslations === 'string' && translations) {
16599
- this.addTranslations(languageOrTranslations, translations);
16600
- this._defaultLanguage = languageOrTranslations;
16601
- }
16602
- else if (languageOrTranslations) {
16603
- Object.keys(languageOrTranslations).forEach((language) => this.addTranslations(language, languageOrTranslations[language]));
16604
- }
16605
- return this;
16606
- }
16607
- /**
16608
- * Updates the {TranslationTestingModule} to provide a {TranslateService} that will
16609
- * use the provided {TranslateCompiler} to translate the test translations.
16610
- *
16611
- * @example
16612
- *
16613
- * TranslateTestingModule.withTranslations('en', {people: '{gender, select, male{He is} female{She is} other{They are}} {how})'})
16614
- * .withCompiler(new TranslateMessageFormatCompiler());
16615
- *
16616
- * @param compiler the compiler to use to compile the test translations.
16617
- * @returns the instance that can be used to chain additional configuration.
16618
- * @memberof TranslateTestingModule
16619
- */
16620
- withCompiler(compiler) {
16621
- this._compiler = compiler;
16622
- return this;
16623
- }
16624
- /**
16625
- * Updates the {TranslateTestingModule} to use the provided language as the default language.
16626
- * By default, the default language will be set to the first language provided.
16627
- *
16628
- * @example
16629
- *
16630
- * TranslateTestingModule.withTranslations('es', SPANISH_TRANSLATIONS)
16631
- * .withTranslations('en', ENGLISH_TRANSLATIONS)
16632
- * .withDefaultLanguage('en');
16633
- *
16634
- * @param language the new default language for translations.
16635
- * @returns the instance that can be used to chain additional configuration.
16636
- * @memberof TranslateTestingModule
16637
- */
16638
- withDefaultLanguage(language) {
16639
- this._defaultLanguage = language || this._defaultLanguage;
16640
- return this;
16641
- }
16642
- addTranslations(language, translations) {
16643
- if (!this._defaultLanguage) {
16644
- this._defaultLanguage = language;
16645
- }
16646
- if (this._translations[language]) {
16647
- this._translations[language] = {
16648
- ...this._translations[language],
16649
- ...translations,
16650
- };
16651
- }
16652
- else {
16653
- this._translations[language] = translations;
16654
- }
16655
- }
16656
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16657
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule], exports: [TranslateModule] }); }
16658
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule, TranslateModule] }); }
16659
- }
16660
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, decorators: [{
16661
- type: NgModule,
16662
- args: [{
16663
- imports: [TranslateModule],
16664
- exports: [TranslateModule],
16665
- }]
16666
- }] });
16667
-
16668
16561
  var dropFile$6 = "Datei ablegen";
16669
16562
  var next$6 = "weiter";
16670
16563
  var previous$6 = "zurück";
@@ -16687,20 +16580,21 @@ var de = {
16687
16580
  "chart.type.line": "Liniendiagramm",
16688
16581
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16689
16582
  "chart.type.pie": "Kreisdiagramm",
16690
- "dashboard.labels.mySpace": "",
16691
- "dashboard.records.all": "",
16692
- "dashboard.records.myDraft": "",
16693
- "dashboard.records.myLibrary": "",
16694
- "dashboard.records.myOrg": "",
16695
- "dashboard.records.myRecords": "",
16696
- "dashboard.records.noRecord": "",
16697
- "dashboard.records.noUser": "",
16698
- "dashboard.records.publishedRecords": "",
16699
- "dashboard.records.search": "",
16700
- "dashboard.records.userDetail": "",
16701
- "dashboard.records.userEmail": "",
16702
- "dashboard.records.username": "",
16703
- "dashboard.records.users": "",
16583
+ "dashboard.createRecord": "",
16584
+ "dashboard.labels.mySpace": "Mein Bereich",
16585
+ "dashboard.records.all": "Katalog",
16586
+ "dashboard.records.myDraft": "Meine Entwürfe",
16587
+ "dashboard.records.myLibrary": "Meine Bibliothek",
16588
+ "dashboard.records.myOrg": "Meine Organisation",
16589
+ "dashboard.records.myRecords": "Meine Datensätze",
16590
+ "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16591
+ "dashboard.records.search": "Suche nach \"{searchText}\"",
16592
+ "dashboard.records.userDetail": "Name",
16593
+ "dashboard.records.userEmail": "E-Mail",
16594
+ "dashboard.records.username": "Benutzername",
16595
+ "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16596
+ "dashboard.results.listMetadata": "",
16597
+ "dashboard.results.listResources": "",
16704
16598
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16705
16599
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16706
16600
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16714,7 +16608,7 @@ var de = {
16714
16608
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
16715
16609
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
16716
16610
  "datafeeder.form.dropdown": "Für welche Skala wurde er erstellt?",
16717
- "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tags aus, die zu Ihrem Datensatz passen",
16611
+ "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tage aus, die zu Ihrem Datensatz passen",
16718
16612
  "datafeeder.form.title": "Geben Sie Ihrem Datensatz den besten Titel",
16719
16613
  "datafeeder.formsPage.title": "Erzählen Sie uns mehr über Ihren Datensatz",
16720
16614
  "datafeeder.month.april": "April",
@@ -16729,16 +16623,16 @@ var de = {
16729
16623
  "datafeeder.month.november": "November",
16730
16624
  "datafeeder.month.october": "Oktober",
16731
16625
  "datafeeder.month.september": "September",
16732
- "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist",
16733
- "datafeeder.publish.illustration.title": "Ein weiterer Datensatz zum Veröffentlichen?",
16626
+ "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist.",
16627
+ "datafeeder.publish.illustration.title": "Ein weiterer Datensatz \n zum Veröffentlichen?",
16734
16628
  "datafeeder.publish.subtitle": "Das Veröffentlichen kann einige Minuten dauern.",
16735
- "datafeeder.publish.title": "Vielen Dank! Ihr Datensatz wird veröffentlicht",
16629
+ "datafeeder.publish.title": "Vielen Dank! \n Ihr Datensatz wird veröffentlicht",
16736
16630
  "datafeeder.publish.upload": "Jetzt hochladen",
16737
16631
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
16738
16632
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
16739
16633
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
16740
16634
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
16741
- "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! Ihr Datensatz wurde veröffentlicht",
16635
+ "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
16742
16636
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
16743
16637
  "datafeeder.summarizePage.illustration": "Kein Fehler? Los geht's!",
16744
16638
  "datafeeder.summarizePage.previous": "Zurück",
@@ -16746,11 +16640,11 @@ var de = {
16746
16640
  "datafeeder.summarizePage.title": "Sie sind fast fertig...",
16747
16641
  "datafeeder.upload.acceptedFormats": "Akzeptierte Dateiformate:",
16748
16642
  "datafeeder.upload.checkboxLabel": "Ich besitze die Rechte zur Veröffentlichung dieses Datensatzes",
16749
- "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geospatialen Datensatz enthält",
16643
+ "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geografischen Datensatz enthält",
16750
16644
  "datafeeder.upload.error.subtitle.cantOpenFile": "Bitte überprüfen Sie, ob die Datei gültig ist",
16751
16645
  "datafeeder.upload.error.subtitle.fileFormat": "Beachten Sie: Nur SHP-Dateien",
16752
- "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximal {size} MB",
16753
- "datafeeder.upload.error.title.analysis": "Fehler bei der Datensatzanalyse",
16646
+ "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximale Dateigröße {size} MB",
16647
+ "datafeeder.upload.error.title.analysis": "Fehler während der Datensatzanalyse",
16754
16648
  "datafeeder.upload.error.title.cantOpenFile": "Fehler beim Öffnen der Datei",
16755
16649
  "datafeeder.upload.error.title.fileFormat": "Das ausgewählte Dateiformat wird nicht unterstützt",
16756
16650
  "datafeeder.upload.error.title.fileHasntSelected": "Keine Datei ausgewählt",
@@ -16758,19 +16652,19 @@ var de = {
16758
16652
  "datafeeder.upload.error.title.noRightsToSendData": "Sie dürfen diesen Datensatz nicht veröffentlichen",
16759
16653
  "datafeeder.upload.illustration.enrichment": "Anreicherung",
16760
16654
  "datafeeder.upload.illustration.import": "Import",
16761
- "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten war noch nie einfacher",
16655
+ "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten \n war noch nie so einfach",
16762
16656
  "datafeeder.upload.illustration.validation": "Validierung",
16763
- "datafeeder.upload.illustration.verification": "Verifizierung",
16657
+ "datafeeder.upload.illustration.verification": "Überprüfung",
16764
16658
  "datafeeder.upload.inputLabel": "Importieren Sie Ihre Datei",
16765
16659
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
16766
16660
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
16767
16661
  "datafeeder.upload.uploadButton": "Hochladen",
16768
- "datafeeder.validation.encoding": "Kodierung",
16662
+ "datafeeder.validation.encoding": "Codierung",
16769
16663
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
16770
16664
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
16771
16665
  "datafeeder.validation.projection": "Raumbezugssystem:",
16772
- "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem",
16773
- "datafeeder.validation.sample.title": "Und eine Beispieleinheit aus dem Datensatz",
16666
+ "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem aus",
16667
+ "datafeeder.validation.sample.title": "Und eine Beispielentität aus dem Datensatz",
16774
16668
  "datafeeder.wizard.emptyRequiredValuesMessage": "Bitte füllen Sie die obligatorischen Felder aus",
16775
16669
  "datafeeder.wizardSummarize.createdAt": "Erstellt am",
16776
16670
  "datafeeder.wizardSummarize.scale": "Maßstab",
@@ -16780,19 +16674,20 @@ var de = {
16780
16674
  "datahub.header.news": "Startseite",
16781
16675
  "datahub.header.organisations": "Organisationen",
16782
16676
  "datahub.header.popularRecords": "Die beliebtesten",
16783
- "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten von meiner Organisation</div>",
16784
- "datahub.news.contact.contactus": "",
16785
- "datahub.news.contact.html": "",
16786
- "datahub.news.contact.title": "",
16677
+ "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
16678
+ "datahub.news.contact.contactus": "Kontaktieren Sie uns",
16679
+ "datahub.news.contact.html": "<p>Brauchen Sie Daten, die derzeit nicht auf der Plattform vorhanden sind?</p><p>Unsere Teams stehen Ihnen zur Verfügung.</p>",
16680
+ "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
16787
16681
  "datahub.news.feed": "Nachrichtenfeed",
16788
16682
  "datahub.news.figures": "Indikatoren",
16789
- "datahub.search.back": "Zurück zu den Ergebnissen",
16683
+ "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
16684
+ "datahub.search.back": "Zurück",
16790
16685
  "datahub.search.filter.all": "Alle",
16791
- "datahub.search.filter.generatedByWfs": "Generiert durch API",
16686
+ "datahub.search.filter.generatedByWfs": "Generiert durch eine API",
16792
16687
  "datahub.search.filter.others": "Andere",
16793
16688
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
16794
16689
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
16795
- "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht geparst werden: \"{ info }\"",
16690
+ "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
16796
16691
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
16797
16692
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
16798
16693
  "domain.record.status.completed": "Abgeschlossen",
@@ -16800,18 +16695,18 @@ var de = {
16800
16695
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
16801
16696
  "domain.record.status.removed": "Entfernt",
16802
16697
  "domain.record.status.under_development": "In Erstellung",
16803
- "domain.record.updateFrequency.asNeeded": "Bei Bedarf",
16804
- "domain.record.updateFrequency.continual": "Kontinuierlich",
16698
+ "domain.record.updateFrequency.asNeeded": "Nach Bedarf",
16699
+ "domain.record.updateFrequency.continual": "Fortlaufend",
16805
16700
  "domain.record.updateFrequency.day": "{count, plural, =0{0} one{Ein} other{{count}}} mal am Tag",
16806
- "domain.record.updateFrequency.irregular": "Unregelmässig",
16701
+ "domain.record.updateFrequency.irregular": "Unregelmäßig",
16807
16702
  "domain.record.updateFrequency.month": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Monat",
16808
16703
  "domain.record.updateFrequency.notPlanned": "Nicht geplant",
16809
- "domain.record.updateFrequency.periodic": "Regelmässig",
16704
+ "domain.record.updateFrequency.periodic": "Regelmäßig",
16810
16705
  "domain.record.updateFrequency.unknown": "Unbekannt",
16811
16706
  "domain.record.updateFrequency.week": "{count, plural, =0{0} one{Ein} other{{count}}} mal in der Woche",
16812
16707
  "domain.record.updateFrequency.year": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Jahr",
16813
16708
  "downloads.format.unknown": "unbekannt",
16814
- "downloads.wfs.featuretype.not.found": "Die Schicht wurde nicht gefunden",
16709
+ "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16815
16710
  dropFile: dropFile$6,
16816
16711
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16817
16712
  "facets.block.title.OrgForResource": "Organisation",
@@ -16846,10 +16741,18 @@ var de = {
16846
16741
  "map.add.layer.file": "Aus einer Datei",
16847
16742
  "map.add.layer.wfs": "Aus WFS",
16848
16743
  "map.add.layer.wms": "Aus WMS",
16744
+ "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16745
+ "map.geocoding.placeholder": "",
16746
+ "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16747
+ "map.layer.add": "Hinzufügen",
16748
+ "map.layers.available": "Verfügbare Layer",
16849
16749
  "map.layers.list": "Ebenen",
16850
16750
  "map.loading.data": "Kartendaten werden geladen...",
16751
+ "map.loading.service": "Dienst wird geladen...",
16851
16752
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
16852
16753
  "map.select.layer": "Datenquelle",
16754
+ "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
16755
+ "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
16853
16756
  "multiselect.filter.placeholder": "Suche",
16854
16757
  "nav.back": "Zurück",
16855
16758
  next: next$6,
@@ -16865,56 +16768,61 @@ var de = {
16865
16768
  "pagination.pageOf": "von",
16866
16769
  previous: previous$6,
16867
16770
  "record.action.download": "Herunterladen",
16868
- "record.action.view": "Ansehen",
16771
+ "record.action.view": "Anzeigen",
16869
16772
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
16870
16773
  "record.metadata.about": "Beschreibung",
16871
16774
  "record.metadata.api": "API",
16872
- "record.metadata.api.form.closeButton": "",
16873
- "record.metadata.api.form.closeForm": "",
16874
- "record.metadata.api.form.create": "",
16875
- "record.metadata.api.form.customUrl": "",
16876
- "record.metadata.api.form.limit": "",
16877
- "record.metadata.api.form.limit.all": "",
16878
- "record.metadata.api.form.offset": "",
16879
- "record.metadata.api.form.openForm": "",
16880
- "record.metadata.api.form.reset": "",
16881
- "record.metadata.api.form.title": "",
16882
- "record.metadata.api.form.type": "",
16883
- "record.metadata.author": "",
16775
+ "record.metadata.api.form.closeButton": "Schließen",
16776
+ "record.metadata.api.form.closeForm": "Formular schließen",
16777
+ "record.metadata.api.form.create": "Ihre Anfrage erstellen",
16778
+ "record.metadata.api.form.customUrl": "Benutzerdefinierte URL",
16779
+ "record.metadata.api.form.limit": "Anzahl der Datensätze",
16780
+ "record.metadata.api.form.limit.all": "Alle",
16781
+ "record.metadata.api.form.offset": "Anzahl des ersten Datensatzes",
16782
+ "record.metadata.api.form.openForm": "Formular öffnen",
16783
+ "record.metadata.api.form.reset": "Zurücksetzen",
16784
+ "record.metadata.api.form.title": "Benutzerdefinierte URL generieren",
16785
+ "record.metadata.api.form.type": "Ausgabeformat",
16786
+ "record.metadata.author": "Autor",
16884
16787
  "record.metadata.catalog": "Katalog",
16885
16788
  "record.metadata.contact": "Kontakt",
16886
- "record.metadata.createdOn": "Erstellt am",
16887
- "record.metadata.details": "Details",
16789
+ "record.metadata.details": "Technische Informationen",
16888
16790
  "record.metadata.download": "Downloads",
16889
- "record.metadata.formats": "",
16890
- "record.metadata.isOpenData": "Open Data",
16791
+ "record.metadata.formats": "Formate",
16891
16792
  "record.metadata.keywords": "Stichworte",
16793
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16892
16794
  "record.metadata.links": "Links",
16893
- "record.metadata.noUsage": "Für diesen Datensatz sind keine Verwendungsbedingungen angegeben.",
16795
+ "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16894
16796
  "record.metadata.origin": "Über die Daten",
16797
+ "record.metadata.otherConstraints": "",
16798
+ "record.metadata.owner": "",
16895
16799
  "record.metadata.preview": "Vorschau",
16896
16800
  "record.metadata.publications": "Veröffentlichungen",
16897
- "record.metadata.quality": "",
16898
- "record.metadata.quality.contact.failed": "",
16899
- "record.metadata.quality.contact.success": "",
16900
- "record.metadata.quality.description.failed": "",
16901
- "record.metadata.quality.description.success": "",
16902
- "record.metadata.quality.details": "",
16903
- "record.metadata.quality.keywords.failed": "",
16904
- "record.metadata.quality.keywords.success": "",
16905
- "record.metadata.quality.legalConstraints.failed": "",
16906
- "record.metadata.quality.legalConstraints.success": "",
16907
- "record.metadata.quality.organisation.failed": "",
16908
- "record.metadata.quality.organisation.success": "",
16909
- "record.metadata.quality.title.failed": "",
16910
- "record.metadata.quality.title.success": "",
16911
- "record.metadata.quality.topic.failed": "",
16912
- "record.metadata.quality.topic.success": "",
16913
- "record.metadata.quality.updateFrequency.failed": "",
16914
- "record.metadata.quality.updateFrequency.success": "",
16801
+ "record.metadata.quality": "Metadatenqualität",
16802
+ "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
16803
+ "record.metadata.quality.contact.success": "Kontakt angegeben",
16804
+ "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
16805
+ "record.metadata.quality.description.success": "Beschreibung angegeben",
16806
+ "record.metadata.quality.details": "Details",
16807
+ "record.metadata.quality.keywords.failed": "Schlagwörter nicht angegeben",
16808
+ "record.metadata.quality.keywords.success": "Schlagwörter angegeben",
16809
+ "record.metadata.quality.legalConstraints.failed": "Rechtliche Beschränkungen nicht angegeben",
16810
+ "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
16811
+ "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
16812
+ "record.metadata.quality.organisation.success": "Organisation angegeben",
16813
+ "record.metadata.quality.title.failed": "Titel nicht angegeben",
16814
+ "record.metadata.quality.title.success": "Titel angegeben",
16815
+ "record.metadata.quality.topic.failed": "Thema nicht angegeben",
16816
+ "record.metadata.quality.topic.success": "Thema angegeben",
16817
+ "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
16818
+ "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16915
16819
  "record.metadata.related": "Ähnliche Datensätze",
16916
- "record.metadata.sheet": "Weitere Informationen erhalten Sie unter :",
16820
+ "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16821
+ "record.metadata.status": "",
16822
+ "record.metadata.themes": "Kategorien",
16917
16823
  "record.metadata.title": "Titel",
16824
+ "record.metadata.type": "Geographischer Datensatz",
16825
+ "record.metadata.uniqueId": "Eindeutige Kennung",
16918
16826
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16919
16827
  "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16920
16828
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
@@ -16926,28 +16834,29 @@ var de = {
16926
16834
  "record.was.created.time": "erstellte diesen Datensatz {time}",
16927
16835
  records: records$6,
16928
16836
  "results.layout.selectOne": "Layout auswählen",
16929
- "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{auf {hits} insgesamt angezeigt.}}",
16930
- "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie andere Wörter</li><li>Geben Sie weniger Wörter ein</li></ul>",
16837
+ "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{angezeigt von {hits} insgesamt.}}",
16838
+ "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie es mit anderen Worten</li><li>Beschränken Sie die Suchwörter</li></ul>",
16931
16839
  "results.records.hits.found": "{hits, plural, =0{Keine Dokumente entsprechen der angegebenen Suche.} one{1 Datensatz gefunden.} other{{hits} Datensätze gefunden.}}",
16932
- "results.records.hits.selected": "",
16840
+ "results.records.hits.selected": "{ amount } ausgewählt",
16933
16841
  "results.showMore": "Mehr Ergebnisse anzeigen...",
16934
- "results.sortBy.dateStamp": "Letzte Aktualisierungen",
16842
+ "results.sortBy.dateStamp": "Neueste",
16935
16843
  "results.sortBy.popularity": "Beliebtheit",
16936
- "results.sortBy.qualityScore": "",
16844
+ "results.sortBy.qualityScore": "Qualitätsbewertung",
16937
16845
  "results.sortBy.relevancy": "Relevanz",
16938
16846
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
16939
16847
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
16940
- "search.error.receivedError": "Ein Fehler wurde empfangen",
16848
+ "search.error.receivedError": "Ein Fehler ist aufgetreten",
16941
16849
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
16942
- "search.field.any.placeholder": "Suche nach Datensätzen ...",
16850
+ "search.field.any.placeholder": "Suche Datensätze ...",
16943
16851
  "search.field.sortBy": "Sortieren nach:",
16944
16852
  "search.filters.clear": "Zurücksetzen",
16945
- "search.filters.contact": "Kontakt",
16853
+ "search.filters.contact": "Kontakte",
16946
16854
  "search.filters.format": "Formate",
16947
16855
  "search.filters.inspireKeyword": "INSPIRE-Schlüsselwort",
16948
16856
  "search.filters.isSpatial": "Ist räumliche Daten",
16949
16857
  "search.filters.isSpatial.no": "nicht räumlich",
16950
16858
  "search.filters.isSpatial.yes": "räumlich",
16859
+ "search.filters.keyword": "Schlüsselwort",
16951
16860
  "search.filters.license": "Lizenz",
16952
16861
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16953
16862
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16960,13 +16869,13 @@ var de = {
16960
16869
  "search.filters.license.unknown": "Unbekannt oder nicht vorhanden",
16961
16870
  "search.filters.maximize": "Erweitern",
16962
16871
  "search.filters.minimize": "Minimieren",
16963
- "search.filters.myRecords": "",
16964
- "search.filters.myRecordsHelp": "",
16965
- "search.filters.otherRecords": "",
16872
+ "search.filters.myRecords": "Nur meine Datensätze anzeigen",
16873
+ "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.",
16874
+ "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
16966
16875
  "search.filters.publicationYear": "Veröffentlichungsjahr",
16967
16876
  "search.filters.publisher": "Organisationen",
16968
- "search.filters.representationType": "",
16969
- "search.filters.resourceType": "",
16877
+ "search.filters.representationType": "Repräsentationstyp",
16878
+ "search.filters.resourceType": "Ressourcentyp",
16970
16879
  "search.filters.standard": "Standard",
16971
16880
  "search.filters.title": "Ergebnisse filtern",
16972
16881
  "search.filters.topic": "Thema",
@@ -16978,6 +16887,7 @@ var de = {
16978
16887
  "table.object.count": "Objekte in diesem Datensatz",
16979
16888
  "table.select.data": "Datenquelle",
16980
16889
  "tooltip.html.copy": "HTML kopieren",
16890
+ "tooltip.id.copy": "",
16981
16891
  "tooltip.url.copy": "URL kopieren",
16982
16892
  "tooltip.url.open": "URL öffnen",
16983
16893
  "ui.readLess": "Weniger lesen",
@@ -17011,20 +16921,21 @@ var en = {
17011
16921
  "chart.type.line": "line chart",
17012
16922
  "chart.type.lineSmooth": "smooth line chart",
17013
16923
  "chart.type.pie": "pie chart",
16924
+ "dashboard.createRecord": "New record",
17014
16925
  "dashboard.labels.mySpace": "My space",
17015
- "dashboard.records.all": "Catalog",
16926
+ "dashboard.records.all": "Metadata records",
17016
16927
  "dashboard.records.myDraft": "My drafts",
17017
16928
  "dashboard.records.myLibrary": "My library",
17018
16929
  "dashboard.records.myOrg": "Organization",
17019
16930
  "dashboard.records.myRecords": "My Records",
17020
- "dashboard.records.noRecord": "No record for this organization",
17021
- "dashboard.records.noUser": "No users for this organization",
17022
16931
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17023
16932
  "dashboard.records.search": "Search for \"{searchText}\"",
17024
16933
  "dashboard.records.userDetail": "Name",
17025
16934
  "dashboard.records.userEmail": "Email",
17026
16935
  "dashboard.records.username": "Username",
17027
16936
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
16937
+ "dashboard.results.listMetadata": "Show metadata",
16938
+ "dashboard.results.listResources": "Show resources",
17028
16939
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17029
16940
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17030
16941
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17110,7 +17021,8 @@ var en = {
17110
17021
  "datahub.news.contact.title": "A specific need?",
17111
17022
  "datahub.news.feed": "News feed",
17112
17023
  "datahub.news.figures": "Indicators",
17113
- "datahub.search.back": "Back to results",
17024
+ "datahub.record.addToFavorites": "Add to favorites",
17025
+ "datahub.search.back": "Back",
17114
17026
  "datahub.search.filter.all": "All",
17115
17027
  "datahub.search.filter.generatedByWfs": "generated by an API",
17116
17028
  "datahub.search.filter.others": "Others",
@@ -17170,10 +17082,18 @@ var en = {
17170
17082
  "map.add.layer.file": "From a file",
17171
17083
  "map.add.layer.wfs": "From WFS",
17172
17084
  "map.add.layer.wms": "From WMS",
17085
+ "map.addFromFile.placeholder": "Click or drop a file here",
17086
+ "map.geocoding.placeholder": "Search for a place",
17087
+ "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17088
+ "map.layer.add": "Add",
17089
+ "map.layers.available": "Available Layers",
17173
17090
  "map.layers.list": "Layers",
17174
17091
  "map.loading.data": "Loading map data...",
17092
+ "map.loading.service": "Loading service...",
17175
17093
  "map.navigation.message": "Please use CTRL + mouse (or two fingers on mobile) to navigate the map",
17176
17094
  "map.select.layer": "Data source",
17095
+ "map.wfs.urlInput.hint": "Enter WFS service URL",
17096
+ "map.wms.urlInput.hint": "Enter WMS service URL",
17177
17097
  "multiselect.filter.placeholder": "Search",
17178
17098
  "nav.back": "Back",
17179
17099
  next: next$5,
@@ -17207,42 +17127,47 @@ var en = {
17207
17127
  "record.metadata.author": "Author",
17208
17128
  "record.metadata.catalog": "Catalog",
17209
17129
  "record.metadata.contact": "Contact",
17210
- "record.metadata.createdOn": "Created on",
17211
- "record.metadata.details": "Details",
17130
+ "record.metadata.details": "Technical information",
17212
17131
  "record.metadata.download": "Downloads",
17213
17132
  "record.metadata.formats": "Formats",
17214
- "record.metadata.isOpenData": "Open Data",
17215
17133
  "record.metadata.keywords": "Keywords",
17134
+ "record.metadata.lastUpdate": "Last updated on",
17216
17135
  "record.metadata.links": "Links",
17217
17136
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17218
17137
  "record.metadata.origin": "About the data",
17138
+ "record.metadata.otherConstraints": "Additional Conditions",
17139
+ "record.metadata.owner": "Catalog of origin",
17219
17140
  "record.metadata.preview": "Preview",
17220
17141
  "record.metadata.publications": "publications",
17221
17142
  "record.metadata.quality": "Metadata Quality",
17222
- "record.metadata.quality.contact.failed": "Contact is not completed",
17223
- "record.metadata.quality.contact.success": "Contact is completed",
17224
- "record.metadata.quality.description.failed": "Description is not completed",
17225
- "record.metadata.quality.description.success": "Description is completed",
17143
+ "record.metadata.quality.contact.failed": "Contact is not specified",
17144
+ "record.metadata.quality.contact.success": "Contact is specified",
17145
+ "record.metadata.quality.description.failed": "Description is not specified",
17146
+ "record.metadata.quality.description.success": "Description is specified",
17226
17147
  "record.metadata.quality.details": "Details",
17227
- "record.metadata.quality.keywords.failed": "Keywords are not completed",
17228
- "record.metadata.quality.keywords.success": "Keywords are completed",
17229
- "record.metadata.quality.legalConstraints.failed": "Legal constraints are not completed",
17230
- "record.metadata.quality.legalConstraints.success": "Legal constraints are completed",
17231
- "record.metadata.quality.organisation.failed": "Organisation is not completed",
17232
- "record.metadata.quality.organisation.success": "Organisation is completed",
17233
- "record.metadata.quality.title.failed": "Title is not completed",
17234
- "record.metadata.quality.title.success": "Title is completed",
17235
- "record.metadata.quality.topic.failed": "Topic is not completed",
17236
- "record.metadata.quality.topic.success": "Topic is completed",
17237
- "record.metadata.quality.updateFrequency.failed": "Update frequency is not completed",
17238
- "record.metadata.quality.updateFrequency.success": "Update frequency is completed",
17148
+ "record.metadata.quality.keywords.failed": "Keywords are not specified",
17149
+ "record.metadata.quality.keywords.success": "Keywords are specified",
17150
+ "record.metadata.quality.legalConstraints.failed": "Legal constraints are not specified",
17151
+ "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
17152
+ "record.metadata.quality.organisation.failed": "Organisation is not specified",
17153
+ "record.metadata.quality.organisation.success": "Organisation is specified",
17154
+ "record.metadata.quality.title.failed": "Title is not specified",
17155
+ "record.metadata.quality.title.success": "Title is specified",
17156
+ "record.metadata.quality.topic.failed": "Topic is not specified",
17157
+ "record.metadata.quality.topic.success": "Topic is specified",
17158
+ "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17159
+ "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17239
17160
  "record.metadata.related": "Related records",
17240
- "record.metadata.sheet": "More information available from:",
17161
+ "record.metadata.sheet": "Original metadata",
17162
+ "record.metadata.status": "Status",
17163
+ "record.metadata.themes": "Categories",
17241
17164
  "record.metadata.title": "Title",
17165
+ "record.metadata.type": "Geographical dataset",
17166
+ "record.metadata.uniqueId": "Unique Identifier",
17242
17167
  "record.metadata.updateFrequency": "Data Update Frequency",
17243
17168
  "record.metadata.updateStatus": "Data Update Status",
17244
17169
  "record.metadata.updatedOn": "Last Data Information Update",
17245
- "record.metadata.usage": "Usage & constraints",
17170
+ "record.metadata.usage": "License and Conditions",
17246
17171
  "record.more.details": "Read more",
17247
17172
  "record.tab.chart": "Chart",
17248
17173
  "record.tab.data": "Table",
@@ -17272,6 +17197,7 @@ var en = {
17272
17197
  "search.filters.isSpatial": "Is spatial data",
17273
17198
  "search.filters.isSpatial.no": "non spatial",
17274
17199
  "search.filters.isSpatial.yes": "spatial",
17200
+ "search.filters.keyword": "Keyword",
17275
17201
  "search.filters.license": "License",
17276
17202
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17277
17203
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17302,6 +17228,7 @@ var en = {
17302
17228
  "table.object.count": "objects in this dataset",
17303
17229
  "table.select.data": "Data source",
17304
17230
  "tooltip.html.copy": "Copy HTML",
17231
+ "tooltip.id.copy": "Copy unique identifier",
17305
17232
  "tooltip.url.copy": "Copy URL",
17306
17233
  "tooltip.url.open": "Open URL",
17307
17234
  "ui.readLess": "Read less",
@@ -17335,20 +17262,21 @@ var es = {
17335
17262
  "chart.type.line": "gráfico de líneas",
17336
17263
  "chart.type.lineSmooth": "gráfico de líneas suave",
17337
17264
  "chart.type.pie": "gráfico circular",
17265
+ "dashboard.createRecord": "",
17338
17266
  "dashboard.labels.mySpace": "Mi espacio",
17339
17267
  "dashboard.records.all": "Catálogo",
17340
17268
  "dashboard.records.myDraft": "Mis borradores",
17341
17269
  "dashboard.records.myLibrary": "Mi biblioteca",
17342
17270
  "dashboard.records.myOrg": "Organización",
17343
17271
  "dashboard.records.myRecords": "Mis Registros",
17344
- "dashboard.records.noRecord": "",
17345
- "dashboard.records.noUser": "",
17346
17272
  "dashboard.records.publishedRecords": "",
17347
17273
  "dashboard.records.search": "Buscar \"{searchText}\"",
17348
17274
  "dashboard.records.userDetail": "",
17349
17275
  "dashboard.records.userEmail": "",
17350
17276
  "dashboard.records.username": "",
17351
17277
  "dashboard.records.users": "",
17278
+ "dashboard.results.listMetadata": "",
17279
+ "dashboard.results.listResources": "",
17352
17280
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17353
17281
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17354
17282
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17434,6 +17362,7 @@ var es = {
17434
17362
  "datahub.news.contact.title": "",
17435
17363
  "datahub.news.feed": "",
17436
17364
  "datahub.news.figures": "",
17365
+ "datahub.record.addToFavorites": "",
17437
17366
  "datahub.search.back": "",
17438
17367
  "datahub.search.filter.all": "",
17439
17368
  "datahub.search.filter.generatedByWfs": "",
@@ -17494,10 +17423,18 @@ var es = {
17494
17423
  "map.add.layer.file": "",
17495
17424
  "map.add.layer.wfs": "",
17496
17425
  "map.add.layer.wms": "",
17426
+ "map.addFromFile.placeholder": "",
17427
+ "map.geocoding.placeholder": "",
17428
+ "map.help.addFromFile": "",
17429
+ "map.layer.add": "",
17430
+ "map.layers.available": "",
17497
17431
  "map.layers.list": "",
17498
17432
  "map.loading.data": "",
17433
+ "map.loading.service": "",
17499
17434
  "map.navigation.message": "",
17500
17435
  "map.select.layer": "",
17436
+ "map.wfs.urlInput.hint": "",
17437
+ "map.wms.urlInput.hint": "",
17501
17438
  "multiselect.filter.placeholder": "",
17502
17439
  "nav.back": "",
17503
17440
  next: next$4,
@@ -17531,15 +17468,16 @@ var es = {
17531
17468
  "record.metadata.author": "",
17532
17469
  "record.metadata.catalog": "",
17533
17470
  "record.metadata.contact": "",
17534
- "record.metadata.createdOn": "",
17535
17471
  "record.metadata.details": "",
17536
17472
  "record.metadata.download": "",
17537
17473
  "record.metadata.formats": "",
17538
- "record.metadata.isOpenData": "",
17539
17474
  "record.metadata.keywords": "",
17475
+ "record.metadata.lastUpdate": "",
17540
17476
  "record.metadata.links": "",
17541
17477
  "record.metadata.noUsage": "",
17542
17478
  "record.metadata.origin": "",
17479
+ "record.metadata.otherConstraints": "",
17480
+ "record.metadata.owner": "",
17543
17481
  "record.metadata.preview": "",
17544
17482
  "record.metadata.publications": "",
17545
17483
  "record.metadata.quality": "",
@@ -17562,7 +17500,11 @@ var es = {
17562
17500
  "record.metadata.quality.updateFrequency.success": "",
17563
17501
  "record.metadata.related": "",
17564
17502
  "record.metadata.sheet": "",
17503
+ "record.metadata.status": "",
17504
+ "record.metadata.themes": "",
17565
17505
  "record.metadata.title": "",
17506
+ "record.metadata.type": "",
17507
+ "record.metadata.uniqueId": "",
17566
17508
  "record.metadata.updateFrequency": "",
17567
17509
  "record.metadata.updateStatus": "",
17568
17510
  "record.metadata.updatedOn": "",
@@ -17596,6 +17538,7 @@ var es = {
17596
17538
  "search.filters.isSpatial": "",
17597
17539
  "search.filters.isSpatial.no": "",
17598
17540
  "search.filters.isSpatial.yes": "",
17541
+ "search.filters.keyword": "",
17599
17542
  "search.filters.license": "",
17600
17543
  "search.filters.license.cc-by": "",
17601
17544
  "search.filters.license.cc-by-sa": "",
@@ -17626,6 +17569,7 @@ var es = {
17626
17569
  "table.object.count": "",
17627
17570
  "table.select.data": "",
17628
17571
  "tooltip.html.copy": "",
17572
+ "tooltip.id.copy": "",
17629
17573
  "tooltip.url.copy": "",
17630
17574
  "tooltip.url.open": "",
17631
17575
  "ui.readLess": "",
@@ -17659,20 +17603,21 @@ var fr = {
17659
17603
  "chart.type.line": "ligne",
17660
17604
  "chart.type.lineSmooth": "ligne lisse",
17661
17605
  "chart.type.pie": "camembert",
17606
+ "dashboard.createRecord": "",
17662
17607
  "dashboard.labels.mySpace": "Mon espace",
17663
17608
  "dashboard.records.all": "Catalogue",
17664
17609
  "dashboard.records.myDraft": "Mes brouillons",
17665
17610
  "dashboard.records.myLibrary": "Ma bibliothèque",
17666
17611
  "dashboard.records.myOrg": "Mon organisation",
17667
17612
  "dashboard.records.myRecords": "Mes fiches publiées",
17668
- "dashboard.records.noRecord": "Aucun jeu de données pour cette organisation",
17669
- "dashboard.records.noUser": "Aucun utilisateur pour cette organisation",
17670
17613
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17671
17614
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17672
17615
  "dashboard.records.userDetail": "Nom",
17673
17616
  "dashboard.records.userEmail": "Email",
17674
17617
  "dashboard.records.username": "Nom d'utilisateur",
17675
17618
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17619
+ "dashboard.results.listMetadata": "",
17620
+ "dashboard.results.listResources": "",
17676
17621
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17677
17622
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17678
17623
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17754,11 +17699,12 @@ var fr = {
17754
17699
  "datahub.header.popularRecords": "Les plus appréciées",
17755
17700
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17756
17701
  "datahub.news.contact.contactus": "Contactez-nous",
17757
- "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont la pour vous répondre.</p>",
17702
+ "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont pour vous répondre.</p>",
17758
17703
  "datahub.news.contact.title": "Un besoin spécifique ?",
17759
17704
  "datahub.news.feed": "Fil d'activité",
17760
17705
  "datahub.news.figures": "Quelques chiffres",
17761
- "datahub.search.back": "Retour aux résultats",
17706
+ "datahub.record.addToFavorites": "Ajouter aux favoris",
17707
+ "datahub.search.back": "Retour",
17762
17708
  "datahub.search.filter.all": "Tous",
17763
17709
  "datahub.search.filter.generatedByWfs": "généré par une API",
17764
17710
  "datahub.search.filter.others": "Autres",
@@ -17818,10 +17764,18 @@ var fr = {
17818
17764
  "map.add.layer.file": "",
17819
17765
  "map.add.layer.wfs": "",
17820
17766
  "map.add.layer.wms": "",
17767
+ "map.addFromFile.placeholder": "",
17768
+ "map.geocoding.placeholder": "",
17769
+ "map.help.addFromFile": "",
17770
+ "map.layer.add": "",
17771
+ "map.layers.available": "",
17821
17772
  "map.layers.list": "",
17822
17773
  "map.loading.data": "Chargement des données...",
17774
+ "map.loading.service": "",
17823
17775
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17824
17776
  "map.select.layer": "Source de données",
17777
+ "map.wfs.urlInput.hint": "",
17778
+ "map.wms.urlInput.hint": "",
17825
17779
  "multiselect.filter.placeholder": "Rechercher",
17826
17780
  "nav.back": "Retour",
17827
17781
  next: next$3,
@@ -17855,15 +17809,16 @@ var fr = {
17855
17809
  "record.metadata.author": "Auteur",
17856
17810
  "record.metadata.catalog": "Catalogue",
17857
17811
  "record.metadata.contact": "Contact",
17858
- "record.metadata.createdOn": "Créé le",
17859
- "record.metadata.details": "Détails",
17812
+ "record.metadata.details": "Informations techniques",
17860
17813
  "record.metadata.download": "Téléchargements",
17861
17814
  "record.metadata.formats": "Formats",
17862
- "record.metadata.isOpenData": "Donnée Ouverte",
17863
17815
  "record.metadata.keywords": "Mots clés",
17816
+ "record.metadata.lastUpdate": "Mis à jour le",
17864
17817
  "record.metadata.links": "Liens",
17865
17818
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17866
17819
  "record.metadata.origin": "À propos des données",
17820
+ "record.metadata.otherConstraints": "Limitations d'usage",
17821
+ "record.metadata.owner": "Catalogue d'origine",
17867
17822
  "record.metadata.preview": "Aperçu",
17868
17823
  "record.metadata.publications": "données",
17869
17824
  "record.metadata.quality": "Qualité des métadonnées",
@@ -17885,12 +17840,16 @@ var fr = {
17885
17840
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
17886
17841
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17887
17842
  "record.metadata.related": "Voir aussi",
17888
- "record.metadata.sheet": "Plus d'informations à l'adresse suivante :",
17843
+ "record.metadata.sheet": "Fiche de métadonnées d'origine",
17844
+ "record.metadata.status": "",
17845
+ "record.metadata.themes": "Catégories",
17889
17846
  "record.metadata.title": "Titre",
17847
+ "record.metadata.type": "Donnée géographique",
17848
+ "record.metadata.uniqueId": "Identificateur de ressource unique",
17890
17849
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17891
17850
  "record.metadata.updateStatus": "Statut de mise à jour des données",
17892
17851
  "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17893
- "record.metadata.usage": "Conditions d'utilisation",
17852
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17894
17853
  "record.more.details": "Détails",
17895
17854
  "record.tab.chart": "Graphique",
17896
17855
  "record.tab.data": "Tableau",
@@ -17920,6 +17879,7 @@ var fr = {
17920
17879
  "search.filters.isSpatial": "Données spatiales",
17921
17880
  "search.filters.isSpatial.no": "non-géolocalisées",
17922
17881
  "search.filters.isSpatial.yes": "géolocalisées",
17882
+ "search.filters.keyword": "Mot-clé",
17923
17883
  "search.filters.license": "Licence",
17924
17884
  "search.filters.license.cc-by": "cc-by",
17925
17885
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -17950,6 +17910,7 @@ var fr = {
17950
17910
  "table.object.count": "enregistrements dans ces données",
17951
17911
  "table.select.data": "Source de données",
17952
17912
  "tooltip.html.copy": "Copier le HTML",
17913
+ "tooltip.id.copy": "Copier l'identifiant unique",
17953
17914
  "tooltip.url.copy": "Copier l'URL",
17954
17915
  "tooltip.url.open": "Ouvrir l'URL",
17955
17916
  "ui.readLess": "Réduire",
@@ -17983,20 +17944,21 @@ var it = {
17983
17944
  "chart.type.line": "grafico a linee",
17984
17945
  "chart.type.lineSmooth": "grafico a linea liscia",
17985
17946
  "chart.type.pie": "grafico a torta",
17947
+ "dashboard.createRecord": "",
17986
17948
  "dashboard.labels.mySpace": "Il mio spazio",
17987
17949
  "dashboard.records.all": "Catalogo",
17988
17950
  "dashboard.records.myDraft": "Le mie bozze",
17989
17951
  "dashboard.records.myLibrary": "La mia biblioteca",
17990
17952
  "dashboard.records.myOrg": "La mia organizzazione",
17991
17953
  "dashboard.records.myRecords": "I miei dati",
17992
- "dashboard.records.noRecord": "Nessun dati per questa organizzazione",
17993
- "dashboard.records.noUser": "Nessun utente per questa organizzazione",
17994
17954
  "dashboard.records.publishedRecords": "dati pubblicati",
17995
17955
  "dashboard.records.search": "Risultati per \"{searchText}\"",
17996
17956
  "dashboard.records.userDetail": "Nome",
17997
17957
  "dashboard.records.userEmail": "Email",
17998
17958
  "dashboard.records.username": "Nome utente",
17999
17959
  "dashboard.records.users": "utenti",
17960
+ "dashboard.results.listMetadata": "",
17961
+ "dashboard.results.listResources": "",
18000
17962
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18001
17963
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18002
17964
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18077,12 +18039,13 @@ var it = {
18077
18039
  "datahub.header.organisations": "Organizzazioni",
18078
18040
  "datahub.header.popularRecords": "Più popolari",
18079
18041
  "datahub.header.title.html": "<div class=\"text-white\">Tutti i dati<br>pubblici della mia organizzazione</div>",
18080
- "datahub.news.contact.contactus": "",
18081
- "datahub.news.contact.html": "",
18082
- "datahub.news.contact.title": "",
18042
+ "datahub.news.contact.contactus": "Contattateci",
18043
+ "datahub.news.contact.html": "<p>Ha bisogno di dati che non sono attualmente disponibili sulla piattaforma? </p><p> I nostri team sono qui per aiutarla.</p>",
18044
+ "datahub.news.contact.title": "Ha un bisogno specifico?",
18083
18045
  "datahub.news.feed": "Feed di attività",
18084
18046
  "datahub.news.figures": "Alcune figure",
18085
- "datahub.search.back": "Torna ai risultati",
18047
+ "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
18048
+ "datahub.search.back": "Ritorna",
18086
18049
  "datahub.search.filter.all": "Tutti",
18087
18050
  "datahub.search.filter.generatedByWfs": "generato da un'API",
18088
18051
  "datahub.search.filter.others": "Altri",
@@ -18109,7 +18072,7 @@ var it = {
18109
18072
  "downloads.format.unknown": "sconosciuto",
18110
18073
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18111
18074
  dropFile: dropFile$2,
18112
- "externalviewer.dataset.unnamed": "",
18075
+ "externalviewer.dataset.unnamed": "Layer del datahub",
18113
18076
  "facets.block.title.OrgForResource": "Organizzazione",
18114
18077
  "facets.block.title.availableInServices": "Disponibile per",
18115
18078
  "facets.block.title.cl_hierarchyLevel.key": "Tipo di risorsa",
@@ -18142,10 +18105,18 @@ var it = {
18142
18105
  "map.add.layer.file": "Da un file",
18143
18106
  "map.add.layer.wfs": "Da un WFS",
18144
18107
  "map.add.layer.wms": "Da un WMS",
18108
+ "map.addFromFile.placeholder": "",
18109
+ "map.geocoding.placeholder": "",
18110
+ "map.help.addFromFile": "",
18111
+ "map.layer.add": "",
18112
+ "map.layers.available": "",
18145
18113
  "map.layers.list": "Layers",
18146
18114
  "map.loading.data": "Caricamento dati...",
18115
+ "map.loading.service": "",
18147
18116
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18148
18117
  "map.select.layer": "Sorgente dati",
18118
+ "map.wfs.urlInput.hint": "",
18119
+ "map.wms.urlInput.hint": "",
18149
18120
  "multiselect.filter.placeholder": "Cerca",
18150
18121
  "nav.back": "Indietro",
18151
18122
  next: next$2,
@@ -18179,15 +18150,16 @@ var it = {
18179
18150
  "record.metadata.author": "Autore",
18180
18151
  "record.metadata.catalog": "Catalogo",
18181
18152
  "record.metadata.contact": "Contatto",
18182
- "record.metadata.createdOn": "Creato il",
18183
- "record.metadata.details": "Dettagli",
18153
+ "record.metadata.details": "Informazioni tecniche",
18184
18154
  "record.metadata.download": "Download",
18185
18155
  "record.metadata.formats": "Formati",
18186
- "record.metadata.isOpenData": "Data aperta",
18187
18156
  "record.metadata.keywords": "Parole chiave",
18157
+ "record.metadata.lastUpdate": "Ultimo aggiornamento",
18188
18158
  "record.metadata.links": "Collegamenti",
18189
18159
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18190
18160
  "record.metadata.origin": "Informazioni sui dati",
18161
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18162
+ "record.metadata.owner": "Catalogo originale",
18191
18163
  "record.metadata.preview": "Anteprima",
18192
18164
  "record.metadata.publications": "pubblicazioni",
18193
18165
  "record.metadata.quality": "Qualità dei metadati",
@@ -18209,12 +18181,16 @@ var it = {
18209
18181
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
18210
18182
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18211
18183
  "record.metadata.related": "Vedi anche",
18212
- "record.metadata.sheet": "Per ulteriori informazioni, cliccate qui:",
18184
+ "record.metadata.sheet": "Origine del metadata",
18185
+ "record.metadata.status": "",
18186
+ "record.metadata.themes": "Categorie",
18213
18187
  "record.metadata.title": "Titolo",
18188
+ "record.metadata.type": "Dati geografici",
18189
+ "record.metadata.uniqueId": "Identificatore unico di risorsa",
18214
18190
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18215
18191
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18216
18192
  "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18217
- "record.metadata.usage": "Condizioni d'uso",
18193
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18218
18194
  "record.more.details": "Dettagli",
18219
18195
  "record.tab.chart": "Grafico",
18220
18196
  "record.tab.data": "Tabella",
@@ -18222,10 +18198,10 @@ var it = {
18222
18198
  "record.was.created.time": "ha creato questi dati {time}",
18223
18199
  records: records$2,
18224
18200
  "results.layout.selectOne": "Mostra risultati",
18225
- "results.records.hits.displayedOn": "",
18201
+ "results.records.hits.displayedOn": "{displayed, plural, =0{Nessun record} one{1 record visualizzato} other{{displayed} records visualizzati}} {hits, plural, other{su {hits} in totale.}}",
18226
18202
  "results.records.hits.empty.help.html": "Suggerimenti: <ul class='list-disc list-inside'><li>Prova con altre parole chiave</li><li>Cerca con meno parole</li></ul>",
18227
18203
  "results.records.hits.found": "{hits, plural, =0{Nessuna corrispondenza.} one{1 record trovato.} other{{hits} risultati.}}",
18228
- "results.records.hits.selected": "",
18204
+ "results.records.hits.selected": "{amount, plural, one{1 selezionato} other{{ amount } selezionati}}",
18229
18205
  "results.showMore": "Altri risultati...",
18230
18206
  "results.sortBy.dateStamp": "Più recente",
18231
18207
  "results.sortBy.popularity": "Popolarità",
@@ -18244,6 +18220,7 @@ var it = {
18244
18220
  "search.filters.isSpatial": "Dati spaziali",
18245
18221
  "search.filters.isSpatial.no": "Non geolocalizzati",
18246
18222
  "search.filters.isSpatial.yes": "Geolocalizzati",
18223
+ "search.filters.keyword": "Parola chiave",
18247
18224
  "search.filters.license": "Licenza",
18248
18225
  "search.filters.license.cc-by": "cc-by",
18249
18226
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18274,10 +18251,11 @@ var it = {
18274
18251
  "table.object.count": "record in questi dati",
18275
18252
  "table.select.data": "Sorgente dati",
18276
18253
  "tooltip.html.copy": "Copiare il HTML",
18254
+ "tooltip.id.copy": "Copiare l'identificatore unico",
18277
18255
  "tooltip.url.copy": "Copiare l'URL",
18278
18256
  "tooltip.url.open": "Aprire l'URL",
18279
- "ui.readLess": "",
18280
- "ui.readMore": "",
18257
+ "ui.readLess": "Ridurre",
18258
+ "ui.readMore": "Leggi di più",
18281
18259
  "wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
18282
18260
  "wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
18283
18261
  "wfs.unreachable.cors": "Il servizio non è accessibile a causa di limitazioni CORS",
@@ -18307,20 +18285,21 @@ var nl = {
18307
18285
  "chart.type.line": "lijndiagram",
18308
18286
  "chart.type.lineSmooth": "glad lijndiagram",
18309
18287
  "chart.type.pie": "cirkeldiagram",
18288
+ "dashboard.createRecord": "",
18310
18289
  "dashboard.labels.mySpace": "Mijn ruimte",
18311
18290
  "dashboard.records.all": "Catalogus",
18312
18291
  "dashboard.records.myDraft": "Mijn concepten",
18313
18292
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18314
18293
  "dashboard.records.myOrg": "Organisatie",
18315
18294
  "dashboard.records.myRecords": "Mijn Records",
18316
- "dashboard.records.noRecord": "",
18317
- "dashboard.records.noUser": "",
18318
18295
  "dashboard.records.publishedRecords": "",
18319
18296
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18320
18297
  "dashboard.records.userDetail": "",
18321
18298
  "dashboard.records.userEmail": "",
18322
18299
  "dashboard.records.username": "",
18323
18300
  "dashboard.records.users": "",
18301
+ "dashboard.results.listMetadata": "",
18302
+ "dashboard.results.listResources": "",
18324
18303
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18325
18304
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18326
18305
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18406,6 +18385,7 @@ var nl = {
18406
18385
  "datahub.news.contact.title": "",
18407
18386
  "datahub.news.feed": "",
18408
18387
  "datahub.news.figures": "",
18388
+ "datahub.record.addToFavorites": "",
18409
18389
  "datahub.search.back": "",
18410
18390
  "datahub.search.filter.all": "",
18411
18391
  "datahub.search.filter.generatedByWfs": "",
@@ -18466,10 +18446,18 @@ var nl = {
18466
18446
  "map.add.layer.file": "",
18467
18447
  "map.add.layer.wfs": "",
18468
18448
  "map.add.layer.wms": "",
18449
+ "map.addFromFile.placeholder": "",
18450
+ "map.geocoding.placeholder": "",
18451
+ "map.help.addFromFile": "",
18452
+ "map.layer.add": "",
18453
+ "map.layers.available": "",
18469
18454
  "map.layers.list": "",
18470
18455
  "map.loading.data": "",
18456
+ "map.loading.service": "",
18471
18457
  "map.navigation.message": "",
18472
18458
  "map.select.layer": "",
18459
+ "map.wfs.urlInput.hint": "",
18460
+ "map.wms.urlInput.hint": "",
18473
18461
  "multiselect.filter.placeholder": "",
18474
18462
  "nav.back": "",
18475
18463
  next: next$1,
@@ -18503,15 +18491,16 @@ var nl = {
18503
18491
  "record.metadata.author": "",
18504
18492
  "record.metadata.catalog": "",
18505
18493
  "record.metadata.contact": "",
18506
- "record.metadata.createdOn": "",
18507
18494
  "record.metadata.details": "",
18508
18495
  "record.metadata.download": "",
18509
18496
  "record.metadata.formats": "",
18510
- "record.metadata.isOpenData": "",
18511
18497
  "record.metadata.keywords": "",
18498
+ "record.metadata.lastUpdate": "",
18512
18499
  "record.metadata.links": "",
18513
18500
  "record.metadata.noUsage": "",
18514
18501
  "record.metadata.origin": "",
18502
+ "record.metadata.otherConstraints": "",
18503
+ "record.metadata.owner": "",
18515
18504
  "record.metadata.preview": "",
18516
18505
  "record.metadata.publications": "",
18517
18506
  "record.metadata.quality": "",
@@ -18534,7 +18523,11 @@ var nl = {
18534
18523
  "record.metadata.quality.updateFrequency.success": "",
18535
18524
  "record.metadata.related": "",
18536
18525
  "record.metadata.sheet": "",
18526
+ "record.metadata.status": "",
18527
+ "record.metadata.themes": "",
18537
18528
  "record.metadata.title": "",
18529
+ "record.metadata.type": "",
18530
+ "record.metadata.uniqueId": "",
18538
18531
  "record.metadata.updateFrequency": "",
18539
18532
  "record.metadata.updateStatus": "",
18540
18533
  "record.metadata.updatedOn": "",
@@ -18568,6 +18561,7 @@ var nl = {
18568
18561
  "search.filters.isSpatial": "",
18569
18562
  "search.filters.isSpatial.no": "",
18570
18563
  "search.filters.isSpatial.yes": "",
18564
+ "search.filters.keyword": "",
18571
18565
  "search.filters.license": "",
18572
18566
  "search.filters.license.cc-by": "",
18573
18567
  "search.filters.license.cc-by-sa": "",
@@ -18598,6 +18592,7 @@ var nl = {
18598
18592
  "table.object.count": "",
18599
18593
  "table.select.data": "",
18600
18594
  "tooltip.html.copy": "",
18595
+ "tooltip.id.copy": "",
18601
18596
  "tooltip.url.copy": "",
18602
18597
  "tooltip.url.open": "",
18603
18598
  "ui.readLess": "",
@@ -18631,20 +18626,21 @@ var pt = {
18631
18626
  "chart.type.line": "gráfico de linha",
18632
18627
  "chart.type.lineSmooth": "gráfico de linha suave",
18633
18628
  "chart.type.pie": "gráfico de pizza",
18629
+ "dashboard.createRecord": "",
18634
18630
  "dashboard.labels.mySpace": "Meu espaço",
18635
18631
  "dashboard.records.all": "Catálogo",
18636
18632
  "dashboard.records.myDraft": "Meus rascunhos",
18637
18633
  "dashboard.records.myLibrary": "Minha biblioteca",
18638
18634
  "dashboard.records.myOrg": "Organização",
18639
18635
  "dashboard.records.myRecords": "Meus Registros",
18640
- "dashboard.records.noRecord": "",
18641
- "dashboard.records.noUser": "",
18642
18636
  "dashboard.records.publishedRecords": "",
18643
18637
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18644
18638
  "dashboard.records.userDetail": "",
18645
18639
  "dashboard.records.userEmail": "",
18646
18640
  "dashboard.records.username": "",
18647
18641
  "dashboard.records.users": "",
18642
+ "dashboard.results.listMetadata": "",
18643
+ "dashboard.results.listResources": "",
18648
18644
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18649
18645
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18650
18646
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18730,6 +18726,7 @@ var pt = {
18730
18726
  "datahub.news.contact.title": "",
18731
18727
  "datahub.news.feed": "",
18732
18728
  "datahub.news.figures": "",
18729
+ "datahub.record.addToFavorites": "",
18733
18730
  "datahub.search.back": "",
18734
18731
  "datahub.search.filter.all": "",
18735
18732
  "datahub.search.filter.generatedByWfs": "",
@@ -18790,10 +18787,18 @@ var pt = {
18790
18787
  "map.add.layer.file": "",
18791
18788
  "map.add.layer.wfs": "",
18792
18789
  "map.add.layer.wms": "",
18790
+ "map.addFromFile.placeholder": "",
18791
+ "map.geocoding.placeholder": "",
18792
+ "map.help.addFromFile": "",
18793
+ "map.layer.add": "",
18794
+ "map.layers.available": "",
18793
18795
  "map.layers.list": "",
18794
18796
  "map.loading.data": "",
18797
+ "map.loading.service": "",
18795
18798
  "map.navigation.message": "",
18796
18799
  "map.select.layer": "",
18800
+ "map.wfs.urlInput.hint": "",
18801
+ "map.wms.urlInput.hint": "",
18797
18802
  "multiselect.filter.placeholder": "",
18798
18803
  "nav.back": "",
18799
18804
  next: next,
@@ -18827,15 +18832,16 @@ var pt = {
18827
18832
  "record.metadata.author": "",
18828
18833
  "record.metadata.catalog": "",
18829
18834
  "record.metadata.contact": "",
18830
- "record.metadata.createdOn": "",
18831
18835
  "record.metadata.details": "",
18832
18836
  "record.metadata.download": "",
18833
18837
  "record.metadata.formats": "",
18834
- "record.metadata.isOpenData": "",
18835
18838
  "record.metadata.keywords": "",
18839
+ "record.metadata.lastUpdate": "",
18836
18840
  "record.metadata.links": "",
18837
18841
  "record.metadata.noUsage": "",
18838
18842
  "record.metadata.origin": "",
18843
+ "record.metadata.otherConstraints": "",
18844
+ "record.metadata.owner": "",
18839
18845
  "record.metadata.preview": "",
18840
18846
  "record.metadata.publications": "",
18841
18847
  "record.metadata.quality": "",
@@ -18858,7 +18864,11 @@ var pt = {
18858
18864
  "record.metadata.quality.updateFrequency.success": "",
18859
18865
  "record.metadata.related": "",
18860
18866
  "record.metadata.sheet": "",
18867
+ "record.metadata.status": "",
18868
+ "record.metadata.themes": "",
18861
18869
  "record.metadata.title": "",
18870
+ "record.metadata.type": "",
18871
+ "record.metadata.uniqueId": "",
18862
18872
  "record.metadata.updateFrequency": "",
18863
18873
  "record.metadata.updateStatus": "",
18864
18874
  "record.metadata.updatedOn": "",
@@ -18892,6 +18902,7 @@ var pt = {
18892
18902
  "search.filters.isSpatial": "",
18893
18903
  "search.filters.isSpatial.no": "",
18894
18904
  "search.filters.isSpatial.yes": "",
18905
+ "search.filters.keyword": "",
18895
18906
  "search.filters.license": "",
18896
18907
  "search.filters.license.cc-by": "",
18897
18908
  "search.filters.license.cc-by-sa": "",
@@ -18922,6 +18933,7 @@ var pt = {
18922
18933
  "table.object.count": "",
18923
18934
  "table.select.data": "",
18924
18935
  "tooltip.html.copy": "",
18936
+ "tooltip.id.copy": "",
18925
18937
  "tooltip.url.copy": "",
18926
18938
  "tooltip.url.open": "",
18927
18939
  "ui.readLess": "",
@@ -19066,20 +19078,11 @@ class Gn4FieldMapper {
19066
19078
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19067
19079
  ],
19068
19080
  }),
19069
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19070
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19071
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19072
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19073
- licenseObject: (output, source) => ({
19074
- ...output,
19075
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19076
- const link = getAsUrl(selectField(license, 'link'));
19077
- return {
19078
- text: selectTranslatedValue(license, this.lang3),
19079
- ...(link ? { link } : {}),
19080
- };
19081
- }),
19082
- }),
19081
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19082
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19083
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19084
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19085
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19083
19086
  lineageObject: (output, source) => ({
19084
19087
  ...output,
19085
19088
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19105,33 +19108,78 @@ class Gn4FieldMapper {
19105
19108
  kind,
19106
19109
  };
19107
19110
  },
19111
+ geom: (output, source) => {
19112
+ const geoms = getAsArray(selectField(source, 'geom'));
19113
+ const shapes = getAsArray(selectField(source, 'shape'));
19114
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19115
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19116
+ return {
19117
+ ...output,
19118
+ spatialExtents: [
19119
+ ...spatialExtents,
19120
+ ...geoms.map((geom, index) => {
19121
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19122
+ const geometry = shapes[index] ?? geom;
19123
+ return {
19124
+ ...(description !== null ? { description } : null),
19125
+ geometry,
19126
+ };
19127
+ }),
19128
+ ],
19129
+ };
19130
+ },
19131
+ resourceTemporalDateRange: (output, source) => {
19132
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19133
+ return {
19134
+ ...output,
19135
+ temporalExtents: ranges.map((range) => {
19136
+ const start = selectField(range, 'gte');
19137
+ const end = selectField(range, 'lte');
19138
+ return {
19139
+ ...(start !== null ? { start: toDate(start) } : null),
19140
+ ...(end !== null ? { end: toDate(end) } : null),
19141
+ };
19142
+ }),
19143
+ };
19144
+ },
19108
19145
  };
19109
19146
  this.genericField = (output) => output;
19110
- this.constraintField = (fieldName, output, source) => ({
19111
- ...output,
19112
- ...(fieldName.endsWith('UseLimitationObject')
19113
- ? {
19114
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19115
- ? [
19116
- ...(output.legalConstraints || []),
19117
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19118
- ]
19119
- : output.legalConstraints || [],
19120
- useLimitations: [
19121
- ...(output.useLimitations || []),
19122
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19123
- ],
19124
- }
19125
- : {
19126
- accessConstraints: [
19127
- ...(output.accessConstraints || []),
19128
- ...selectField(source, fieldName).map((field) => ({
19129
- text: selectTranslatedValue(field, this.lang3),
19130
- type: this.getConstraintsType(fieldName),
19131
- })),
19132
- ],
19133
- }),
19134
- });
19147
+ this.constraintField = (type, output, constraintArray) => {
19148
+ let outputField;
19149
+ switch (type) {
19150
+ case 'license':
19151
+ outputField = 'licenses';
19152
+ break;
19153
+ case 'legal':
19154
+ outputField = 'legalConstraints';
19155
+ break;
19156
+ case 'security':
19157
+ outputField = 'securityConstraints';
19158
+ break;
19159
+ case 'other':
19160
+ outputField = 'otherConstraints';
19161
+ break;
19162
+ }
19163
+ const outputArray = outputField in output ? output[outputField] : [];
19164
+ outputArray.push(...constraintArray.map((item) => {
19165
+ const text = selectTranslatedValue(item, this.lang3);
19166
+ const url = getAsUrl(selectField(item, 'link'));
19167
+ return {
19168
+ text,
19169
+ ...(url ? { url } : {}),
19170
+ };
19171
+ }));
19172
+ const result = {
19173
+ ...output,
19174
+ [outputField]: outputArray,
19175
+ };
19176
+ // avoid legal constraints being duplicates of licenses
19177
+ if ('legalConstraints' in result &&
19178
+ (type === 'legal' || type === 'license')) {
19179
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19180
+ }
19181
+ return result;
19182
+ };
19135
19183
  this.mapLink = (sourceLink) => {
19136
19184
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19137
19185
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19179,17 +19227,6 @@ class Gn4FieldMapper {
19179
19227
  extras: { ...(output.extras || {}), ...value },
19180
19228
  });
19181
19229
  }
19182
- getConstraintsType(indexField) {
19183
- switch (indexField) {
19184
- case 'MD_LegalConstraintsUseLimitationObject':
19185
- return 'legal';
19186
- case 'MD_SecurityConstraintsUseLimitationObject':
19187
- return 'security';
19188
- case 'MD_ConstraintsUseLimitationObject':
19189
- default:
19190
- return 'other';
19191
- }
19192
- }
19193
19230
  getMappingFn(fieldName) {
19194
19231
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19195
19232
  }
@@ -19251,14 +19288,16 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19251
19288
  recordUpdated: null,
19252
19289
  ownerOrganization: null,
19253
19290
  licenses: [],
19291
+ legalConstraints: [],
19292
+ securityConstraints: [],
19293
+ otherConstraints: [],
19254
19294
  contacts: [],
19255
19295
  contactsForResource: [],
19256
- accessConstraints: [],
19257
19296
  keywords: [],
19258
19297
  themes: [],
19259
- useLimitations: [],
19260
19298
  spatialExtents: [],
19261
19299
  temporalExtents: [],
19300
+ overviews: [],
19262
19301
  };
19263
19302
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19264
19303
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -20023,11 +20062,18 @@ class OrganizationsFromMetadataService {
20023
20062
  if (!allContactOrgs.length)
20024
20063
  return of(record);
20025
20064
  const ownerOrganization = allContactOrgs[0];
20026
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20065
+ // read the owner group as well to have a fallback logo
20066
+ const groupId = selectField(source, 'groupOwner');
20067
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20068
+ return group.id === Number(groupId);
20069
+ })));
20070
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20027
20071
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20072
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20028
20073
  return {
20029
20074
  ...record,
20030
20075
  ownerOrganization: {
20076
+ logoUrl,
20031
20077
  ...ownerOrganization,
20032
20078
  ...recordOrganisation,
20033
20079
  },
@@ -20292,36 +20338,23 @@ class SelectionService {
20292
20338
  this.selectedRecordsIdentifiers$.next(filtered);
20293
20339
  }
20294
20340
  selectRecords(records) {
20295
- const newIds = [];
20296
- records.map((record) => {
20297
- newIds.push(record.uniqueIdentifier);
20298
- });
20299
- const apiResponse = this.selectionsApi.add(BUCKET_ID, newIds);
20300
- return apiResponse.pipe(tap$2(() => {
20341
+ const newIds = records.map((record) => record.uniqueIdentifier);
20342
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20301
20343
  this.addIdsToSelected(newIds);
20302
- }), map$2(() => undefined));
20344
+ });
20303
20345
  }
20304
20346
  deselectRecords(records) {
20305
- const idsToBeRemoved = [];
20306
- records.map((record) => {
20307
- idsToBeRemoved.push(record.uniqueIdentifier);
20308
- });
20309
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved);
20310
- return apiResponse.pipe(tap$2(() => {
20347
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20348
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20311
20349
  this.removeIdsFromSelected(idsToBeRemoved);
20312
- }), map$2(() => undefined));
20313
- }
20314
- clearSelection() {
20315
- const currentSelectedResponse = this.selectionsApi.get(BUCKET_ID);
20316
- let currentSelection;
20317
- this.subscription = currentSelectedResponse.subscribe((value) => {
20318
- currentSelection = [...value];
20319
20350
  });
20320
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20321
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20322
- return apiResponse.pipe(tap$2(() => {
20351
+ }
20352
+ async clearSelection() {
20353
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20354
+ const currentSelection = Array.from(response);
20355
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20323
20356
  this.removeIdsFromSelected(currentSelection);
20324
- }), map$2(() => undefined));
20357
+ });
20325
20358
  }
20326
20359
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20327
20360
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20351,12 +20384,21 @@ class Gn4PlatformMapper {
20351
20384
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20352
20385
  return { ...apiUser, id: id.toString() };
20353
20386
  }
20354
- thesaurusFromApi(thesaurus) {
20387
+ thesaurusFromApi(thesaurus, lang3) {
20355
20388
  return thesaurus.map((keyword) => {
20356
- const { uri, value } = keyword;
20389
+ let key = keyword.uri;
20390
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20391
+ if (key.indexOf('@@@') > -1) {
20392
+ key = key.split('@@@')[1];
20393
+ }
20394
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20395
+ const description = lang3 && lang3 in keyword.definitions
20396
+ ? keyword.definitions[lang3]
20397
+ : keyword.definition;
20357
20398
  return {
20358
- key: uri,
20359
- label: value,
20399
+ key,
20400
+ label,
20401
+ description,
20360
20402
  };
20361
20403
  });
20362
20404
  }
@@ -20369,13 +20411,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20369
20411
 
20370
20412
  const minApiVersion = '4.2.2';
20371
20413
  class Gn4PlatformService {
20372
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20414
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20373
20415
  this.siteApiService = siteApiService;
20374
20416
  this.meApi = meApi;
20375
20417
  this.usersApi = usersApi;
20376
20418
  this.mapper = mapper;
20377
20419
  this.toolsApiService = toolsApiService;
20378
20420
  this.registriesApiService = registriesApiService;
20421
+ this.langService = langService;
20379
20422
  this.type = 'GeoNetwork';
20380
20423
  this.keyTranslations$ = this.toolsApiService
20381
20424
  .getTranslationsPackage1('gnui')
@@ -20389,6 +20432,11 @@ class Gn4PlatformService {
20389
20432
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20390
20433
  }
20391
20434
  }), shareReplay(1));
20435
+ /**
20436
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20437
+ * @private
20438
+ */
20439
+ this.thesauri = {};
20392
20440
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20393
20441
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20394
20442
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20415,19 +20463,36 @@ class Gn4PlatformService {
20415
20463
  return this.users$;
20416
20464
  }
20417
20465
  translateKey(key) {
20466
+ // if the key is a URI, use the registries API to look for the translation
20467
+ if (key.match(/^https?:\/\//)) {
20468
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20469
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20470
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20471
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20472
+ for (const item of thesaurus) {
20473
+ if (item.key === key)
20474
+ return item.label;
20475
+ }
20476
+ return key;
20477
+ }));
20478
+ }
20418
20479
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20419
20480
  }
20420
- getThesaurusByLang(thesaurusName, lang) {
20421
- return this.registriesApiService
20422
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20423
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20481
+ getThesaurusByUri(uri) {
20482
+ if (this.thesauri[uri]) {
20483
+ return this.thesauri[uri];
20484
+ }
20485
+ this.thesauri[uri] = this.registriesApiService
20486
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20487
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20488
+ return this.thesauri[uri];
20424
20489
  }
20425
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20490
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20426
20491
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20427
20492
  }
20428
20493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20429
20494
  type: Injectable
20430
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20495
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20431
20496
 
20432
20497
  function provideGn4() {
20433
20498
  return [
@@ -20639,6 +20704,8 @@ const defaultMapOptions = {
20639
20704
  };
20640
20705
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20641
20706
 
20707
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20708
+
20642
20709
  var MapContextLayerTypeEnum;
20643
20710
  (function (MapContextLayerTypeEnum) {
20644
20711
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21014,9 +21081,15 @@ const FORMATS = {
21014
21081
  color: '#328556',
21015
21082
  mimeTypes: ['x-gis/x-shapefile'],
21016
21083
  },
21084
+ gml: {
21085
+ extensions: ['gml'],
21086
+ priority: 5,
21087
+ color: '#c92bce',
21088
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21089
+ },
21017
21090
  kml: {
21018
21091
  extensions: ['kml', 'kmz'],
21019
- priority: 5,
21092
+ priority: 6,
21020
21093
  color: '#348009',
21021
21094
  mimeTypes: [
21022
21095
  'application/vnd.google-earth.kml+xml',
@@ -21025,34 +21098,40 @@ const FORMATS = {
21025
21098
  },
21026
21099
  gpkg: {
21027
21100
  extensions: ['gpkg', 'geopackage'],
21028
- priority: 6,
21101
+ priority: 7,
21029
21102
  color: '#ea79ba',
21030
21103
  mimeTypes: ['application/geopackage+sqlite3'],
21031
21104
  },
21032
21105
  zip: {
21033
21106
  extensions: ['zip', 'tar.gz'],
21034
- priority: 7,
21107
+ priority: 8,
21035
21108
  color: '#f2bb3a',
21036
21109
  mimeTypes: ['application/zip', 'application/x-zip'],
21037
21110
  },
21038
21111
  pdf: {
21039
21112
  extensions: ['pdf'],
21040
- priority: 8,
21113
+ priority: 9,
21041
21114
  color: '#db544a',
21042
21115
  mimeTypes: ['application/pdf'],
21043
21116
  },
21044
21117
  jpg: {
21045
21118
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21046
- priority: 8,
21119
+ priority: 9,
21047
21120
  color: '#673ab7',
21048
21121
  mimeTypes: ['image/jpg'],
21049
21122
  },
21050
21123
  svg: {
21051
21124
  extensions: ['svg'],
21052
- priority: 9,
21125
+ priority: 10,
21053
21126
  color: '#d98294',
21054
21127
  mimeTypes: ['image/svg+xml'],
21055
21128
  },
21129
+ dxf: {
21130
+ extensions: ['dxf'],
21131
+ priority: 11,
21132
+ color: '#de630b',
21133
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21134
+ },
21056
21135
  };
21057
21136
  function getFormatPriority(linkFormat) {
21058
21137
  for (const format in FORMATS) {
@@ -21069,14 +21148,18 @@ function getFormatPriority(linkFormat) {
21069
21148
  function getLinkPriority(link) {
21070
21149
  return getFormatPriority(getFileFormat(link));
21071
21150
  }
21072
- function extensionToFormat(extension) {
21073
- for (const format in FORMATS) {
21074
- for (const alias of FORMATS[format].extensions) {
21075
- if (alias === extension.toLowerCase())
21076
- return format;
21151
+ function getFileFormatFromServiceOutput(serviceOutput) {
21152
+ function formatMatcher(format) {
21153
+ const output = serviceOutput.toLowerCase();
21154
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21155
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21156
+ }
21157
+ for (const formatName in FORMATS) {
21158
+ if (formatMatcher(FORMATS[formatName])) {
21159
+ return formatName;
21077
21160
  }
21078
21161
  }
21079
- return undefined;
21162
+ return null;
21080
21163
  }
21081
21164
  function getFileFormat(link) {
21082
21165
  if ('mimeType' in link) {
@@ -21217,72 +21300,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21217
21300
  }]
21218
21301
  }] });
21219
21302
 
21220
- const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
21221
-
21222
- class MapUtilsWMSService {
21223
- constructor(proxy) {
21224
- this.proxy = proxy;
21225
- }
21226
- getCapabilities(layer) {
21227
- return from(new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady());
21228
- }
21229
- getLayerFull(layer) {
21230
- return this.getCapabilities(layer).pipe(map$1((endpoint) => endpoint.getLayerByName(layer.name)));
21231
- }
21232
- getLayerLonLatBBox(layer) {
21233
- return this.getLayerFull(layer).pipe(switchMap$1((wmsLayerFull) => from(this.getLonLatBBox(wmsLayerFull))));
21234
- }
21235
- async getLonLatBBox(wmsLayerFull) {
21236
- const { boundingBoxes } = wmsLayerFull;
21237
- const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21238
- if (lonLatCRS) {
21239
- return boundingBoxes[lonLatCRS];
21240
- }
21241
- else {
21242
- const availableEPSGCode = Object.keys(boundingBoxes)[0];
21243
- register(proj4);
21244
- const proj = await fromEPSGCode(availableEPSGCode);
21245
- proj4.defs(availableEPSGCode, proj);
21246
- const bboxWithFiniteNumbers = [
21247
- parseFloat(boundingBoxes[availableEPSGCode][0]),
21248
- parseFloat(boundingBoxes[availableEPSGCode][1]),
21249
- parseFloat(boundingBoxes[availableEPSGCode][2]),
21250
- parseFloat(boundingBoxes[availableEPSGCode][3]),
21251
- ];
21252
- const extent = transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21253
- return extent;
21254
- }
21255
- }
21256
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21257
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, providedIn: 'root' }); }
21258
- }
21259
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, decorators: [{
21260
- type: Injectable,
21261
- args: [{
21262
- providedIn: 'root',
21263
- }]
21264
- }], ctorParameters: function () { return [{ type: ProxyService }]; } });
21265
-
21266
21303
  const FEATURE_PROJECTION = 'EPSG:3857';
21267
21304
  const DATA_PROJECTION = 'EPSG:4326';
21305
+ const GEOJSON = new GeoJSON();
21268
21306
  class MapUtilsService {
21269
- constructor(http, wmsUtils) {
21307
+ constructor(http, proxy) {
21270
21308
  this.http = http;
21271
- this.wmsUtils = wmsUtils;
21309
+ this.proxy = proxy;
21272
21310
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21273
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21311
+ return GEOJSON.readFeatures(featureCollection, {
21274
21312
  featureProjection,
21275
21313
  dataProjection,
21276
21314
  });
21277
- return olFeatures;
21278
21315
  };
21279
21316
  }
21280
21317
  createEmptyMap() {
21281
- const map = new Map$1({
21318
+ return new Map$1({
21282
21319
  controls: [],
21283
21320
  pixelRatio: 1,
21284
21321
  });
21285
- return map;
21286
21322
  }
21287
21323
  isWMSLayer(layer) {
21288
21324
  return (layer.getSource() instanceof TileWMS ||
@@ -21297,8 +21333,7 @@ class MapUtilsService {
21297
21333
  ...source.getParams(),
21298
21334
  INFO_FORMAT: 'application/json',
21299
21335
  };
21300
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21301
- return url;
21336
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21302
21337
  }
21303
21338
  getVectorFeaturesFromClick(olMap, event) {
21304
21339
  const features = [];
@@ -21326,38 +21361,56 @@ class MapUtilsService {
21326
21361
  /**
21327
21362
  * Will emit `null` if no extent could be computed
21328
21363
  */
21329
- getLayerExtent(layer) {
21330
- let geographicExtent;
21364
+ async getLayerExtent(layer) {
21365
+ let latLonExtent;
21331
21366
  if (layer &&
21332
21367
  layer.type === 'geojson' &&
21333
21368
  'data' in layer &&
21334
21369
  typeof layer.data === 'object' &&
21335
21370
  layer.data.features[0] &&
21336
21371
  layer.data.features[0].geometry) {
21337
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21338
- .readFeatures(layerData)
21372
+ latLonExtent = new GeoJSON()
21373
+ .readFeatures(layer.data)
21339
21374
  .map((feature) => feature.getGeometry())
21340
21375
  .filter((geom) => !!geom)
21341
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21376
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21342
21377
  }
21343
21378
  else if (layer && layer.type === 'wms') {
21344
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21379
+ latLonExtent = await this.getWmsLayerExtent(layer);
21345
21380
  }
21346
21381
  else if (layer && layer.type === 'wmts') {
21347
21382
  if (layer.extent) {
21348
- geographicExtent = of(layer.extent);
21383
+ latLonExtent = layer.extent;
21349
21384
  }
21350
21385
  else {
21351
- return of(layer.options.tileGrid.getExtent());
21386
+ return layer.options.tileGrid.getExtent();
21352
21387
  }
21353
21388
  }
21354
21389
  else {
21355
- return of(null);
21390
+ return null;
21391
+ }
21392
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21393
+ return null;
21394
+ }
21395
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21396
+ }
21397
+ async getWmsLayerExtent(layer) {
21398
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21399
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21400
+ if (!Object.keys(boundingBoxes).length) {
21401
+ return null;
21402
+ }
21403
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21404
+ if (lonLatCRS) {
21405
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21406
+ }
21407
+ else {
21408
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21409
+ register(proj4);
21410
+ const proj = await fromEPSGCode(availableEPSGCode);
21411
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21412
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21356
21413
  }
21357
- return geographicExtent.pipe(map$1((extent) => [
21358
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
21359
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
21360
- ]), map$1((extent) => (isEmpty(extent) ? null : extent)));
21361
21414
  }
21362
21415
  getWmtsLayerFromCapabilities(link) {
21363
21416
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21413,7 +21466,18 @@ ${e.stack || e.message || e}`);
21413
21466
  ])
21414
21467
  .getArray());
21415
21468
  }
21416
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, deps: [{ token: i1.HttpClient }, { token: MapUtilsWMSService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21469
+ getRecordExtent(record) {
21470
+ if (!('spatialExtents' in record)) {
21471
+ return null;
21472
+ }
21473
+ // transform an array of geojson geometries into a bbox
21474
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21475
+ const geom = GEOJSON.readGeometry(curr.geometry);
21476
+ return extend(prev, geom.getExtent());
21477
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21478
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21479
+ }
21480
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, deps: [{ token: i1.HttpClient }, { token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21417
21481
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21418
21482
  }
21419
21483
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21421,7 +21485,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21421
21485
  args: [{
21422
21486
  providedIn: 'root',
21423
21487
  }]
21424
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21488
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21425
21489
  function dragPanCondition(event) {
21426
21490
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21427
21491
  if (!dragPanCondition) {
@@ -22496,6 +22560,7 @@ const DEFAULT_VIEW = {
22496
22560
  center: [0, 15],
22497
22561
  zoom: 2,
22498
22562
  };
22563
+ const WFS_MAX_FEATURES = 10000;
22499
22564
  class MapContextService {
22500
22565
  constructor(mapUtils, styleService) {
22501
22566
  this.mapUtils = mapUtils;
@@ -22505,6 +22570,9 @@ class MapContextService {
22505
22570
  if (mapConfig) {
22506
22571
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22507
22572
  }
22573
+ else {
22574
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22575
+ }
22508
22576
  if (!mapContext.view?.extent &&
22509
22577
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22510
22578
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22554,6 +22622,7 @@ class MapContextService {
22554
22622
  urlObj.searchParams.set('typename', layerModel.name);
22555
22623
  urlObj.searchParams.set('srsname', 'EPSG:3857');
22556
22624
  urlObj.searchParams.set('bbox', `${extent.join(',')},EPSG:3857`);
22625
+ urlObj.searchParams.set('maxFeatures', WFS_MAX_FEATURES.toString());
22557
22626
  return urlObj.toString();
22558
22627
  },
22559
22628
  strategy: bbox,
@@ -22614,6 +22683,11 @@ class MapContextService {
22614
22683
  }
22615
22684
  return view;
22616
22685
  }
22686
+ addDefaultBaselayerContext(layers) {
22687
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22688
+ ? layers
22689
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22690
+ }
22617
22691
  mergeMapConfigWithContext(mapContext, mapConfig) {
22618
22692
  return {
22619
22693
  ...mapContext,
@@ -23101,6 +23175,7 @@ class ThumbnailComponent {
23101
23175
  constructor(optionalPlaceholderUrl) {
23102
23176
  this.optionalPlaceholderUrl = optionalPlaceholderUrl;
23103
23177
  this.fit = 'cover';
23178
+ this.placeholderShown = new EventEmitter();
23104
23179
  this.placeholderUrl = this.optionalPlaceholderUrl || DEFAULT_PLACEHOLDER;
23105
23180
  this.images = [];
23106
23181
  }
@@ -23136,6 +23211,7 @@ class ThumbnailComponent {
23136
23211
  setNewSrcImage(image) {
23137
23212
  this.imgFit = image.fit;
23138
23213
  this.imgUrl = image.url;
23214
+ this.placeholderShown.emit(this.isPlaceholder);
23139
23215
  }
23140
23216
  setPlaceholder() {
23141
23217
  this.setNewSrcImage({ url: this.placeholderUrl, fit: 'scale-down' });
@@ -23158,7 +23234,7 @@ class ThumbnailComponent {
23158
23234
  }
23159
23235
  }
23160
23236
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, deps: [{ token: THUMBNAIL_PLACEHOLDER, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
23161
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23237
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23162
23238
  }
23163
23239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23164
23240
  type: Component,
@@ -23178,11 +23254,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23178
23254
  }], containerElement: [{
23179
23255
  type: ViewChild,
23180
23256
  args: ['containerElement']
23257
+ }], placeholderShown: [{
23258
+ type: Output
23181
23259
  }] } });
23182
23260
 
23183
23261
  class RecordPreviewCardComponent extends RecordPreviewComponent {
23184
23262
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23185
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewCardComponent, selector: "gn-ui-record-preview-card", usesInheritance: true, ngImport: i0, template: "<div\n class=\"h-full border bg-white rounded-sm overflow-hidden transition duration-200 transform hover:scale-105 hover:bg-gray-50 border-gray-300 hover:border-primary hover:text-primary\"\n>\n <a\n [href]=\"record.landingPage\"\n [title]=\"record.abstract\"\n [target]=\"linkTarget\"\n >\n <div class=\"flex flex-col min-h-full\">\n <gn-ui-thumbnail\n class=\"lg:h-48 md:h-36 border-b border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"grow p-4\">\n <h1 class=\"title-font text-lg font-medium mb-3 clamp-2\">\n {{ record.title }}\n </h1>\n <p class=\"leading-relaxed text-sm text-gray-700 clamp-3\">\n {{ record.abstract }}\n </p>\n </div>\n </div>\n </a>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23263
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewCardComponent, selector: "gn-ui-record-preview-card", usesInheritance: true, ngImport: i0, template: "<div\n class=\"h-full border bg-white rounded-sm overflow-hidden transition duration-200 transform hover:scale-105 hover:bg-gray-50 border-gray-300 hover:border-primary hover:text-primary\"\n>\n <a\n [href]=\"record.landingPage\"\n [title]=\"record.abstract\"\n [target]=\"linkTarget\"\n >\n <div class=\"flex flex-col min-h-full\">\n <gn-ui-thumbnail\n class=\"lg:h-48 md:h-36 border-b border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"grow p-4\">\n <h1 class=\"title-font text-lg font-medium mb-3 clamp-2\">\n {{ record.title }}\n </h1>\n <p class=\"leading-relaxed text-sm text-gray-700 clamp-3\">\n {{ record.abstract }}\n </p>\n </div>\n </div>\n </a>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23186
23264
  }
23187
23265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, decorators: [{
23188
23266
  type: Component,
@@ -23191,7 +23269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23191
23269
 
23192
23270
  class RecordPreviewListComponent extends RecordPreviewComponent {
23193
23271
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23194
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewListComponent, selector: "gn-ui-record-preview-list", usesInheritance: true, ngImport: i0, template: "<div\n class=\"h-40 bg-white transition duration-200 border border-gray-200 rounded-md hover:bg-gray-50 hover:border-primary hover:text-primary\"\n>\n <a\n [href]=\"record.landingPage\"\n [target]=\"linkTarget\"\n [title]=\"record.abstract\"\n >\n <div class=\"h-full flex flex-row items-center shadow-sm\">\n <gn-ui-thumbnail\n class=\"w-40 h-full shrink-0 border-r border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"grow h-full px-6 py-4 flex flex-col overflow-hidden\">\n <div class=\"title-font text-lg font-medium mb-2\">\n <h1 class=\"truncate\">{{ record.title }}</h1>\n </div>\n <p class=\"leading-relaxed clamp-3 text-sm text-gray-700\">\n {{ record.abstract }}\n </p>\n <div class=\"grow\"></div>\n <div class=\"flex flex-row items-center\">\n <div\n class=\"text-gray-500 text-xs truncate capitalize border-r mr-4 pr-4\"\n *ngIf=\"record.kind === 'dataset'\"\n >\n <span translate>{{ record.updateFrequency }}</span>\n </div>\n <div\n class=\"text-gray-500 text-xs border-gray-300 truncate viewable-downloadable\"\n *ngIf=\"isViewable || isDownloadable\"\n >\n <span *ngIf=\"isViewable\" translate>record.action.view</span>\n <span *ngIf=\"isViewable && isDownloadable\">,&nbsp;</span>\n <span *ngIf=\"isDownloadable\" translate>record.action.download</span>\n </div>\n </div>\n </div>\n </div>\n </a>\n</div>\n", styles: [".viewable-downloadable :first-child{text-transform:capitalize}\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: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23272
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewListComponent, selector: "gn-ui-record-preview-list", usesInheritance: true, ngImport: i0, template: "<div\n class=\"h-40 bg-white transition duration-200 border border-gray-200 rounded-md hover:bg-gray-50 hover:border-primary hover:text-primary\"\n>\n <a\n [href]=\"record.landingPage\"\n [target]=\"linkTarget\"\n [title]=\"record.abstract\"\n >\n <div class=\"h-full flex flex-row items-center shadow-sm\">\n <gn-ui-thumbnail\n class=\"w-40 h-full shrink-0 border-r border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"grow h-full px-6 py-4 flex flex-col overflow-hidden\">\n <div class=\"title-font text-lg font-medium mb-2\">\n <h1 class=\"truncate\">{{ record.title }}</h1>\n </div>\n <p class=\"leading-relaxed clamp-3 text-sm text-gray-700\">\n {{ record.abstract }}\n </p>\n <div class=\"grow\"></div>\n <div class=\"flex flex-row items-center\">\n <div\n class=\"text-gray-500 text-xs truncate capitalize border-r mr-4 pr-4\"\n *ngIf=\"record.kind === 'dataset'\"\n >\n <span translate>{{ record.updateFrequency }}</span>\n </div>\n <div\n class=\"text-gray-500 text-xs border-gray-300 truncate viewable-downloadable\"\n *ngIf=\"isViewable || isDownloadable\"\n >\n <span *ngIf=\"isViewable\" translate>record.action.view</span>\n <span *ngIf=\"isViewable && isDownloadable\">,&nbsp;</span>\n <span *ngIf=\"isDownloadable\" translate>record.action.download</span>\n </div>\n </div>\n </div>\n </div>\n </a>\n</div>\n", styles: [".viewable-downloadable :first-child{text-transform:capitalize}\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: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23195
23273
  }
23196
23274
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, decorators: [{
23197
23275
  type: Component,
@@ -23288,8 +23366,7 @@ class MetadataQualityComponent {
23288
23366
  : this.calculatedQualityScore;
23289
23367
  }
23290
23368
  get calculatedQualityScore() {
23291
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23292
- this.items.length);
23369
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23293
23370
  }
23294
23371
  showMenu() {
23295
23372
  this.isMenuShown = true;
@@ -23339,7 +23416,7 @@ class RecordPreviewRowComponent extends RecordPreviewComponent {
23339
23416
  this.elementRef = elementRef;
23340
23417
  }
23341
23418
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewRowComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
23342
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewRowComponent, selector: "gn-ui-record-preview-row", usesInheritance: true, ngImport: i0, template: "<a\n class=\"group container-lg mx-auto flex cursor-pointer flex-wrap sm:flex-nowrap\"\n [title]=\"record.title\"\n [attr.href]=\"linkHref\"\n>\n <div class=\"shrink-0 w-full sm:w-52\">\n <div\n class=\"overflow-hidden bg-gray-100 rounded-lg w-full border border-gray-300 h-36\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full object-cover object-left-top\"\n [thumbnailUrl]=\"[record.overviews?.[0]?.url?.toString(), organization?.logoUrl?.toString()]\"\n [fit]=\"['cover', 'contain']\"\n ></gn-ui-thumbnail>\n </div>\n </div>\n <div\n class=\"content grid grow relative sm:pl-6 sm:pr-12\"\n style=\"grid-template-columns: auto 70px\"\n >\n <div class=\"mb-3 mt-5 sm:mt-2\">\n <div\n class=\"font-title text-21 text-title line-clamp-2 col-start-1 col-span-2 sm:line-clamp-1 group-hover:text-primary transition-colors\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </div>\n </div>\n <div\n class=\"abstract mt-4 mb-5 h-36 line-clamp-6 col-start-1 col-span-2 row-start-3 sm:mb-2 sm:h-[4.5rem] sm:line-clamp-3 sm:row-start-2 sm:mt-0\"\n data-cy=\"recordAbstract\"\n >\n {{ abstract }}\n </div>\n <div\n class=\"text-primary opacity-45 uppercase col-start-1 col-span-2 row-start-2 sm:truncate sm:row-start-3 sm:col-span-1\"\n data-cy=\"recordOrg\"\n [class]=\"metadataQualityDisplay ? 'limit-organisation-with-quality' : ''\"\n >\n {{ organization?.name }}\n </div>\n <div\n class=\"icons flex flex-row col-start-1 row-start-4 sm:col-start-2 sm:row-start-3 sm:absolute sm:right-[0.4em]\"\n >\n <mat-icon\n *ngIf=\"isDownloadable\"\n class=\"material-symbols-outlined text-primary opacity-45 mx-1\"\n >cloud_download</mat-icon\n >\n <mat-icon\n *ngIf=\"isViewable\"\n class=\"material-symbols-outlined text-primary opacity-45 mx-1\"\n >map</mat-icon\n >\n </div>\n <div\n *ngIf=\"metadataQualityDisplay\"\n class=\"col-start-2 row-start-4 sm:row-start-3 absolute right-[4em] sm:right-[5em]\"\n >\n <gn-ui-metadata-quality\n smaller=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div\n class=\"text-right col-start-3 row-start-4 sm:absolute sm:col-start-2 sm:row-start-1 sm:top-[-1.125em] sm:right-[0.4em]\"\n data-cy=\"recordFav\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n</a>\n", styles: [".limit-organisation-with-quality{max-width:calc(100% - 170px)}\n"], dependencies: [{ 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: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23419
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewRowComponent, selector: "gn-ui-record-preview-row", usesInheritance: true, ngImport: i0, template: "<a\n class=\"group container-lg mx-auto flex cursor-pointer flex-wrap sm:flex-nowrap\"\n [title]=\"record.title\"\n [attr.href]=\"linkHref\"\n>\n <div class=\"shrink-0 w-full sm:w-52\">\n <div\n class=\"overflow-hidden bg-gray-100 rounded-lg w-full border border-gray-300 h-36\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full object-cover object-left-top\"\n [thumbnailUrl]=\"[record.overviews?.[0]?.url?.toString(), organization?.logoUrl?.toString()]\"\n [fit]=\"['cover', 'contain']\"\n ></gn-ui-thumbnail>\n </div>\n </div>\n <div\n class=\"content grid grow relative sm:pl-6 sm:pr-12\"\n style=\"grid-template-columns: auto 70px\"\n >\n <div class=\"mb-3 mt-5 sm:mt-2\">\n <div\n class=\"font-title text-21 text-title line-clamp-2 col-start-1 col-span-2 sm:line-clamp-1 group-hover:text-primary transition-colors\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </div>\n </div>\n <div\n class=\"abstract mt-4 mb-5 h-36 line-clamp-6 col-start-1 col-span-2 row-start-3 sm:mb-2 sm:h-[4.5rem] sm:line-clamp-3 sm:row-start-2 sm:mt-0\"\n data-cy=\"recordAbstract\"\n >\n {{ abstract }}\n </div>\n <div\n class=\"text-primary opacity-45 uppercase col-start-1 col-span-2 row-start-2 sm:truncate sm:row-start-3 sm:col-span-1\"\n data-cy=\"recordOrg\"\n [class]=\"metadataQualityDisplay ? 'limit-organisation-with-quality' : ''\"\n >\n {{ organization?.name }}\n </div>\n <div\n class=\"icons flex flex-row col-start-1 row-start-4 sm:col-start-2 sm:row-start-3 sm:absolute sm:right-[0.4em]\"\n >\n <mat-icon\n *ngIf=\"isDownloadable\"\n class=\"material-symbols-outlined text-primary opacity-45 mx-1\"\n >cloud_download</mat-icon\n >\n <mat-icon\n *ngIf=\"isViewable\"\n class=\"material-symbols-outlined text-primary opacity-45 mx-1\"\n >map</mat-icon\n >\n </div>\n <div\n *ngIf=\"metadataQualityDisplay\"\n class=\"col-start-2 row-start-4 sm:row-start-3 absolute right-[4em] sm:right-[5em]\"\n >\n <gn-ui-metadata-quality\n smaller=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div\n class=\"text-right col-start-3 row-start-4 sm:absolute sm:col-start-2 sm:row-start-1 sm:top-[-1.125em] sm:right-[0.4em]\"\n data-cy=\"recordFav\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n</a>\n", styles: [".limit-organisation-with-quality{max-width:calc(100% - 170px)}\n"], dependencies: [{ 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: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23343
23420
  }
23344
23421
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewRowComponent, decorators: [{
23345
23422
  type: Component,
@@ -23357,7 +23434,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23357
23434
 
23358
23435
  class RecordPreviewTitleComponent extends RecordPreviewComponent {
23359
23436
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23360
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewTitleComponent, selector: "gn-ui-record-preview-title", usesInheritance: true, ngImport: i0, template: "<!-- Record list item: List Small -->\n<div\n class=\"h-10 w-full border-b border-gray-200 transition duration-200 rounded-sm hover:text-primary\"\n>\n <a\n [href]=\"record.landingPage\"\n [target]=\"linkTarget\"\n [title]=\"record.abstract\"\n >\n <div class=\"h-full flex flex-row items-center\">\n <gn-ui-thumbnail\n class=\"w-10 h-full shrink-0 border-r border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"grow px-3 py-1 flex flex-col overflow-hidden\">\n <h1 class=\"title-font text-sm font-bold truncate md:text-clip\">\n {{ record.title }}\n </h1>\n </div>\n </div>\n </a>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23437
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewTitleComponent, selector: "gn-ui-record-preview-title", usesInheritance: true, ngImport: i0, template: "<!-- Record list item: List Small -->\n<div\n class=\"h-10 w-full border-b border-gray-200 transition duration-200 rounded-sm hover:text-primary\"\n>\n <a\n [href]=\"record.landingPage\"\n [target]=\"linkTarget\"\n [title]=\"record.abstract\"\n >\n <div class=\"h-full flex flex-row items-center\">\n <gn-ui-thumbnail\n class=\"w-10 h-full shrink-0 border-r border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"grow px-3 py-1 flex flex-col overflow-hidden\">\n <h1 class=\"title-font text-sm font-bold truncate md:text-clip\">\n {{ record.title }}\n </h1>\n </div>\n </div>\n </a>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23361
23438
  }
23362
23439
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, decorators: [{
23363
23440
  type: Component,
@@ -23397,7 +23474,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
23397
23474
  return this.timeFormat.format(this.record.recordCreated, Date.now());
23398
23475
  }
23399
23476
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewFeedComponent, deps: [{ token: i0.ElementRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
23400
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewFeedComponent, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n <mat-icon\n *ngIf=\"!hasLogo\"\n class=\"material-symbols-outlined text-gray-200\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n >{{ hasOnlyPerson ? 'face' : 'home_work' }}</mat-icon\n >\n <gn-ui-thumbnail\n *ngIf=\"hasLogo\"\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n <span\n *ngIf=\"hasOrganization\"\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n <span\n *ngIf=\"hasOnlyPerson\"\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"absolute top-[0.85em] right-[0.85em]\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n <h1\n class=\"font-title text-black text-[21px] font-medium mb-3 pr-8\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n <p class=\"line-clamp-3\">{{ abstract }}</p>\n <gn-ui-thumbnail\n *ngIf=\"record.overviews?.[0]\"\n class=\"block mt-3 w-full h-[136px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n <div class=\"flex flex-row mt-3\" *ngIf=\"isDownloadable || isViewable\">\n <mat-icon\n *ngIf=\"isDownloadable\"\n class=\"material-symbols-outlined text-primary opacity-45 mr-3\"\n >cloud_download\n </mat-icon>\n <mat-icon\n *ngIf=\"isViewable\"\n class=\"material-symbols-outlined text-primary opacity-45 mr-3\"\n >map\n </mat-icon>\n </div>\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"], dependencies: [{ 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$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23477
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordPreviewFeedComponent, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n <mat-icon\n *ngIf=\"!hasLogo\"\n class=\"material-symbols-outlined text-gray-200\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n >{{ hasOnlyPerson ? 'face' : 'home_work' }}</mat-icon\n >\n <gn-ui-thumbnail\n *ngIf=\"hasLogo\"\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n <span\n *ngIf=\"hasOrganization\"\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n <span\n *ngIf=\"hasOnlyPerson\"\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"absolute top-[0.85em] right-[0.85em]\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n <h1\n class=\"font-title text-black text-[21px] font-medium mb-3 pr-8\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n <p class=\"line-clamp-3\">{{ abstract }}</p>\n <gn-ui-thumbnail\n *ngIf=\"record.overviews?.[0]\"\n class=\"block mt-3 w-full h-[136px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n <div class=\"flex flex-row mt-3\" *ngIf=\"isDownloadable || isViewable\">\n <mat-icon\n *ngIf=\"isDownloadable\"\n class=\"material-symbols-outlined text-primary opacity-45 mr-3\"\n >cloud_download\n </mat-icon>\n <mat-icon\n *ngIf=\"isViewable\"\n class=\"material-symbols-outlined text-primary opacity-45 mr-3\"\n >map\n </mat-icon>\n </div>\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"], dependencies: [{ 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$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23401
23478
  }
23402
23479
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewFeedComponent, decorators: [{
23403
23480
  type: Component,
@@ -23730,15 +23807,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23730
23807
  args: ['contentDiv']
23731
23808
  }] } });
23732
23809
 
23733
- class ContentGhostComponent {
23810
+ class CopyTextButtonComponent {
23734
23811
  constructor() {
23735
- this.ghostClass = '';
23812
+ this.displayText = true;
23813
+ this.rows = 1;
23736
23814
  }
23737
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23738
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: { showContent: "showContent", ghostClass: "ghostClass" }, ngImport: i0, template: "<div\n *ngIf=\"!showContent\"\n class=\"ghost bg-gray-100 rounded-lg relative overflow-hidden {{ ghostClass }}\"\n></div>\n<ng-content *ngIf=\"showContent\"></ng-content>\n", styles: [".ghost{min-height:2rem;min-width:2rem;overflow:hidden}.ghost:after{content:\"\";position:absolute;top:0;bottom:0;width:50%;background-image:linear-gradient(to left,rgba(251,251,251,.05),rgba(251,251,251,.3),rgba(251,251,251,.6),rgba(251,251,251,.3),rgba(251,251,251,.05));animation:loading 1s infinite}@keyframes loading{0%{left:-50%}to{left:100%}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23739
- }
23740
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, decorators: [{
23741
- type: Component,
23815
+ copyText(event) {
23816
+ navigator.clipboard.writeText(this.text);
23817
+ event.target.blur();
23818
+ }
23819
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23820
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23821
+ }
23822
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
23823
+ type: Component,
23824
+ args: [{ selector: 'gn-ui-copy-text-button', changeDetection: ChangeDetectionStrategy.OnPush, 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" }]
23825
+ }], propDecorators: { text: [{
23826
+ type: Input
23827
+ }], tooltipText: [{
23828
+ type: Input
23829
+ }], displayText: [{
23830
+ type: Input
23831
+ }], rows: [{
23832
+ type: Input
23833
+ }] } });
23834
+
23835
+ class MarkdownParserComponent {
23836
+ get parsedMarkdown() {
23837
+ return marked.parse(this.textContent);
23838
+ }
23839
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23840
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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 }); }
23841
+ }
23842
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23843
+ type: Component,
23844
+ 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"] }]
23845
+ }], propDecorators: { textContent: [{
23846
+ type: Input
23847
+ }] } });
23848
+
23849
+ class ContentGhostComponent {
23850
+ constructor() {
23851
+ this.ghostClass = '';
23852
+ }
23853
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23854
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: { showContent: "showContent", ghostClass: "ghostClass" }, ngImport: i0, template: "<div\n *ngIf=\"!showContent\"\n class=\"ghost bg-gray-100 rounded-lg relative overflow-hidden {{ ghostClass }}\"\n></div>\n<ng-content *ngIf=\"showContent\"></ng-content>\n", styles: [".ghost{min-height:2rem;min-width:2rem;overflow:hidden}.ghost:after{content:\"\";position:absolute;top:0;bottom:0;width:50%;background-image:linear-gradient(to left,rgba(251,251,251,.05),rgba(251,251,251,.3),rgba(251,251,251,.6),rgba(251,251,251,.3),rgba(251,251,251,.05));animation:loading 1s infinite}@keyframes loading{0%{left:-50%}to{left:100%}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23855
+ }
23856
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, decorators: [{
23857
+ type: Component,
23742
23858
  args: [{ selector: 'gn-ui-content-ghost', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"!showContent\"\n class=\"ghost bg-gray-100 rounded-lg relative overflow-hidden {{ ghostClass }}\"\n></div>\n<ng-content *ngIf=\"showContent\"></ng-content>\n", styles: [".ghost{min-height:2rem;min-width:2rem;overflow:hidden}.ghost:after{content:\"\";position:absolute;top:0;bottom:0;width:50%;background-image:linear-gradient(to left,rgba(251,251,251,.05),rgba(251,251,251,.3),rgba(251,251,251,.6),rgba(251,251,251,.3),rgba(251,251,251,.05));animation:loading 1s infinite}@keyframes loading{0%{left:-50%}to{left:100%}}\n"] }]
23743
23859
  }], propDecorators: { showContent: [{
23744
23860
  type: Input
@@ -23890,16 +24006,32 @@ class MetadataInfoComponent {
23890
24006
  }
23891
24007
  get hasUsage() {
23892
24008
  return (this.metadata.extras?.isOpenData === true ||
23893
- this.metadata.useLimitations?.length ||
23894
- this.metadata.accessConstraints?.length);
24009
+ (this.metadata.legalConstraints?.length > 0 &&
24010
+ this.legalConstraints.length > 0) ||
24011
+ (this.metadata.otherConstraints?.length > 0 &&
24012
+ this.otherConstraints.length > 0) ||
24013
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
23895
24014
  }
23896
- get usages() {
24015
+ get legalConstraints() {
23897
24016
  let array = [];
23898
- if (this.metadata.useLimitations?.length) {
23899
- array = array.concat(this.metadata.useLimitations);
24017
+ if (this.metadata.legalConstraints?.length) {
24018
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
23900
24019
  }
23901
- if (this.metadata.accessConstraints?.length) {
23902
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24020
+ return array;
24021
+ }
24022
+ get otherConstraints() {
24023
+ let array = [];
24024
+ if (this.metadata.otherConstraints?.length) {
24025
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24026
+ }
24027
+ return array;
24028
+ }
24029
+ get licenses() {
24030
+ let array = [];
24031
+ if (this.metadata.licenses?.length) {
24032
+ array = array.concat(this.metadata.licenses
24033
+ .filter((c) => c.text)
24034
+ .map((c) => ({ text: c.text, url: c.url })));
23903
24035
  }
23904
24036
  return array;
23905
24037
  }
@@ -23922,11 +24054,11 @@ class MetadataInfoComponent {
23922
24054
  this.keyword.emit(keyword);
23923
24055
  }
23924
24056
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23925
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<p\n class=\"text-[28px] text-title text-center mb-6 font-title sm:text-left\"\n translate\n>\n record.metadata.about\n</p>\n<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 <p\n class=\"whitespace-pre-line break-words sm:mb-4 sm:pr-16\"\n [innerHTML]=\"metadata.abstract\"\n gnUiLinkify\n ></p>\n <ng-container *ngIf=\"metadata.keywords?.length\">\n <p class=\"mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </ng-container>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\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.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"py-5 px-5 rounded bg-gray-100 text-gray-700\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\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;}\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: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { 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: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24057
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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 </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 class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\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.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | 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.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</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: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { 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: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23926
24058
  }
23927
24059
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
23928
24060
  type: Component,
23929
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p\n class=\"text-[28px] text-title text-center mb-6 font-title sm:text-left\"\n translate\n>\n record.metadata.about\n</p>\n<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 <p\n class=\"whitespace-pre-line break-words sm:mb-4 sm:pr-16\"\n [innerHTML]=\"metadata.abstract\"\n gnUiLinkify\n ></p>\n <ng-container *ngIf=\"metadata.keywords?.length\">\n <p class=\"mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </ng-container>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\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.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"py-5 px-5 rounded bg-gray-100 text-gray-700\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\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;}\n"] }]
24061
+ 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 </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 class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\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.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | 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.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</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"] }]
23930
24062
  }], propDecorators: { metadata: [{
23931
24063
  type: Input
23932
24064
  }], incomplete: [{
@@ -23995,11 +24127,11 @@ class ButtonComponent {
23995
24127
  propagateToDocumentOnly(event);
23996
24128
  }
23997
24129
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23998
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host /deep/ mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24130
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, isStandalone: true, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23999
24131
  }
24000
24132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24001
24133
  type: Component,
24002
- args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host /deep/ mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24134
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24003
24135
  }], propDecorators: { type: [{
24004
24136
  type: Input
24005
24137
  }], disabled: [{
@@ -24074,40 +24206,15 @@ class DownloadsListComponent {
24074
24206
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24075
24207
  }
24076
24208
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
24077
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\">\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], 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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24209
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], 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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24078
24210
  }
24079
24211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24080
24212
  type: Component,
24081
- args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\">\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
24213
+ args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
24082
24214
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24083
24215
  type: Input
24084
24216
  }] } });
24085
24217
 
24086
- class CopyTextButtonComponent {
24087
- constructor() {
24088
- this.displayText = true;
24089
- this.rows = 1;
24090
- }
24091
- copyText(event) {
24092
- navigator.clipboard.writeText(this.text);
24093
- event.target.blur();
24094
- }
24095
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24096
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24097
- }
24098
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24099
- type: Component,
24100
- args: [{ selector: 'gn-ui-copy-text-button', changeDetection: ChangeDetectionStrategy.OnPush, 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" }]
24101
- }], propDecorators: { text: [{
24102
- type: Input
24103
- }], tooltipText: [{
24104
- type: Input
24105
- }], displayText: [{
24106
- type: Input
24107
- }], rows: [{
24108
- type: Input
24109
- }] } });
24110
-
24111
24218
  class ApiCardComponent {
24112
24219
  constructor() {
24113
24220
  this.currentlyActive = false;
@@ -24304,11 +24411,11 @@ class CarouselComponent {
24304
24411
  this.emblaApi.scrollTo(stepIndex);
24305
24412
  }
24306
24413
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24307
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container /deep/ > *{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24414
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24308
24415
  }
24309
24416
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24310
24417
  type: Component,
24311
- args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container /deep/ > *{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24418
+ args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24312
24419
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24313
24420
  type: Input
24314
24421
  }], stepsContainerClass: [{
@@ -24352,6 +24459,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24352
24459
  }]
24353
24460
  }] });
24354
24461
 
24462
+ class InteractiveTableColumnComponent {
24463
+ constructor() {
24464
+ this.grow = false;
24465
+ this.sortable = false;
24466
+ this.activeSort = null;
24467
+ this.sortChange = new EventEmitter();
24468
+ }
24469
+ handleSortChange() {
24470
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24471
+ this.sortChange.emit(this.activeSort);
24472
+ }
24473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24474
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: InteractiveTableColumnComponent, isStandalone: true, selector: "gn-ui-interactive-table-column", inputs: { grow: "grow", sortable: "sortable", activeSort: "activeSort" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "cell", first: true, predicate: ["cell"], descendants: true }], ngImport: i0, template: "<span>empty</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24475
+ }
24476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24477
+ type: Component,
24478
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24479
+ }], propDecorators: { header: [{
24480
+ type: ContentChild,
24481
+ args: ['header']
24482
+ }], cell: [{
24483
+ type: ContentChild,
24484
+ args: ['cell']
24485
+ }], grow: [{
24486
+ type: Input
24487
+ }], sortable: [{
24488
+ type: Input
24489
+ }], activeSort: [{
24490
+ type: Input
24491
+ }], sortChange: [{
24492
+ type: Output
24493
+ }] } });
24494
+
24495
+ class InteractiveTableComponent {
24496
+ constructor() {
24497
+ this.items = [];
24498
+ this.itemClick = new EventEmitter();
24499
+ }
24500
+ get gridStyle() {
24501
+ return {
24502
+ 'grid-template-columns': this.columns
24503
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24504
+ .join(' '),
24505
+ };
24506
+ }
24507
+ handleRowClick(item) {
24508
+ this.itemClick.emit(item);
24509
+ }
24510
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24511
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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 }); }
24512
+ }
24513
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24514
+ type: Component,
24515
+ 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"] }]
24516
+ }], propDecorators: { columns: [{
24517
+ type: ContentChildren,
24518
+ args: [InteractiveTableColumnComponent]
24519
+ }], items: [{
24520
+ type: Input
24521
+ }], itemClick: [{
24522
+ type: Output
24523
+ }] } });
24524
+
24355
24525
  class LinkCardComponent {
24356
24526
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24357
24527
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, selector: "gn-ui-link-card", inputs: { link: "link" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -24365,11 +24535,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24365
24535
 
24366
24536
  class RelatedRecordCardComponent {
24367
24537
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24368
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record" }, ngImport: i0, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$5.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"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24538
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record" }, ngImport: i0, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$5.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 }); }
24369
24539
  }
24370
24540
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
24371
24541
  type: Component,
24372
- args: [{ selector: 'gn-ui-related-record-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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" }]
24542
+ args: [{ selector: 'gn-ui-related-record-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\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" }]
24373
24543
  }], propDecorators: { record: [{
24374
24544
  type: Input
24375
24545
  }] } });
@@ -24397,11 +24567,11 @@ class MetadataContactComponent {
24397
24567
  this.organizationClick.emit(this.shownOrganization);
24398
24568
  }
24399
24569
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24400
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6 sm:mb-12\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.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]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.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>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.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=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], 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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24570
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.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]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.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>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.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=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], 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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24401
24571
  }
24402
24572
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24403
24573
  type: Component,
24404
- args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6 sm:mb-12\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.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]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.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>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.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=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24574
+ args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.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]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.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>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.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=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24405
24575
  }], propDecorators: { metadata: [{
24406
24576
  type: Input
24407
24577
  }], organizationClick: [{
@@ -24805,11 +24975,11 @@ class DropdownMultiselectComponent {
24805
24975
  this.setFocus();
24806
24976
  }
24807
24977
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$6.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
24808
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, $event.target.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], 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: "directive", type: i2$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24978
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], 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: "directive", type: i2$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24809
24979
  }
24810
24980
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24811
24981
  type: Component,
24812
- args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, $event.target.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
24982
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
24813
24983
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24814
24984
  type: Input
24815
24985
  }], choices: [{
@@ -24963,11 +25133,11 @@ class TextAreaComponent {
24963
25133
  this.rawChange.next(value);
24964
25134
  }
24965
25135
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24966
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25136
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
24967
25137
  }
24968
25138
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
24969
25139
  type: Component,
24970
- args: [{ selector: 'gn-ui-text-area', template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25140
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
24971
25141
  }], propDecorators: { value: [{
24972
25142
  type: Input
24973
25143
  }], placeholder: [{
@@ -25068,11 +25238,11 @@ class AutocompleteComponent {
25068
25238
  }
25069
25239
  }
25070
25240
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25071
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", 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($event.target.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\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 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\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]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right: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: "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$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { 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: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25241
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", 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 <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\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 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\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]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right: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: "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$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { 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: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25072
25242
  }
25073
25243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25074
25244
  type: Component,
25075
- args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, 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($event.target.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\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 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\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]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right: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"] }]
25245
+ args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, 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 <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\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 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\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]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right: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"] }]
25076
25246
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25077
25247
  type: Input
25078
25248
  }], action: [{
@@ -25121,11 +25291,11 @@ class StarToggleComponent {
25121
25291
  event.preventDefault();
25122
25292
  }
25123
25293
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25124
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25294
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25125
25295
  }
25126
25296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, decorators: [{
25127
25297
  type: Component,
25128
- args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
25298
+ args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
25129
25299
  }], propDecorators: { toggled: [{
25130
25300
  type: Input
25131
25301
  }], disabled: [{
@@ -25237,11 +25407,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25237
25407
 
25238
25408
  class NavigationButtonComponent {
25239
25409
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25240
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center backdrop-blur p-1 bg-primary-opacity-50 text-white rounded\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle\">{{ icon }}</mat-icon>\n <span class=\"mx-2 hidden group-hover:inline\">{{ label }}</span>\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25410
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25241
25411
  }
25242
25412
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25243
25413
  type: Component,
25244
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center backdrop-blur p-1 bg-primary-opacity-50 text-white rounded\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle\">{{ icon }}</mat-icon>\n <span class=\"mx-2 hidden group-hover:inline\">{{ label }}</span>\n</button>\n" }]
25414
+ args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n" }]
25245
25415
  }], propDecorators: { label: [{
25246
25416
  type: Input
25247
25417
  }], icon: [{
@@ -25448,11 +25618,11 @@ class CheckboxComponent {
25448
25618
  this.changed.emit(this.checked);
25449
25619
  }
25450
25620
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25451
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n type=\"checkbox\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25621
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25452
25622
  }
25453
25623
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25454
25624
  type: Component,
25455
- args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n type=\"checkbox\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25625
+ args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25456
25626
  }], propDecorators: { type: [{
25457
25627
  type: Input
25458
25628
  }], checked: [{
@@ -25507,14 +25677,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25507
25677
  args: [{ selector: 'gn-ui-date-range-picker', template: "<div\n class=\"flex items-center justify-center w-64 h-11 rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"w-48 flex justify-between\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matStartDate\n placeholder=\"Start date\"\n (dateInput)=\"startDateSelected($event)\"\n />\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matEndDate\n placeholder=\"End date\"\n (dateInput)=\"endDateSelected($event)\"\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 <mat-date-range-picker #picker></mat-date-range-picker>\n</div>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"] }]
25508
25678
  }] });
25509
25679
 
25680
+ class EditableLabelDirective {
25681
+ constructor(el, renderer) {
25682
+ this.el = el;
25683
+ this.renderer = renderer;
25684
+ this.editableLabelChanged = new EventEmitter();
25685
+ }
25686
+ ngAfterViewInit() {
25687
+ if (this.gnUiEditableLabel !== false) {
25688
+ const appendedInput = this.renderer.createElement('input');
25689
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25690
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25691
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25692
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25693
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25694
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25695
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25696
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25697
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25698
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25699
+ const hostContent = this.el.nativeElement.textContent || '';
25700
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25701
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25702
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25703
+ this.renderer.listen(appendedInput, 'input', (event) => {
25704
+ this.editableLabelChanged.emit(event.target.value);
25705
+ });
25706
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25707
+ }
25708
+ }
25709
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
25710
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: EditableLabelDirective, isStandalone: true, selector: "[gnUiEditableLabel]", inputs: { gnUiEditableLabel: "gnUiEditableLabel" }, outputs: { editableLabelChanged: "editableLabelChanged" }, ngImport: i0 }); }
25711
+ }
25712
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25713
+ type: Directive,
25714
+ args: [{
25715
+ selector: '[gnUiEditableLabel]',
25716
+ standalone: true,
25717
+ }]
25718
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25719
+ type: Output
25720
+ }], gnUiEditableLabel: [{
25721
+ type: Input
25722
+ }] } });
25723
+
25510
25724
  class UiInputsModule {
25511
25725
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25512
25726
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25513
25727
  AutocompleteComponent,
25514
- ButtonComponent,
25515
25728
  TextInputComponent,
25516
25729
  DragAndDropFileInputComponent,
25517
- TextAreaComponent,
25518
25730
  ChipsInputComponent,
25519
25731
  NavigationButtonComponent,
25520
25732
  StarToggleComponent,
@@ -25546,7 +25758,10 @@ class UiInputsModule {
25546
25758
  MatFormFieldModule,
25547
25759
  MatInputModule,
25548
25760
  MatDatepickerModule,
25549
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25761
+ MatNativeDateModule,
25762
+ EditableLabelDirective,
25763
+ TextAreaComponent,
25764
+ ButtonComponent], exports: [DropdownSelectorComponent,
25550
25765
  AutocompleteComponent,
25551
25766
  ButtonComponent,
25552
25767
  TextInputComponent,
@@ -25562,7 +25777,8 @@ class UiInputsModule {
25562
25777
  CopyTextButtonComponent,
25563
25778
  CheckboxComponent,
25564
25779
  SearchInputComponent,
25565
- DateRangePickerComponent] }); }
25780
+ DateRangePickerComponent,
25781
+ EditableLabelDirective] }); }
25566
25782
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25567
25783
  TranslateModule.forChild(),
25568
25784
  NgxDropzoneModule,
@@ -25587,10 +25803,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25587
25803
  declarations: [
25588
25804
  DropdownSelectorComponent,
25589
25805
  AutocompleteComponent,
25590
- ButtonComponent,
25591
25806
  TextInputComponent,
25592
25807
  DragAndDropFileInputComponent,
25593
- TextAreaComponent,
25594
25808
  ChipsInputComponent,
25595
25809
  NavigationButtonComponent,
25596
25810
  StarToggleComponent,
@@ -25628,6 +25842,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25628
25842
  MatInputModule,
25629
25843
  MatDatepickerModule,
25630
25844
  MatNativeDateModule,
25845
+ EditableLabelDirective,
25846
+ TextAreaComponent,
25847
+ ButtonComponent,
25631
25848
  ],
25632
25849
  exports: [
25633
25850
  DropdownSelectorComponent,
@@ -25647,6 +25864,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25647
25864
  CheckboxComponent,
25648
25865
  SearchInputComponent,
25649
25866
  DateRangePickerComponent,
25867
+ EditableLabelDirective,
25650
25868
  ],
25651
25869
  }]
25652
25870
  }] });
@@ -25746,7 +25964,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25746
25964
 
25747
25965
  const DEFAULT_PARAMS = {
25748
25966
  OFFSET: '',
25749
- LIMIT: '',
25967
+ LIMIT: '-1',
25750
25968
  FORMAT: 'json',
25751
25969
  };
25752
25970
  class RecordApiFormComponent {
@@ -25775,6 +25993,8 @@ class RecordApiFormComponent {
25775
25993
  }
25776
25994
  return outputUrl;
25777
25995
  }));
25996
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
25997
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25778
25998
  }
25779
25999
  set apiLink(value) {
25780
26000
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25784,10 +26004,11 @@ class RecordApiFormComponent {
25784
26004
  this.offset$.next(value);
25785
26005
  }
25786
26006
  setLimit(value) {
25787
- this.limit$.next(value);
26007
+ const newLimit = value === '' ? '-1' : value;
26008
+ this.limit$.next(newLimit);
25788
26009
  }
25789
26010
  setFormat(value) {
25790
- this.format$.next(value);
26011
+ this.format$.next(String(value));
25791
26012
  }
25792
26013
  resetUrl() {
25793
26014
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25795,15 +26016,34 @@ class RecordApiFormComponent {
25795
26016
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25796
26017
  }
25797
26018
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25798
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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 flex-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 (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | 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]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\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\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\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]=\"formatsList\"\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$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"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], 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 }); }
26019
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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 flex-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\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\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]=\"formatsList\"\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$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"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], 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 }); }
25799
26020
  }
25800
26021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25801
26022
  type: Component,
25802
- args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, 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 flex-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 (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | 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]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\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\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\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]=\"formatsList\"\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"] }]
26023
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, 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 flex-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\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\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]=\"formatsList\"\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"] }]
25803
26024
  }], propDecorators: { apiLink: [{
25804
26025
  type: Input
25805
26026
  }] } });
25806
26027
 
26028
+ class ImageOverlayPreviewComponent {
26029
+ constructor() {
26030
+ this.isPlaceholderShown = new EventEmitter();
26031
+ }
26032
+ openLightbox(src) {
26033
+ basicLightbox.create(`<img src="${src}"/>`).show();
26034
+ }
26035
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26036
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: { imageUrl: "imageUrl" }, outputs: { isPlaceholderShown: "isPlaceholderShown" }, ngImport: i0, template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n", styles: [""], dependencies: [{ 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: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
26037
+ }
26038
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
26039
+ type: Component,
26040
+ args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n" }]
26041
+ }], propDecorators: { imageUrl: [{
26042
+ type: Input
26043
+ }], isPlaceholderShown: [{
26044
+ type: Output
26045
+ }] } });
26046
+
25807
26047
  class UiElementsModule {
25808
26048
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25809
26049
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -25825,7 +26065,8 @@ class UiElementsModule {
25825
26065
  GnUiLinkifyDirective,
25826
26066
  PaginationButtonsComponent,
25827
26067
  MaxLinesComponent,
25828
- RecordApiFormComponent], imports: [CommonModule,
26068
+ RecordApiFormComponent,
26069
+ ImageOverlayPreviewComponent], imports: [CommonModule,
25829
26070
  MatIconModule,
25830
26071
  MatTooltipModule,
25831
26072
  UiWidgetsModule,
@@ -25833,7 +26074,8 @@ class UiElementsModule {
25833
26074
  RouterModule,
25834
26075
  UiInputsModule,
25835
26076
  FormsModule,
25836
- NgOptimizedImage], exports: [MetadataInfoComponent,
26077
+ NgOptimizedImage,
26078
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
25837
26079
  ContentGhostComponent,
25838
26080
  DownloadItemComponent,
25839
26081
  DownloadsListComponent,
@@ -25850,7 +26092,10 @@ class UiElementsModule {
25850
26092
  AvatarComponent,
25851
26093
  UserPreviewComponent,
25852
26094
  PaginationButtonsComponent,
25853
- RecordApiFormComponent] }); }
26095
+ MaxLinesComponent,
26096
+ RecordApiFormComponent,
26097
+ MarkdownParserComponent,
26098
+ ImageOverlayPreviewComponent] }); }
25854
26099
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, imports: [CommonModule,
25855
26100
  MatIconModule,
25856
26101
  MatTooltipModule,
@@ -25877,6 +26122,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25877
26122
  UiInputsModule,
25878
26123
  FormsModule,
25879
26124
  NgOptimizedImage,
26125
+ MarkdownParserComponent,
25880
26126
  ],
25881
26127
  declarations: [
25882
26128
  MetadataInfoComponent,
@@ -25899,6 +26145,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25899
26145
  PaginationButtonsComponent,
25900
26146
  MaxLinesComponent,
25901
26147
  RecordApiFormComponent,
26148
+ ImageOverlayPreviewComponent,
25902
26149
  ],
25903
26150
  exports: [
25904
26151
  MetadataInfoComponent,
@@ -25918,148 +26165,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25918
26165
  AvatarComponent,
25919
26166
  UserPreviewComponent,
25920
26167
  PaginationButtonsComponent,
26168
+ MaxLinesComponent,
25921
26169
  RecordApiFormComponent,
26170
+ MarkdownParserComponent,
26171
+ ImageOverlayPreviewComponent,
25922
26172
  ],
25923
26173
  }]
25924
26174
  }] });
25925
26175
 
25926
- class RecordTableComponent {
25927
- constructor() {
25928
- this.selectedRecords = [];
25929
- this.records = [];
25930
- this.recordClick = new EventEmitter();
25931
- this.recordsSelect = new EventEmitter();
25932
- this.recordsDeselect = new EventEmitter();
25933
- this.sortByChange = new EventEmitter();
25934
- }
25935
- dateToString(date) {
25936
- return date?.toLocaleDateString(undefined, {
25937
- year: 'numeric',
25938
- month: 'long',
25939
- day: 'numeric',
25940
- timeZone: 'UTC',
25941
- });
25942
- }
25943
- getStatus(isPublishedToAll) {
25944
- return isPublishedToAll ? 'published' : 'not published';
25945
- }
25946
- formatUserInfo(userInfo) {
25947
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
25948
- if (infos && infos.length === 4) {
25949
- return `${infos[2]} ${infos[1]}`;
25950
- }
25951
- return undefined;
25952
- }
25953
- getRecordFormats(record) {
25954
- if (record.kind === 'service' || !('distributions' in record)) {
25955
- return [];
25956
- }
25957
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
25958
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
25959
- return formats;
25960
- }
25961
- getBadgeColor(format) {
25962
- return getBadgeColor(format);
25963
- }
25964
- getOrderForColumn(col) {
25965
- if (!this.sortBy) {
25966
- return null;
25967
- }
25968
- let order = null;
25969
- const sortedArray = Array.isArray(this.sortBy[0])
25970
- ? this.sortBy
25971
- : [this.sortBy];
25972
- sortedArray.forEach((sortedCol) => {
25973
- if (sortedCol[1] === col) {
25974
- order = sortedCol[0];
25975
- }
25976
- });
25977
- return order;
25978
- }
25979
- setSortBy(col) {
25980
- const sortOrder = this.getOrderForColumn(col);
25981
- let newOrder;
25982
- if (sortOrder) {
25983
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
25984
- }
25985
- else {
25986
- newOrder = 'asc';
25987
- }
25988
- this.sortByChange.emit([newOrder, col]);
25989
- this.sortBy = [newOrder, col];
25990
- }
25991
- isSortedBy(col, order) {
25992
- const sortOrder = this.getOrderForColumn(col);
25993
- return sortOrder === order;
25994
- }
25995
- isChecked(record) {
25996
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
25997
- return true;
25998
- }
25999
- return false;
26000
- }
26001
- handleRecordSelectedChange(selected, record) {
26002
- if (!selected) {
26003
- this.recordsDeselect.emit([record]);
26004
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
26005
- }
26006
- else {
26007
- this.recordsSelect.emit([record]);
26008
- this.selectedRecords.push(record.uniqueIdentifier);
26009
- }
26010
- }
26011
- selectAll() {
26012
- if (this.isAllSelected()) {
26013
- this.recordsDeselect.emit(this.records);
26014
- this.selectedRecords = [];
26015
- }
26016
- else {
26017
- this.recordsSelect.emit(this.records);
26018
- this.selectedRecords = this.records.map((record) => {
26019
- return record.uniqueIdentifier;
26020
- });
26021
- }
26022
- }
26023
- isAllSelected() {
26024
- if (this.selectedRecords.length === this.records.length) {
26025
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
26026
- if (allRecords.length === this.records.length) {
26027
- return true;
26028
- }
26029
- }
26030
- return false;
26031
- }
26032
- isSomeSelected() {
26033
- if (this.selectedRecords.length > 0 &&
26034
- this.selectedRecords.length < this.records.length) {
26035
- return true;
26036
- }
26037
- return false;
26038
- }
26039
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26040
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordTableComponent, selector: "gn-ui-record-table", inputs: { selectedRecords: "selectedRecords", records: "records", totalHits: "totalHits", sortBy: "sortBy" }, outputs: { recordClick: "recordClick", recordsSelect: "recordsSelect", recordsDeselect: "recordsDeselect", sortByChange: "sortByChange" }, ngImport: i0, template: "<div>\n <div *ngIf=\"totalHits\" class=\"\">\n <div class=\"flex records-information\">\n <div\n translate\n class=\"my-8 ml-4 block text-gray-800\"\n [translateParams]=\"{\n displayed: records.length,\n hits: totalHits\n }\"\n >\n results.records.hits.displayedOn\n </div>\n <div\n *ngIf=\"selectedRecords.length > 0\"\n class=\"my-8 ml-6 block text-gray-400 selected-records\"\n translate\n [translateParams]=\"{ amount: selectedRecords.length }\"\n >\n results.records.hits.selected\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(3,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userDetail</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.username</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userEmail</span>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordSelect.emit(record)\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col text-16\">\n {{ record.name }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.username }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.emailAddresses[0] }}\n </div>\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(6,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"!records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"flex justify-center items-center\">\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"selectAll()\"\n type=\"default\"\n >\n </gn-ui-checkbox>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1 text-left\"\n (buttonClick)=\"setSortBy('resourceTitleObject.default.keyword')\"\n >\n <span translate>record.metadata.title</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div translate=\"\" class=\"record-table-header text-gray-400 flex gap-1\">\n record.metadata.formats\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('recordOwner')\"\n >\n <span translate>record.metadata.author</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('changeDate')\"\n >\n <span translate>record.metadata.updatedOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('createDate')\"\n >\n <span translate>record.metadata.createdOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordSelect.emit(record)\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col\">\n <gn-ui-checkbox\n [checked]=\"isChecked(record)\"\n (changed)=\"handleRecordSelectedChange($event, record)\"\n type=\"default\"\n ></gn-ui-checkbox>\n </div>\n <div\n [title]=\"record.title\"\n class=\"record-table-col text-16 self-center\"\n >\n {{ record.title }}\n </div>\n <div\n class=\"record-table-col flex justify-start items-center gap-2 text-16\"\n [title]=\"formats.join(', ')\"\n *ngIf=\"getRecordFormats(record) as formats\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-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 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div\n class=\"flex-shrink-0\"\n *ngIf=\"!record.name && formats.slice(2).length > 0\"\n >\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div class=\"record-table-col flex items-center gap-2 text-16\">\n <mat-icon class=\"material-symbols-outlined\"> person </mat-icon>\n <span class=\"\">{{ formatUserInfo(record.extras?.ownerInfo) }}</span>\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordUpdated) }}\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordCreated) }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".record-table-col{@apply px-5 py-3 items-center truncate;}.record-table-header{@apply record-table-col capitalize;}\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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
26041
- }
26042
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26043
- type: Component,
26044
- args: [{ selector: 'gn-ui-record-table', template: "<div>\n <div *ngIf=\"totalHits\" class=\"\">\n <div class=\"flex records-information\">\n <div\n translate\n class=\"my-8 ml-4 block text-gray-800\"\n [translateParams]=\"{\n displayed: records.length,\n hits: totalHits\n }\"\n >\n results.records.hits.displayedOn\n </div>\n <div\n *ngIf=\"selectedRecords.length > 0\"\n class=\"my-8 ml-6 block text-gray-400 selected-records\"\n translate\n [translateParams]=\"{ amount: selectedRecords.length }\"\n >\n results.records.hits.selected\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(3,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userDetail</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.username</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userEmail</span>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordSelect.emit(record)\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col text-16\">\n {{ record.name }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.username }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.emailAddresses[0] }}\n </div>\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(6,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"!records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"flex justify-center items-center\">\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"selectAll()\"\n type=\"default\"\n >\n </gn-ui-checkbox>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1 text-left\"\n (buttonClick)=\"setSortBy('resourceTitleObject.default.keyword')\"\n >\n <span translate>record.metadata.title</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div translate=\"\" class=\"record-table-header text-gray-400 flex gap-1\">\n record.metadata.formats\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('recordOwner')\"\n >\n <span translate>record.metadata.author</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('changeDate')\"\n >\n <span translate>record.metadata.updatedOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('createDate')\"\n >\n <span translate>record.metadata.createdOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordSelect.emit(record)\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col\">\n <gn-ui-checkbox\n [checked]=\"isChecked(record)\"\n (changed)=\"handleRecordSelectedChange($event, record)\"\n type=\"default\"\n ></gn-ui-checkbox>\n </div>\n <div\n [title]=\"record.title\"\n class=\"record-table-col text-16 self-center\"\n >\n {{ record.title }}\n </div>\n <div\n class=\"record-table-col flex justify-start items-center gap-2 text-16\"\n [title]=\"formats.join(', ')\"\n *ngIf=\"getRecordFormats(record) as formats\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-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 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div\n class=\"flex-shrink-0\"\n *ngIf=\"!record.name && formats.slice(2).length > 0\"\n >\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div class=\"record-table-col flex items-center gap-2 text-16\">\n <mat-icon class=\"material-symbols-outlined\"> person </mat-icon>\n <span class=\"\">{{ formatUserInfo(record.extras?.ownerInfo) }}</span>\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordUpdated) }}\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordCreated) }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".record-table-col{@apply px-5 py-3 items-center truncate;}.record-table-header{@apply record-table-col capitalize;}\n"] }]
26045
- }], propDecorators: { selectedRecords: [{
26046
- type: Input
26047
- }], records: [{
26048
- type: Input
26049
- }], totalHits: [{
26050
- type: Input
26051
- }], sortBy: [{
26052
- type: Input
26053
- }], recordClick: [{
26054
- type: Output
26055
- }], recordsSelect: [{
26056
- type: Output
26057
- }], recordsDeselect: [{
26058
- type: Output
26059
- }], sortByChange: [{
26060
- type: Output
26061
- }] } });
26062
-
26063
26176
  class UiSearchModule {
26064
26177
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26065
26178
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26072,8 +26185,7 @@ class UiSearchModule {
26072
26185
  ResultsHitsNumberComponent,
26073
26186
  ResultsListItemComponent,
26074
26187
  RecordPreviewFeedComponent,
26075
- RecordPreviewRowComponent,
26076
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26188
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26077
26189
  FacetsModule$1,
26078
26190
  FormsModule,
26079
26191
  ReactiveFormsModule,
@@ -26084,7 +26196,8 @@ class UiSearchModule {
26084
26196
  UiElementsModule,
26085
26197
  MatIconModule,
26086
26198
  MatCheckboxModule,
26087
- RouterLink], exports: [RecordPreviewListComponent,
26199
+ RouterLink,
26200
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26088
26201
  RecordPreviewCardComponent,
26089
26202
  RecordPreviewTextComponent,
26090
26203
  RecordPreviewTitleComponent,
@@ -26094,8 +26207,7 @@ class UiSearchModule {
26094
26207
  RecordPreviewComponent,
26095
26208
  ResultsHitsNumberComponent,
26096
26209
  RecordPreviewFeedComponent,
26097
- RecordPreviewRowComponent,
26098
- RecordTableComponent] }); }
26210
+ RecordPreviewRowComponent] }); }
26099
26211
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26100
26212
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26101
26213
  ], imports: [CommonModule,
@@ -26110,7 +26222,8 @@ class UiSearchModule {
26110
26222
  UiInputsModule,
26111
26223
  UiElementsModule,
26112
26224
  MatIconModule,
26113
- MatCheckboxModule, FacetsModule$1] }); }
26225
+ MatCheckboxModule,
26226
+ InteractiveTableComponent, FacetsModule$1] }); }
26114
26227
  }
26115
26228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26116
26229
  type: NgModule,
@@ -26127,7 +26240,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26127
26240
  ResultsListItemComponent,
26128
26241
  RecordPreviewFeedComponent,
26129
26242
  RecordPreviewRowComponent,
26130
- RecordTableComponent,
26131
26243
  ],
26132
26244
  imports: [
26133
26245
  CommonModule,
@@ -26144,6 +26256,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26144
26256
  MatIconModule,
26145
26257
  MatCheckboxModule,
26146
26258
  RouterLink,
26259
+ InteractiveTableComponent,
26147
26260
  ],
26148
26261
  exports: [
26149
26262
  RecordPreviewListComponent,
@@ -26157,7 +26270,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26157
26270
  ResultsHitsNumberComponent,
26158
26271
  RecordPreviewFeedComponent,
26159
26272
  RecordPreviewRowComponent,
26160
- RecordTableComponent,
26161
26273
  ],
26162
26274
  providers: [
26163
26275
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26716,6 +26828,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26716
26828
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26717
26829
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26718
26830
 
26831
+ // this geometry will be used to filter & boost results accordingly
26832
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26833
+
26719
26834
  class SearchFacade {
26720
26835
  constructor(store, filterGeometry) {
26721
26836
  this.store = store;
@@ -26820,6 +26935,7 @@ class SearchFacade {
26820
26935
  this.store.dispatch(new SetFilters({}, this.searchId));
26821
26936
  this.store.dispatch(new SetSortBy([], this.searchId));
26822
26937
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
26938
+ return this;
26823
26939
  }
26824
26940
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade, deps: [{ token: i1$2.Store }, { token: FILTER_GEOMETRY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
26825
26941
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27204,8 +27320,11 @@ class FuzzySearchComponent {
27204
27320
  this.searchService.updateFilters({ any });
27205
27321
  }
27206
27322
  }
27207
- handleInputCleared() {
27208
- this.searchService.updateFilters({ any: '' });
27323
+ async handleInputCleared() {
27324
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27325
+ if (currentSearchFilters.any) {
27326
+ this.searchService.updateFilters({ any: '' });
27327
+ }
27209
27328
  }
27210
27329
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FuzzySearchComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
27211
27330
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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", "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 }); }
@@ -27285,6 +27404,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27285
27404
  args: [RESULTS_LAYOUT_CONFIG]
27286
27405
  }] }]; } });
27287
27406
 
27407
+ // expects the replacement key ${uuid}
27408
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27409
+
27288
27410
  class FavoriteStarComponent {
27289
27411
  set record(value) {
27290
27412
  this.record_ = value;
@@ -27305,6 +27427,7 @@ class FavoriteStarComponent {
27305
27427
  this.changeDetector = changeDetector;
27306
27428
  this.authService = authService;
27307
27429
  this.translateService = translateService;
27430
+ this.displayCount = true;
27308
27431
  this.isFavorite$ = this.favoritesService.myFavoritesUuid$.pipe(map$1((favorites) => favorites.indexOf(this.record.uniqueIdentifier) > -1));
27309
27432
  this.isAnonymous$ = this.platformService.isAnonymous();
27310
27433
  this.loading = false;
@@ -27367,12 +27490,14 @@ class FavoriteStarComponent {
27367
27490
  });
27368
27491
  }
27369
27492
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, deps: [{ token: FavoritesService }, { token: PlatformServiceInterface }, { token: i0.ChangeDetectorRef }, { token: AuthService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
27370
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div>\n <span class=\"align-text-top mr-1.5 favorite-count\" *ngIf=\"hasFavoriteCount\">{{\n favoriteCount\n }}</span>\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27493
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], 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: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27371
27494
  }
27372
27495
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27373
27496
  type: Component,
27374
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <span class=\"align-text-top mr-1.5 favorite-count\" *ngIf=\"hasFavoriteCount\">{{\n favoriteCount\n }}</span>\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n" }]
27375
- }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { record: [{
27497
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27498
+ }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27499
+ type: Input
27500
+ }], record: [{
27376
27501
  type: Input
27377
27502
  }], starToggleRef: [{
27378
27503
  type: ViewChild,
@@ -27415,7 +27540,7 @@ class ResultsListContainerComponent {
27415
27540
  return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
27416
27541
  }
27417
27542
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsListContainerComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }, { token: RECORD_URL_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
27418
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-search-results-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-search-results-error>\n <gn-ui-search-results-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-search-results-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], 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: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["record"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }] }); }
27543
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-search-results-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-search-results-error>\n <gn-ui-search-results-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-search-results-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], 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: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }] }); }
27419
27544
  }
27420
27545
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
27421
27546
  type: Component,
@@ -27543,9 +27668,11 @@ class SearchEffects {
27543
27668
  // I could not get this to work (maybe a bug in rxjs?)
27544
27669
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27545
27670
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27546
- return of([state, favorites, null]);
27671
+ return of([state, favorites, undefined]);
27547
27672
  }
27548
27673
  return this.filterGeometry$.pipe(tap$2((geom) => {
27674
+ if (!geom)
27675
+ return;
27549
27676
  try {
27550
27677
  const trace = valid$1(geom, true);
27551
27678
  if (trace?.length > 0) {
@@ -27557,7 +27684,7 @@ class SearchEffects {
27557
27684
  throw new Error();
27558
27685
  }
27559
27686
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27560
- return of([state, favorites, null]);
27687
+ return of([state, favorites, undefined]);
27561
27688
  }));
27562
27689
  }), switchMap$1(([state, favorites, geometry]) => {
27563
27690
  const { currentPage, pageSize, sort } = state.params;
@@ -27656,10 +27783,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27656
27783
  class AbstractSearchField {
27657
27784
  }
27658
27785
  class SimpleSearchField {
27659
- constructor(esFieldName, order = 'asc', injector) {
27786
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27660
27787
  this.esFieldName = esFieldName;
27661
- this.order = order;
27662
27788
  this.injector = injector;
27789
+ this.order = order;
27790
+ this.orderType = orderType;
27663
27791
  this.repository = this.injector.get(RecordsRepositoryInterface);
27664
27792
  // FIXME: this is required to register runtime fields; abstract this as well
27665
27793
  this.esService = this.injector.get(ElasticsearchService);
@@ -27670,12 +27798,12 @@ class SimpleSearchField {
27670
27798
  type: 'terms',
27671
27799
  field: this.esFieldName,
27672
27800
  limit: 1000,
27673
- sort: [this.order, 'key'],
27801
+ sort: [this.order, this.orderType],
27674
27802
  },
27675
27803
  };
27676
27804
  }
27677
27805
  async getBucketLabel(bucket) {
27678
- return bucket.term;
27806
+ return bucket.term.toString();
27679
27807
  }
27680
27808
  getAvailableValues() {
27681
27809
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27703,9 +27831,13 @@ class SimpleSearchField {
27703
27831
  return of(values);
27704
27832
  }
27705
27833
  }
27706
- class KeySearchField extends SimpleSearchField {
27707
- constructor() {
27708
- super(...arguments);
27834
+ class TranslatedSearchField extends SimpleSearchField {
27835
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27836
+ super(esFieldName, injector, order, orderType);
27837
+ this.esFieldName = esFieldName;
27838
+ this.injector = injector;
27839
+ this.order = order;
27840
+ this.orderType = orderType;
27709
27841
  this.platformService = this.injector.get(PlatformServiceInterface);
27710
27842
  }
27711
27843
  async getTranslation(key) {
@@ -27715,26 +27847,36 @@ class KeySearchField extends SimpleSearchField {
27715
27847
  return (await this.getTranslation(bucket.term)) || bucket.term;
27716
27848
  }
27717
27849
  getAvailableValues() {
27850
+ if (this.orderType === 'count')
27851
+ return super.getAvailableValues();
27718
27852
  // sort values by alphabetical order
27719
27853
  return super
27720
27854
  .getAvailableValues()
27721
27855
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27722
27856
  }
27723
27857
  }
27724
- class ThesaurusField extends KeySearchField {
27725
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27726
- super(esFieldName, order, injector);
27727
- this.thesaurusName = thesaurusName;
27858
+ /**
27859
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
27860
+ * to the defined METADATA_LANGUAGE token
27861
+ * The provided ES field name should not include any prefix such as `.langeng`
27862
+ */
27863
+ class MultilingualSearchField extends SimpleSearchField {
27864
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27865
+ super(esFieldName, injector, order, orderType);
27866
+ this.esFieldName = esFieldName;
27867
+ this.injector = injector;
27868
+ this.order = order;
27869
+ this.orderType = orderType;
27728
27870
  this.langService = this.injector.get(LangService);
27729
- this.thesaurus$ = this.platformService
27730
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27731
- .pipe(catchError(() => {
27732
- console.warn('Error while loading thesaurus language package');
27733
- return of([]);
27734
- }), shareReplay(1));
27735
- }
27736
- async getTranslation(key) {
27737
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
27871
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
27872
+ // note: we're excluding the metadata language "current" value because that would produce
27873
+ // permalinks that might not work for different users
27874
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
27875
+ this.esFieldName += `.lang${this.searchLanguage}`;
27876
+ }
27877
+ else {
27878
+ this.esFieldName += '.default';
27879
+ }
27738
27880
  }
27739
27881
  }
27740
27882
  class FullTextSearchField {
@@ -27754,7 +27896,7 @@ marker('search.filters.isSpatial.yes');
27754
27896
  marker('search.filters.isSpatial.no');
27755
27897
  class IsSpatialSearchField extends SimpleSearchField {
27756
27898
  constructor(injector) {
27757
- super('isSpatial', 'asc', injector);
27899
+ super('isSpatial', injector, 'asc');
27758
27900
  this.translateService = this.injector.get(TranslateService);
27759
27901
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27760
27902
  String formats = doc.format.join('|').toLowerCase();
@@ -27804,7 +27946,7 @@ marker('search.filters.license.unknown');
27804
27946
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27805
27947
  class LicenseSearchField extends SimpleSearchField {
27806
27948
  constructor(injector) {
27807
- super('license', 'asc', injector);
27949
+ super('license', injector, 'asc');
27808
27950
  this.translateService = this.injector.get(TranslateService);
27809
27951
  this.esService.registerRuntimeField('license', `String raw = '';
27810
27952
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -27888,7 +28030,7 @@ class OrganizationSearchField {
27888
28030
  }
27889
28031
  class OwnerSearchField extends SimpleSearchField {
27890
28032
  constructor(injector) {
27891
- super('owner', 'asc', injector);
28033
+ super('owner', injector, 'asc');
27892
28034
  }
27893
28035
  getAvailableValues() {
27894
28036
  return of([]);
@@ -27897,6 +28039,7 @@ class OwnerSearchField extends SimpleSearchField {
27897
28039
 
27898
28040
  marker('search.filters.format');
27899
28041
  marker('search.filters.inspireKeyword');
28042
+ marker('search.filters.keyword');
27900
28043
  marker('search.filters.isSpatial');
27901
28044
  marker('search.filters.license');
27902
28045
  marker('search.filters.publicationYear');
@@ -27914,13 +28057,14 @@ class FieldsService {
27914
28057
  this.injector = injector;
27915
28058
  this.fields = {
27916
28059
  publisher: new OrganizationSearchField(this.injector),
27917
- format: new SimpleSearchField('format', 'asc', this.injector),
27918
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
27919
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
27920
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
27921
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
27922
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
27923
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28060
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28061
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28062
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28063
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28064
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28065
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28066
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28067
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
27924
28068
  isSpatial: new IsSpatialSearchField(this.injector),
27925
28069
  q: new FullTextSearchField(),
27926
28070
  license: new LicenseSearchField(this.injector),
@@ -27994,10 +28138,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27994
28138
  type: Input
27995
28139
  }] } });
27996
28140
 
27997
- // this geometry will be used to filter & boost results accordingly
27998
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
27999
- // expects the replacement key ${uuid}
28000
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28001
28141
  class FeatureSearchModule {
28002
28142
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28003
28143
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28096,6 +28236,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28096
28236
  }]
28097
28237
  }] });
28098
28238
 
28239
+ class ResultsTableComponent {
28240
+ constructor(searchFacade, searchService, selectionService) {
28241
+ this.searchFacade = searchFacade;
28242
+ this.searchService = searchService;
28243
+ this.selectionService = selectionService;
28244
+ this.recordClick = new EventEmitter();
28245
+ this.records$ = this.searchFacade.results$;
28246
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28247
+ }
28248
+ dateToString(date) {
28249
+ return date?.toLocaleDateString(undefined, {
28250
+ year: 'numeric',
28251
+ month: 'long',
28252
+ day: 'numeric',
28253
+ timeZone: 'UTC',
28254
+ });
28255
+ }
28256
+ getStatus(isPublishedToAll) {
28257
+ return isPublishedToAll ? 'published' : 'not published';
28258
+ }
28259
+ getRecordFormats(record) {
28260
+ if (record.kind === 'service' || !('distributions' in record)) {
28261
+ return [];
28262
+ }
28263
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28264
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28265
+ return formats;
28266
+ }
28267
+ formatUserInfo(userInfo) {
28268
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28269
+ if (infos && infos.length === 4) {
28270
+ return `${infos[2]} ${infos[1]}`;
28271
+ }
28272
+ return undefined;
28273
+ }
28274
+ getBadgeColor(format) {
28275
+ return getBadgeColor(format);
28276
+ }
28277
+ handleRecordClick(item) {
28278
+ this.recordClick.emit(item);
28279
+ }
28280
+ setSortBy(col, order) {
28281
+ this.searchService.setSortBy([order, col]);
28282
+ }
28283
+ isSortedBy(col) {
28284
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28285
+ const sortArray = Array.isArray(sortOrder[0])
28286
+ ? sortOrder
28287
+ : [sortOrder];
28288
+ for (const sort of sortArray) {
28289
+ if (sort[1] === col) {
28290
+ return sort[0];
28291
+ }
28292
+ }
28293
+ return null;
28294
+ }));
28295
+ }
28296
+ isChecked(record) {
28297
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28298
+ return selectedRecords.includes(record.uniqueIdentifier);
28299
+ }));
28300
+ }
28301
+ handleRecordSelectedChange(selected, record) {
28302
+ if (!selected) {
28303
+ this.selectionService.deselectRecords([record]);
28304
+ }
28305
+ else {
28306
+ this.selectionService.selectRecords([record]);
28307
+ }
28308
+ }
28309
+ async toggleSelectAll() {
28310
+ const records = await firstValueFrom(this.records$);
28311
+ if (await firstValueFrom(this.isAllSelected())) {
28312
+ this.selectionService.deselectRecords(records);
28313
+ }
28314
+ else {
28315
+ this.selectionService.selectRecords(records);
28316
+ }
28317
+ }
28318
+ isAllSelected() {
28319
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28320
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28321
+ }));
28322
+ }
28323
+ isSomeSelected() {
28324
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28325
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28326
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28327
+ return !allSelected && someSelected;
28328
+ }));
28329
+ }
28330
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: SelectionService }], target: i0.ɵɵFactoryTarget.Component }); }
28331
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", outputs: { recordClick: "recordClick" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\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() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\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) | async\"\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') | async\"\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 {{ item.title }}\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 flex-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 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-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') | async\"\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') | async\"\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: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { 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"] }] }); }
28332
+ }
28333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28334
+ type: Component,
28335
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28336
+ CommonModule,
28337
+ UiInputsModule,
28338
+ InteractiveTableComponent,
28339
+ InteractiveTableColumnComponent,
28340
+ MatIconModule,
28341
+ TranslateModule,
28342
+ ], template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\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() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\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) | async\"\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') | async\"\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 {{ item.title }}\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 flex-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 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-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') | async\"\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') | async\"\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" }]
28343
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28344
+ type: Output
28345
+ }] } });
28346
+
28099
28347
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28100
28348
  get mapLinks() {
28101
28349
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28130,7 +28378,7 @@ class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28130
28378
  return getLinkLabel(link);
28131
28379
  }
28132
28380
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerRecordPreviewComponent, deps: [{ token: i0.ElementRef }, { token: LinkClassifierService }, { token: MapFacade }, { token: MapUtilsService }], target: i0.ɵɵFactoryTarget.Component }); }
28133
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerRecordPreviewComponent, selector: "gn-ui-add-layer-record-preview", usesInheritance: true, ngImport: i0, template: "<div class=\"w-full flex flex-row rounded-sm\" [title]=\"record.abstract\">\n <gn-ui-thumbnail\n class=\"w-16 h-16 shrink-0 border-r border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"flex flex-col p-2 gap-2 overflow-hidden\">\n <h1 class=\"text-sm font-medium truncate\">\n {{ record.title }}\n </h1>\n <ng-container *ngFor=\"let link of mapLinks\">\n <gn-ui-button\n [type]=\"'outline'\"\n (buttonClick)=\"handleLinkClick(link)\"\n extraClass=\"!py-[8px] !px-[12px]\"\n >\n <div class=\"text-left text-[12px] line-clamp-2\">\n {{ getLinkLabel(link) }}\n </div>\n </gn-ui-button>\n </ng-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28381
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerRecordPreviewComponent, selector: "gn-ui-add-layer-record-preview", usesInheritance: true, ngImport: i0, template: "<div class=\"w-full flex flex-row rounded-sm\" [title]=\"record.abstract\">\n <gn-ui-thumbnail\n class=\"w-16 h-16 shrink-0 border-r border-gray-200 bg-gray-100\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n\n <div class=\"flex flex-col p-2 gap-2 overflow-hidden\">\n <h1 class=\"text-sm font-medium truncate\">\n {{ record.title }}\n </h1>\n <ng-container *ngFor=\"let link of mapLinks\">\n <gn-ui-button\n [type]=\"'outline'\"\n (buttonClick)=\"handleLinkClick(link)\"\n extraClass=\"!py-[8px] !px-[12px]\"\n >\n <div class=\"text-left text-[12px] line-clamp-2\">\n {{ getLinkLabel(link) }}\n </div>\n </gn-ui-button>\n </ng-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28134
28382
  }
28135
28383
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerRecordPreviewComponent, decorators: [{
28136
28384
  type: Component,
@@ -28174,6 +28422,208 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28174
28422
  ], template: "<div class=\"h-full text-sm\">\n <gn-ui-fuzzy-search></gn-ui-fuzzy-search>\n <gn-ui-results-list-container\n layout=\"ADDLAYER\"\n ></gn-ui-results-list-container>\n</div>\n", styles: ["::ng-deep .mat-tab-body-wrapper{flex-grow:1}\n"] }]
28175
28423
  }], ctorParameters: function () { return [{ type: SearchFacade }]; } });
28176
28424
 
28425
+ class AddLayerFromWmsComponent {
28426
+ constructor(mapFacade, changeDetectorRef) {
28427
+ this.mapFacade = mapFacade;
28428
+ this.changeDetectorRef = changeDetectorRef;
28429
+ this.wmsUrl = '';
28430
+ this.loading = false;
28431
+ this.layers = [];
28432
+ this.wmsEndpoint = null;
28433
+ this.urlChange = new Subject();
28434
+ this.errorMessage = null;
28435
+ }
28436
+ ngOnInit() {
28437
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => this.loadLayers());
28438
+ }
28439
+ async loadLayers() {
28440
+ this.errorMessage = null;
28441
+ try {
28442
+ this.loading = true;
28443
+ if (this.wmsUrl.trim() === '') {
28444
+ this.layers = [];
28445
+ return;
28446
+ }
28447
+ this.wmsEndpoint = await new WmsEndpoint(this.wmsUrl).isReady();
28448
+ this.layers = this.wmsEndpoint.getLayers();
28449
+ }
28450
+ catch (error) {
28451
+ const err = error;
28452
+ this.layers = [];
28453
+ this.errorMessage = 'Error loading layers: ' + err.message;
28454
+ }
28455
+ finally {
28456
+ this.loading = false;
28457
+ this.changeDetectorRef.markForCheck();
28458
+ }
28459
+ }
28460
+ addLayer(layer) {
28461
+ const layerToAdd = {
28462
+ name: layer.name,
28463
+ url: this.wmsUrl.toString(),
28464
+ type: MapContextLayerTypeEnum.WMS,
28465
+ };
28466
+ this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
28467
+ }
28468
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28469
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n", styles: [""], 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: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28470
+ }
28471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, decorators: [{
28472
+ type: Component,
28473
+ args: [{ selector: 'gn-ui-add-layer-from-wms', template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n" }]
28474
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28475
+
28476
+ const INVALID_FILE_FORMAT_ERROR_MESSAGE = 'Invalid file format';
28477
+ class AddLayerFromFileComponent {
28478
+ constructor(mapFacade, changeDetectorRef) {
28479
+ this.mapFacade = mapFacade;
28480
+ this.changeDetectorRef = changeDetectorRef;
28481
+ this.errorMessage = null;
28482
+ this.successMessage = null;
28483
+ this.loading = false;
28484
+ this.acceptedMimeType = ['.geojson'];
28485
+ this.maxFileSize = 5000000;
28486
+ }
28487
+ async handleFileChange(file) {
28488
+ if (!file) {
28489
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28490
+ return;
28491
+ }
28492
+ if (file.size > this.maxFileSize) {
28493
+ this.displayMessage('File size exceeds the limit of 5MB', 'error');
28494
+ return;
28495
+ }
28496
+ await this.addLayer(file);
28497
+ }
28498
+ async addLayer(file) {
28499
+ this.errorMessage = null;
28500
+ this.loading = true;
28501
+ try {
28502
+ if (!this.isFileFormatValid(file)) {
28503
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28504
+ return;
28505
+ }
28506
+ const fileExtension = this.getFileExtension(file);
28507
+ switch (fileExtension) {
28508
+ case 'geojson':
28509
+ await this.addGeoJsonLayer(file);
28510
+ break;
28511
+ default:
28512
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28513
+ break;
28514
+ }
28515
+ }
28516
+ catch (error) {
28517
+ const err = error;
28518
+ this.displayMessage('Error loading file: ' + err.message, 'error');
28519
+ }
28520
+ finally {
28521
+ this.loading = false;
28522
+ }
28523
+ }
28524
+ addGeoJsonLayer(file) {
28525
+ return new Promise((resolve, reject) => {
28526
+ try {
28527
+ const reader = new FileReader();
28528
+ reader.onload = () => {
28529
+ const result = reader.result;
28530
+ const title = file.name.split('.').slice(0, -1).join('.');
28531
+ const layerToAdd = {
28532
+ type: 'geojson',
28533
+ data: result,
28534
+ };
28535
+ this.mapFacade.addLayer({ ...layerToAdd, title: title });
28536
+ this.displayMessage('File successfully added to map', 'success');
28537
+ resolve();
28538
+ };
28539
+ reader.onerror = reject;
28540
+ reader.readAsText(file);
28541
+ }
28542
+ catch (error) {
28543
+ reject(error);
28544
+ }
28545
+ });
28546
+ }
28547
+ isFileFormatValid(file) {
28548
+ const fileExtension = this.getFileExtension(file);
28549
+ return this.acceptedMimeType.includes(`.${fileExtension}`);
28550
+ }
28551
+ getFileExtension(file) {
28552
+ return file.name.split('.').pop();
28553
+ }
28554
+ displayMessage(message, type) {
28555
+ if (type === 'success') {
28556
+ this.successMessage = message;
28557
+ }
28558
+ else if (type === 'error') {
28559
+ this.errorMessage = message;
28560
+ }
28561
+ setTimeout(() => {
28562
+ this.successMessage = null;
28563
+ this.errorMessage = null;
28564
+ this.changeDetectorRef.detectChanges();
28565
+ }, 5000);
28566
+ }
28567
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28568
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromFileComponent, selector: "gn-ui-add-layer-from-file", ngImport: i0, template: "<div class=\"flex flex-col gap-2 my-2\">\n <div class=\"flex items-center gap-4\">\n <div class=\"flex-grow rounded-md border-2 border-gray-200\">\n <gn-ui-drag-and-drop-file-input\n (fileChange)=\"handleFileChange($event)\"\n [accept]=\"acceptedMimeType.join(',')\"\n [placeholder]=\"'map.addFromFile.placeholder' | translate\"\n class=\"placeholder-grey\"\n ></gn-ui-drag-and-drop-file-input>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\" translate>map.help.addFromFile</p>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"successMessage\" class=\"text-green-500 mt-2\">\n {{ successMessage }}\n</div>\n", styles: [""], 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: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: ["placeholder", "accept"], outputs: ["fileChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28569
+ }
28570
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, decorators: [{
28571
+ type: Component,
28572
+ args: [{ selector: 'gn-ui-add-layer-from-file', template: "<div class=\"flex flex-col gap-2 my-2\">\n <div class=\"flex items-center gap-4\">\n <div class=\"flex-grow rounded-md border-2 border-gray-200\">\n <gn-ui-drag-and-drop-file-input\n (fileChange)=\"handleFileChange($event)\"\n [accept]=\"acceptedMimeType.join(',')\"\n [placeholder]=\"'map.addFromFile.placeholder' | translate\"\n class=\"placeholder-grey\"\n ></gn-ui-drag-and-drop-file-input>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\" translate>map.help.addFromFile</p>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"successMessage\" class=\"text-green-500 mt-2\">\n {{ successMessage }}\n</div>\n" }]
28573
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28574
+
28575
+ class AddLayerFromWfsComponent {
28576
+ constructor(mapFacade, changeDetectorRef) {
28577
+ this.mapFacade = mapFacade;
28578
+ this.changeDetectorRef = changeDetectorRef;
28579
+ this.wfsUrl = '';
28580
+ this.loading = false;
28581
+ this.layers = [];
28582
+ this.wfsEndpoint = null;
28583
+ this.urlChange = new Subject();
28584
+ this.errorMessage = null;
28585
+ }
28586
+ ngOnInit() {
28587
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => this.loadLayers());
28588
+ }
28589
+ async loadLayers() {
28590
+ this.errorMessage = null;
28591
+ try {
28592
+ this.loading = true;
28593
+ if (this.wfsUrl.trim() === '') {
28594
+ this.layers = [];
28595
+ return;
28596
+ }
28597
+ this.wfsEndpoint = await new WfsEndpoint(this.wfsUrl).isReady();
28598
+ this.layers = this.wfsEndpoint.getFeatureTypes();
28599
+ console.log(this.layers);
28600
+ }
28601
+ catch (error) {
28602
+ const err = error;
28603
+ this.layers = [];
28604
+ this.errorMessage = 'Error loading layers: ' + err.message;
28605
+ }
28606
+ finally {
28607
+ this.loading = false;
28608
+ this.changeDetectorRef.markForCheck();
28609
+ }
28610
+ }
28611
+ addLayer(layer) {
28612
+ const layerToAdd = {
28613
+ name: layer.name,
28614
+ url: this.wfsUrl.toString(),
28615
+ type: MapContextLayerTypeEnum.WFS,
28616
+ };
28617
+ this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
28618
+ }
28619
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28620
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], 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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28621
+ }
28622
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
28623
+ type: Component,
28624
+ args: [{ selector: 'gn-ui-add-layer-from-wfs', template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n" }]
28625
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28626
+
28177
28627
  class LayersPanelComponent {
28178
28628
  constructor(mapFacade) {
28179
28629
  this.mapFacade = mapFacade;
@@ -28183,11 +28633,11 @@ class LayersPanelComponent {
28183
28633
  this.mapFacade.removeLayer(index);
28184
28634
  }
28185
28635
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
28186
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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 h-full\">Add from WMS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from WFS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from file</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$3.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.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: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28636
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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.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$3.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.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: 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 }); }
28187
28637
  }
28188
28638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
28189
28639
  type: Component,
28190
- args: [{ selector: 'gn-ui-layers-panel', changeDetection: ChangeDetectionStrategy.OnPush, 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 h-full\">Add from WMS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from WFS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from file</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" }]
28640
+ args: [{ selector: 'gn-ui-layers-panel', changeDetection: ChangeDetectionStrategy.OnPush, 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.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" }]
28191
28641
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28192
28642
 
28193
28643
  class MapEffects {
@@ -28220,6 +28670,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28220
28670
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28221
28671
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28222
28672
 
28673
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28674
+ class GeocodingService {
28675
+ constructor(provider) {
28676
+ this.provider = provider;
28677
+ }
28678
+ query(text) {
28679
+ let queryObservable;
28680
+ switch (this.provider[0]) {
28681
+ case 'geoadmin':
28682
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28683
+ break;
28684
+ case 'geonames':
28685
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28686
+ break;
28687
+ case 'data-gouv-fr':
28688
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28689
+ break;
28690
+ default:
28691
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28692
+ }
28693
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28694
+ }
28695
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, deps: [{ token: GEOCODING_PROVIDER }], target: i0.ɵɵFactoryTarget.Injectable }); }
28696
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28697
+ }
28698
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28699
+ type: Injectable,
28700
+ args: [{
28701
+ providedIn: 'root',
28702
+ }]
28703
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28704
+ type: Inject,
28705
+ args: [GEOCODING_PROVIDER]
28706
+ }] }]; } });
28707
+
28708
+ class GeocodingComponent {
28709
+ constructor(mapManager, geocodingService) {
28710
+ this.mapManager = mapManager;
28711
+ this.geocodingService = geocodingService;
28712
+ this.searchText = '';
28713
+ this.results = [];
28714
+ this.searchTextChanged = new Subject();
28715
+ this.destroy$ = new Subject();
28716
+ this.errorMessage = null;
28717
+ this.searchTextChanged
28718
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28719
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28720
+ this.errorMessage =
28721
+ 'An error occurred while searching. Please try again.';
28722
+ console.error(error);
28723
+ return [];
28724
+ }));
28725
+ }), takeUntil(this.destroy$))
28726
+ .subscribe((results) => {
28727
+ this.results = results;
28728
+ });
28729
+ }
28730
+ ngOnDestroy() {
28731
+ this.destroy$.next();
28732
+ this.destroy$.complete();
28733
+ }
28734
+ onSearchChange(searchText) {
28735
+ if (!searchText) {
28736
+ this.clearSearch();
28737
+ return;
28738
+ }
28739
+ else {
28740
+ this.searchTextChanged.next(searchText);
28741
+ }
28742
+ }
28743
+ clearSearch() {
28744
+ this.searchText = '';
28745
+ this.results = [];
28746
+ this.errorMessage = null;
28747
+ }
28748
+ zoomToLocation(result) {
28749
+ const map = this.mapManager.map;
28750
+ const view = map.getView();
28751
+ const geometry = result.geom;
28752
+ if (geometry.type === 'Point') {
28753
+ this.zoomToPoint(geometry.coordinates, view);
28754
+ }
28755
+ else if (geometry.type === 'Polygon') {
28756
+ this.zoomToPolygon(geometry.coordinates, view);
28757
+ }
28758
+ else {
28759
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28760
+ }
28761
+ }
28762
+ zoomToPoint(pointCoords, view) {
28763
+ const transformedCoords = fromLonLat(pointCoords);
28764
+ view.setCenter(transformedCoords);
28765
+ view.setZoom(12);
28766
+ }
28767
+ zoomToPolygon(polygonCoords, view) {
28768
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28769
+ const polygon = new Polygon([transformedCoords]);
28770
+ view.fit(polygon, {
28771
+ duration: 100,
28772
+ maxZoom: 12,
28773
+ });
28774
+ }
28775
+ onEnterPress() {
28776
+ if (this.results && this.results.length > 0) {
28777
+ this.zoomToLocation(this.results[0]);
28778
+ }
28779
+ }
28780
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, deps: [{ token: MapManagerService }, { token: GeocodingService }], target: i0.ɵɵFactoryTarget.Component }); }
28781
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: GeocodingComponent, selector: "gn-ui-geocoding", ngImport: i0, template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n<ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n *ngIf=\"results && results.length\"\n>\n <li\n *ngFor=\"let result of results\"\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n</ul>\n", styles: [""], 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: SearchInputComponent, selector: "gn-ui-search-input", inputs: ["value", "placeholder"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28782
+ }
28783
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28784
+ type: Component,
28785
+ args: [{ selector: 'gn-ui-geocoding', template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n<ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n *ngIf=\"results && results.length\"\n>\n <li\n *ngFor=\"let result of results\"\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n</ul>\n" }]
28786
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28787
+
28223
28788
  class FeatureMapModule {
28224
28789
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28225
28790
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28227,7 +28792,11 @@ class FeatureMapModule {
28227
28792
  LayersPanelComponent,
28228
28793
  AddLayerFromCatalogComponent,
28229
28794
  MapContainerComponent,
28230
- AddLayerRecordPreviewComponent], imports: [CommonModule,
28795
+ AddLayerRecordPreviewComponent,
28796
+ AddLayerFromWmsComponent,
28797
+ AddLayerFromFileComponent,
28798
+ AddLayerFromWfsComponent,
28799
+ GeocodingComponent], imports: [CommonModule,
28231
28800
  UiMapModule,
28232
28801
  UiLayoutModule,
28233
28802
  MatIconModule,
@@ -28238,13 +28807,18 @@ class FeatureMapModule {
28238
28807
  MapInstanceDirective,
28239
28808
  LayersPanelComponent,
28240
28809
  AddLayerFromCatalogComponent,
28241
- MapContainerComponent] }); }
28810
+ MapContainerComponent,
28811
+ GeocodingComponent] }); }
28242
28812
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28243
28813
  {
28244
28814
  provide: FEATURE_MAP_OPTIONS,
28245
28815
  useValue: defaultMapOptions,
28246
28816
  },
28247
28817
  MapFacade,
28818
+ {
28819
+ provide: GEOCODING_PROVIDER,
28820
+ useValue: ['geonames', { maxRows: 5 }],
28821
+ },
28248
28822
  ], imports: [CommonModule,
28249
28823
  UiMapModule,
28250
28824
  UiLayoutModule,
@@ -28267,6 +28841,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28267
28841
  AddLayerFromCatalogComponent,
28268
28842
  MapContainerComponent,
28269
28843
  AddLayerRecordPreviewComponent,
28844
+ AddLayerFromWmsComponent,
28845
+ AddLayerFromFileComponent,
28846
+ AddLayerFromWfsComponent,
28847
+ GeocodingComponent,
28270
28848
  ],
28271
28849
  exports: [
28272
28850
  MapContextComponent,
@@ -28274,6 +28852,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28274
28852
  LayersPanelComponent,
28275
28853
  AddLayerFromCatalogComponent,
28276
28854
  MapContainerComponent,
28855
+ GeocodingComponent,
28277
28856
  ],
28278
28857
  imports: [
28279
28858
  CommonModule,
@@ -28294,6 +28873,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28294
28873
  useValue: defaultMapOptions,
28295
28874
  },
28296
28875
  MapFacade,
28876
+ {
28877
+ provide: GEOCODING_PROVIDER,
28878
+ useValue: ['geonames', { maxRows: 5 }],
28879
+ },
28297
28880
  ],
28298
28881
  }]
28299
28882
  }] });
@@ -28388,7 +28971,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28388
28971
  ...state,
28389
28972
  chartConfig,
28390
28973
  })), on(close, (state) => {
28391
- // eslint-disable-next-line
28974
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28392
28975
  const { metadata, related, ...stateWithoutMd } = state;
28393
28976
  return stateWithoutMd;
28394
28977
  }));
@@ -29655,15 +30238,16 @@ class DataService {
29655
30238
  // Pour DL toutes les données
29656
30239
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
29657
30240
  ...wfsLink,
30241
+ type: 'download',
29658
30242
  url: new URL(urls[format]),
29659
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30243
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29660
30244
  }))));
29661
30245
  }
29662
30246
  getDownloadLinksFromEsriRest(esriRestLink) {
29663
30247
  return ['json', 'geojson'].map((format) => ({
29664
30248
  ...esriRestLink,
29665
30249
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
29666
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30250
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29667
30251
  }));
29668
30252
  }
29669
30253
  readAsGeoJson(link) {
@@ -30057,12 +30641,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30057
30641
  }] } });
30058
30642
 
30059
30643
  class MapViewComponent {
30060
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30644
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30061
30645
  this.mdViewFacade = mdViewFacade;
30062
30646
  this.mapManager = mapManager;
30063
30647
  this.mapUtils = mapUtils;
30064
30648
  this.dataService = dataService;
30065
- this.proxy = proxy;
30066
30649
  this.featureInfo = featureInfo;
30067
30650
  this.changeRef = changeRef;
30068
30651
  this.styleService = styleService;
@@ -30097,7 +30680,7 @@ class MapViewComponent {
30097
30680
  return of([]);
30098
30681
  }), finalize(() => (this.loading = false)));
30099
30682
  }));
30100
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30683
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30101
30684
  console.warn(error); // FIXME: report this to the user somehow
30102
30685
  return of(undefined);
30103
30686
  }), map$1((extent) => ({
@@ -30105,7 +30688,18 @@ class MapViewComponent {
30105
30688
  view: {
30106
30689
  extent,
30107
30690
  },
30108
- })), tap$1(() => this.resetSelection()))));
30691
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30692
+ if (context.view.extent)
30693
+ return context;
30694
+ const extent = this.mapUtils.getRecordExtent(metadata);
30695
+ return {
30696
+ ...context,
30697
+ view: {
30698
+ ...context.view,
30699
+ extent,
30700
+ },
30701
+ };
30702
+ }));
30109
30703
  }
30110
30704
  ngOnDestroy() {
30111
30705
  this.subscription.unsubscribe();
@@ -30158,13 +30752,13 @@ class MapViewComponent {
30158
30752
  selectLinkToDisplay(link) {
30159
30753
  this.selectedLinkIndex$.next(link);
30160
30754
  }
30161
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapManagerService }, { token: MapUtilsService }, { token: DataService }, { token: ProxyService }, { token: FeatureInfoService }, { token: i0.ChangeDetectorRef }, { token: MapStyleService }], target: i0.ɵɵFactoryTarget.Component }); }
30755
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapManagerService }, { token: MapUtilsService }, { token: DataService }, { token: FeatureInfoService }, { token: i0.ChangeDetectorRef }, { token: MapStyleService }], target: i0.ɵɵFactoryTarget.Component }); }
30162
30756
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MapViewComponent, selector: "gn-ui-map-view", ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MapContextComponent, selector: "gn-ui-map-context", inputs: ["context", "mapConfig"], outputs: ["featureClicked"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mapConfig"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30163
30757
  }
30164
30758
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30165
30759
  type: Component,
30166
30760
  args: [{ selector: 'gn-ui-map-view', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n" }]
30167
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30761
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30168
30762
 
30169
30763
  class DataViewComponent {
30170
30764
  constructor(mdViewFacade) {
@@ -30247,7 +30841,7 @@ class OrganisationPreviewComponent {
30247
30841
  this.clickedOrganisation.emit(this.organisation);
30248
30842
  }
30249
30843
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30250
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: OrganisationPreviewComponent, selector: "gn-ui-organisation-preview", inputs: { organisation: "organisation", organisationUrl: "organisationUrl" }, outputs: { clickedOrganisation: "clickedOrganisation" }, ngImport: i0, template: "<a href (click)=\"clickOrganisation($event)\" [attr.href]=\"organisationUrl\">\n <div\n class=\"group cursor-pointer rounded-lg h-full flex flex-col\"\n [title]=\"organisation.name\"\n >\n <div\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"organisation.logoUrl\"\n [fit]=\"'contain'\"\n >\n </gn-ui-thumbnail>\n </div>\n <div class=\"px-3 pb-2 capitalize flex flex-col flex-grow overflow-hidden\">\n <span\n class=\"flex-shrink-0 mb-3 mt-5 font-title text-21 text-title group-hover:text-primary line-clamp-2 sm:mt-2 transition-colors\"\n data-cy=\"organizationName\"\n >\n {{ organisation.name }}</span\n >\n <p\n class=\"abstract mt-4 mb-5 sm:mb-2 sm:mt-0 flex-grow flex-shrink-1 overflow-hidden\"\n data-cy=\"organizationDesc\"\n >\n {{ organisation.description }}\n </p>\n <div class=\"flex-shrink-0 text-primary opacity-50 flex leading-6\">\n <mat-icon class=\"material-symbols-outlined text-primary opacity-50 mr-1\"\n >folder_open\n </mat-icon>\n <span class=\"mx-1\" data-cy=\"organizationRecordsCount\">{{\n organisation.recordCount\n }}</span>\n <span translate>record.metadata.publications</span>\n </div>\n </div>\n </div>\n</a>\n", styles: [".abstract{position:relative}.abstract:after{content:\"\";position:absolute;bottom:0;left:0;right:0;background:linear-gradient(0deg,white,transparent);height:10px}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30844
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: OrganisationPreviewComponent, selector: "gn-ui-organisation-preview", inputs: { organisation: "organisation", organisationUrl: "organisationUrl" }, outputs: { clickedOrganisation: "clickedOrganisation" }, ngImport: i0, template: "<a href (click)=\"clickOrganisation($event)\" [attr.href]=\"organisationUrl\">\n <div\n class=\"group cursor-pointer rounded-lg h-full flex flex-col\"\n [title]=\"organisation.name\"\n >\n <div\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"organisation.logoUrl\"\n [fit]=\"'contain'\"\n >\n </gn-ui-thumbnail>\n </div>\n <div class=\"px-3 pb-2 capitalize flex flex-col flex-grow overflow-hidden\">\n <span\n class=\"flex-shrink-0 mb-3 mt-5 font-title text-21 text-title group-hover:text-primary line-clamp-2 sm:mt-2 transition-colors\"\n data-cy=\"organizationName\"\n >\n {{ organisation.name }}</span\n >\n <p\n class=\"abstract mt-4 mb-5 sm:mb-2 sm:mt-0 flex-grow flex-shrink-1 overflow-hidden\"\n data-cy=\"organizationDesc\"\n >\n {{ organisation.description }}\n </p>\n <div class=\"flex-shrink-0 text-primary opacity-50 flex leading-6\">\n <mat-icon class=\"material-symbols-outlined text-primary opacity-50 mr-1\"\n >folder_open\n </mat-icon>\n <span class=\"mx-1\" data-cy=\"organizationRecordsCount\">{{\n organisation.recordCount\n }}</span>\n <span translate>record.metadata.publications</span>\n </div>\n </div>\n </div>\n</a>\n", styles: [".abstract{position:relative}.abstract:after{content:\"\";position:absolute;bottom:0;left:0;right:0;background:linear-gradient(0deg,white,transparent);height:10px}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30251
30845
  }
30252
30846
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, decorators: [{
30253
30847
  type: Component,
@@ -30316,7 +30910,7 @@ class LanguageSwitcherComponent {
30316
30910
  ngOnInit() {
30317
30911
  const languages = this.languagePlaceholder || DEFAULT_LANGUAGES;
30318
30912
  this.languageList = languages.map((language) => ({
30319
- label: `language.${language}`,
30913
+ label: `${language}`.toUpperCase(),
30320
30914
  value: language,
30321
30915
  }));
30322
30916
  }
@@ -30331,11 +30925,11 @@ class LanguageSwitcherComponent {
30331
30925
  this.translate.use(value);
30332
30926
  }
30333
30927
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30334
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
30928
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
30335
30929
  }
30336
30930
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30337
30931
  type: Component,
30338
- args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n>\n</gn-ui-dropdown-selector>\n" }]
30932
+ args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
30339
30933
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30340
30934
  type: Optional
30341
30935
  }, {
@@ -30616,13 +31210,6 @@ class MyOrgService {
30616
31210
  constructor(platformService, orgService) {
30617
31211
  this.platformService = platformService;
30618
31212
  this.orgService = orgService;
30619
- this.myOrgDataSubject = new BehaviorSubject({
30620
- orgName: '',
30621
- logoUrl: '',
30622
- recordCount: 0,
30623
- userCount: 0,
30624
- userList: [],
30625
- });
30626
31213
  this.myOrgData$ = combineLatest([
30627
31214
  this.platformService.getMe(),
30628
31215
  this.platformService.getUsers(),
@@ -30641,7 +31228,7 @@ class MyOrgService {
30641
31228
  userList,
30642
31229
  userCount,
30643
31230
  };
30644
- }));
31231
+ }), shareReplay(1));
30645
31232
  }
30646
31233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, deps: [{ token: PlatformServiceInterface }, { token: OrganizationsServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
30647
31234
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31334,11 +31921,11 @@ class RecordFormComponent {
31334
31921
  return field.config.model;
31335
31922
  }
31336
31923
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31337
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31924
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\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: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31338
31925
  }
31339
31926
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31340
31927
  type: Component,
31341
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n" }]
31928
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n" }]
31342
31929
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31343
31930
 
31344
31931
  const ROUTER_STATE_KEY = 'router';
@@ -31706,5 +32293,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31706
32293
  * Generated bundle index. Do not edit.
31707
32294
  */
31708
32295
 
31709
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, 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, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditorService, ElasticsearchService, EmbeddedTranslateLoader, 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, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, Gn4MetadataMapper, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, 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, MapUtilsWMSService, MapViewComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordTableComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, 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, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, 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, TranslateTestingModule, 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, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, extensionToFormat, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, 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, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32296
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, 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, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, 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, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, 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, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, 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, 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, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, 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, 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, dragPanCondition, dropEmptyTranslations, 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, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
31710
32297
  //# sourceMappingURL=geonetwork-ui.mjs.map