geonetwork-ui 2.2.0-dev.05d3ea32 → 2.2.0-dev.0c7f1872

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 (367) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +28 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +83 -58
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +6 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +20 -17
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +52 -23
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +52 -32
  9. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  10. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  12. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  13. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  14. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  16. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  17. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  19. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  20. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  21. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  22. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  23. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  24. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  25. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  26. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +1 -1
  27. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +106 -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 +20 -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 +5 -4
  34. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -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 +3 -3
  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 +2 -2
  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 +3 -3
  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 +3 -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 +3 -3
  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 -22
  60. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -4
  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 +8 -4
  64. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +12 -5
  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/text-area/text-area.component.mjs +3 -3
  73. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +12 -7
  74. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  75. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  76. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  77. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  78. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  79. package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +1 -1
  80. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +1 -1
  81. package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +1 -1
  82. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +1 -1
  83. package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +1 -1
  84. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  85. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  86. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  87. package/esm2022/translations/de.json +103 -98
  88. package/esm2022/translations/en.json +29 -24
  89. package/esm2022/translations/es.json +10 -5
  90. package/esm2022/translations/fr.json +13 -8
  91. package/esm2022/translations/it.json +12 -7
  92. package/esm2022/translations/nl.json +10 -5
  93. package/esm2022/translations/pt.json +10 -5
  94. package/fesm2022/geonetwork-ui.mjs +1256 -813
  95. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  96. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +3 -0
  97. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  98. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  99. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  100. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  101. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +3 -5
  102. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  103. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  104. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  105. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  106. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +6 -6
  107. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  108. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +4 -3
  109. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  110. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  111. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  112. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  113. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  114. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  115. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  116. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  117. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  118. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  119. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +28 -17
  120. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  121. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  122. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  123. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  124. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  125. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  126. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  127. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  128. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  129. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  130. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  131. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  132. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  133. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  134. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  135. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  136. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  137. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  138. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  139. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  140. package/libs/feature/map/src/index.d.ts +1 -0
  141. package/libs/feature/map/src/index.d.ts.map +1 -1
  142. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +22 -0
  143. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -0
  144. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  145. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  146. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  147. package/libs/feature/map/src/lib/feature-map.module.d.ts +15 -13
  148. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  149. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  150. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  151. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  152. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  153. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  154. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  155. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  156. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  157. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  158. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  159. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  160. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  161. package/libs/feature/search/src/index.d.ts +3 -0
  162. package/libs/feature/search/src/index.d.ts.map +1 -1
  163. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  164. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  165. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  166. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  167. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  168. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  169. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  170. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  171. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  172. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  173. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  174. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  175. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  176. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  177. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  178. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  179. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  180. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  181. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  182. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  183. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  184. package/libs/ui/elements/src/index.d.ts +2 -0
  185. package/libs/ui/elements/src/index.d.ts.map +1 -1
  186. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  187. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +10 -0
  188. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -0
  189. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  190. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  191. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +10 -6
  192. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  193. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  194. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  195. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  196. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +3 -2
  197. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  198. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +3 -2
  199. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  200. package/libs/ui/inputs/src/index.d.ts +1 -0
  201. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  202. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  203. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  204. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  205. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  206. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  207. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  208. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -39
  209. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  210. package/libs/ui/layout/src/index.d.ts +2 -0
  211. package/libs/ui/layout/src/index.d.ts.map +1 -1
  212. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  213. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  214. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  215. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  216. package/libs/ui/search/src/index.d.ts +0 -1
  217. package/libs/ui/search/src/index.d.ts.map +1 -1
  218. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  219. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  220. package/libs/util/i18n/src/index.d.ts +0 -1
  221. package/libs/util/i18n/src/index.d.ts.map +1 -1
  222. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  223. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  224. package/package.json +4 -1
  225. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +61 -8
  226. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +55 -9
  227. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +225 -24
  228. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +32 -0
  229. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +123 -73
  230. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +5 -3
  231. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +3 -5
  232. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  233. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +24 -21
  234. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +115 -62
  235. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +169 -95
  236. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  237. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  238. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  239. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  240. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  241. package/src/libs/common/domain/src/lib/index.ts +2 -0
  242. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +33 -21
  243. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  244. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  245. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  246. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  247. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  248. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  249. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  250. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  251. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  252. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +50 -10
  253. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  254. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  255. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  256. package/src/libs/feature/map/src/index.ts +1 -0
  257. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.css +0 -0
  258. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +21 -0
  259. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +107 -0
  260. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  261. package/src/libs/feature/map/src/lib/feature-map.module.ts +10 -0
  262. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  263. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  264. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  265. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  266. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +3 -1
  267. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  268. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  269. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  270. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  271. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  272. package/src/libs/feature/search/src/index.ts +3 -0
  273. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  274. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  275. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  276. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  277. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  278. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  279. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  280. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  281. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  282. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  283. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  284. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  285. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  286. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  287. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  288. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  289. package/src/libs/ui/elements/src/index.ts +2 -0
  290. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  291. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +0 -0
  292. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +30 -0
  293. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
  294. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  295. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  296. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  297. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +54 -54
  298. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  299. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +2 -2
  300. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +51 -24
  301. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +37 -15
  302. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  303. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  304. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  305. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  306. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  307. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +4 -0
  308. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -1
  309. package/src/libs/ui/inputs/src/index.ts +1 -0
  310. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  311. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  312. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -0
  313. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  314. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  315. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  316. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  317. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  318. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  319. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +5 -2
  320. package/src/libs/ui/layout/src/index.ts +2 -0
  321. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  322. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  323. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  324. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  325. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  326. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  327. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  328. package/src/libs/ui/search/src/index.ts +0 -1
  329. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  330. package/src/libs/util/i18n/src/index.ts +0 -1
  331. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  332. package/tailwind.base.config.js +3 -0
  333. package/tailwind.base.css +2 -2
  334. package/translations/de.json +103 -98
  335. package/translations/en.json +29 -24
  336. package/translations/es.json +10 -5
  337. package/translations/fr.json +13 -8
  338. package/translations/it.json +12 -7
  339. package/translations/nl.json +10 -5
  340. package/translations/pt.json +10 -5
  341. package/translations/sk.json +10 -5
  342. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  343. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  344. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  345. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  346. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  347. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  348. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  349. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  350. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  351. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  352. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  353. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  354. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  355. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  356. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  357. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  358. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  359. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  360. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  361. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  362. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  363. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  364. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  365. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  366. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  367. /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, WfsEndpoint, sharedFetch, useCache } 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';
@@ -73,10 +73,13 @@ import { MatFormFieldModule } from '@angular/material/form-field';
73
73
  import * as i3$2 from '@angular/material/datepicker';
74
74
  import { MatDatepickerModule } from '@angular/material/datepicker';
75
75
  import { MatInputModule } from '@angular/material/input';
76
+ import * as basicLightbox from 'basiclightbox';
76
77
  import * as i1$8 from '@ngrx/effects';
77
78
  import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
78
79
  import tippy from 'tippy.js';
79
80
  import { valid as valid$1 } from 'geojson-validation';
81
+ import { Polygon } from 'ol/geom';
82
+ import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
80
83
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
81
84
  import * as i4$1 from '@angular/cdk/scrolling';
82
85
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -584,6 +587,20 @@ function matchMimeType(format) {
584
587
  return format || null;
585
588
  }
586
589
 
590
+ function getKeywordTypeFromKeywordTypeCode(typeCode) {
591
+ if (!typeCode)
592
+ return 'other';
593
+ switch (typeCode) {
594
+ case 'theme':
595
+ case 'place':
596
+ case 'temporal':
597
+ case 'other':
598
+ return typeCode;
599
+ default:
600
+ return 'other';
601
+ }
602
+ }
603
+
587
604
  function extractCharacterString() {
588
605
  return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
589
606
  }
@@ -646,28 +663,32 @@ function extractStatus() {
646
663
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
647
664
  }
648
665
  // from gmd:resourceConstraints
649
- function extractAccessConstraints() {
650
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
651
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
666
+ function extractLegalConstraints() {
667
+ 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]) => ({
668
+ ...(url && { url }),
652
669
  text,
653
- type: 'other',
654
670
  })));
655
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
671
+ }
672
+ // from gmd:resourceConstraints
673
+ function extractSecurityConstraints() {
674
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
675
+ ...(url && { url }),
656
676
  text,
657
- type: 'security',
658
677
  })));
659
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
660
678
  }
661
679
  // from gmd:resourceConstraints
662
- function extractUseLimitations() {
663
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
680
+ function extractOtherConstraints() {
681
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
682
+ ...(url && { url }),
683
+ text,
684
+ })));
664
685
  }
665
686
  // from gmd:resourceConstraints
666
687
  function extractLicenses() {
667
- 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]) => ({
688
+ 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]) => ({
668
689
  ...(url && { url }),
669
690
  text,
670
- })))));
691
+ })));
671
692
  }
672
693
  // from gmd:MD_Distribution
673
694
  function extractDatasetDistributions() {
@@ -826,31 +847,55 @@ function readDatasetUpdated(rootEl) {
826
847
  function readContacts(rootEl) {
827
848
  return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
828
849
  }
829
- function readKeywordsOfType(isTheme) {
830
- return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), filterArray(pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => isTheme === values.indexOf('theme') > -1))), mapArray(findChildrenElement('gmd:keyword')), flattenArray(), mapArray(extractCharacterString()));
850
+ // from gmd:thesaurusName
851
+ function readThesaurus(rootEl) {
852
+ if (!rootEl)
853
+ return null;
854
+ const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
855
+ const id = pipe(findIdentifier, extractCharacterString())(rootEl);
856
+ const url = pipe(findIdentifier, extractUrl())(rootEl);
857
+ const name = pipe(findNestedElement('gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
858
+ return {
859
+ id,
860
+ ...(name && { name }),
861
+ ...(url && { url }),
862
+ };
831
863
  }
832
- function readKeywords(rootEl) {
833
- return readKeywordsOfType(false)(rootEl);
864
+ // from gmd:MD_Keywords
865
+ function readKeywordGroup(rootEl) {
866
+ const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
867
+ const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
868
+ return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
869
+ const label = extractCharacterString()(el);
870
+ return {
871
+ ...(thesaurus ? { thesaurus } : {}),
872
+ label,
873
+ type,
874
+ };
875
+ }))(rootEl);
834
876
  }
835
- function readThemes(rootEl) {
836
- return readKeywordsOfType(true)(rootEl);
877
+ function readKeywords(rootEl) {
878
+ return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), mapArray(readKeywordGroup), flattenArray())(rootEl);
837
879
  }
838
880
  function readStatus(rootEl) {
839
881
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
840
882
  }
841
883
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
842
- function readAccessConstraints(rootEl) {
843
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
884
+ function readLegalConstraints(rootEl) {
885
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
844
886
  }
845
- function readUseLimitations(rootEl) {
846
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
887
+ function readSecurityConstraints(rootEl) {
888
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
889
+ }
890
+ function readOtherConstraints(rootEl) {
891
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
847
892
  }
848
893
  function readLicenses(rootEl) {
849
894
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
850
895
  }
851
896
  // not used yet
852
897
  function readIsoTopics(rootEl) {
853
- return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', false), mapArray(readText()))(rootEl);
898
+ return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', true), mapArray(readText()))(rootEl);
854
899
  }
855
900
  function readSpatialRepresentation(rootEl) {
856
901
  return pipe(findIdentification(), findNestedElement('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), readAttribute('codeListValue'), map(getSpatialRepresentationFromCode))(rootEl);
@@ -1066,33 +1111,50 @@ function updateCitationDate(date, type) {
1066
1111
  function appendCitationDate(date, type) {
1067
1112
  return appendChildren(pipe(createElement('gmd:date'), createChild('gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createElement('gmd:dateType'), createChild('gmd:CI_DateTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), addAttribute('codeListValue', type)))));
1068
1113
  }
1069
- function removeKeywords(type) {
1070
- return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords'), filterArray(pipe(findNestedElement('gmd:MD_Keywords', 'gmd:type', 'gmd:MD_KeywordTypeCode'), readAttribute('codeListValue'),
1071
- // if a specific type is targeted, compare with it; otherwise remove keywords if they have no type defined
1072
- map((typeValue) => (type !== null ? type === typeValue : true))))));
1073
- }
1074
- function appendKeywords(keywords, type) {
1075
- return appendChildren(pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), type !== null
1076
- ? 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)))
1077
- : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1078
- }
1079
- function removeAccessConstraints() {
1080
- const securityConstraintsFilter = pipe(findChildrenElement('gmd:MD_SecurityConstraints'), (array) => array.length > 0);
1081
- // remove legal constraints that *only* have 'otherRestrictions'
1082
- const otherConstraintsFilter = pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code === 'otherRestrictions'));
1083
- return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray((el) => securityConstraintsFilter(el) || otherConstraintsFilter(el))));
1084
- }
1085
- function createAccessConstraint(constraint) {
1086
- if (constraint.type === 'security') {
1114
+ function removeKeywords() {
1115
+ return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords')));
1116
+ }
1117
+ // returns a <gmd:thesaurusName> element
1118
+ function createThesaurus(thesaurus) {
1119
+ return pipe(createElement('gmd:thesaurusName'), createChild('gmd:CI_Citation'), appendChildren(pipe(createElement('gmd:title'), writeCharacterString(thesaurus.name || thesaurus.id)), pipe(createElement('gmd:identifier'), createChild('gmd:MD_Identifier'), appendChildren(pipe(createElement('gmd:code'), thesaurus.url
1120
+ ? writeAnchor(thesaurus.url, thesaurus.id)
1121
+ : writeCharacterString(thesaurus.id))))));
1122
+ }
1123
+ function appendKeywords(keywords) {
1124
+ const keywordsByThesaurus = keywords.reduce((acc, keyword) => {
1125
+ const thesaurusId = keyword.thesaurus?.id;
1126
+ const type = keyword.type;
1127
+ let existingGroup = acc.find((group) => group[0].thesaurus
1128
+ ? group[0].thesaurus.id === thesaurusId
1129
+ : group[0].type === type);
1130
+ if (!existingGroup) {
1131
+ existingGroup = [];
1132
+ acc.push(existingGroup);
1133
+ }
1134
+ existingGroup.push(keyword);
1135
+ return acc;
1136
+ }, []);
1137
+ return appendChildren(...keywordsByThesaurus.map((keywords) => pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', keywords[0].type))), keywords[0].thesaurus
1138
+ ? appendChildren(createThesaurus(keywords[0].thesaurus))
1139
+ : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword.label)))))));
1140
+ }
1141
+ function createConstraint(constraint, type) {
1142
+ if (type === 'security') {
1087
1143
  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))));
1088
1144
  }
1089
- 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))));
1145
+ else if (type === 'legal') {
1146
+ 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))));
1147
+ }
1148
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1090
1149
  }
1091
- function removeUseLimitations() {
1150
+ function removeOtherConstraints() {
1092
1151
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1093
1152
  }
1094
- function createUseLimitation(useLimitation) {
1095
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1153
+ function removeSecurityConstraints() {
1154
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1155
+ }
1156
+ function removeLegalConstraints() {
1157
+ 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')))));
1096
1158
  }
1097
1159
  function removeLicenses() {
1098
1160
  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')))));
@@ -1191,19 +1253,22 @@ function writeContacts(record, rootEl) {
1191
1253
  pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact)))))(rootEl);
1192
1254
  }
1193
1255
  function writeKeywords(record, rootEl) {
1194
- pipe(findOrCreateIdentification(), removeKeywords(null), appendKeywords(record.keywords, null))(rootEl);
1256
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1195
1257
  }
1196
- function writeThemes(record, rootEl) {
1197
- pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1198
- }
1199
- function writeAccessConstraints(record, rootEl) {
1200
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1258
+ function writeTopics(record, rootEl) {
1259
+ pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(createElement('gmd:topicCategory'), createChild('gmd:MD_TopicCategoryCode'), setTextContent(topic)))))(rootEl);
1201
1260
  }
1202
1261
  function writeLicenses(record, rootEl) {
1203
1262
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1204
1263
  }
1205
- function writeUseLimitations(record, rootEl) {
1206
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1264
+ function writeLegalConstraints(record, rootEl) {
1265
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1266
+ }
1267
+ function writeSecurityConstraints(record, rootEl) {
1268
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1269
+ }
1270
+ function writeOtherConstraints(record, rootEl) {
1271
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1207
1272
  }
1208
1273
  function writeUpdateFrequency(record, rootEl) {
1209
1274
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1300,13 +1365,12 @@ function toModel(xml) {
1300
1365
  const recordUpdated = readRecordUpdated(rootEl);
1301
1366
  const recordCreated = recordUpdated;
1302
1367
  const keywords = readKeywords(rootEl);
1303
- const themes = readThemes(rootEl);
1304
- const accessConstraints = readAccessConstraints(rootEl);
1305
- const useLimitations = readUseLimitations(rootEl);
1368
+ const topics = readIsoTopics(rootEl);
1369
+ const legalConstraints = readLegalConstraints(rootEl);
1370
+ const otherConstraints = readOtherConstraints(rootEl);
1371
+ const securityConstraints = readSecurityConstraints(rootEl);
1306
1372
  const licenses = readLicenses(rootEl);
1307
1373
  const overviews = readOverviews(rootEl);
1308
- // not used yet
1309
- const isoTopics = readIsoTopics(rootEl);
1310
1374
  if (kind === 'dataset') {
1311
1375
  const status = readStatus(rootEl);
1312
1376
  const datasetCreated = readDatasetCreated(rootEl);
@@ -1329,10 +1393,11 @@ function toModel(xml) {
1329
1393
  contacts,
1330
1394
  contactsForResource: [],
1331
1395
  keywords,
1332
- themes,
1333
- accessConstraints,
1334
- useLimitations,
1396
+ topics,
1335
1397
  licenses,
1398
+ legalConstraints,
1399
+ securityConstraints,
1400
+ otherConstraints,
1336
1401
  ...(datasetCreated && { datasetCreated }),
1337
1402
  ...(datasetUpdated && { datasetUpdated }),
1338
1403
  lineage,
@@ -1356,10 +1421,11 @@ function toModel(xml) {
1356
1421
  ownerOrganization,
1357
1422
  contacts,
1358
1423
  keywords,
1359
- themes,
1360
- accessConstraints,
1361
- useLimitations,
1424
+ topics,
1362
1425
  licenses,
1426
+ legalConstraints,
1427
+ securityConstraints,
1428
+ otherConstraints,
1363
1429
  overviews,
1364
1430
  onlineResources,
1365
1431
  };
@@ -1384,10 +1450,12 @@ function toXml(record, originalXml) {
1384
1450
  writeAbstract(record, rootEl);
1385
1451
  fieldChanged('contacts') && writeContacts(record, rootEl);
1386
1452
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1387
- fieldChanged('themes') && writeThemes(record, rootEl);
1388
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1453
+ fieldChanged('topics') && writeTopics(record, rootEl);
1454
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1455
+ fieldChanged('securityConstraints') &&
1456
+ writeSecurityConstraints(record, rootEl);
1389
1457
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1390
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1458
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1391
1459
  if (record.kind === 'dataset') {
1392
1460
  writeStatus(record, rootEl);
1393
1461
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1413,6 +1481,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1413
1481
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1414
1482
  const toDate = (field) => new Date(field);
1415
1483
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1484
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1416
1485
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1417
1486
  const getAsUrl = (field, location = window.location.toString()) => {
1418
1487
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -1453,6 +1522,31 @@ const mapContact = (sourceContact, lang3) => {
1453
1522
  ...(phone && { phone }),
1454
1523
  };
1455
1524
  };
1525
+ const mapKeywords = (thesauri, language) => {
1526
+ const keywords = [];
1527
+ for (const thesaurusId in thesauri) {
1528
+ const rawThesaurus = thesauri[thesaurusId];
1529
+ let thesaurus = null;
1530
+ if (rawThesaurus.id) {
1531
+ const thesaurusSource = { ...rawThesaurus };
1532
+ const url = getAsUrl(selectField(thesaurusSource, 'link'));
1533
+ const name = selectField(thesaurusSource, 'title');
1534
+ thesaurus = {
1535
+ id: rawThesaurus.id,
1536
+ ...(name && { name }),
1537
+ ...(url && { url }),
1538
+ };
1539
+ }
1540
+ for (const keyword of rawThesaurus.keywords) {
1541
+ keywords.push({
1542
+ label: selectTranslatedValue(keyword, language),
1543
+ type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
1544
+ ...(thesaurus && { thesaurus }),
1545
+ });
1546
+ }
1547
+ }
1548
+ return keywords;
1549
+ };
1456
1550
 
1457
1551
  /**
1458
1552
  * Custom HttpParameterCodec
@@ -16539,133 +16633,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16539
16633
  }]
16540
16634
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16541
16635
 
16542
- // IMPORTANT:
16543
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/test-translate-loader.service.ts
16544
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16545
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16546
- class TestTranslateLoader extends TranslateLoader {
16547
- constructor(_translations = {}) {
16548
- super();
16549
- this._translations = _translations;
16550
- }
16551
- /**
16552
- * Returns an {Observable} of translations for the specified language. If the
16553
- * language is not recognized, an empty translations object will be returned.
16554
- *
16555
- * @param language the language for which the translations should be retrieved.
16556
- * @returns the translations for the specified
16557
- * language or an empty set of translations if the language is not recognized.
16558
- */
16559
- getTranslation(language) {
16560
- return of(this._translations[language] || {});
16561
- }
16562
- }
16563
-
16564
- // IMPORTANT:
16565
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/testing.module.ts
16566
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16567
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16568
- /**
16569
- * The TranslateTestingModule provides the {TranslateModule} as well as a
16570
- * {TranslateService} configured to return translations specific for the
16571
- * test environment.
16572
- *
16573
- * @export
16574
- */
16575
- class TranslateTestingModule {
16576
- constructor() {
16577
- this._translations = {};
16578
- }
16579
- static withTranslations(languageOrTranslations, translations) {
16580
- const translateTestingModule = new TranslateTestingModule();
16581
- if (typeof languageOrTranslations === 'string') {
16582
- return translateTestingModule.withTranslations(languageOrTranslations, translations);
16583
- }
16584
- return translateTestingModule.withTranslations(languageOrTranslations);
16585
- }
16586
- get ngModule() {
16587
- return TranslateTestingModule;
16588
- }
16589
- get providers() {
16590
- const translateService = new TranslateService(null, new TestTranslateLoader(this._translations), this._compiler || new TranslateFakeCompiler(), new TranslateDefaultParser(), new FakeMissingTranslationHandler(), true, true, false, this._defaultLanguage);
16591
- return [
16592
- {
16593
- provide: TranslateService,
16594
- useValue: translateService,
16595
- },
16596
- ];
16597
- }
16598
- withTranslations(languageOrTranslations, translations) {
16599
- if (typeof languageOrTranslations === 'string' && translations) {
16600
- this.addTranslations(languageOrTranslations, translations);
16601
- this._defaultLanguage = languageOrTranslations;
16602
- }
16603
- else if (languageOrTranslations) {
16604
- Object.keys(languageOrTranslations).forEach((language) => this.addTranslations(language, languageOrTranslations[language]));
16605
- }
16606
- return this;
16607
- }
16608
- /**
16609
- * Updates the {TranslationTestingModule} to provide a {TranslateService} that will
16610
- * use the provided {TranslateCompiler} to translate the test translations.
16611
- *
16612
- * @example
16613
- *
16614
- * TranslateTestingModule.withTranslations('en', {people: '{gender, select, male{He is} female{She is} other{They are}} {how})'})
16615
- * .withCompiler(new TranslateMessageFormatCompiler());
16616
- *
16617
- * @param compiler the compiler to use to compile the test translations.
16618
- * @returns the instance that can be used to chain additional configuration.
16619
- * @memberof TranslateTestingModule
16620
- */
16621
- withCompiler(compiler) {
16622
- this._compiler = compiler;
16623
- return this;
16624
- }
16625
- /**
16626
- * Updates the {TranslateTestingModule} to use the provided language as the default language.
16627
- * By default, the default language will be set to the first language provided.
16628
- *
16629
- * @example
16630
- *
16631
- * TranslateTestingModule.withTranslations('es', SPANISH_TRANSLATIONS)
16632
- * .withTranslations('en', ENGLISH_TRANSLATIONS)
16633
- * .withDefaultLanguage('en');
16634
- *
16635
- * @param language the new default language for translations.
16636
- * @returns the instance that can be used to chain additional configuration.
16637
- * @memberof TranslateTestingModule
16638
- */
16639
- withDefaultLanguage(language) {
16640
- this._defaultLanguage = language || this._defaultLanguage;
16641
- return this;
16642
- }
16643
- addTranslations(language, translations) {
16644
- if (!this._defaultLanguage) {
16645
- this._defaultLanguage = language;
16646
- }
16647
- if (this._translations[language]) {
16648
- this._translations[language] = {
16649
- ...this._translations[language],
16650
- ...translations,
16651
- };
16652
- }
16653
- else {
16654
- this._translations[language] = translations;
16655
- }
16656
- }
16657
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16658
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule], exports: [TranslateModule] }); }
16659
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule, TranslateModule] }); }
16660
- }
16661
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, decorators: [{
16662
- type: NgModule,
16663
- args: [{
16664
- imports: [TranslateModule],
16665
- exports: [TranslateModule],
16666
- }]
16667
- }] });
16668
-
16669
16636
  var dropFile$6 = "Datei ablegen";
16670
16637
  var next$6 = "weiter";
16671
16638
  var previous$6 = "zurück";
@@ -16688,20 +16655,21 @@ var de = {
16688
16655
  "chart.type.line": "Liniendiagramm",
16689
16656
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16690
16657
  "chart.type.pie": "Kreisdiagramm",
16691
- "dashboard.labels.mySpace": "",
16692
- "dashboard.records.all": "",
16693
- "dashboard.records.myDraft": "",
16694
- "dashboard.records.myLibrary": "",
16695
- "dashboard.records.myOrg": "",
16696
- "dashboard.records.myRecords": "",
16697
- "dashboard.records.noRecord": "",
16698
- "dashboard.records.noUser": "",
16699
- "dashboard.records.publishedRecords": "",
16700
- "dashboard.records.search": "",
16701
- "dashboard.records.userDetail": "",
16702
- "dashboard.records.userEmail": "",
16703
- "dashboard.records.username": "",
16704
- "dashboard.records.users": "",
16658
+ "dashboard.createRecord": "",
16659
+ "dashboard.labels.mySpace": "Mein Bereich",
16660
+ "dashboard.records.all": "Katalog",
16661
+ "dashboard.records.myDraft": "Meine Entwürfe",
16662
+ "dashboard.records.myLibrary": "Meine Bibliothek",
16663
+ "dashboard.records.myOrg": "Meine Organisation",
16664
+ "dashboard.records.myRecords": "Meine Datensätze",
16665
+ "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16666
+ "dashboard.records.search": "Suche nach \"{searchText}\"",
16667
+ "dashboard.records.userDetail": "Name",
16668
+ "dashboard.records.userEmail": "E-Mail",
16669
+ "dashboard.records.username": "Benutzername",
16670
+ "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16671
+ "dashboard.results.listMetadata": "",
16672
+ "dashboard.results.listResources": "",
16705
16673
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16706
16674
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16707
16675
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16715,7 +16683,7 @@ var de = {
16715
16683
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
16716
16684
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
16717
16685
  "datafeeder.form.dropdown": "Für welche Skala wurde er erstellt?",
16718
- "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tags aus, die zu Ihrem Datensatz passen",
16686
+ "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tage aus, die zu Ihrem Datensatz passen",
16719
16687
  "datafeeder.form.title": "Geben Sie Ihrem Datensatz den besten Titel",
16720
16688
  "datafeeder.formsPage.title": "Erzählen Sie uns mehr über Ihren Datensatz",
16721
16689
  "datafeeder.month.april": "April",
@@ -16730,16 +16698,16 @@ var de = {
16730
16698
  "datafeeder.month.november": "November",
16731
16699
  "datafeeder.month.october": "Oktober",
16732
16700
  "datafeeder.month.september": "September",
16733
- "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist",
16734
- "datafeeder.publish.illustration.title": "Ein weiterer Datensatz zum Veröffentlichen?",
16701
+ "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist.",
16702
+ "datafeeder.publish.illustration.title": "Ein weiterer Datensatz \n zum Veröffentlichen?",
16735
16703
  "datafeeder.publish.subtitle": "Das Veröffentlichen kann einige Minuten dauern.",
16736
- "datafeeder.publish.title": "Vielen Dank! Ihr Datensatz wird veröffentlicht",
16704
+ "datafeeder.publish.title": "Vielen Dank! \n Ihr Datensatz wird veröffentlicht",
16737
16705
  "datafeeder.publish.upload": "Jetzt hochladen",
16738
16706
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
16739
16707
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
16740
16708
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
16741
16709
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
16742
- "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! Ihr Datensatz wurde veröffentlicht",
16710
+ "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
16743
16711
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
16744
16712
  "datafeeder.summarizePage.illustration": "Kein Fehler? Los geht's!",
16745
16713
  "datafeeder.summarizePage.previous": "Zurück",
@@ -16747,11 +16715,11 @@ var de = {
16747
16715
  "datafeeder.summarizePage.title": "Sie sind fast fertig...",
16748
16716
  "datafeeder.upload.acceptedFormats": "Akzeptierte Dateiformate:",
16749
16717
  "datafeeder.upload.checkboxLabel": "Ich besitze die Rechte zur Veröffentlichung dieses Datensatzes",
16750
- "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geospatialen Datensatz enthält",
16718
+ "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geografischen Datensatz enthält",
16751
16719
  "datafeeder.upload.error.subtitle.cantOpenFile": "Bitte überprüfen Sie, ob die Datei gültig ist",
16752
16720
  "datafeeder.upload.error.subtitle.fileFormat": "Beachten Sie: Nur SHP-Dateien",
16753
- "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximal {size} MB",
16754
- "datafeeder.upload.error.title.analysis": "Fehler bei der Datensatzanalyse",
16721
+ "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximale Dateigröße {size} MB",
16722
+ "datafeeder.upload.error.title.analysis": "Fehler während der Datensatzanalyse",
16755
16723
  "datafeeder.upload.error.title.cantOpenFile": "Fehler beim Öffnen der Datei",
16756
16724
  "datafeeder.upload.error.title.fileFormat": "Das ausgewählte Dateiformat wird nicht unterstützt",
16757
16725
  "datafeeder.upload.error.title.fileHasntSelected": "Keine Datei ausgewählt",
@@ -16759,19 +16727,19 @@ var de = {
16759
16727
  "datafeeder.upload.error.title.noRightsToSendData": "Sie dürfen diesen Datensatz nicht veröffentlichen",
16760
16728
  "datafeeder.upload.illustration.enrichment": "Anreicherung",
16761
16729
  "datafeeder.upload.illustration.import": "Import",
16762
- "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten war noch nie einfacher",
16730
+ "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten \n war noch nie so einfach",
16763
16731
  "datafeeder.upload.illustration.validation": "Validierung",
16764
- "datafeeder.upload.illustration.verification": "Verifizierung",
16732
+ "datafeeder.upload.illustration.verification": "Überprüfung",
16765
16733
  "datafeeder.upload.inputLabel": "Importieren Sie Ihre Datei",
16766
16734
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
16767
16735
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
16768
16736
  "datafeeder.upload.uploadButton": "Hochladen",
16769
- "datafeeder.validation.encoding": "Kodierung",
16737
+ "datafeeder.validation.encoding": "Codierung",
16770
16738
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
16771
16739
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
16772
16740
  "datafeeder.validation.projection": "Raumbezugssystem:",
16773
- "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem",
16774
- "datafeeder.validation.sample.title": "Und eine Beispieleinheit aus dem Datensatz",
16741
+ "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem aus",
16742
+ "datafeeder.validation.sample.title": "Und eine Beispielentität aus dem Datensatz",
16775
16743
  "datafeeder.wizard.emptyRequiredValuesMessage": "Bitte füllen Sie die obligatorischen Felder aus",
16776
16744
  "datafeeder.wizardSummarize.createdAt": "Erstellt am",
16777
16745
  "datafeeder.wizardSummarize.scale": "Maßstab",
@@ -16781,20 +16749,20 @@ var de = {
16781
16749
  "datahub.header.news": "Startseite",
16782
16750
  "datahub.header.organisations": "Organisationen",
16783
16751
  "datahub.header.popularRecords": "Die beliebtesten",
16784
- "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten von meiner Organisation</div>",
16785
- "datahub.news.contact.contactus": "",
16786
- "datahub.news.contact.html": "",
16787
- "datahub.news.contact.title": "",
16752
+ "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
16753
+ "datahub.news.contact.contactus": "Kontaktieren Sie uns",
16754
+ "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>",
16755
+ "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
16788
16756
  "datahub.news.feed": "Nachrichtenfeed",
16789
16757
  "datahub.news.figures": "Indikatoren",
16790
- "datahub.record.addToFavorites": "",
16791
- "datahub.search.back": "Zurück zu den Ergebnissen",
16758
+ "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
16759
+ "datahub.search.back": "Zurück",
16792
16760
  "datahub.search.filter.all": "Alle",
16793
- "datahub.search.filter.generatedByWfs": "Generiert durch API",
16761
+ "datahub.search.filter.generatedByWfs": "Generiert durch eine API",
16794
16762
  "datahub.search.filter.others": "Andere",
16795
16763
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
16796
16764
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
16797
- "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht geparst werden: \"{ info }\"",
16765
+ "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
16798
16766
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
16799
16767
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
16800
16768
  "domain.record.status.completed": "Abgeschlossen",
@@ -16802,18 +16770,18 @@ var de = {
16802
16770
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
16803
16771
  "domain.record.status.removed": "Entfernt",
16804
16772
  "domain.record.status.under_development": "In Erstellung",
16805
- "domain.record.updateFrequency.asNeeded": "Bei Bedarf",
16806
- "domain.record.updateFrequency.continual": "Kontinuierlich",
16773
+ "domain.record.updateFrequency.asNeeded": "Nach Bedarf",
16774
+ "domain.record.updateFrequency.continual": "Fortlaufend",
16807
16775
  "domain.record.updateFrequency.day": "{count, plural, =0{0} one{Ein} other{{count}}} mal am Tag",
16808
- "domain.record.updateFrequency.irregular": "Unregelmässig",
16776
+ "domain.record.updateFrequency.irregular": "Unregelmäßig",
16809
16777
  "domain.record.updateFrequency.month": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Monat",
16810
16778
  "domain.record.updateFrequency.notPlanned": "Nicht geplant",
16811
- "domain.record.updateFrequency.periodic": "Regelmässig",
16779
+ "domain.record.updateFrequency.periodic": "Regelmäßig",
16812
16780
  "domain.record.updateFrequency.unknown": "Unbekannt",
16813
16781
  "domain.record.updateFrequency.week": "{count, plural, =0{0} one{Ein} other{{count}}} mal in der Woche",
16814
16782
  "domain.record.updateFrequency.year": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Jahr",
16815
16783
  "downloads.format.unknown": "unbekannt",
16816
- "downloads.wfs.featuretype.not.found": "Die Schicht wurde nicht gefunden",
16784
+ "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16817
16785
  dropFile: dropFile$6,
16818
16786
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16819
16787
  "facets.block.title.OrgForResource": "Organisation",
@@ -16848,15 +16816,18 @@ var de = {
16848
16816
  "map.add.layer.file": "Aus einer Datei",
16849
16817
  "map.add.layer.wfs": "Aus WFS",
16850
16818
  "map.add.layer.wms": "Aus WMS",
16851
- "map.layer.add": "",
16852
- "map.layers.available": "",
16819
+ "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16820
+ "map.geocoding.placeholder": "",
16821
+ "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16822
+ "map.layer.add": "Hinzufügen",
16823
+ "map.layers.available": "Verfügbare Layer",
16853
16824
  "map.layers.list": "Ebenen",
16854
16825
  "map.loading.data": "Kartendaten werden geladen...",
16855
- "map.loading.service": "",
16826
+ "map.loading.service": "Dienst wird geladen...",
16856
16827
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
16857
16828
  "map.select.layer": "Datenquelle",
16858
- "map.wfs.urlInput.hint": "",
16859
- "map.wms.urlInput.hint": "",
16829
+ "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
16830
+ "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
16860
16831
  "multiselect.filter.placeholder": "Suche",
16861
16832
  "nav.back": "Zurück",
16862
16833
  next: next$6,
@@ -16872,61 +16843,61 @@ var de = {
16872
16843
  "pagination.pageOf": "von",
16873
16844
  previous: previous$6,
16874
16845
  "record.action.download": "Herunterladen",
16875
- "record.action.view": "Ansehen",
16846
+ "record.action.view": "Anzeigen",
16876
16847
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
16877
16848
  "record.metadata.about": "Beschreibung",
16878
16849
  "record.metadata.api": "API",
16879
- "record.metadata.api.form.closeButton": "",
16880
- "record.metadata.api.form.closeForm": "",
16881
- "record.metadata.api.form.create": "",
16882
- "record.metadata.api.form.customUrl": "",
16883
- "record.metadata.api.form.limit": "",
16884
- "record.metadata.api.form.limit.all": "",
16885
- "record.metadata.api.form.offset": "",
16886
- "record.metadata.api.form.openForm": "",
16887
- "record.metadata.api.form.reset": "",
16888
- "record.metadata.api.form.title": "",
16889
- "record.metadata.api.form.type": "",
16890
- "record.metadata.author": "",
16850
+ "record.metadata.api.form.closeButton": "Schließen",
16851
+ "record.metadata.api.form.closeForm": "Formular schließen",
16852
+ "record.metadata.api.form.create": "Ihre Anfrage erstellen",
16853
+ "record.metadata.api.form.customUrl": "Benutzerdefinierte URL",
16854
+ "record.metadata.api.form.limit": "Anzahl der Datensätze",
16855
+ "record.metadata.api.form.limit.all": "Alle",
16856
+ "record.metadata.api.form.offset": "Anzahl des ersten Datensatzes",
16857
+ "record.metadata.api.form.openForm": "Formular öffnen",
16858
+ "record.metadata.api.form.reset": "Zurücksetzen",
16859
+ "record.metadata.api.form.title": "Benutzerdefinierte URL generieren",
16860
+ "record.metadata.api.form.type": "Ausgabeformat",
16861
+ "record.metadata.author": "Autor",
16891
16862
  "record.metadata.catalog": "Katalog",
16892
16863
  "record.metadata.contact": "Kontakt",
16893
- "record.metadata.createdOn": "Erstellt am",
16894
16864
  "record.metadata.details": "Technische Informationen",
16895
16865
  "record.metadata.download": "Downloads",
16896
- "record.metadata.formats": "",
16897
- "record.metadata.isOpenData": "Open Data",
16866
+ "record.metadata.formats": "Formate",
16898
16867
  "record.metadata.keywords": "Stichworte",
16899
- "record.metadata.lastUpdate": "",
16868
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16900
16869
  "record.metadata.links": "Links",
16901
- "record.metadata.noUsage": "Für diesen Datensatz sind keine Verwendungsbedingungen angegeben.",
16870
+ "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16902
16871
  "record.metadata.origin": "Über die Daten",
16872
+ "record.metadata.otherConstraints": "",
16903
16873
  "record.metadata.owner": "",
16904
16874
  "record.metadata.preview": "Vorschau",
16905
16875
  "record.metadata.publications": "Veröffentlichungen",
16906
- "record.metadata.quality": "",
16907
- "record.metadata.quality.contact.failed": "",
16908
- "record.metadata.quality.contact.success": "",
16909
- "record.metadata.quality.description.failed": "",
16910
- "record.metadata.quality.description.success": "",
16911
- "record.metadata.quality.details": "",
16912
- "record.metadata.quality.keywords.failed": "",
16913
- "record.metadata.quality.keywords.success": "",
16914
- "record.metadata.quality.legalConstraints.failed": "",
16915
- "record.metadata.quality.legalConstraints.success": "",
16916
- "record.metadata.quality.organisation.failed": "",
16917
- "record.metadata.quality.organisation.success": "",
16918
- "record.metadata.quality.title.failed": "",
16919
- "record.metadata.quality.title.success": "",
16920
- "record.metadata.quality.topic.failed": "",
16921
- "record.metadata.quality.topic.success": "",
16922
- "record.metadata.quality.updateFrequency.failed": "",
16923
- "record.metadata.quality.updateFrequency.success": "",
16876
+ "record.metadata.quality": "Metadatenqualität",
16877
+ "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
16878
+ "record.metadata.quality.contact.success": "Kontakt angegeben",
16879
+ "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
16880
+ "record.metadata.quality.description.success": "Beschreibung angegeben",
16881
+ "record.metadata.quality.details": "Details",
16882
+ "record.metadata.quality.keywords.failed": "Schlagwörter nicht angegeben",
16883
+ "record.metadata.quality.keywords.success": "Schlagwörter angegeben",
16884
+ "record.metadata.quality.legalConstraints.failed": "Rechtliche Beschränkungen nicht angegeben",
16885
+ "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
16886
+ "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
16887
+ "record.metadata.quality.organisation.success": "Organisation angegeben",
16888
+ "record.metadata.quality.title.failed": "Titel nicht angegeben",
16889
+ "record.metadata.quality.title.success": "Titel angegeben",
16890
+ "record.metadata.quality.topic.failed": "Thema nicht angegeben",
16891
+ "record.metadata.quality.topic.success": "Thema angegeben",
16892
+ "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
16893
+ "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16924
16894
  "record.metadata.related": "Ähnliche Datensätze",
16925
- "record.metadata.sheet": "Weitere Informationen erhalten Sie unter :",
16926
- "record.metadata.themes": "",
16895
+ "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16896
+ "record.metadata.status": "",
16927
16897
  "record.metadata.title": "Titel",
16928
- "record.metadata.type": "",
16929
- "record.metadata.uniqueId": "",
16898
+ "record.metadata.topics": "Kategorien",
16899
+ "record.metadata.type": "Geographischer Datensatz",
16900
+ "record.metadata.uniqueId": "Eindeutige Kennung",
16930
16901
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16931
16902
  "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16932
16903
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
@@ -16938,28 +16909,29 @@ var de = {
16938
16909
  "record.was.created.time": "erstellte diesen Datensatz {time}",
16939
16910
  records: records$6,
16940
16911
  "results.layout.selectOne": "Layout auswählen",
16941
- "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{auf {hits} insgesamt angezeigt.}}",
16942
- "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>",
16912
+ "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{angezeigt von {hits} insgesamt.}}",
16913
+ "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>",
16943
16914
  "results.records.hits.found": "{hits, plural, =0{Keine Dokumente entsprechen der angegebenen Suche.} one{1 Datensatz gefunden.} other{{hits} Datensätze gefunden.}}",
16944
- "results.records.hits.selected": "",
16915
+ "results.records.hits.selected": "{ amount } ausgewählt",
16945
16916
  "results.showMore": "Mehr Ergebnisse anzeigen...",
16946
- "results.sortBy.dateStamp": "Letzte Aktualisierungen",
16917
+ "results.sortBy.dateStamp": "Neueste",
16947
16918
  "results.sortBy.popularity": "Beliebtheit",
16948
- "results.sortBy.qualityScore": "",
16919
+ "results.sortBy.qualityScore": "Qualitätsbewertung",
16949
16920
  "results.sortBy.relevancy": "Relevanz",
16950
16921
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
16951
16922
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
16952
- "search.error.receivedError": "Ein Fehler wurde empfangen",
16923
+ "search.error.receivedError": "Ein Fehler ist aufgetreten",
16953
16924
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
16954
- "search.field.any.placeholder": "Suche nach Datensätzen ...",
16925
+ "search.field.any.placeholder": "Suche Datensätze ...",
16955
16926
  "search.field.sortBy": "Sortieren nach:",
16956
16927
  "search.filters.clear": "Zurücksetzen",
16957
- "search.filters.contact": "Kontakt",
16928
+ "search.filters.contact": "Kontakte",
16958
16929
  "search.filters.format": "Formate",
16959
16930
  "search.filters.inspireKeyword": "INSPIRE-Schlüsselwort",
16960
16931
  "search.filters.isSpatial": "Ist räumliche Daten",
16961
16932
  "search.filters.isSpatial.no": "nicht räumlich",
16962
16933
  "search.filters.isSpatial.yes": "räumlich",
16934
+ "search.filters.keyword": "Schlüsselwort",
16963
16935
  "search.filters.license": "Lizenz",
16964
16936
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16965
16937
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16972,13 +16944,13 @@ var de = {
16972
16944
  "search.filters.license.unknown": "Unbekannt oder nicht vorhanden",
16973
16945
  "search.filters.maximize": "Erweitern",
16974
16946
  "search.filters.minimize": "Minimieren",
16975
- "search.filters.myRecords": "",
16976
- "search.filters.myRecordsHelp": "",
16977
- "search.filters.otherRecords": "",
16947
+ "search.filters.myRecords": "Nur meine Datensätze anzeigen",
16948
+ "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.",
16949
+ "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
16978
16950
  "search.filters.publicationYear": "Veröffentlichungsjahr",
16979
16951
  "search.filters.publisher": "Organisationen",
16980
- "search.filters.representationType": "",
16981
- "search.filters.resourceType": "",
16952
+ "search.filters.representationType": "Repräsentationstyp",
16953
+ "search.filters.resourceType": "Ressourcentyp",
16982
16954
  "search.filters.standard": "Standard",
16983
16955
  "search.filters.title": "Ergebnisse filtern",
16984
16956
  "search.filters.topic": "Thema",
@@ -17024,20 +16996,21 @@ var en = {
17024
16996
  "chart.type.line": "line chart",
17025
16997
  "chart.type.lineSmooth": "smooth line chart",
17026
16998
  "chart.type.pie": "pie chart",
16999
+ "dashboard.createRecord": "New record",
17027
17000
  "dashboard.labels.mySpace": "My space",
17028
- "dashboard.records.all": "Catalog",
17001
+ "dashboard.records.all": "Metadata records",
17029
17002
  "dashboard.records.myDraft": "My drafts",
17030
17003
  "dashboard.records.myLibrary": "My library",
17031
17004
  "dashboard.records.myOrg": "Organization",
17032
17005
  "dashboard.records.myRecords": "My Records",
17033
- "dashboard.records.noRecord": "No record for this organization",
17034
- "dashboard.records.noUser": "No users for this organization",
17035
17006
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17036
17007
  "dashboard.records.search": "Search for \"{searchText}\"",
17037
17008
  "dashboard.records.userDetail": "Name",
17038
17009
  "dashboard.records.userEmail": "Email",
17039
17010
  "dashboard.records.username": "Username",
17040
17011
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
17012
+ "dashboard.results.listMetadata": "Show metadata",
17013
+ "dashboard.results.listResources": "Show resources",
17041
17014
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17042
17015
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17043
17016
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17184,6 +17157,9 @@ var en = {
17184
17157
  "map.add.layer.file": "From a file",
17185
17158
  "map.add.layer.wfs": "From WFS",
17186
17159
  "map.add.layer.wms": "From WMS",
17160
+ "map.addFromFile.placeholder": "Click or drop a file here",
17161
+ "map.geocoding.placeholder": "Search for a place",
17162
+ "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17187
17163
  "map.layer.add": "Add",
17188
17164
  "map.layers.available": "Available Layers",
17189
17165
  "map.layers.list": "Layers",
@@ -17226,47 +17202,47 @@ var en = {
17226
17202
  "record.metadata.author": "Author",
17227
17203
  "record.metadata.catalog": "Catalog",
17228
17204
  "record.metadata.contact": "Contact",
17229
- "record.metadata.createdOn": "Created on",
17230
17205
  "record.metadata.details": "Technical information",
17231
17206
  "record.metadata.download": "Downloads",
17232
17207
  "record.metadata.formats": "Formats",
17233
- "record.metadata.isOpenData": "Open Data",
17234
17208
  "record.metadata.keywords": "Keywords",
17235
17209
  "record.metadata.lastUpdate": "Last updated on",
17236
17210
  "record.metadata.links": "Links",
17237
17211
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17238
17212
  "record.metadata.origin": "About the data",
17213
+ "record.metadata.otherConstraints": "Additional Conditions",
17239
17214
  "record.metadata.owner": "Catalog of origin",
17240
17215
  "record.metadata.preview": "Preview",
17241
17216
  "record.metadata.publications": "publications",
17242
17217
  "record.metadata.quality": "Metadata Quality",
17243
- "record.metadata.quality.contact.failed": "Contact is not completed",
17244
- "record.metadata.quality.contact.success": "Contact is completed",
17245
- "record.metadata.quality.description.failed": "Description is not completed",
17246
- "record.metadata.quality.description.success": "Description is completed",
17218
+ "record.metadata.quality.contact.failed": "Contact is not specified",
17219
+ "record.metadata.quality.contact.success": "Contact is specified",
17220
+ "record.metadata.quality.description.failed": "Description is not specified",
17221
+ "record.metadata.quality.description.success": "Description is specified",
17247
17222
  "record.metadata.quality.details": "Details",
17248
- "record.metadata.quality.keywords.failed": "Keywords are not completed",
17249
- "record.metadata.quality.keywords.success": "Keywords are completed",
17250
- "record.metadata.quality.legalConstraints.failed": "Legal constraints are not completed",
17251
- "record.metadata.quality.legalConstraints.success": "Legal constraints are completed",
17252
- "record.metadata.quality.organisation.failed": "Organisation is not completed",
17253
- "record.metadata.quality.organisation.success": "Organisation is completed",
17254
- "record.metadata.quality.title.failed": "Title is not completed",
17255
- "record.metadata.quality.title.success": "Title is completed",
17256
- "record.metadata.quality.topic.failed": "Topic is not completed",
17257
- "record.metadata.quality.topic.success": "Topic is completed",
17258
- "record.metadata.quality.updateFrequency.failed": "Update frequency is not completed",
17259
- "record.metadata.quality.updateFrequency.success": "Update frequency is completed",
17223
+ "record.metadata.quality.keywords.failed": "Keywords are not specified",
17224
+ "record.metadata.quality.keywords.success": "Keywords are specified",
17225
+ "record.metadata.quality.legalConstraints.failed": "Legal constraints are not specified",
17226
+ "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
17227
+ "record.metadata.quality.organisation.failed": "Organisation is not specified",
17228
+ "record.metadata.quality.organisation.success": "Organisation is specified",
17229
+ "record.metadata.quality.title.failed": "Title is not specified",
17230
+ "record.metadata.quality.title.success": "Title is specified",
17231
+ "record.metadata.quality.topic.failed": "Topic is not specified",
17232
+ "record.metadata.quality.topic.success": "Topic is specified",
17233
+ "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17234
+ "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17260
17235
  "record.metadata.related": "Related records",
17261
17236
  "record.metadata.sheet": "Original metadata",
17262
- "record.metadata.themes": "Categories",
17237
+ "record.metadata.status": "Status",
17263
17238
  "record.metadata.title": "Title",
17239
+ "record.metadata.topics": "Categories",
17264
17240
  "record.metadata.type": "Geographical dataset",
17265
17241
  "record.metadata.uniqueId": "Unique Identifier",
17266
17242
  "record.metadata.updateFrequency": "Data Update Frequency",
17267
17243
  "record.metadata.updateStatus": "Data Update Status",
17268
- "record.metadata.updatedOn": "Metadata's last update",
17269
- "record.metadata.usage": "Usage & constraints",
17244
+ "record.metadata.updatedOn": "Last Data Information Update",
17245
+ "record.metadata.usage": "License and Conditions",
17270
17246
  "record.more.details": "Read more",
17271
17247
  "record.tab.chart": "Chart",
17272
17248
  "record.tab.data": "Table",
@@ -17296,6 +17272,7 @@ var en = {
17296
17272
  "search.filters.isSpatial": "Is spatial data",
17297
17273
  "search.filters.isSpatial.no": "non spatial",
17298
17274
  "search.filters.isSpatial.yes": "spatial",
17275
+ "search.filters.keyword": "Keyword",
17299
17276
  "search.filters.license": "License",
17300
17277
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17301
17278
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17360,20 +17337,21 @@ var es = {
17360
17337
  "chart.type.line": "gráfico de líneas",
17361
17338
  "chart.type.lineSmooth": "gráfico de líneas suave",
17362
17339
  "chart.type.pie": "gráfico circular",
17340
+ "dashboard.createRecord": "",
17363
17341
  "dashboard.labels.mySpace": "Mi espacio",
17364
17342
  "dashboard.records.all": "Catálogo",
17365
17343
  "dashboard.records.myDraft": "Mis borradores",
17366
17344
  "dashboard.records.myLibrary": "Mi biblioteca",
17367
17345
  "dashboard.records.myOrg": "Organización",
17368
17346
  "dashboard.records.myRecords": "Mis Registros",
17369
- "dashboard.records.noRecord": "",
17370
- "dashboard.records.noUser": "",
17371
17347
  "dashboard.records.publishedRecords": "",
17372
17348
  "dashboard.records.search": "Buscar \"{searchText}\"",
17373
17349
  "dashboard.records.userDetail": "",
17374
17350
  "dashboard.records.userEmail": "",
17375
17351
  "dashboard.records.username": "",
17376
17352
  "dashboard.records.users": "",
17353
+ "dashboard.results.listMetadata": "",
17354
+ "dashboard.results.listResources": "",
17377
17355
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17378
17356
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17379
17357
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17520,6 +17498,9 @@ var es = {
17520
17498
  "map.add.layer.file": "",
17521
17499
  "map.add.layer.wfs": "",
17522
17500
  "map.add.layer.wms": "",
17501
+ "map.addFromFile.placeholder": "",
17502
+ "map.geocoding.placeholder": "",
17503
+ "map.help.addFromFile": "",
17523
17504
  "map.layer.add": "",
17524
17505
  "map.layers.available": "",
17525
17506
  "map.layers.list": "",
@@ -17562,16 +17543,15 @@ var es = {
17562
17543
  "record.metadata.author": "",
17563
17544
  "record.metadata.catalog": "",
17564
17545
  "record.metadata.contact": "",
17565
- "record.metadata.createdOn": "",
17566
17546
  "record.metadata.details": "",
17567
17547
  "record.metadata.download": "",
17568
17548
  "record.metadata.formats": "",
17569
- "record.metadata.isOpenData": "",
17570
17549
  "record.metadata.keywords": "",
17571
17550
  "record.metadata.lastUpdate": "",
17572
17551
  "record.metadata.links": "",
17573
17552
  "record.metadata.noUsage": "",
17574
17553
  "record.metadata.origin": "",
17554
+ "record.metadata.otherConstraints": "",
17575
17555
  "record.metadata.owner": "",
17576
17556
  "record.metadata.preview": "",
17577
17557
  "record.metadata.publications": "",
@@ -17595,8 +17575,9 @@ var es = {
17595
17575
  "record.metadata.quality.updateFrequency.success": "",
17596
17576
  "record.metadata.related": "",
17597
17577
  "record.metadata.sheet": "",
17598
- "record.metadata.themes": "",
17578
+ "record.metadata.status": "",
17599
17579
  "record.metadata.title": "",
17580
+ "record.metadata.topics": "",
17600
17581
  "record.metadata.type": "",
17601
17582
  "record.metadata.uniqueId": "",
17602
17583
  "record.metadata.updateFrequency": "",
@@ -17632,6 +17613,7 @@ var es = {
17632
17613
  "search.filters.isSpatial": "",
17633
17614
  "search.filters.isSpatial.no": "",
17634
17615
  "search.filters.isSpatial.yes": "",
17616
+ "search.filters.keyword": "",
17635
17617
  "search.filters.license": "",
17636
17618
  "search.filters.license.cc-by": "",
17637
17619
  "search.filters.license.cc-by-sa": "",
@@ -17696,20 +17678,21 @@ var fr = {
17696
17678
  "chart.type.line": "ligne",
17697
17679
  "chart.type.lineSmooth": "ligne lisse",
17698
17680
  "chart.type.pie": "camembert",
17681
+ "dashboard.createRecord": "",
17699
17682
  "dashboard.labels.mySpace": "Mon espace",
17700
17683
  "dashboard.records.all": "Catalogue",
17701
17684
  "dashboard.records.myDraft": "Mes brouillons",
17702
17685
  "dashboard.records.myLibrary": "Ma bibliothèque",
17703
17686
  "dashboard.records.myOrg": "Mon organisation",
17704
17687
  "dashboard.records.myRecords": "Mes fiches publiées",
17705
- "dashboard.records.noRecord": "Aucun jeu de données pour cette organisation",
17706
- "dashboard.records.noUser": "Aucun utilisateur pour cette organisation",
17707
17688
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17708
17689
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17709
17690
  "dashboard.records.userDetail": "Nom",
17710
17691
  "dashboard.records.userEmail": "Email",
17711
17692
  "dashboard.records.username": "Nom d'utilisateur",
17712
17693
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17694
+ "dashboard.results.listMetadata": "",
17695
+ "dashboard.results.listResources": "",
17713
17696
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17714
17697
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17715
17698
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17791,7 +17774,7 @@ var fr = {
17791
17774
  "datahub.header.popularRecords": "Les plus appréciées",
17792
17775
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17793
17776
  "datahub.news.contact.contactus": "Contactez-nous",
17794
- "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>",
17777
+ "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>",
17795
17778
  "datahub.news.contact.title": "Un besoin spécifique ?",
17796
17779
  "datahub.news.feed": "Fil d'activité",
17797
17780
  "datahub.news.figures": "Quelques chiffres",
@@ -17856,6 +17839,9 @@ var fr = {
17856
17839
  "map.add.layer.file": "",
17857
17840
  "map.add.layer.wfs": "",
17858
17841
  "map.add.layer.wms": "",
17842
+ "map.addFromFile.placeholder": "",
17843
+ "map.geocoding.placeholder": "",
17844
+ "map.help.addFromFile": "",
17859
17845
  "map.layer.add": "",
17860
17846
  "map.layers.available": "",
17861
17847
  "map.layers.list": "",
@@ -17898,16 +17884,15 @@ var fr = {
17898
17884
  "record.metadata.author": "Auteur",
17899
17885
  "record.metadata.catalog": "Catalogue",
17900
17886
  "record.metadata.contact": "Contact",
17901
- "record.metadata.createdOn": "Créé le",
17902
17887
  "record.metadata.details": "Informations techniques",
17903
17888
  "record.metadata.download": "Téléchargements",
17904
17889
  "record.metadata.formats": "Formats",
17905
- "record.metadata.isOpenData": "Donnée Ouverte",
17906
17890
  "record.metadata.keywords": "Mots clés",
17907
17891
  "record.metadata.lastUpdate": "Mis à jour le",
17908
17892
  "record.metadata.links": "Liens",
17909
17893
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17910
17894
  "record.metadata.origin": "À propos des données",
17895
+ "record.metadata.otherConstraints": "Limitations d'usage",
17911
17896
  "record.metadata.owner": "Catalogue d'origine",
17912
17897
  "record.metadata.preview": "Aperçu",
17913
17898
  "record.metadata.publications": "données",
@@ -17931,14 +17916,15 @@ var fr = {
17931
17916
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17932
17917
  "record.metadata.related": "Voir aussi",
17933
17918
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17934
- "record.metadata.themes": "Catégories",
17919
+ "record.metadata.status": "",
17935
17920
  "record.metadata.title": "Titre",
17921
+ "record.metadata.topics": "Catégories",
17936
17922
  "record.metadata.type": "Donnée géographique",
17937
17923
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17938
17924
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17939
17925
  "record.metadata.updateStatus": "Statut de mise à jour des données",
17940
- "record.metadata.updatedOn": "Mise à jour de la fiche de métadonnée",
17941
- "record.metadata.usage": "Conditions d'utilisation",
17926
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17927
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17942
17928
  "record.more.details": "Détails",
17943
17929
  "record.tab.chart": "Graphique",
17944
17930
  "record.tab.data": "Tableau",
@@ -17968,6 +17954,7 @@ var fr = {
17968
17954
  "search.filters.isSpatial": "Données spatiales",
17969
17955
  "search.filters.isSpatial.no": "non-géolocalisées",
17970
17956
  "search.filters.isSpatial.yes": "géolocalisées",
17957
+ "search.filters.keyword": "Mot-clé",
17971
17958
  "search.filters.license": "Licence",
17972
17959
  "search.filters.license.cc-by": "cc-by",
17973
17960
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18032,20 +18019,21 @@ var it = {
18032
18019
  "chart.type.line": "grafico a linee",
18033
18020
  "chart.type.lineSmooth": "grafico a linea liscia",
18034
18021
  "chart.type.pie": "grafico a torta",
18022
+ "dashboard.createRecord": "",
18035
18023
  "dashboard.labels.mySpace": "Il mio spazio",
18036
18024
  "dashboard.records.all": "Catalogo",
18037
18025
  "dashboard.records.myDraft": "Le mie bozze",
18038
18026
  "dashboard.records.myLibrary": "La mia biblioteca",
18039
18027
  "dashboard.records.myOrg": "La mia organizzazione",
18040
18028
  "dashboard.records.myRecords": "I miei dati",
18041
- "dashboard.records.noRecord": "Nessun dati per questa organizzazione",
18042
- "dashboard.records.noUser": "Nessun utente per questa organizzazione",
18043
18029
  "dashboard.records.publishedRecords": "dati pubblicati",
18044
18030
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18045
18031
  "dashboard.records.userDetail": "Nome",
18046
18032
  "dashboard.records.userEmail": "Email",
18047
18033
  "dashboard.records.username": "Nome utente",
18048
18034
  "dashboard.records.users": "utenti",
18035
+ "dashboard.results.listMetadata": "",
18036
+ "dashboard.results.listResources": "",
18049
18037
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18050
18038
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18051
18039
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18192,6 +18180,9 @@ var it = {
18192
18180
  "map.add.layer.file": "Da un file",
18193
18181
  "map.add.layer.wfs": "Da un WFS",
18194
18182
  "map.add.layer.wms": "Da un WMS",
18183
+ "map.addFromFile.placeholder": "",
18184
+ "map.geocoding.placeholder": "",
18185
+ "map.help.addFromFile": "",
18195
18186
  "map.layer.add": "",
18196
18187
  "map.layers.available": "",
18197
18188
  "map.layers.list": "Layers",
@@ -18234,16 +18225,15 @@ var it = {
18234
18225
  "record.metadata.author": "Autore",
18235
18226
  "record.metadata.catalog": "Catalogo",
18236
18227
  "record.metadata.contact": "Contatto",
18237
- "record.metadata.createdOn": "Creato il",
18238
18228
  "record.metadata.details": "Informazioni tecniche",
18239
18229
  "record.metadata.download": "Download",
18240
18230
  "record.metadata.formats": "Formati",
18241
- "record.metadata.isOpenData": "Data aperta",
18242
18231
  "record.metadata.keywords": "Parole chiave",
18243
18232
  "record.metadata.lastUpdate": "Ultimo aggiornamento",
18244
18233
  "record.metadata.links": "Collegamenti",
18245
18234
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18246
18235
  "record.metadata.origin": "Informazioni sui dati",
18236
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18247
18237
  "record.metadata.owner": "Catalogo originale",
18248
18238
  "record.metadata.preview": "Anteprima",
18249
18239
  "record.metadata.publications": "pubblicazioni",
@@ -18267,14 +18257,15 @@ var it = {
18267
18257
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18268
18258
  "record.metadata.related": "Vedi anche",
18269
18259
  "record.metadata.sheet": "Origine del metadata",
18270
- "record.metadata.themes": "Categorie",
18260
+ "record.metadata.status": "",
18271
18261
  "record.metadata.title": "Titolo",
18262
+ "record.metadata.topics": "Categorie",
18272
18263
  "record.metadata.type": "Dati geografici",
18273
18264
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18274
18265
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18275
18266
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18276
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18277
- "record.metadata.usage": "Condizioni d'uso",
18267
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18268
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18278
18269
  "record.more.details": "Dettagli",
18279
18270
  "record.tab.chart": "Grafico",
18280
18271
  "record.tab.data": "Tabella",
@@ -18304,6 +18295,7 @@ var it = {
18304
18295
  "search.filters.isSpatial": "Dati spaziali",
18305
18296
  "search.filters.isSpatial.no": "Non geolocalizzati",
18306
18297
  "search.filters.isSpatial.yes": "Geolocalizzati",
18298
+ "search.filters.keyword": "Parola chiave",
18307
18299
  "search.filters.license": "Licenza",
18308
18300
  "search.filters.license.cc-by": "cc-by",
18309
18301
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18368,20 +18360,21 @@ var nl = {
18368
18360
  "chart.type.line": "lijndiagram",
18369
18361
  "chart.type.lineSmooth": "glad lijndiagram",
18370
18362
  "chart.type.pie": "cirkeldiagram",
18363
+ "dashboard.createRecord": "",
18371
18364
  "dashboard.labels.mySpace": "Mijn ruimte",
18372
18365
  "dashboard.records.all": "Catalogus",
18373
18366
  "dashboard.records.myDraft": "Mijn concepten",
18374
18367
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18375
18368
  "dashboard.records.myOrg": "Organisatie",
18376
18369
  "dashboard.records.myRecords": "Mijn Records",
18377
- "dashboard.records.noRecord": "",
18378
- "dashboard.records.noUser": "",
18379
18370
  "dashboard.records.publishedRecords": "",
18380
18371
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18381
18372
  "dashboard.records.userDetail": "",
18382
18373
  "dashboard.records.userEmail": "",
18383
18374
  "dashboard.records.username": "",
18384
18375
  "dashboard.records.users": "",
18376
+ "dashboard.results.listMetadata": "",
18377
+ "dashboard.results.listResources": "",
18385
18378
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18386
18379
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18387
18380
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18528,6 +18521,9 @@ var nl = {
18528
18521
  "map.add.layer.file": "",
18529
18522
  "map.add.layer.wfs": "",
18530
18523
  "map.add.layer.wms": "",
18524
+ "map.addFromFile.placeholder": "",
18525
+ "map.geocoding.placeholder": "",
18526
+ "map.help.addFromFile": "",
18531
18527
  "map.layer.add": "",
18532
18528
  "map.layers.available": "",
18533
18529
  "map.layers.list": "",
@@ -18570,16 +18566,15 @@ var nl = {
18570
18566
  "record.metadata.author": "",
18571
18567
  "record.metadata.catalog": "",
18572
18568
  "record.metadata.contact": "",
18573
- "record.metadata.createdOn": "",
18574
18569
  "record.metadata.details": "",
18575
18570
  "record.metadata.download": "",
18576
18571
  "record.metadata.formats": "",
18577
- "record.metadata.isOpenData": "",
18578
18572
  "record.metadata.keywords": "",
18579
18573
  "record.metadata.lastUpdate": "",
18580
18574
  "record.metadata.links": "",
18581
18575
  "record.metadata.noUsage": "",
18582
18576
  "record.metadata.origin": "",
18577
+ "record.metadata.otherConstraints": "",
18583
18578
  "record.metadata.owner": "",
18584
18579
  "record.metadata.preview": "",
18585
18580
  "record.metadata.publications": "",
@@ -18603,8 +18598,9 @@ var nl = {
18603
18598
  "record.metadata.quality.updateFrequency.success": "",
18604
18599
  "record.metadata.related": "",
18605
18600
  "record.metadata.sheet": "",
18606
- "record.metadata.themes": "",
18601
+ "record.metadata.status": "",
18607
18602
  "record.metadata.title": "",
18603
+ "record.metadata.topics": "",
18608
18604
  "record.metadata.type": "",
18609
18605
  "record.metadata.uniqueId": "",
18610
18606
  "record.metadata.updateFrequency": "",
@@ -18640,6 +18636,7 @@ var nl = {
18640
18636
  "search.filters.isSpatial": "",
18641
18637
  "search.filters.isSpatial.no": "",
18642
18638
  "search.filters.isSpatial.yes": "",
18639
+ "search.filters.keyword": "",
18643
18640
  "search.filters.license": "",
18644
18641
  "search.filters.license.cc-by": "",
18645
18642
  "search.filters.license.cc-by-sa": "",
@@ -18704,20 +18701,21 @@ var pt = {
18704
18701
  "chart.type.line": "gráfico de linha",
18705
18702
  "chart.type.lineSmooth": "gráfico de linha suave",
18706
18703
  "chart.type.pie": "gráfico de pizza",
18704
+ "dashboard.createRecord": "",
18707
18705
  "dashboard.labels.mySpace": "Meu espaço",
18708
18706
  "dashboard.records.all": "Catálogo",
18709
18707
  "dashboard.records.myDraft": "Meus rascunhos",
18710
18708
  "dashboard.records.myLibrary": "Minha biblioteca",
18711
18709
  "dashboard.records.myOrg": "Organização",
18712
18710
  "dashboard.records.myRecords": "Meus Registros",
18713
- "dashboard.records.noRecord": "",
18714
- "dashboard.records.noUser": "",
18715
18711
  "dashboard.records.publishedRecords": "",
18716
18712
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18717
18713
  "dashboard.records.userDetail": "",
18718
18714
  "dashboard.records.userEmail": "",
18719
18715
  "dashboard.records.username": "",
18720
18716
  "dashboard.records.users": "",
18717
+ "dashboard.results.listMetadata": "",
18718
+ "dashboard.results.listResources": "",
18721
18719
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18722
18720
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18723
18721
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18864,6 +18862,9 @@ var pt = {
18864
18862
  "map.add.layer.file": "",
18865
18863
  "map.add.layer.wfs": "",
18866
18864
  "map.add.layer.wms": "",
18865
+ "map.addFromFile.placeholder": "",
18866
+ "map.geocoding.placeholder": "",
18867
+ "map.help.addFromFile": "",
18867
18868
  "map.layer.add": "",
18868
18869
  "map.layers.available": "",
18869
18870
  "map.layers.list": "",
@@ -18906,16 +18907,15 @@ var pt = {
18906
18907
  "record.metadata.author": "",
18907
18908
  "record.metadata.catalog": "",
18908
18909
  "record.metadata.contact": "",
18909
- "record.metadata.createdOn": "",
18910
18910
  "record.metadata.details": "",
18911
18911
  "record.metadata.download": "",
18912
18912
  "record.metadata.formats": "",
18913
- "record.metadata.isOpenData": "",
18914
18913
  "record.metadata.keywords": "",
18915
18914
  "record.metadata.lastUpdate": "",
18916
18915
  "record.metadata.links": "",
18917
18916
  "record.metadata.noUsage": "",
18918
18917
  "record.metadata.origin": "",
18918
+ "record.metadata.otherConstraints": "",
18919
18919
  "record.metadata.owner": "",
18920
18920
  "record.metadata.preview": "",
18921
18921
  "record.metadata.publications": "",
@@ -18939,8 +18939,9 @@ var pt = {
18939
18939
  "record.metadata.quality.updateFrequency.success": "",
18940
18940
  "record.metadata.related": "",
18941
18941
  "record.metadata.sheet": "",
18942
- "record.metadata.themes": "",
18942
+ "record.metadata.status": "",
18943
18943
  "record.metadata.title": "",
18944
+ "record.metadata.topics": "",
18944
18945
  "record.metadata.type": "",
18945
18946
  "record.metadata.uniqueId": "",
18946
18947
  "record.metadata.updateFrequency": "",
@@ -18976,6 +18977,7 @@ var pt = {
18976
18977
  "search.filters.isSpatial": "",
18977
18978
  "search.filters.isSpatial.no": "",
18978
18979
  "search.filters.isSpatial.yes": "",
18980
+ "search.filters.keyword": "",
18979
18981
  "search.filters.license": "",
18980
18982
  "search.filters.license.cc-by": "",
18981
18983
  "search.filters.license.cc-by-sa": "",
@@ -19084,8 +19086,8 @@ class Gn4FieldMapper {
19084
19086
  },
19085
19087
  cl_topic: (output, source) => ({
19086
19088
  ...output,
19087
- themes: [
19088
- ...(output.themes || []),
19089
+ topics: [
19090
+ ...(output.topics || []),
19089
19091
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
19090
19092
  ],
19091
19093
  }),
@@ -19140,31 +19142,22 @@ class Gn4FieldMapper {
19140
19142
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19141
19143
  }, output);
19142
19144
  },
19143
- tag: (output, source) => ({
19145
+ allKeywords: (output, source) => ({
19144
19146
  ...output,
19145
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19147
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19146
19148
  }),
19147
19149
  inspireTheme: (output, source) => ({
19148
19150
  ...output,
19149
- themes: [
19150
- ...(output.themes || []),
19151
+ topics: [
19152
+ ...(output.topics || []),
19151
19153
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19152
19154
  ],
19153
19155
  }),
19154
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19155
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19156
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19157
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19158
- licenseObject: (output, source) => ({
19159
- ...output,
19160
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19161
- const link = getAsUrl(selectField(license, 'link'));
19162
- return {
19163
- text: selectTranslatedValue(license, this.lang3),
19164
- ...(link ? { link } : {}),
19165
- };
19166
- }),
19167
- }),
19156
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19157
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19158
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19159
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19160
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19168
19161
  lineageObject: (output, source) => ({
19169
19162
  ...output,
19170
19163
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19190,33 +19183,78 @@ class Gn4FieldMapper {
19190
19183
  kind,
19191
19184
  };
19192
19185
  },
19186
+ geom: (output, source) => {
19187
+ const geoms = getAsArray(selectField(source, 'geom'));
19188
+ const shapes = getAsArray(selectField(source, 'shape'));
19189
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19190
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19191
+ return {
19192
+ ...output,
19193
+ spatialExtents: [
19194
+ ...spatialExtents,
19195
+ ...geoms.map((geom, index) => {
19196
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19197
+ const geometry = shapes[index] ?? geom;
19198
+ return {
19199
+ ...(description !== null ? { description } : null),
19200
+ geometry,
19201
+ };
19202
+ }),
19203
+ ],
19204
+ };
19205
+ },
19206
+ resourceTemporalDateRange: (output, source) => {
19207
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19208
+ return {
19209
+ ...output,
19210
+ temporalExtents: ranges.map((range) => {
19211
+ const start = selectField(range, 'gte');
19212
+ const end = selectField(range, 'lte');
19213
+ return {
19214
+ ...(start !== null ? { start: toDate(start) } : null),
19215
+ ...(end !== null ? { end: toDate(end) } : null),
19216
+ };
19217
+ }),
19218
+ };
19219
+ },
19193
19220
  };
19194
19221
  this.genericField = (output) => output;
19195
- this.constraintField = (fieldName, output, source) => ({
19196
- ...output,
19197
- ...(fieldName.endsWith('UseLimitationObject')
19198
- ? {
19199
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19200
- ? [
19201
- ...(output.legalConstraints || []),
19202
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19203
- ]
19204
- : output.legalConstraints || [],
19205
- useLimitations: [
19206
- ...(output.useLimitations || []),
19207
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19208
- ],
19209
- }
19210
- : {
19211
- accessConstraints: [
19212
- ...(output.accessConstraints || []),
19213
- ...selectField(source, fieldName).map((field) => ({
19214
- text: selectTranslatedValue(field, this.lang3),
19215
- type: this.getConstraintsType(fieldName),
19216
- })),
19217
- ],
19218
- }),
19219
- });
19222
+ this.constraintField = (type, output, constraintArray) => {
19223
+ let outputField;
19224
+ switch (type) {
19225
+ case 'license':
19226
+ outputField = 'licenses';
19227
+ break;
19228
+ case 'legal':
19229
+ outputField = 'legalConstraints';
19230
+ break;
19231
+ case 'security':
19232
+ outputField = 'securityConstraints';
19233
+ break;
19234
+ case 'other':
19235
+ outputField = 'otherConstraints';
19236
+ break;
19237
+ }
19238
+ const outputArray = outputField in output ? output[outputField] : [];
19239
+ outputArray.push(...constraintArray.map((item) => {
19240
+ const text = selectTranslatedValue(item, this.lang3);
19241
+ const url = getAsUrl(selectField(item, 'link'));
19242
+ return {
19243
+ text,
19244
+ ...(url ? { url } : {}),
19245
+ };
19246
+ }));
19247
+ const result = {
19248
+ ...output,
19249
+ [outputField]: outputArray,
19250
+ };
19251
+ // avoid legal constraints being duplicates of licenses
19252
+ if ('legalConstraints' in result &&
19253
+ (type === 'legal' || type === 'license')) {
19254
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19255
+ }
19256
+ return result;
19257
+ };
19220
19258
  this.mapLink = (sourceLink) => {
19221
19259
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19222
19260
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19264,17 +19302,6 @@ class Gn4FieldMapper {
19264
19302
  extras: { ...(output.extras || {}), ...value },
19265
19303
  });
19266
19304
  }
19267
- getConstraintsType(indexField) {
19268
- switch (indexField) {
19269
- case 'MD_LegalConstraintsUseLimitationObject':
19270
- return 'legal';
19271
- case 'MD_SecurityConstraintsUseLimitationObject':
19272
- return 'security';
19273
- case 'MD_ConstraintsUseLimitationObject':
19274
- default:
19275
- return 'other';
19276
- }
19277
- }
19278
19305
  getMappingFn(fieldName) {
19279
19306
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19280
19307
  }
@@ -19336,14 +19363,16 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19336
19363
  recordUpdated: null,
19337
19364
  ownerOrganization: null,
19338
19365
  licenses: [],
19366
+ legalConstraints: [],
19367
+ securityConstraints: [],
19368
+ otherConstraints: [],
19339
19369
  contacts: [],
19340
19370
  contactsForResource: [],
19341
- accessConstraints: [],
19342
19371
  keywords: [],
19343
- themes: [],
19344
- useLimitations: [],
19372
+ topics: [],
19345
19373
  spatialExtents: [],
19346
19374
  temporalExtents: [],
19375
+ overviews: [],
19347
19376
  };
19348
19377
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19349
19378
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -20108,11 +20137,18 @@ class OrganizationsFromMetadataService {
20108
20137
  if (!allContactOrgs.length)
20109
20138
  return of(record);
20110
20139
  const ownerOrganization = allContactOrgs[0];
20111
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20140
+ // read the owner group as well to have a fallback logo
20141
+ const groupId = selectField(source, 'groupOwner');
20142
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20143
+ return group.id === Number(groupId);
20144
+ })));
20145
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20112
20146
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20147
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20113
20148
  return {
20114
20149
  ...record,
20115
20150
  ownerOrganization: {
20151
+ logoUrl,
20116
20152
  ...ownerOrganization,
20117
20153
  ...recordOrganisation,
20118
20154
  },
@@ -20377,36 +20413,23 @@ class SelectionService {
20377
20413
  this.selectedRecordsIdentifiers$.next(filtered);
20378
20414
  }
20379
20415
  selectRecords(records) {
20380
- const newIds = [];
20381
- records.map((record) => {
20382
- newIds.push(record.uniqueIdentifier);
20383
- });
20384
- const apiResponse = this.selectionsApi.add(BUCKET_ID, newIds);
20385
- return apiResponse.pipe(tap$2(() => {
20416
+ const newIds = records.map((record) => record.uniqueIdentifier);
20417
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20386
20418
  this.addIdsToSelected(newIds);
20387
- }), map$2(() => undefined));
20419
+ });
20388
20420
  }
20389
20421
  deselectRecords(records) {
20390
- const idsToBeRemoved = [];
20391
- records.map((record) => {
20392
- idsToBeRemoved.push(record.uniqueIdentifier);
20393
- });
20394
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved);
20395
- return apiResponse.pipe(tap$2(() => {
20422
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20423
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20396
20424
  this.removeIdsFromSelected(idsToBeRemoved);
20397
- }), map$2(() => undefined));
20398
- }
20399
- clearSelection() {
20400
- const currentSelectedResponse = this.selectionsApi.get(BUCKET_ID);
20401
- let currentSelection;
20402
- this.subscription = currentSelectedResponse.subscribe((value) => {
20403
- currentSelection = [...value];
20404
20425
  });
20405
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20406
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20407
- return apiResponse.pipe(tap$2(() => {
20426
+ }
20427
+ async clearSelection() {
20428
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20429
+ const currentSelection = Array.from(response);
20430
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20408
20431
  this.removeIdsFromSelected(currentSelection);
20409
- }), map$2(() => undefined));
20432
+ });
20410
20433
  }
20411
20434
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20412
20435
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20436,12 +20459,21 @@ class Gn4PlatformMapper {
20436
20459
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20437
20460
  return { ...apiUser, id: id.toString() };
20438
20461
  }
20439
- thesaurusFromApi(thesaurus) {
20462
+ thesaurusFromApi(thesaurus, lang3) {
20440
20463
  return thesaurus.map((keyword) => {
20441
- const { uri, value } = keyword;
20464
+ let key = keyword.uri;
20465
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20466
+ if (key.indexOf('@@@') > -1) {
20467
+ key = key.split('@@@')[1];
20468
+ }
20469
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20470
+ const description = lang3 && lang3 in keyword.definitions
20471
+ ? keyword.definitions[lang3]
20472
+ : keyword.definition;
20442
20473
  return {
20443
- key: uri,
20444
- label: value,
20474
+ key,
20475
+ label,
20476
+ description,
20445
20477
  };
20446
20478
  });
20447
20479
  }
@@ -20454,13 +20486,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20454
20486
 
20455
20487
  const minApiVersion = '4.2.2';
20456
20488
  class Gn4PlatformService {
20457
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20489
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20458
20490
  this.siteApiService = siteApiService;
20459
20491
  this.meApi = meApi;
20460
20492
  this.usersApi = usersApi;
20461
20493
  this.mapper = mapper;
20462
20494
  this.toolsApiService = toolsApiService;
20463
20495
  this.registriesApiService = registriesApiService;
20496
+ this.langService = langService;
20464
20497
  this.type = 'GeoNetwork';
20465
20498
  this.keyTranslations$ = this.toolsApiService
20466
20499
  .getTranslationsPackage1('gnui')
@@ -20474,6 +20507,11 @@ class Gn4PlatformService {
20474
20507
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20475
20508
  }
20476
20509
  }), shareReplay(1));
20510
+ /**
20511
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20512
+ * @private
20513
+ */
20514
+ this.thesauri = {};
20477
20515
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20478
20516
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20479
20517
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20500,19 +20538,36 @@ class Gn4PlatformService {
20500
20538
  return this.users$;
20501
20539
  }
20502
20540
  translateKey(key) {
20541
+ // if the key is a URI, use the registries API to look for the translation
20542
+ if (key.match(/^https?:\/\//)) {
20543
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20544
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20545
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20546
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20547
+ for (const item of thesaurus) {
20548
+ if (item.key === key)
20549
+ return item.label;
20550
+ }
20551
+ return key;
20552
+ }));
20553
+ }
20503
20554
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20504
20555
  }
20505
- getThesaurusByLang(thesaurusName, lang) {
20506
- return this.registriesApiService
20507
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20508
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20556
+ getThesaurusByUri(uri) {
20557
+ if (this.thesauri[uri]) {
20558
+ return this.thesauri[uri];
20559
+ }
20560
+ this.thesauri[uri] = this.registriesApiService
20561
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20562
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20563
+ return this.thesauri[uri];
20509
20564
  }
20510
- 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 }); }
20565
+ 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 }); }
20511
20566
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20512
20567
  }
20513
20568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20514
20569
  type: Injectable
20515
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20570
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20516
20571
 
20517
20572
  function provideGn4() {
20518
20573
  return [
@@ -20724,6 +20779,8 @@ const defaultMapOptions = {
20724
20779
  };
20725
20780
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20726
20781
 
20782
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20783
+
20727
20784
  var MapContextLayerTypeEnum;
20728
20785
  (function (MapContextLayerTypeEnum) {
20729
20786
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21099,9 +21156,15 @@ const FORMATS = {
21099
21156
  color: '#328556',
21100
21157
  mimeTypes: ['x-gis/x-shapefile'],
21101
21158
  },
21159
+ gml: {
21160
+ extensions: ['gml'],
21161
+ priority: 5,
21162
+ color: '#c92bce',
21163
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21164
+ },
21102
21165
  kml: {
21103
21166
  extensions: ['kml', 'kmz'],
21104
- priority: 5,
21167
+ priority: 6,
21105
21168
  color: '#348009',
21106
21169
  mimeTypes: [
21107
21170
  'application/vnd.google-earth.kml+xml',
@@ -21110,34 +21173,40 @@ const FORMATS = {
21110
21173
  },
21111
21174
  gpkg: {
21112
21175
  extensions: ['gpkg', 'geopackage'],
21113
- priority: 6,
21176
+ priority: 7,
21114
21177
  color: '#ea79ba',
21115
21178
  mimeTypes: ['application/geopackage+sqlite3'],
21116
21179
  },
21117
21180
  zip: {
21118
21181
  extensions: ['zip', 'tar.gz'],
21119
- priority: 7,
21182
+ priority: 8,
21120
21183
  color: '#f2bb3a',
21121
21184
  mimeTypes: ['application/zip', 'application/x-zip'],
21122
21185
  },
21123
21186
  pdf: {
21124
21187
  extensions: ['pdf'],
21125
- priority: 8,
21188
+ priority: 9,
21126
21189
  color: '#db544a',
21127
21190
  mimeTypes: ['application/pdf'],
21128
21191
  },
21129
21192
  jpg: {
21130
21193
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21131
- priority: 8,
21194
+ priority: 9,
21132
21195
  color: '#673ab7',
21133
21196
  mimeTypes: ['image/jpg'],
21134
21197
  },
21135
21198
  svg: {
21136
21199
  extensions: ['svg'],
21137
- priority: 9,
21200
+ priority: 10,
21138
21201
  color: '#d98294',
21139
21202
  mimeTypes: ['image/svg+xml'],
21140
21203
  },
21204
+ dxf: {
21205
+ extensions: ['dxf'],
21206
+ priority: 11,
21207
+ color: '#de630b',
21208
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21209
+ },
21141
21210
  };
21142
21211
  function getFormatPriority(linkFormat) {
21143
21212
  for (const format in FORMATS) {
@@ -21154,14 +21223,18 @@ function getFormatPriority(linkFormat) {
21154
21223
  function getLinkPriority(link) {
21155
21224
  return getFormatPriority(getFileFormat(link));
21156
21225
  }
21157
- function extensionToFormat(extension) {
21158
- for (const format in FORMATS) {
21159
- for (const alias of FORMATS[format].extensions) {
21160
- if (alias === extension.toLowerCase())
21161
- return format;
21226
+ function getFileFormatFromServiceOutput(serviceOutput) {
21227
+ function formatMatcher(format) {
21228
+ const output = serviceOutput.toLowerCase();
21229
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21230
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21231
+ }
21232
+ for (const formatName in FORMATS) {
21233
+ if (formatMatcher(FORMATS[formatName])) {
21234
+ return formatName;
21162
21235
  }
21163
21236
  }
21164
- return undefined;
21237
+ return null;
21165
21238
  }
21166
21239
  function getFileFormat(link) {
21167
21240
  if ('mimeType' in link) {
@@ -21302,72 +21375,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21302
21375
  }]
21303
21376
  }] });
21304
21377
 
21305
- const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
21306
-
21307
- class MapUtilsWMSService {
21308
- constructor(proxy) {
21309
- this.proxy = proxy;
21310
- }
21311
- getCapabilities(layer) {
21312
- return from(new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady());
21313
- }
21314
- getLayerFull(layer) {
21315
- return this.getCapabilities(layer).pipe(map$1((endpoint) => endpoint.getLayerByName(layer.name)));
21316
- }
21317
- getLayerLonLatBBox(layer) {
21318
- return this.getLayerFull(layer).pipe(switchMap$1((wmsLayerFull) => from(this.getLonLatBBox(wmsLayerFull))));
21319
- }
21320
- async getLonLatBBox(wmsLayerFull) {
21321
- const { boundingBoxes } = wmsLayerFull;
21322
- const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21323
- if (lonLatCRS) {
21324
- return boundingBoxes[lonLatCRS];
21325
- }
21326
- else {
21327
- const availableEPSGCode = Object.keys(boundingBoxes)[0];
21328
- register(proj4);
21329
- const proj = await fromEPSGCode(availableEPSGCode);
21330
- proj4.defs(availableEPSGCode, proj);
21331
- const bboxWithFiniteNumbers = [
21332
- parseFloat(boundingBoxes[availableEPSGCode][0]),
21333
- parseFloat(boundingBoxes[availableEPSGCode][1]),
21334
- parseFloat(boundingBoxes[availableEPSGCode][2]),
21335
- parseFloat(boundingBoxes[availableEPSGCode][3]),
21336
- ];
21337
- const extent = transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21338
- return extent;
21339
- }
21340
- }
21341
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21342
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, providedIn: 'root' }); }
21343
- }
21344
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, decorators: [{
21345
- type: Injectable,
21346
- args: [{
21347
- providedIn: 'root',
21348
- }]
21349
- }], ctorParameters: function () { return [{ type: ProxyService }]; } });
21350
-
21351
21378
  const FEATURE_PROJECTION = 'EPSG:3857';
21352
21379
  const DATA_PROJECTION = 'EPSG:4326';
21380
+ const GEOJSON = new GeoJSON();
21353
21381
  class MapUtilsService {
21354
- constructor(http, wmsUtils) {
21382
+ constructor(http, proxy) {
21355
21383
  this.http = http;
21356
- this.wmsUtils = wmsUtils;
21384
+ this.proxy = proxy;
21357
21385
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21358
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21386
+ return GEOJSON.readFeatures(featureCollection, {
21359
21387
  featureProjection,
21360
21388
  dataProjection,
21361
21389
  });
21362
- return olFeatures;
21363
21390
  };
21364
21391
  }
21365
21392
  createEmptyMap() {
21366
- const map = new Map$1({
21393
+ return new Map$1({
21367
21394
  controls: [],
21368
21395
  pixelRatio: 1,
21369
21396
  });
21370
- return map;
21371
21397
  }
21372
21398
  isWMSLayer(layer) {
21373
21399
  return (layer.getSource() instanceof TileWMS ||
@@ -21382,8 +21408,7 @@ class MapUtilsService {
21382
21408
  ...source.getParams(),
21383
21409
  INFO_FORMAT: 'application/json',
21384
21410
  };
21385
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21386
- return url;
21411
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21387
21412
  }
21388
21413
  getVectorFeaturesFromClick(olMap, event) {
21389
21414
  const features = [];
@@ -21411,41 +21436,59 @@ class MapUtilsService {
21411
21436
  /**
21412
21437
  * Will emit `null` if no extent could be computed
21413
21438
  */
21414
- getLayerExtent(layer) {
21415
- let geographicExtent;
21439
+ async getLayerExtent(layer) {
21440
+ let latLonExtent;
21416
21441
  if (layer &&
21417
21442
  layer.type === 'geojson' &&
21418
21443
  'data' in layer &&
21419
21444
  typeof layer.data === 'object' &&
21420
21445
  layer.data.features[0] &&
21421
21446
  layer.data.features[0].geometry) {
21422
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21423
- .readFeatures(layerData)
21447
+ latLonExtent = new GeoJSON()
21448
+ .readFeatures(layer.data)
21424
21449
  .map((feature) => feature.getGeometry())
21425
21450
  .filter((geom) => !!geom)
21426
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21451
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21427
21452
  }
21428
21453
  else if (layer && layer.type === 'wms') {
21429
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21454
+ latLonExtent = await this.getWmsLayerExtent(layer);
21430
21455
  }
21431
21456
  else if (layer && layer.type === 'wmts') {
21432
21457
  if (layer.extent) {
21433
- geographicExtent = of(layer.extent);
21458
+ latLonExtent = layer.extent;
21434
21459
  }
21435
21460
  else {
21436
- return of(layer.options.tileGrid.getExtent());
21461
+ return layer.options.tileGrid.getExtent();
21437
21462
  }
21438
21463
  }
21439
21464
  else {
21440
- return of(null);
21465
+ return null;
21441
21466
  }
21442
- return geographicExtent.pipe(map$1((extent) => [
21443
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
21444
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
21445
- ]), map$1((extent) => (isEmpty(extent) ? null : extent)));
21467
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21468
+ return null;
21469
+ }
21470
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21446
21471
  }
21447
- getWmtsLayerFromCapabilities(link) {
21448
- const getCapabilitiesUrl = new URL(link.url, window.location.toString());
21472
+ async getWmsLayerExtent(layer) {
21473
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21474
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21475
+ if (!Object.keys(boundingBoxes).length) {
21476
+ return null;
21477
+ }
21478
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21479
+ if (lonLatCRS) {
21480
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21481
+ }
21482
+ else {
21483
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21484
+ register(proj4);
21485
+ const proj = await fromEPSGCode(availableEPSGCode);
21486
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21487
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21488
+ }
21489
+ }
21490
+ getWmtsLayerFromCapabilities(link) {
21491
+ const getCapabilitiesUrl = new URL(link.url, window.location.toString());
21449
21492
  getCapabilitiesUrl.searchParams.set('SERVICE', 'WMTS');
21450
21493
  getCapabilitiesUrl.searchParams.set('REQUEST', 'GetCapabilities');
21451
21494
  return from(fetch(getCapabilitiesUrl.toString())
@@ -21498,7 +21541,18 @@ ${e.stack || e.message || e}`);
21498
21541
  ])
21499
21542
  .getArray());
21500
21543
  }
21501
- 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 }); }
21544
+ getRecordExtent(record) {
21545
+ if (!('spatialExtents' in record)) {
21546
+ return null;
21547
+ }
21548
+ // transform an array of geojson geometries into a bbox
21549
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21550
+ const geom = GEOJSON.readGeometry(curr.geometry);
21551
+ return extend(prev, geom.getExtent());
21552
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21553
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21554
+ }
21555
+ 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 }); }
21502
21556
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21503
21557
  }
21504
21558
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21506,7 +21560,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21506
21560
  args: [{
21507
21561
  providedIn: 'root',
21508
21562
  }]
21509
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21563
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21510
21564
  function dragPanCondition(event) {
21511
21565
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21512
21566
  if (!dragPanCondition) {
@@ -22591,6 +22645,9 @@ class MapContextService {
22591
22645
  if (mapConfig) {
22592
22646
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22593
22647
  }
22648
+ else {
22649
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22650
+ }
22594
22651
  if (!mapContext.view?.extent &&
22595
22652
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22596
22653
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22701,6 +22758,11 @@ class MapContextService {
22701
22758
  }
22702
22759
  return view;
22703
22760
  }
22761
+ addDefaultBaselayerContext(layers) {
22762
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22763
+ ? layers
22764
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22765
+ }
22704
22766
  mergeMapConfigWithContext(mapContext, mapConfig) {
22705
22767
  return {
22706
22768
  ...mapContext,
@@ -23188,6 +23250,7 @@ class ThumbnailComponent {
23188
23250
  constructor(optionalPlaceholderUrl) {
23189
23251
  this.optionalPlaceholderUrl = optionalPlaceholderUrl;
23190
23252
  this.fit = 'cover';
23253
+ this.placeholderShown = new EventEmitter();
23191
23254
  this.placeholderUrl = this.optionalPlaceholderUrl || DEFAULT_PLACEHOLDER;
23192
23255
  this.images = [];
23193
23256
  }
@@ -23223,6 +23286,7 @@ class ThumbnailComponent {
23223
23286
  setNewSrcImage(image) {
23224
23287
  this.imgFit = image.fit;
23225
23288
  this.imgUrl = image.url;
23289
+ this.placeholderShown.emit(this.isPlaceholder);
23226
23290
  }
23227
23291
  setPlaceholder() {
23228
23292
  this.setNewSrcImage({ url: this.placeholderUrl, fit: 'scale-down' });
@@ -23245,11 +23309,11 @@ class ThumbnailComponent {
23245
23309
  }
23246
23310
  }
23247
23311
  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 }); }
23248
- 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 }); }
23312
+ 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 justify-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 w-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 }); }
23249
23313
  }
23250
23314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23251
23315
  type: Component,
23252
- args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, 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" }]
23316
+ args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-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 w-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" }]
23253
23317
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23254
23318
  type: Optional
23255
23319
  }, {
@@ -23265,11 +23329,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23265
23329
  }], containerElement: [{
23266
23330
  type: ViewChild,
23267
23331
  args: ['containerElement']
23332
+ }], placeholderShown: [{
23333
+ type: Output
23268
23334
  }] } });
23269
23335
 
23270
23336
  class RecordPreviewCardComponent extends RecordPreviewComponent {
23271
23337
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23272
- 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 }); }
23338
+ 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 }); }
23273
23339
  }
23274
23340
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, decorators: [{
23275
23341
  type: Component,
@@ -23278,7 +23344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23278
23344
 
23279
23345
  class RecordPreviewListComponent extends RecordPreviewComponent {
23280
23346
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23281
- 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 }); }
23347
+ 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 }); }
23282
23348
  }
23283
23349
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, decorators: [{
23284
23350
  type: Component,
@@ -23375,8 +23441,7 @@ class MetadataQualityComponent {
23375
23441
  : this.calculatedQualityScore;
23376
23442
  }
23377
23443
  get calculatedQualityScore() {
23378
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23379
- this.items.length);
23444
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23380
23445
  }
23381
23446
  showMenu() {
23382
23447
  this.isMenuShown = true;
@@ -23394,7 +23459,7 @@ class MetadataQualityComponent {
23394
23459
  this.items = [];
23395
23460
  this.add('title', !!this.metadata?.title);
23396
23461
  this.add('description', !!this.metadata?.abstract);
23397
- this.add('topic', this.metadata?.themes?.length > 0);
23462
+ this.add('topic', this.metadata?.topics?.length > 0);
23398
23463
  this.add('keywords', this.metadata?.keywords?.length > 0);
23399
23464
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23400
23465
  this.add('organisation', !!contact?.organization);
@@ -23426,7 +23491,7 @@ class RecordPreviewRowComponent extends RecordPreviewComponent {
23426
23491
  this.elementRef = elementRef;
23427
23492
  }
23428
23493
  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 }); }
23429
- 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 }); }
23494
+ 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 }); }
23430
23495
  }
23431
23496
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewRowComponent, decorators: [{
23432
23497
  type: Component,
@@ -23444,7 +23509,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23444
23509
 
23445
23510
  class RecordPreviewTitleComponent extends RecordPreviewComponent {
23446
23511
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23447
- 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 }); }
23512
+ 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 }); }
23448
23513
  }
23449
23514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, decorators: [{
23450
23515
  type: Component,
@@ -23484,7 +23549,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
23484
23549
  return this.timeFormat.format(this.record.recordCreated, Date.now());
23485
23550
  }
23486
23551
  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 }); }
23487
- 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 }); }
23552
+ 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 }); }
23488
23553
  }
23489
23554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewFeedComponent, decorators: [{
23490
23555
  type: Component,
@@ -23842,6 +23907,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23842
23907
  type: Input
23843
23908
  }] } });
23844
23909
 
23910
+ class MarkdownParserComponent {
23911
+ get parsedMarkdown() {
23912
+ return marked.parse(this.textContent);
23913
+ }
23914
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23915
+ 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 }); }
23916
+ }
23917
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23918
+ type: Component,
23919
+ 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"] }]
23920
+ }], propDecorators: { textContent: [{
23921
+ type: Input
23922
+ }] } });
23923
+
23845
23924
  class ContentGhostComponent {
23846
23925
  constructor() {
23847
23926
  this.ghostClass = '';
@@ -23996,36 +24075,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23996
24075
  args: ['container']
23997
24076
  }] } });
23998
24077
 
23999
- class MarkdownParserComponent {
24000
- get parsedMarkdown() {
24001
- return marked.parse(this.textContent);
24002
- }
24003
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24004
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host /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 /deep/ .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host /deep/ .markdown-body h1,:host /deep/ .markdown-body h2,:host /deep/ .markdown-body h3,:host /deep/ .markdown-body h4,:host /deep/ .markdown-body h5,:host /deep/ .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host /deep/ .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host /deep/ .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host /deep/ .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host /deep/ .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host /deep/ .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host /deep/ .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host /deep/ .markdown-body p{margin-top:0;margin-bottom:10px}:host /deep/ .markdown-body p > a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host /deep/ .markdown-body p > a:hover{color:var(--color-primary-darker)!important}:host /deep/ .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host /deep/ .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host /deep/ .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host /deep/ .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host /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 /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 /deep/ .markdown-body hr::before{display:table;content:\"\"}:host /deep/ .markdown-body hr::after{display:table;clear:both;content:\"\"}:host /deep/ .markdown-body ul,:host /deep/ .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host /deep/ .markdown-body ol ol,:host /deep/ .markdown-body ul ol{list-style-type:lower-roman}:host /deep/ .markdown-body ul ul ol,:host /deep/ .markdown-body ul ol ol,:host /deep/ .markdown-body ol ul ol,:host /deep/ .markdown-body ol ol ol{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host /deep/ .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host /deep/ .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host /deep/ .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body div > ol:not([type]){list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host /deep/ .markdown-body td,:host /deep/ .markdown-body th{padding:0}:host /deep/ .markdown-body th{color:var(--color-secondary)}:host /deep/ .markdown-body table th,:host /deep/ .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host /deep/ .markdown-body table td > :last-child{margin-bottom:0}:host /deep/ .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host /deep/ .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host /deep/ .markdown-body table img{background-color:transparent}:host /deep/ .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host /deep/ .markdown-body img[align=\"right\"]{padding-left:20px}:host /deep/ .markdown-body img[align=\"left\"]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24005
- }
24006
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24007
- type: Component,
24008
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host /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 /deep/ .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host /deep/ .markdown-body h1,:host /deep/ .markdown-body h2,:host /deep/ .markdown-body h3,:host /deep/ .markdown-body h4,:host /deep/ .markdown-body h5,:host /deep/ .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host /deep/ .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host /deep/ .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host /deep/ .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host /deep/ .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host /deep/ .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host /deep/ .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host /deep/ .markdown-body p{margin-top:0;margin-bottom:10px}:host /deep/ .markdown-body p > a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host /deep/ .markdown-body p > a:hover{color:var(--color-primary-darker)!important}:host /deep/ .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host /deep/ .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host /deep/ .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host /deep/ .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host /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 /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 /deep/ .markdown-body hr::before{display:table;content:\"\"}:host /deep/ .markdown-body hr::after{display:table;clear:both;content:\"\"}:host /deep/ .markdown-body ul,:host /deep/ .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host /deep/ .markdown-body ol ol,:host /deep/ .markdown-body ul ol{list-style-type:lower-roman}:host /deep/ .markdown-body ul ul ol,:host /deep/ .markdown-body ul ol ol,:host /deep/ .markdown-body ol ul ol,:host /deep/ .markdown-body ol ol ol{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host /deep/ .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host /deep/ .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host /deep/ .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body div > ol:not([type]){list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host /deep/ .markdown-body td,:host /deep/ .markdown-body th{padding:0}:host /deep/ .markdown-body th{color:var(--color-secondary)}:host /deep/ .markdown-body table th,:host /deep/ .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host /deep/ .markdown-body table td > :last-child{margin-bottom:0}:host /deep/ .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host /deep/ .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host /deep/ .markdown-body table img{background-color:transparent}:host /deep/ .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host /deep/ .markdown-body img[align=\"right\"]{padding-left:20px}:host /deep/ .markdown-body img[align=\"left\"]{padding-right:20px}\n"] }]
24009
- }], propDecorators: { textContent: [{
24010
- type: Input
24011
- }] } });
24012
-
24013
24078
  class MetadataInfoComponent {
24014
24079
  constructor() {
24015
24080
  this.keyword = new EventEmitter();
24016
24081
  }
24017
24082
  get hasUsage() {
24018
24083
  return (this.metadata.extras?.isOpenData === true ||
24019
- this.metadata.useLimitations?.length ||
24020
- this.metadata.accessConstraints?.length);
24084
+ (this.metadata.legalConstraints?.length > 0 &&
24085
+ this.legalConstraints.length > 0) ||
24086
+ (this.metadata.otherConstraints?.length > 0 &&
24087
+ this.otherConstraints.length > 0) ||
24088
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24021
24089
  }
24022
- get usages() {
24090
+ get legalConstraints() {
24023
24091
  let array = [];
24024
- if (this.metadata.useLimitations?.length) {
24025
- array = array.concat(this.metadata.useLimitations);
24092
+ if (this.metadata.legalConstraints?.length) {
24093
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24026
24094
  }
24027
- if (this.metadata.accessConstraints?.length) {
24028
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24095
+ return array;
24096
+ }
24097
+ get otherConstraints() {
24098
+ let array = [];
24099
+ if (this.metadata.otherConstraints?.length) {
24100
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24101
+ }
24102
+ return array;
24103
+ }
24104
+ get licenses() {
24105
+ let array = [];
24106
+ if (this.metadata.licenses?.length) {
24107
+ array = array.concat(this.metadata.licenses
24108
+ .filter((c) => c.text)
24109
+ .map((c) => ({ text: c.text, url: c.url })));
24029
24110
  }
24030
24111
  return array;
24031
24112
  }
@@ -24047,16 +24128,12 @@ class MetadataInfoComponent {
24047
24128
  onKeywordClick(keyword) {
24048
24129
  this.keyword.emit(keyword);
24049
24130
  }
24050
- copyText() {
24051
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24052
- event.target.blur();
24053
- }
24054
24131
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24055
- 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\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=\"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: 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: 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: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24132
+ 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.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *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.label }}</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 }); }
24056
24133
  }
24057
24134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24058
24135
  type: Component,
24059
- 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\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=\"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"] }]
24136
+ 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.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *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.label }}</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"] }]
24060
24137
  }], propDecorators: { metadata: [{
24061
24138
  type: Input
24062
24139
  }], incomplete: [{
@@ -24125,11 +24202,11 @@ class ButtonComponent {
24125
24202
  propagateToDocumentOnly(event);
24126
24203
  }
24127
24204
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24128
- 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 }); }
24205
+ 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 }); }
24129
24206
  }
24130
24207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24131
24208
  type: Component,
24132
- 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"] }]
24209
+ 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"] }]
24133
24210
  }], propDecorators: { type: [{
24134
24211
  type: Input
24135
24212
  }], disabled: [{
@@ -24204,11 +24281,11 @@ class DownloadsListComponent {
24204
24281
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24205
24282
  }
24206
24283
  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 }); }
24207
- 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 }); }
24284
+ 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 }); }
24208
24285
  }
24209
24286
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24210
24287
  type: Component,
24211
- 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" }]
24288
+ 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" }]
24212
24289
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24213
24290
  type: Input
24214
24291
  }] } });
@@ -24409,11 +24486,11 @@ class CarouselComponent {
24409
24486
  this.emblaApi.scrollTo(stepIndex);
24410
24487
  }
24411
24488
  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 }); }
24412
- 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 }); }
24489
+ 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 }); }
24413
24490
  }
24414
24491
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24415
24492
  type: Component,
24416
- 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"] }]
24493
+ 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"] }]
24417
24494
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24418
24495
  type: Input
24419
24496
  }], stepsContainerClass: [{
@@ -24457,6 +24534,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24457
24534
  }]
24458
24535
  }] });
24459
24536
 
24537
+ class InteractiveTableColumnComponent {
24538
+ constructor() {
24539
+ this.grow = false;
24540
+ this.sortable = false;
24541
+ this.activeSort = null;
24542
+ this.sortChange = new EventEmitter();
24543
+ }
24544
+ handleSortChange() {
24545
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24546
+ this.sortChange.emit(this.activeSort);
24547
+ }
24548
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24549
+ 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 }); }
24550
+ }
24551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24552
+ type: Component,
24553
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24554
+ }], propDecorators: { header: [{
24555
+ type: ContentChild,
24556
+ args: ['header']
24557
+ }], cell: [{
24558
+ type: ContentChild,
24559
+ args: ['cell']
24560
+ }], grow: [{
24561
+ type: Input
24562
+ }], sortable: [{
24563
+ type: Input
24564
+ }], activeSort: [{
24565
+ type: Input
24566
+ }], sortChange: [{
24567
+ type: Output
24568
+ }] } });
24569
+
24570
+ class InteractiveTableComponent {
24571
+ constructor() {
24572
+ this.items = [];
24573
+ this.itemClick = new EventEmitter();
24574
+ }
24575
+ get gridStyle() {
24576
+ return {
24577
+ 'grid-template-columns': this.columns
24578
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24579
+ .join(' '),
24580
+ };
24581
+ }
24582
+ handleRowClick(item) {
24583
+ this.itemClick.emit(item);
24584
+ }
24585
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24586
+ 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 }); }
24587
+ }
24588
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24589
+ type: Component,
24590
+ 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"] }]
24591
+ }], propDecorators: { columns: [{
24592
+ type: ContentChildren,
24593
+ args: [InteractiveTableColumnComponent]
24594
+ }], items: [{
24595
+ type: Input
24596
+ }], itemClick: [{
24597
+ type: Output
24598
+ }] } });
24599
+
24460
24600
  class LinkCardComponent {
24461
24601
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24462
24602
  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 }); }
@@ -24470,11 +24610,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24470
24610
 
24471
24611
  class RelatedRecordCardComponent {
24472
24612
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24473
- 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 }); }
24613
+ 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 }); }
24474
24614
  }
24475
24615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
24476
24616
  type: Component,
24477
- 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" }]
24617
+ 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" }]
24478
24618
  }], propDecorators: { record: [{
24479
24619
  type: Input
24480
24620
  }] } });
@@ -24502,11 +24642,11 @@ class MetadataContactComponent {
24502
24642
  this.organizationClick.emit(this.shownOrganization);
24503
24643
  }
24504
24644
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24505
- 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 }); }
24645
+ 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 }); }
24506
24646
  }
24507
24647
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24508
24648
  type: Component,
24509
- 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" }]
24649
+ 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" }]
24510
24650
  }], propDecorators: { metadata: [{
24511
24651
  type: Input
24512
24652
  }], organizationClick: [{
@@ -24910,11 +25050,11 @@ class DropdownMultiselectComponent {
24910
25050
  this.setFocus();
24911
25051
  }
24912
25052
  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 }); }
24913
- 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 }); }
25053
+ 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 }); }
24914
25054
  }
24915
25055
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24916
25056
  type: Component,
24917
- 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" }]
25057
+ 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" }]
24918
25058
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24919
25059
  type: Input
24920
25060
  }], choices: [{
@@ -25068,11 +25208,11 @@ class TextAreaComponent {
25068
25208
  this.rawChange.next(value);
25069
25209
  }
25070
25210
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25071
- 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"] }); }
25211
+ 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"] }); }
25072
25212
  }
25073
25213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25074
25214
  type: Component,
25075
- 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"] }]
25215
+ 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"] }]
25076
25216
  }], propDecorators: { value: [{
25077
25217
  type: Input
25078
25218
  }], placeholder: [{
@@ -25173,11 +25313,11 @@ class AutocompleteComponent {
25173
25313
  }
25174
25314
  }
25175
25315
  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 }); }
25176
- 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 }); }
25316
+ 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 }); }
25177
25317
  }
25178
25318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25179
25319
  type: Component,
25180
- 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"] }]
25320
+ 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"] }]
25181
25321
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25182
25322
  type: Input
25183
25323
  }], action: [{
@@ -25342,11 +25482,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25342
25482
 
25343
25483
  class NavigationButtonComponent {
25344
25484
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25345
- 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 }); }
25485
+ 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 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: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25346
25486
  }
25347
25487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25348
25488
  type: Component,
25349
- 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" }]
25489
+ 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 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: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
25350
25490
  }], propDecorators: { label: [{
25351
25491
  type: Input
25352
25492
  }], icon: [{
@@ -25553,11 +25693,11 @@ class CheckboxComponent {
25553
25693
  this.changed.emit(this.checked);
25554
25694
  }
25555
25695
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25556
- 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 }); }
25696
+ 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 }); }
25557
25697
  }
25558
25698
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25559
25699
  type: Component,
25560
- 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"] }]
25700
+ 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"] }]
25561
25701
  }], propDecorators: { type: [{
25562
25702
  type: Input
25563
25703
  }], checked: [{
@@ -25612,14 +25752,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25612
25752
  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"] }]
25613
25753
  }] });
25614
25754
 
25755
+ class EditableLabelDirective {
25756
+ constructor(el, renderer) {
25757
+ this.el = el;
25758
+ this.renderer = renderer;
25759
+ this.editableLabelChanged = new EventEmitter();
25760
+ }
25761
+ ngAfterViewInit() {
25762
+ if (this.gnUiEditableLabel !== false) {
25763
+ const appendedInput = this.renderer.createElement('input');
25764
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25765
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25766
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25767
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25768
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25769
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25770
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25771
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25772
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25773
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25774
+ const hostContent = this.el.nativeElement.textContent || '';
25775
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25776
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25777
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25778
+ this.renderer.listen(appendedInput, 'input', (event) => {
25779
+ this.editableLabelChanged.emit(event.target.value);
25780
+ });
25781
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25782
+ }
25783
+ }
25784
+ 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 }); }
25785
+ 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 }); }
25786
+ }
25787
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25788
+ type: Directive,
25789
+ args: [{
25790
+ selector: '[gnUiEditableLabel]',
25791
+ standalone: true,
25792
+ }]
25793
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25794
+ type: Output
25795
+ }], gnUiEditableLabel: [{
25796
+ type: Input
25797
+ }] } });
25798
+
25615
25799
  class UiInputsModule {
25616
25800
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25617
25801
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25618
25802
  AutocompleteComponent,
25619
- ButtonComponent,
25620
25803
  TextInputComponent,
25621
25804
  DragAndDropFileInputComponent,
25622
- TextAreaComponent,
25623
25805
  ChipsInputComponent,
25624
25806
  NavigationButtonComponent,
25625
25807
  StarToggleComponent,
@@ -25651,7 +25833,10 @@ class UiInputsModule {
25651
25833
  MatFormFieldModule,
25652
25834
  MatInputModule,
25653
25835
  MatDatepickerModule,
25654
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25836
+ MatNativeDateModule,
25837
+ EditableLabelDirective,
25838
+ TextAreaComponent,
25839
+ ButtonComponent], exports: [DropdownSelectorComponent,
25655
25840
  AutocompleteComponent,
25656
25841
  ButtonComponent,
25657
25842
  TextInputComponent,
@@ -25667,7 +25852,8 @@ class UiInputsModule {
25667
25852
  CopyTextButtonComponent,
25668
25853
  CheckboxComponent,
25669
25854
  SearchInputComponent,
25670
- DateRangePickerComponent] }); }
25855
+ DateRangePickerComponent,
25856
+ EditableLabelDirective] }); }
25671
25857
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25672
25858
  TranslateModule.forChild(),
25673
25859
  NgxDropzoneModule,
@@ -25692,10 +25878,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25692
25878
  declarations: [
25693
25879
  DropdownSelectorComponent,
25694
25880
  AutocompleteComponent,
25695
- ButtonComponent,
25696
25881
  TextInputComponent,
25697
25882
  DragAndDropFileInputComponent,
25698
- TextAreaComponent,
25699
25883
  ChipsInputComponent,
25700
25884
  NavigationButtonComponent,
25701
25885
  StarToggleComponent,
@@ -25733,6 +25917,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25733
25917
  MatInputModule,
25734
25918
  MatDatepickerModule,
25735
25919
  MatNativeDateModule,
25920
+ EditableLabelDirective,
25921
+ TextAreaComponent,
25922
+ ButtonComponent,
25736
25923
  ],
25737
25924
  exports: [
25738
25925
  DropdownSelectorComponent,
@@ -25752,6 +25939,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25752
25939
  CheckboxComponent,
25753
25940
  SearchInputComponent,
25754
25941
  DateRangePickerComponent,
25942
+ EditableLabelDirective,
25755
25943
  ],
25756
25944
  }]
25757
25945
  }] });
@@ -25851,7 +26039,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25851
26039
 
25852
26040
  const DEFAULT_PARAMS = {
25853
26041
  OFFSET: '',
25854
- LIMIT: '',
26042
+ LIMIT: '-1',
25855
26043
  FORMAT: 'json',
25856
26044
  };
25857
26045
  class RecordApiFormComponent {
@@ -25880,6 +26068,8 @@ class RecordApiFormComponent {
25880
26068
  }
25881
26069
  return outputUrl;
25882
26070
  }));
26071
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26072
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25883
26073
  }
25884
26074
  set apiLink(value) {
25885
26075
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25889,10 +26079,11 @@ class RecordApiFormComponent {
25889
26079
  this.offset$.next(value);
25890
26080
  }
25891
26081
  setLimit(value) {
25892
- this.limit$.next(value);
26082
+ const newLimit = value === '' ? '-1' : value;
26083
+ this.limit$.next(newLimit);
25893
26084
  }
25894
26085
  setFormat(value) {
25895
- this.format$.next(value);
26086
+ this.format$.next(String(value));
25896
26087
  }
25897
26088
  resetUrl() {
25898
26089
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25900,15 +26091,34 @@ class RecordApiFormComponent {
25900
26091
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25901
26092
  }
25902
26093
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25903
- 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 }); }
26094
+ 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 }); }
25904
26095
  }
25905
26096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25906
26097
  type: Component,
25907
- 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"] }]
26098
+ 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"] }]
25908
26099
  }], propDecorators: { apiLink: [{
25909
26100
  type: Input
25910
26101
  }] } });
25911
26102
 
26103
+ class ImageOverlayPreviewComponent {
26104
+ constructor() {
26105
+ this.isPlaceholderShown = new EventEmitter();
26106
+ }
26107
+ openLightbox(src) {
26108
+ basicLightbox.create(`<img src="${src}"/>`).show();
26109
+ }
26110
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26111
+ 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"] }] }); }
26112
+ }
26113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
26114
+ type: Component,
26115
+ 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" }]
26116
+ }], propDecorators: { imageUrl: [{
26117
+ type: Input
26118
+ }], isPlaceholderShown: [{
26119
+ type: Output
26120
+ }] } });
26121
+
25912
26122
  class UiElementsModule {
25913
26123
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25914
26124
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -25931,7 +26141,7 @@ class UiElementsModule {
25931
26141
  PaginationButtonsComponent,
25932
26142
  MaxLinesComponent,
25933
26143
  RecordApiFormComponent,
25934
- MarkdownParserComponent], imports: [CommonModule,
26144
+ ImageOverlayPreviewComponent], imports: [CommonModule,
25935
26145
  MatIconModule,
25936
26146
  MatTooltipModule,
25937
26147
  UiWidgetsModule,
@@ -25939,7 +26149,8 @@ class UiElementsModule {
25939
26149
  RouterModule,
25940
26150
  UiInputsModule,
25941
26151
  FormsModule,
25942
- NgOptimizedImage], exports: [MetadataInfoComponent,
26152
+ NgOptimizedImage,
26153
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
25943
26154
  ContentGhostComponent,
25944
26155
  DownloadItemComponent,
25945
26156
  DownloadsListComponent,
@@ -25956,8 +26167,10 @@ class UiElementsModule {
25956
26167
  AvatarComponent,
25957
26168
  UserPreviewComponent,
25958
26169
  PaginationButtonsComponent,
26170
+ MaxLinesComponent,
25959
26171
  RecordApiFormComponent,
25960
- MarkdownParserComponent] }); }
26172
+ MarkdownParserComponent,
26173
+ ImageOverlayPreviewComponent] }); }
25961
26174
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, imports: [CommonModule,
25962
26175
  MatIconModule,
25963
26176
  MatTooltipModule,
@@ -25984,6 +26197,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25984
26197
  UiInputsModule,
25985
26198
  FormsModule,
25986
26199
  NgOptimizedImage,
26200
+ MarkdownParserComponent,
25987
26201
  ],
25988
26202
  declarations: [
25989
26203
  MetadataInfoComponent,
@@ -26006,7 +26220,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26006
26220
  PaginationButtonsComponent,
26007
26221
  MaxLinesComponent,
26008
26222
  RecordApiFormComponent,
26009
- MarkdownParserComponent,
26223
+ ImageOverlayPreviewComponent,
26010
26224
  ],
26011
26225
  exports: [
26012
26226
  MetadataInfoComponent,
@@ -26026,149 +26240,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26026
26240
  AvatarComponent,
26027
26241
  UserPreviewComponent,
26028
26242
  PaginationButtonsComponent,
26243
+ MaxLinesComponent,
26029
26244
  RecordApiFormComponent,
26030
26245
  MarkdownParserComponent,
26246
+ ImageOverlayPreviewComponent,
26031
26247
  ],
26032
26248
  }]
26033
26249
  }] });
26034
26250
 
26035
- class RecordTableComponent {
26036
- constructor() {
26037
- this.selectedRecords = [];
26038
- this.records = [];
26039
- this.recordClick = new EventEmitter();
26040
- this.recordsSelect = new EventEmitter();
26041
- this.recordsDeselect = new EventEmitter();
26042
- this.sortByChange = new EventEmitter();
26043
- }
26044
- dateToString(date) {
26045
- return date?.toLocaleDateString(undefined, {
26046
- year: 'numeric',
26047
- month: 'long',
26048
- day: 'numeric',
26049
- timeZone: 'UTC',
26050
- });
26051
- }
26052
- getStatus(isPublishedToAll) {
26053
- return isPublishedToAll ? 'published' : 'not published';
26054
- }
26055
- formatUserInfo(userInfo) {
26056
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
26057
- if (infos && infos.length === 4) {
26058
- return `${infos[2]} ${infos[1]}`;
26059
- }
26060
- return undefined;
26061
- }
26062
- getRecordFormats(record) {
26063
- if (record.kind === 'service' || !('distributions' in record)) {
26064
- return [];
26065
- }
26066
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
26067
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
26068
- return formats;
26069
- }
26070
- getBadgeColor(format) {
26071
- return getBadgeColor(format);
26072
- }
26073
- getOrderForColumn(col) {
26074
- if (!this.sortBy) {
26075
- return null;
26076
- }
26077
- let order = null;
26078
- const sortedArray = Array.isArray(this.sortBy[0])
26079
- ? this.sortBy
26080
- : [this.sortBy];
26081
- sortedArray.forEach((sortedCol) => {
26082
- if (sortedCol[1] === col) {
26083
- order = sortedCol[0];
26084
- }
26085
- });
26086
- return order;
26087
- }
26088
- setSortBy(col) {
26089
- const sortOrder = this.getOrderForColumn(col);
26090
- let newOrder;
26091
- if (sortOrder) {
26092
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
26093
- }
26094
- else {
26095
- newOrder = 'asc';
26096
- }
26097
- this.sortByChange.emit([newOrder, col]);
26098
- this.sortBy = [newOrder, col];
26099
- }
26100
- isSortedBy(col, order) {
26101
- const sortOrder = this.getOrderForColumn(col);
26102
- return sortOrder === order;
26103
- }
26104
- isChecked(record) {
26105
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
26106
- return true;
26107
- }
26108
- return false;
26109
- }
26110
- handleRecordSelectedChange(selected, record) {
26111
- if (!selected) {
26112
- this.recordsDeselect.emit([record]);
26113
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
26114
- }
26115
- else {
26116
- this.recordsSelect.emit([record]);
26117
- this.selectedRecords.push(record.uniqueIdentifier);
26118
- }
26119
- }
26120
- selectAll() {
26121
- if (this.isAllSelected()) {
26122
- this.recordsDeselect.emit(this.records);
26123
- this.selectedRecords = [];
26124
- }
26125
- else {
26126
- this.recordsSelect.emit(this.records);
26127
- this.selectedRecords = this.records.map((record) => {
26128
- return record.uniqueIdentifier;
26129
- });
26130
- }
26131
- }
26132
- isAllSelected() {
26133
- if (this.selectedRecords.length === this.records.length) {
26134
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
26135
- if (allRecords.length === this.records.length) {
26136
- return true;
26137
- }
26138
- }
26139
- return false;
26140
- }
26141
- isSomeSelected() {
26142
- if (this.selectedRecords.length > 0 &&
26143
- this.selectedRecords.length < this.records.length) {
26144
- return true;
26145
- }
26146
- return false;
26147
- }
26148
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26149
- 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"] }] }); }
26150
- }
26151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26152
- type: Component,
26153
- 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"] }]
26154
- }], propDecorators: { selectedRecords: [{
26155
- type: Input
26156
- }], records: [{
26157
- type: Input
26158
- }], totalHits: [{
26159
- type: Input
26160
- }], sortBy: [{
26161
- type: Input
26162
- }], recordClick: [{
26163
- type: Output
26164
- }], recordsSelect: [{
26165
- type: Output
26166
- }], recordsDeselect: [{
26167
- type: Output
26168
- }], sortByChange: [{
26169
- type: Output
26170
- }] } });
26171
-
26172
26251
  class UiSearchModule {
26173
26252
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26174
26253
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26181,8 +26260,7 @@ class UiSearchModule {
26181
26260
  ResultsHitsNumberComponent,
26182
26261
  ResultsListItemComponent,
26183
26262
  RecordPreviewFeedComponent,
26184
- RecordPreviewRowComponent,
26185
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26263
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26186
26264
  FacetsModule$1,
26187
26265
  FormsModule,
26188
26266
  ReactiveFormsModule,
@@ -26193,7 +26271,8 @@ class UiSearchModule {
26193
26271
  UiElementsModule,
26194
26272
  MatIconModule,
26195
26273
  MatCheckboxModule,
26196
- RouterLink], exports: [RecordPreviewListComponent,
26274
+ RouterLink,
26275
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26197
26276
  RecordPreviewCardComponent,
26198
26277
  RecordPreviewTextComponent,
26199
26278
  RecordPreviewTitleComponent,
@@ -26203,8 +26282,7 @@ class UiSearchModule {
26203
26282
  RecordPreviewComponent,
26204
26283
  ResultsHitsNumberComponent,
26205
26284
  RecordPreviewFeedComponent,
26206
- RecordPreviewRowComponent,
26207
- RecordTableComponent] }); }
26285
+ RecordPreviewRowComponent] }); }
26208
26286
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26209
26287
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26210
26288
  ], imports: [CommonModule,
@@ -26219,7 +26297,8 @@ class UiSearchModule {
26219
26297
  UiInputsModule,
26220
26298
  UiElementsModule,
26221
26299
  MatIconModule,
26222
- MatCheckboxModule, FacetsModule$1] }); }
26300
+ MatCheckboxModule,
26301
+ InteractiveTableComponent, FacetsModule$1] }); }
26223
26302
  }
26224
26303
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26225
26304
  type: NgModule,
@@ -26236,7 +26315,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26236
26315
  ResultsListItemComponent,
26237
26316
  RecordPreviewFeedComponent,
26238
26317
  RecordPreviewRowComponent,
26239
- RecordTableComponent,
26240
26318
  ],
26241
26319
  imports: [
26242
26320
  CommonModule,
@@ -26253,6 +26331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26253
26331
  MatIconModule,
26254
26332
  MatCheckboxModule,
26255
26333
  RouterLink,
26334
+ InteractiveTableComponent,
26256
26335
  ],
26257
26336
  exports: [
26258
26337
  RecordPreviewListComponent,
@@ -26266,7 +26345,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26266
26345
  ResultsHitsNumberComponent,
26267
26346
  RecordPreviewFeedComponent,
26268
26347
  RecordPreviewRowComponent,
26269
- RecordTableComponent,
26270
26348
  ],
26271
26349
  providers: [
26272
26350
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26825,6 +26903,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26825
26903
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26826
26904
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26827
26905
 
26906
+ // this geometry will be used to filter & boost results accordingly
26907
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26908
+
26828
26909
  class SearchFacade {
26829
26910
  constructor(store, filterGeometry) {
26830
26911
  this.store = store;
@@ -26929,6 +27010,7 @@ class SearchFacade {
26929
27010
  this.store.dispatch(new SetFilters({}, this.searchId));
26930
27011
  this.store.dispatch(new SetSortBy([], this.searchId));
26931
27012
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
27013
+ return this;
26932
27014
  }
26933
27015
  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 }); }
26934
27016
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27313,8 +27395,11 @@ class FuzzySearchComponent {
27313
27395
  this.searchService.updateFilters({ any });
27314
27396
  }
27315
27397
  }
27316
- handleInputCleared() {
27317
- this.searchService.updateFilters({ any: '' });
27398
+ async handleInputCleared() {
27399
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27400
+ if (currentSearchFilters.any) {
27401
+ this.searchService.updateFilters({ any: '' });
27402
+ }
27318
27403
  }
27319
27404
  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 }); }
27320
27405
  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 }); }
@@ -27394,6 +27479,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27394
27479
  args: [RESULTS_LAYOUT_CONFIG]
27395
27480
  }] }]; } });
27396
27481
 
27482
+ // expects the replacement key ${uuid}
27483
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27484
+
27397
27485
  class FavoriteStarComponent {
27398
27486
  set record(value) {
27399
27487
  this.record_ = value;
@@ -27477,11 +27565,11 @@ class FavoriteStarComponent {
27477
27565
  });
27478
27566
  }
27479
27567
  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 }); }
27480
- 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 }); }
27568
+ 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 items-center\">\n <span\n class=\"align-text-top mr-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 ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\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 }); }
27481
27569
  }
27482
27570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27483
27571
  type: Component,
27484
- 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" }]
27572
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-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 ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27485
27573
  }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27486
27574
  type: Input
27487
27575
  }], record: [{
@@ -27655,9 +27743,11 @@ class SearchEffects {
27655
27743
  // I could not get this to work (maybe a bug in rxjs?)
27656
27744
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27657
27745
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27658
- return of([state, favorites, null]);
27746
+ return of([state, favorites, undefined]);
27659
27747
  }
27660
27748
  return this.filterGeometry$.pipe(tap$2((geom) => {
27749
+ if (!geom)
27750
+ return;
27661
27751
  try {
27662
27752
  const trace = valid$1(geom, true);
27663
27753
  if (trace?.length > 0) {
@@ -27669,7 +27759,7 @@ class SearchEffects {
27669
27759
  throw new Error();
27670
27760
  }
27671
27761
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27672
- return of([state, favorites, null]);
27762
+ return of([state, favorites, undefined]);
27673
27763
  }));
27674
27764
  }), switchMap$1(([state, favorites, geometry]) => {
27675
27765
  const { currentPage, pageSize, sort } = state.params;
@@ -27768,10 +27858,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27768
27858
  class AbstractSearchField {
27769
27859
  }
27770
27860
  class SimpleSearchField {
27771
- constructor(esFieldName, order = 'asc', injector) {
27861
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27772
27862
  this.esFieldName = esFieldName;
27773
- this.order = order;
27774
27863
  this.injector = injector;
27864
+ this.order = order;
27865
+ this.orderType = orderType;
27775
27866
  this.repository = this.injector.get(RecordsRepositoryInterface);
27776
27867
  // FIXME: this is required to register runtime fields; abstract this as well
27777
27868
  this.esService = this.injector.get(ElasticsearchService);
@@ -27782,12 +27873,12 @@ class SimpleSearchField {
27782
27873
  type: 'terms',
27783
27874
  field: this.esFieldName,
27784
27875
  limit: 1000,
27785
- sort: [this.order, 'key'],
27876
+ sort: [this.order, this.orderType],
27786
27877
  },
27787
27878
  };
27788
27879
  }
27789
27880
  async getBucketLabel(bucket) {
27790
- return bucket.term;
27881
+ return bucket.term.toString();
27791
27882
  }
27792
27883
  getAvailableValues() {
27793
27884
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27815,9 +27906,13 @@ class SimpleSearchField {
27815
27906
  return of(values);
27816
27907
  }
27817
27908
  }
27818
- class KeySearchField extends SimpleSearchField {
27819
- constructor() {
27820
- super(...arguments);
27909
+ class TranslatedSearchField extends SimpleSearchField {
27910
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27911
+ super(esFieldName, injector, order, orderType);
27912
+ this.esFieldName = esFieldName;
27913
+ this.injector = injector;
27914
+ this.order = order;
27915
+ this.orderType = orderType;
27821
27916
  this.platformService = this.injector.get(PlatformServiceInterface);
27822
27917
  }
27823
27918
  async getTranslation(key) {
@@ -27827,26 +27922,36 @@ class KeySearchField extends SimpleSearchField {
27827
27922
  return (await this.getTranslation(bucket.term)) || bucket.term;
27828
27923
  }
27829
27924
  getAvailableValues() {
27925
+ if (this.orderType === 'count')
27926
+ return super.getAvailableValues();
27830
27927
  // sort values by alphabetical order
27831
27928
  return super
27832
27929
  .getAvailableValues()
27833
27930
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27834
27931
  }
27835
27932
  }
27836
- class ThesaurusField extends KeySearchField {
27837
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27838
- super(esFieldName, order, injector);
27839
- this.thesaurusName = thesaurusName;
27933
+ /**
27934
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
27935
+ * to the defined METADATA_LANGUAGE token
27936
+ * The provided ES field name should not include any prefix such as `.langeng`
27937
+ */
27938
+ class MultilingualSearchField extends SimpleSearchField {
27939
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27940
+ super(esFieldName, injector, order, orderType);
27941
+ this.esFieldName = esFieldName;
27942
+ this.injector = injector;
27943
+ this.order = order;
27944
+ this.orderType = orderType;
27840
27945
  this.langService = this.injector.get(LangService);
27841
- this.thesaurus$ = this.platformService
27842
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27843
- .pipe(catchError(() => {
27844
- console.warn('Error while loading thesaurus language package');
27845
- return of([]);
27846
- }), shareReplay(1));
27847
- }
27848
- async getTranslation(key) {
27849
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
27946
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
27947
+ // note: we're excluding the metadata language "current" value because that would produce
27948
+ // permalinks that might not work for different users
27949
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
27950
+ this.esFieldName += `.lang${this.searchLanguage}`;
27951
+ }
27952
+ else {
27953
+ this.esFieldName += '.default';
27954
+ }
27850
27955
  }
27851
27956
  }
27852
27957
  class FullTextSearchField {
@@ -27866,7 +27971,7 @@ marker('search.filters.isSpatial.yes');
27866
27971
  marker('search.filters.isSpatial.no');
27867
27972
  class IsSpatialSearchField extends SimpleSearchField {
27868
27973
  constructor(injector) {
27869
- super('isSpatial', 'asc', injector);
27974
+ super('isSpatial', injector, 'asc');
27870
27975
  this.translateService = this.injector.get(TranslateService);
27871
27976
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27872
27977
  String formats = doc.format.join('|').toLowerCase();
@@ -27916,7 +28021,7 @@ marker('search.filters.license.unknown');
27916
28021
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27917
28022
  class LicenseSearchField extends SimpleSearchField {
27918
28023
  constructor(injector) {
27919
- super('license', 'asc', injector);
28024
+ super('license', injector, 'asc');
27920
28025
  this.translateService = this.injector.get(TranslateService);
27921
28026
  this.esService.registerRuntimeField('license', `String raw = '';
27922
28027
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -28000,7 +28105,7 @@ class OrganizationSearchField {
28000
28105
  }
28001
28106
  class OwnerSearchField extends SimpleSearchField {
28002
28107
  constructor(injector) {
28003
- super('owner', 'asc', injector);
28108
+ super('owner', injector, 'asc');
28004
28109
  }
28005
28110
  getAvailableValues() {
28006
28111
  return of([]);
@@ -28009,6 +28114,7 @@ class OwnerSearchField extends SimpleSearchField {
28009
28114
 
28010
28115
  marker('search.filters.format');
28011
28116
  marker('search.filters.inspireKeyword');
28117
+ marker('search.filters.keyword');
28012
28118
  marker('search.filters.isSpatial');
28013
28119
  marker('search.filters.license');
28014
28120
  marker('search.filters.publicationYear');
@@ -28026,13 +28132,14 @@ class FieldsService {
28026
28132
  this.injector = injector;
28027
28133
  this.fields = {
28028
28134
  publisher: new OrganizationSearchField(this.injector),
28029
- format: new SimpleSearchField('format', 'asc', this.injector),
28030
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
28031
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
28032
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
28033
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
28034
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
28035
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28135
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28136
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28137
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28138
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28139
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28140
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28141
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28142
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
28036
28143
  isSpatial: new IsSpatialSearchField(this.injector),
28037
28144
  q: new FullTextSearchField(),
28038
28145
  license: new LicenseSearchField(this.injector),
@@ -28106,10 +28213,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28106
28213
  type: Input
28107
28214
  }] } });
28108
28215
 
28109
- // this geometry will be used to filter & boost results accordingly
28110
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
28111
- // expects the replacement key ${uuid}
28112
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28113
28216
  class FeatureSearchModule {
28114
28217
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28115
28218
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28208,6 +28311,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28208
28311
  }]
28209
28312
  }] });
28210
28313
 
28314
+ class ResultsTableComponent {
28315
+ constructor(searchFacade, searchService, selectionService) {
28316
+ this.searchFacade = searchFacade;
28317
+ this.searchService = searchService;
28318
+ this.selectionService = selectionService;
28319
+ this.recordClick = new EventEmitter();
28320
+ this.records$ = this.searchFacade.results$;
28321
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28322
+ }
28323
+ dateToString(date) {
28324
+ return date?.toLocaleDateString(undefined, {
28325
+ year: 'numeric',
28326
+ month: 'long',
28327
+ day: 'numeric',
28328
+ timeZone: 'UTC',
28329
+ });
28330
+ }
28331
+ getStatus(isPublishedToAll) {
28332
+ return isPublishedToAll ? 'published' : 'not published';
28333
+ }
28334
+ getRecordFormats(record) {
28335
+ if (record.kind === 'service' || !('distributions' in record)) {
28336
+ return [];
28337
+ }
28338
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28339
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28340
+ return formats;
28341
+ }
28342
+ formatUserInfo(userInfo) {
28343
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28344
+ if (infos && infos.length === 4) {
28345
+ return `${infos[2]} ${infos[1]}`;
28346
+ }
28347
+ return undefined;
28348
+ }
28349
+ getBadgeColor(format) {
28350
+ return getBadgeColor(format);
28351
+ }
28352
+ handleRecordClick(item) {
28353
+ this.recordClick.emit(item);
28354
+ }
28355
+ setSortBy(col, order) {
28356
+ this.searchService.setSortBy([order, col]);
28357
+ }
28358
+ isSortedBy(col) {
28359
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28360
+ const sortArray = Array.isArray(sortOrder[0])
28361
+ ? sortOrder
28362
+ : [sortOrder];
28363
+ for (const sort of sortArray) {
28364
+ if (sort[1] === col) {
28365
+ return sort[0];
28366
+ }
28367
+ }
28368
+ return null;
28369
+ }));
28370
+ }
28371
+ isChecked(record) {
28372
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28373
+ return selectedRecords.includes(record.uniqueIdentifier);
28374
+ }));
28375
+ }
28376
+ handleRecordSelectedChange(selected, record) {
28377
+ if (!selected) {
28378
+ this.selectionService.deselectRecords([record]);
28379
+ }
28380
+ else {
28381
+ this.selectionService.selectRecords([record]);
28382
+ }
28383
+ }
28384
+ async toggleSelectAll() {
28385
+ const records = await firstValueFrom(this.records$);
28386
+ if (await firstValueFrom(this.isAllSelected())) {
28387
+ this.selectionService.deselectRecords(records);
28388
+ }
28389
+ else {
28390
+ this.selectionService.selectRecords(records);
28391
+ }
28392
+ }
28393
+ isAllSelected() {
28394
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28395
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28396
+ }));
28397
+ }
28398
+ isSomeSelected() {
28399
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28400
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28401
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28402
+ return !allSelected && someSelected;
28403
+ }));
28404
+ }
28405
+ 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 }); }
28406
+ 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"] }] }); }
28407
+ }
28408
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28409
+ type: Component,
28410
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28411
+ CommonModule,
28412
+ UiInputsModule,
28413
+ InteractiveTableComponent,
28414
+ InteractiveTableColumnComponent,
28415
+ MatIconModule,
28416
+ TranslateModule,
28417
+ ], 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" }]
28418
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28419
+ type: Output
28420
+ }] } });
28421
+
28211
28422
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28212
28423
  get mapLinks() {
28213
28424
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28242,7 +28453,7 @@ class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28242
28453
  return getLinkLabel(link);
28243
28454
  }
28244
28455
  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 }); }
28245
- 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 }); }
28456
+ 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 }); }
28246
28457
  }
28247
28458
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerRecordPreviewComponent, decorators: [{
28248
28459
  type: Component,
@@ -28337,6 +28548,105 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28337
28548
  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" }]
28338
28549
  }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28339
28550
 
28551
+ const INVALID_FILE_FORMAT_ERROR_MESSAGE = 'Invalid file format';
28552
+ class AddLayerFromFileComponent {
28553
+ constructor(mapFacade, changeDetectorRef) {
28554
+ this.mapFacade = mapFacade;
28555
+ this.changeDetectorRef = changeDetectorRef;
28556
+ this.errorMessage = null;
28557
+ this.successMessage = null;
28558
+ this.loading = false;
28559
+ this.acceptedMimeType = ['.geojson'];
28560
+ this.maxFileSize = 5000000;
28561
+ }
28562
+ async handleFileChange(file) {
28563
+ if (!file) {
28564
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28565
+ return;
28566
+ }
28567
+ if (file.size > this.maxFileSize) {
28568
+ this.displayMessage('File size exceeds the limit of 5MB', 'error');
28569
+ return;
28570
+ }
28571
+ await this.addLayer(file);
28572
+ }
28573
+ async addLayer(file) {
28574
+ this.errorMessage = null;
28575
+ this.loading = true;
28576
+ try {
28577
+ if (!this.isFileFormatValid(file)) {
28578
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28579
+ return;
28580
+ }
28581
+ const fileExtension = this.getFileExtension(file);
28582
+ switch (fileExtension) {
28583
+ case 'geojson':
28584
+ await this.addGeoJsonLayer(file);
28585
+ break;
28586
+ default:
28587
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28588
+ break;
28589
+ }
28590
+ }
28591
+ catch (error) {
28592
+ const err = error;
28593
+ this.displayMessage('Error loading file: ' + err.message, 'error');
28594
+ }
28595
+ finally {
28596
+ this.loading = false;
28597
+ }
28598
+ }
28599
+ addGeoJsonLayer(file) {
28600
+ return new Promise((resolve, reject) => {
28601
+ try {
28602
+ const reader = new FileReader();
28603
+ reader.onload = () => {
28604
+ const result = reader.result;
28605
+ const title = file.name.split('.').slice(0, -1).join('.');
28606
+ const layerToAdd = {
28607
+ type: 'geojson',
28608
+ data: result,
28609
+ };
28610
+ this.mapFacade.addLayer({ ...layerToAdd, title: title });
28611
+ this.displayMessage('File successfully added to map', 'success');
28612
+ resolve();
28613
+ };
28614
+ reader.onerror = reject;
28615
+ reader.readAsText(file);
28616
+ }
28617
+ catch (error) {
28618
+ reject(error);
28619
+ }
28620
+ });
28621
+ }
28622
+ isFileFormatValid(file) {
28623
+ const fileExtension = this.getFileExtension(file);
28624
+ return this.acceptedMimeType.includes(`.${fileExtension}`);
28625
+ }
28626
+ getFileExtension(file) {
28627
+ return file.name.split('.').pop();
28628
+ }
28629
+ displayMessage(message, type) {
28630
+ if (type === 'success') {
28631
+ this.successMessage = message;
28632
+ }
28633
+ else if (type === 'error') {
28634
+ this.errorMessage = message;
28635
+ }
28636
+ setTimeout(() => {
28637
+ this.successMessage = null;
28638
+ this.errorMessage = null;
28639
+ this.changeDetectorRef.detectChanges();
28640
+ }, 5000);
28641
+ }
28642
+ 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 }); }
28643
+ 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" }] }); }
28644
+ }
28645
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, decorators: [{
28646
+ type: Component,
28647
+ 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" }]
28648
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28649
+
28340
28650
  class AddLayerFromWfsComponent {
28341
28651
  constructor(mapFacade, changeDetectorRef) {
28342
28652
  this.mapFacade = mapFacade;
@@ -28398,11 +28708,11 @@ class LayersPanelComponent {
28398
28708
  this.mapFacade.removeLayer(index);
28399
28709
  }
28400
28710
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
28401
- 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 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: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { 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 }); }
28711
+ 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 }); }
28402
28712
  }
28403
28713
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
28404
28714
  type: Component,
28405
- 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 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" }]
28715
+ 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" }]
28406
28716
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28407
28717
 
28408
28718
  class MapEffects {
@@ -28435,6 +28745,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28435
28745
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28436
28746
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28437
28747
 
28748
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28749
+ class GeocodingService {
28750
+ constructor(provider) {
28751
+ this.provider = provider;
28752
+ }
28753
+ query(text) {
28754
+ let queryObservable;
28755
+ switch (this.provider[0]) {
28756
+ case 'geoadmin':
28757
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28758
+ break;
28759
+ case 'geonames':
28760
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28761
+ break;
28762
+ case 'data-gouv-fr':
28763
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28764
+ break;
28765
+ default:
28766
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28767
+ }
28768
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28769
+ }
28770
+ 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 }); }
28771
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28772
+ }
28773
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28774
+ type: Injectable,
28775
+ args: [{
28776
+ providedIn: 'root',
28777
+ }]
28778
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28779
+ type: Inject,
28780
+ args: [GEOCODING_PROVIDER]
28781
+ }] }]; } });
28782
+
28783
+ class GeocodingComponent {
28784
+ constructor(mapManager, geocodingService) {
28785
+ this.mapManager = mapManager;
28786
+ this.geocodingService = geocodingService;
28787
+ this.searchText = '';
28788
+ this.results = [];
28789
+ this.searchTextChanged = new Subject();
28790
+ this.destroy$ = new Subject();
28791
+ this.errorMessage = null;
28792
+ this.searchTextChanged
28793
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28794
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28795
+ this.errorMessage =
28796
+ 'An error occurred while searching. Please try again.';
28797
+ console.error(error);
28798
+ return [];
28799
+ }));
28800
+ }), takeUntil(this.destroy$))
28801
+ .subscribe((results) => {
28802
+ this.results = results;
28803
+ });
28804
+ }
28805
+ ngOnDestroy() {
28806
+ this.destroy$.next();
28807
+ this.destroy$.complete();
28808
+ }
28809
+ onSearchChange(searchText) {
28810
+ if (!searchText) {
28811
+ this.clearSearch();
28812
+ return;
28813
+ }
28814
+ else {
28815
+ this.searchTextChanged.next(searchText);
28816
+ }
28817
+ }
28818
+ clearSearch() {
28819
+ this.searchText = '';
28820
+ this.results = [];
28821
+ this.errorMessage = null;
28822
+ }
28823
+ zoomToLocation(result) {
28824
+ const map = this.mapManager.map;
28825
+ const view = map.getView();
28826
+ const geometry = result.geom;
28827
+ if (geometry.type === 'Point') {
28828
+ this.zoomToPoint(geometry.coordinates, view);
28829
+ }
28830
+ else if (geometry.type === 'Polygon') {
28831
+ this.zoomToPolygon(geometry.coordinates, view);
28832
+ }
28833
+ else {
28834
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28835
+ }
28836
+ }
28837
+ zoomToPoint(pointCoords, view) {
28838
+ const transformedCoords = fromLonLat(pointCoords);
28839
+ view.setCenter(transformedCoords);
28840
+ view.setZoom(12);
28841
+ }
28842
+ zoomToPolygon(polygonCoords, view) {
28843
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28844
+ const polygon = new Polygon([transformedCoords]);
28845
+ view.fit(polygon, {
28846
+ duration: 100,
28847
+ maxZoom: 12,
28848
+ });
28849
+ }
28850
+ onEnterPress() {
28851
+ if (this.results && this.results.length > 0) {
28852
+ this.zoomToLocation(this.results[0]);
28853
+ }
28854
+ }
28855
+ 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 }); }
28856
+ 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" }] }); }
28857
+ }
28858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28859
+ type: Component,
28860
+ 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" }]
28861
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28862
+
28438
28863
  class FeatureMapModule {
28439
28864
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28440
28865
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28444,7 +28869,9 @@ class FeatureMapModule {
28444
28869
  MapContainerComponent,
28445
28870
  AddLayerRecordPreviewComponent,
28446
28871
  AddLayerFromWmsComponent,
28447
- AddLayerFromWfsComponent], imports: [CommonModule,
28872
+ AddLayerFromFileComponent,
28873
+ AddLayerFromWfsComponent,
28874
+ GeocodingComponent], imports: [CommonModule,
28448
28875
  UiMapModule,
28449
28876
  UiLayoutModule,
28450
28877
  MatIconModule,
@@ -28455,13 +28882,18 @@ class FeatureMapModule {
28455
28882
  MapInstanceDirective,
28456
28883
  LayersPanelComponent,
28457
28884
  AddLayerFromCatalogComponent,
28458
- MapContainerComponent] }); }
28885
+ MapContainerComponent,
28886
+ GeocodingComponent] }); }
28459
28887
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28460
28888
  {
28461
28889
  provide: FEATURE_MAP_OPTIONS,
28462
28890
  useValue: defaultMapOptions,
28463
28891
  },
28464
28892
  MapFacade,
28893
+ {
28894
+ provide: GEOCODING_PROVIDER,
28895
+ useValue: ['geonames', { maxRows: 5 }],
28896
+ },
28465
28897
  ], imports: [CommonModule,
28466
28898
  UiMapModule,
28467
28899
  UiLayoutModule,
@@ -28485,7 +28917,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28485
28917
  MapContainerComponent,
28486
28918
  AddLayerRecordPreviewComponent,
28487
28919
  AddLayerFromWmsComponent,
28920
+ AddLayerFromFileComponent,
28488
28921
  AddLayerFromWfsComponent,
28922
+ GeocodingComponent,
28489
28923
  ],
28490
28924
  exports: [
28491
28925
  MapContextComponent,
@@ -28493,6 +28927,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28493
28927
  LayersPanelComponent,
28494
28928
  AddLayerFromCatalogComponent,
28495
28929
  MapContainerComponent,
28930
+ GeocodingComponent,
28496
28931
  ],
28497
28932
  imports: [
28498
28933
  CommonModule,
@@ -28513,6 +28948,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28513
28948
  useValue: defaultMapOptions,
28514
28949
  },
28515
28950
  MapFacade,
28951
+ {
28952
+ provide: GEOCODING_PROVIDER,
28953
+ useValue: ['geonames', { maxRows: 5 }],
28954
+ },
28516
28955
  ],
28517
28956
  }]
28518
28957
  }] });
@@ -28607,7 +29046,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28607
29046
  ...state,
28608
29047
  chartConfig,
28609
29048
  })), on(close, (state) => {
28610
- // eslint-disable-next-line
29049
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28611
29050
  const { metadata, related, ...stateWithoutMd } = state;
28612
29051
  return stateWithoutMd;
28613
29052
  }));
@@ -29874,15 +30313,16 @@ class DataService {
29874
30313
  // Pour DL toutes les données
29875
30314
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
29876
30315
  ...wfsLink,
30316
+ type: 'download',
29877
30317
  url: new URL(urls[format]),
29878
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30318
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29879
30319
  }))));
29880
30320
  }
29881
30321
  getDownloadLinksFromEsriRest(esriRestLink) {
29882
30322
  return ['json', 'geojson'].map((format) => ({
29883
30323
  ...esriRestLink,
29884
30324
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
29885
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30325
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29886
30326
  }));
29887
30327
  }
29888
30328
  readAsGeoJson(link) {
@@ -30276,12 +30716,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30276
30716
  }] } });
30277
30717
 
30278
30718
  class MapViewComponent {
30279
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30719
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30280
30720
  this.mdViewFacade = mdViewFacade;
30281
30721
  this.mapManager = mapManager;
30282
30722
  this.mapUtils = mapUtils;
30283
30723
  this.dataService = dataService;
30284
- this.proxy = proxy;
30285
30724
  this.featureInfo = featureInfo;
30286
30725
  this.changeRef = changeRef;
30287
30726
  this.styleService = styleService;
@@ -30316,7 +30755,7 @@ class MapViewComponent {
30316
30755
  return of([]);
30317
30756
  }), finalize(() => (this.loading = false)));
30318
30757
  }));
30319
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30758
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30320
30759
  console.warn(error); // FIXME: report this to the user somehow
30321
30760
  return of(undefined);
30322
30761
  }), map$1((extent) => ({
@@ -30324,7 +30763,18 @@ class MapViewComponent {
30324
30763
  view: {
30325
30764
  extent,
30326
30765
  },
30327
- })), tap$1(() => this.resetSelection()))));
30766
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30767
+ if (context.view.extent)
30768
+ return context;
30769
+ const extent = this.mapUtils.getRecordExtent(metadata);
30770
+ return {
30771
+ ...context,
30772
+ view: {
30773
+ ...context.view,
30774
+ extent,
30775
+ },
30776
+ };
30777
+ }));
30328
30778
  }
30329
30779
  ngOnDestroy() {
30330
30780
  this.subscription.unsubscribe();
@@ -30377,13 +30827,13 @@ class MapViewComponent {
30377
30827
  selectLinkToDisplay(link) {
30378
30828
  this.selectedLinkIndex$.next(link);
30379
30829
  }
30380
- 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 }); }
30830
+ 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 }); }
30381
30831
  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 }); }
30382
30832
  }
30383
30833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30384
30834
  type: Component,
30385
30835
  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" }]
30386
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30836
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30387
30837
 
30388
30838
  class DataViewComponent {
30389
30839
  constructor(mdViewFacade) {
@@ -30466,7 +30916,7 @@ class OrganisationPreviewComponent {
30466
30916
  this.clickedOrganisation.emit(this.organisation);
30467
30917
  }
30468
30918
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30469
- 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 }); }
30919
+ 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 }); }
30470
30920
  }
30471
30921
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, decorators: [{
30472
30922
  type: Component,
@@ -30550,11 +31000,11 @@ class LanguageSwitcherComponent {
30550
31000
  this.translate.use(value);
30551
31001
  }
30552
31002
  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 }); }
30553
- 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"] }] }); }
31003
+ 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 !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"] }] }); }
30554
31004
  }
30555
31005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30556
31006
  type: Component,
30557
- 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" }]
31007
+ 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 !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
30558
31008
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30559
31009
  type: Optional
30560
31010
  }, {
@@ -30835,13 +31285,6 @@ class MyOrgService {
30835
31285
  constructor(platformService, orgService) {
30836
31286
  this.platformService = platformService;
30837
31287
  this.orgService = orgService;
30838
- this.myOrgDataSubject = new BehaviorSubject({
30839
- orgName: '',
30840
- logoUrl: '',
30841
- recordCount: 0,
30842
- userCount: 0,
30843
- userList: [],
30844
- });
30845
31288
  this.myOrgData$ = combineLatest([
30846
31289
  this.platformService.getMe(),
30847
31290
  this.platformService.getUsers(),
@@ -30860,7 +31303,7 @@ class MyOrgService {
30860
31303
  userList,
30861
31304
  userCount,
30862
31305
  };
30863
- }));
31306
+ }), shareReplay(1));
30864
31307
  }
30865
31308
  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 }); }
30866
31309
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31553,11 +31996,11 @@ class RecordFormComponent {
31553
31996
  return field.config.model;
31554
31997
  }
31555
31998
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31556
- 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 }); }
31999
+ 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 }); }
31557
32000
  }
31558
32001
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31559
32002
  type: Component,
31560
- 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" }]
32003
+ 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" }]
31561
32004
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31562
32005
 
31563
32006
  const ROUTER_STATE_KEY = 'router';
@@ -31925,5 +32368,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31925
32368
  * Generated bundle index. Do not edit.
31926
32369
  */
31927
32370
 
31928
- 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, MarkdownParserComponent, 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, WFS_MAX_FEATURES, 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 };
32371
+ 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, mapKeywords, 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 };
31929
32372
  //# sourceMappingURL=geonetwork-ui.mjs.map