geonetwork-ui 2.2.0-dev.3678ce55 → 2.2.0-dev.37255b6f

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 (341) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +36 -2
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +2 -1
  4. package/esm2022/libs/api/repository/src/index.mjs +2 -1
  5. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  6. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  8. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  9. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  10. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  12. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  13. package/esm2022/libs/feature/auth/src/lib/feature-auth.module.mjs +2 -2
  14. package/esm2022/libs/feature/catalog/src/lib/feature-catalog.module.mjs +2 -2
  15. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  16. package/esm2022/libs/feature/catalog/src/lib/organisations/organisations.component.mjs +4 -15
  17. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  18. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  19. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  20. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +1 -1
  21. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +106 -0
  22. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +64 -0
  23. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +63 -0
  24. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  25. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  26. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +26 -3
  27. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  28. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  29. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +6 -3
  30. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +3 -1
  31. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  32. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  33. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  34. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  35. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  36. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +9 -6
  37. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +3 -7
  38. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  39. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  40. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  41. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  42. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +3 -3
  43. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  44. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +8 -6
  45. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  46. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +2 -2
  47. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +4 -4
  48. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +1 -1
  49. package/esm2022/libs/ui/elements/src/index.mjs +4 -1
  50. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  51. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +27 -0
  52. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +17 -0
  53. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +10 -3
  54. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +12 -6
  55. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +3 -3
  56. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +7 -3
  57. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +15 -3
  58. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  59. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  60. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  61. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  62. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +8 -5
  63. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  64. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  65. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +2 -2
  66. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +8 -3
  67. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  68. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  69. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  70. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  71. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  72. package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +1 -1
  73. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +1 -1
  74. package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +1 -1
  75. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +1 -1
  76. package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +1 -1
  77. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  78. package/esm2022/libs/util/i18n/src/index.mjs +2 -2
  79. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  80. package/esm2022/libs/util/shared/src/lib/utils/fuzzy-filter.mjs +27 -0
  81. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  82. package/esm2022/translations/de.json +104 -88
  83. package/esm2022/translations/en.json +40 -24
  84. package/esm2022/translations/es.json +19 -3
  85. package/esm2022/translations/fr.json +24 -8
  86. package/esm2022/translations/it.json +31 -15
  87. package/esm2022/translations/nl.json +19 -3
  88. package/esm2022/translations/pt.json +19 -3
  89. package/fesm2022/geonetwork-ui.mjs +1163 -644
  90. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  91. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  92. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  93. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  94. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  95. package/libs/api/repository/src/index.d.ts +1 -0
  96. package/libs/api/repository/src/index.d.ts.map +1 -1
  97. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  98. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  99. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  100. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  101. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +10 -5
  102. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  103. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  104. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  105. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  106. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  107. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  108. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  109. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  110. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  111. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  112. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  113. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  114. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  115. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts +0 -1
  116. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts.map +1 -1
  117. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  118. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  119. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  120. package/libs/feature/map/src/index.d.ts +1 -0
  121. package/libs/feature/map/src/index.d.ts.map +1 -1
  122. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +22 -0
  123. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -0
  124. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +22 -0
  125. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -0
  126. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +22 -0
  127. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -0
  128. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  129. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  130. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  131. package/libs/feature/map/src/lib/feature-map.module.d.ts +16 -12
  132. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  133. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  134. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  135. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  136. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  137. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  138. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  139. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  140. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  141. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  142. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  143. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  144. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  145. package/libs/feature/search/src/index.d.ts +3 -0
  146. package/libs/feature/search/src/index.d.ts.map +1 -1
  147. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +6 -5
  148. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  149. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  150. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  151. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  152. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  153. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  154. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  155. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  156. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  157. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  158. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  159. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  160. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  161. package/libs/feature/search/src/lib/state/effects.d.ts +1 -1
  162. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  163. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  164. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  165. package/libs/feature/search/src/lib/utils/service/fields.d.ts +1 -1
  166. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  167. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  168. package/libs/ui/elements/src/index.d.ts +3 -0
  169. package/libs/ui/elements/src/index.d.ts.map +1 -1
  170. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  171. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +10 -0
  172. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -0
  173. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +8 -0
  174. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -0
  175. package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts +1 -0
  176. package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts.map +1 -1
  177. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +1 -0
  178. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  179. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +3 -2
  180. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  181. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -11
  182. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  183. package/libs/ui/inputs/src/index.d.ts +1 -0
  184. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  185. package/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.d.ts.map +1 -1
  186. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  187. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  188. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  189. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  190. package/libs/ui/layout/src/index.d.ts +2 -0
  191. package/libs/ui/layout/src/index.d.ts.map +1 -1
  192. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  193. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  194. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  195. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  196. package/libs/ui/search/src/index.d.ts +0 -1
  197. package/libs/ui/search/src/index.d.ts.map +1 -1
  198. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  199. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  200. package/libs/util/i18n/src/index.d.ts +1 -1
  201. package/libs/util/i18n/src/index.d.ts.map +1 -1
  202. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  203. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  204. package/libs/util/shared/src/lib/utils/fuzzy-filter.d.ts +9 -0
  205. package/libs/util/shared/src/lib/utils/fuzzy-filter.d.ts.map +1 -0
  206. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  207. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  208. package/package.json +4 -1
  209. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  210. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +43 -0
  211. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +1 -0
  212. package/src/libs/api/repository/src/index.ts +1 -0
  213. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  214. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  215. package/src/libs/common/domain/src/lib/index.ts +2 -0
  216. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +12 -7
  217. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  218. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  219. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  220. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  221. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  222. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  223. package/src/libs/feature/auth/src/lib/feature-auth.module.ts +1 -1
  224. package/src/libs/feature/catalog/src/lib/feature-catalog.module.ts +1 -1
  225. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  226. package/src/libs/feature/catalog/src/lib/organisations/organisations.component.ts +3 -17
  227. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  228. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  229. package/src/libs/feature/map/src/index.ts +1 -0
  230. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.css +0 -0
  231. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +21 -0
  232. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +107 -0
  233. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.css +0 -0
  234. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +37 -0
  235. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +64 -0
  236. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.css +0 -0
  237. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +55 -0
  238. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +63 -0
  239. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  240. package/src/libs/feature/map/src/lib/feature-map.module.ts +14 -0
  241. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  242. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  243. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  244. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  245. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +9 -3
  246. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +6 -0
  247. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  248. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  249. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  250. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  251. package/src/libs/feature/search/src/index.ts +3 -0
  252. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +12 -4
  253. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +3 -5
  254. package/src/libs/feature/search/src/lib/feature-search.module.ts +2 -11
  255. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  256. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  257. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  258. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  259. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  260. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  261. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  262. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  263. package/src/libs/feature/search/src/lib/state/effects.ts +6 -5
  264. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  265. package/src/libs/feature/search/src/lib/utils/service/fields.ts +1 -1
  266. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -0
  267. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.ts +1 -1
  268. package/src/libs/ui/elements/src/index.ts +3 -0
  269. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  270. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +0 -0
  271. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +30 -0
  272. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
  273. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +264 -0
  274. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.html +1 -0
  275. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +16 -0
  276. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +93 -27
  277. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.ts +7 -0
  278. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +4 -0
  279. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +59 -32
  280. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +5 -0
  281. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  282. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +4 -0
  283. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +7 -0
  284. package/src/libs/ui/inputs/src/index.ts +1 -0
  285. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  286. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  287. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  288. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  289. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.ts +7 -4
  290. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  291. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +8 -3
  292. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.css +1 -0
  293. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  294. package/src/libs/ui/layout/src/index.ts +2 -0
  295. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  296. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  297. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  298. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  299. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  300. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  301. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  302. package/src/libs/ui/search/src/index.ts +0 -1
  303. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  304. package/src/libs/util/i18n/src/index.ts +1 -1
  305. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  306. package/src/libs/util/shared/src/lib/utils/fuzzy-filter.ts +32 -0
  307. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  308. package/translations/de.json +104 -88
  309. package/translations/en.json +40 -24
  310. package/translations/es.json +19 -3
  311. package/translations/fr.json +24 -8
  312. package/translations/it.json +31 -15
  313. package/translations/nl.json +19 -3
  314. package/translations/pt.json +19 -3
  315. package/translations/sk.json +19 -3
  316. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  317. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  318. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  319. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  320. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  321. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  322. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  323. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  324. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  325. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  326. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  327. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  328. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  329. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  330. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  331. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  332. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  333. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  334. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  335. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  336. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  337. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  338. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  339. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  340. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  341. /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
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';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, tap as tap$2, fromEvent, timer, from, Subscription, animationFrameScheduler, firstValueFrom, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, EMPTY, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, from, Subscription, animationFrameScheduler, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
18
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
@@ -32,8 +32,8 @@ import WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';
32
32
  import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
33
33
  import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
34
34
  import WMTSCapabilities from 'ol/format/WMTSCapabilities';
35
- import { WmsEndpoint, sharedFetch, useCache, WfsEndpoint } from '@camptocamp/ogc-client';
36
35
  import chroma from 'chroma-js';
36
+ import { WmsEndpoint, WfsEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
37
37
  import { register, fromEPSGCode } from 'ol/proj/proj4';
38
38
  import proj4 from 'proj4/dist/proj4';
39
39
  import * as TOML from '@ltd/j-toml';
@@ -58,6 +58,7 @@ import * as i1$4 from '@angular/material/progress-spinner';
58
58
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
59
59
  import * as i3 from '@angular/material/tooltip';
60
60
  import { MatTooltipModule } from '@angular/material/tooltip';
61
+ import { marked } from 'marked';
61
62
  import EmblaCarousel from 'embla-carousel';
62
63
  import * as i1$6 from '@angular/cdk/overlay';
63
64
  import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
@@ -72,10 +73,13 @@ import { MatFormFieldModule } from '@angular/material/form-field';
72
73
  import * as i3$2 from '@angular/material/datepicker';
73
74
  import { MatDatepickerModule } from '@angular/material/datepicker';
74
75
  import { MatInputModule } from '@angular/material/input';
76
+ import * as basicLightbox from 'basiclightbox';
75
77
  import * as i1$8 from '@ngrx/effects';
76
78
  import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
77
79
  import tippy from 'tippy.js';
78
80
  import { valid as valid$1 } from 'geojson-validation';
81
+ import { Polygon } from 'ol/geom';
82
+ import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
79
83
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
80
84
  import * as i4$1 from '@angular/cdk/scrolling';
81
85
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -1412,6 +1416,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1412
1416
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1413
1417
  const toDate = (field) => new Date(field);
1414
1418
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1419
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1415
1420
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1416
1421
  const getAsUrl = (field, location = window.location.toString()) => {
1417
1422
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -16538,133 +16543,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16538
16543
  }]
16539
16544
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16540
16545
 
16541
- // IMPORTANT:
16542
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/test-translate-loader.service.ts
16543
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16544
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16545
- class TestTranslateLoader extends TranslateLoader {
16546
- constructor(_translations = {}) {
16547
- super();
16548
- this._translations = _translations;
16549
- }
16550
- /**
16551
- * Returns an {Observable} of translations for the specified language. If the
16552
- * language is not recognized, an empty translations object will be returned.
16553
- *
16554
- * @param language the language for which the translations should be retrieved.
16555
- * @returns the translations for the specified
16556
- * language or an empty set of translations if the language is not recognized.
16557
- */
16558
- getTranslation(language) {
16559
- return of(this._translations[language] || {});
16560
- }
16561
- }
16562
-
16563
- // IMPORTANT:
16564
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/testing.module.ts
16565
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16566
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16567
- /**
16568
- * The TranslateTestingModule provides the {TranslateModule} as well as a
16569
- * {TranslateService} configured to return translations specific for the
16570
- * test environment.
16571
- *
16572
- * @export
16573
- */
16574
- class TranslateTestingModule {
16575
- constructor() {
16576
- this._translations = {};
16577
- }
16578
- static withTranslations(languageOrTranslations, translations) {
16579
- const translateTestingModule = new TranslateTestingModule();
16580
- if (typeof languageOrTranslations === 'string') {
16581
- return translateTestingModule.withTranslations(languageOrTranslations, translations);
16582
- }
16583
- return translateTestingModule.withTranslations(languageOrTranslations);
16584
- }
16585
- get ngModule() {
16586
- return TranslateTestingModule;
16587
- }
16588
- get providers() {
16589
- const translateService = new TranslateService(null, new TestTranslateLoader(this._translations), this._compiler || new TranslateFakeCompiler(), new TranslateDefaultParser(), new FakeMissingTranslationHandler(), true, true, false, this._defaultLanguage);
16590
- return [
16591
- {
16592
- provide: TranslateService,
16593
- useValue: translateService,
16594
- },
16595
- ];
16596
- }
16597
- withTranslations(languageOrTranslations, translations) {
16598
- if (typeof languageOrTranslations === 'string' && translations) {
16599
- this.addTranslations(languageOrTranslations, translations);
16600
- this._defaultLanguage = languageOrTranslations;
16601
- }
16602
- else if (languageOrTranslations) {
16603
- Object.keys(languageOrTranslations).forEach((language) => this.addTranslations(language, languageOrTranslations[language]));
16604
- }
16605
- return this;
16606
- }
16607
- /**
16608
- * Updates the {TranslationTestingModule} to provide a {TranslateService} that will
16609
- * use the provided {TranslateCompiler} to translate the test translations.
16610
- *
16611
- * @example
16612
- *
16613
- * TranslateTestingModule.withTranslations('en', {people: '{gender, select, male{He is} female{She is} other{They are}} {how})'})
16614
- * .withCompiler(new TranslateMessageFormatCompiler());
16615
- *
16616
- * @param compiler the compiler to use to compile the test translations.
16617
- * @returns the instance that can be used to chain additional configuration.
16618
- * @memberof TranslateTestingModule
16619
- */
16620
- withCompiler(compiler) {
16621
- this._compiler = compiler;
16622
- return this;
16623
- }
16624
- /**
16625
- * Updates the {TranslateTestingModule} to use the provided language as the default language.
16626
- * By default, the default language will be set to the first language provided.
16627
- *
16628
- * @example
16629
- *
16630
- * TranslateTestingModule.withTranslations('es', SPANISH_TRANSLATIONS)
16631
- * .withTranslations('en', ENGLISH_TRANSLATIONS)
16632
- * .withDefaultLanguage('en');
16633
- *
16634
- * @param language the new default language for translations.
16635
- * @returns the instance that can be used to chain additional configuration.
16636
- * @memberof TranslateTestingModule
16637
- */
16638
- withDefaultLanguage(language) {
16639
- this._defaultLanguage = language || this._defaultLanguage;
16640
- return this;
16641
- }
16642
- addTranslations(language, translations) {
16643
- if (!this._defaultLanguage) {
16644
- this._defaultLanguage = language;
16645
- }
16646
- if (this._translations[language]) {
16647
- this._translations[language] = {
16648
- ...this._translations[language],
16649
- ...translations,
16650
- };
16651
- }
16652
- else {
16653
- this._translations[language] = translations;
16654
- }
16655
- }
16656
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16657
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule], exports: [TranslateModule] }); }
16658
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule, TranslateModule] }); }
16659
- }
16660
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, decorators: [{
16661
- type: NgModule,
16662
- args: [{
16663
- imports: [TranslateModule],
16664
- exports: [TranslateModule],
16665
- }]
16666
- }] });
16667
-
16668
16546
  var dropFile$6 = "Datei ablegen";
16669
16547
  var next$6 = "weiter";
16670
16548
  var previous$6 = "zurück";
@@ -16687,20 +16565,21 @@ var de = {
16687
16565
  "chart.type.line": "Liniendiagramm",
16688
16566
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16689
16567
  "chart.type.pie": "Kreisdiagramm",
16690
- "dashboard.labels.mySpace": "",
16691
- "dashboard.records.all": "",
16692
- "dashboard.records.myDraft": "",
16693
- "dashboard.records.myLibrary": "",
16694
- "dashboard.records.myOrg": "",
16695
- "dashboard.records.myRecords": "",
16696
- "dashboard.records.noRecord": "",
16697
- "dashboard.records.noUser": "",
16698
- "dashboard.records.publishedRecords": "",
16699
- "dashboard.records.search": "",
16700
- "dashboard.records.userDetail": "",
16701
- "dashboard.records.userEmail": "",
16702
- "dashboard.records.username": "",
16703
- "dashboard.records.users": "",
16568
+ "dashboard.createRecord": "",
16569
+ "dashboard.labels.mySpace": "Mein Bereich",
16570
+ "dashboard.records.all": "Katalog",
16571
+ "dashboard.records.myDraft": "Meine Entwürfe",
16572
+ "dashboard.records.myLibrary": "Meine Bibliothek",
16573
+ "dashboard.records.myOrg": "Meine Organisation",
16574
+ "dashboard.records.myRecords": "Meine Datensätze",
16575
+ "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16576
+ "dashboard.records.search": "Suche nach \"{searchText}\"",
16577
+ "dashboard.records.userDetail": "Name",
16578
+ "dashboard.records.userEmail": "E-Mail",
16579
+ "dashboard.records.username": "Benutzername",
16580
+ "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16581
+ "dashboard.results.listMetadata": "",
16582
+ "dashboard.results.listResources": "",
16704
16583
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16705
16584
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16706
16585
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16714,7 +16593,7 @@ var de = {
16714
16593
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
16715
16594
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
16716
16595
  "datafeeder.form.dropdown": "Für welche Skala wurde er erstellt?",
16717
- "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tags aus, die zu Ihrem Datensatz passen",
16596
+ "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tage aus, die zu Ihrem Datensatz passen",
16718
16597
  "datafeeder.form.title": "Geben Sie Ihrem Datensatz den besten Titel",
16719
16598
  "datafeeder.formsPage.title": "Erzählen Sie uns mehr über Ihren Datensatz",
16720
16599
  "datafeeder.month.april": "April",
@@ -16729,16 +16608,16 @@ var de = {
16729
16608
  "datafeeder.month.november": "November",
16730
16609
  "datafeeder.month.october": "Oktober",
16731
16610
  "datafeeder.month.september": "September",
16732
- "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist",
16733
- "datafeeder.publish.illustration.title": "Ein weiterer Datensatz zum Veröffentlichen?",
16611
+ "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist.",
16612
+ "datafeeder.publish.illustration.title": "Ein weiterer Datensatz \n zum Veröffentlichen?",
16734
16613
  "datafeeder.publish.subtitle": "Das Veröffentlichen kann einige Minuten dauern.",
16735
- "datafeeder.publish.title": "Vielen Dank! Ihr Datensatz wird veröffentlicht",
16614
+ "datafeeder.publish.title": "Vielen Dank! \n Ihr Datensatz wird veröffentlicht",
16736
16615
  "datafeeder.publish.upload": "Jetzt hochladen",
16737
16616
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
16738
16617
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
16739
16618
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
16740
16619
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
16741
- "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! Ihr Datensatz wurde veröffentlicht",
16620
+ "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
16742
16621
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
16743
16622
  "datafeeder.summarizePage.illustration": "Kein Fehler? Los geht's!",
16744
16623
  "datafeeder.summarizePage.previous": "Zurück",
@@ -16746,11 +16625,11 @@ var de = {
16746
16625
  "datafeeder.summarizePage.title": "Sie sind fast fertig...",
16747
16626
  "datafeeder.upload.acceptedFormats": "Akzeptierte Dateiformate:",
16748
16627
  "datafeeder.upload.checkboxLabel": "Ich besitze die Rechte zur Veröffentlichung dieses Datensatzes",
16749
- "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geospatialen Datensatz enthält",
16628
+ "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geografischen Datensatz enthält",
16750
16629
  "datafeeder.upload.error.subtitle.cantOpenFile": "Bitte überprüfen Sie, ob die Datei gültig ist",
16751
16630
  "datafeeder.upload.error.subtitle.fileFormat": "Beachten Sie: Nur SHP-Dateien",
16752
- "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximal {size} MB",
16753
- "datafeeder.upload.error.title.analysis": "Fehler bei der Datensatzanalyse",
16631
+ "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximale Dateigröße {size} MB",
16632
+ "datafeeder.upload.error.title.analysis": "Fehler während der Datensatzanalyse",
16754
16633
  "datafeeder.upload.error.title.cantOpenFile": "Fehler beim Öffnen der Datei",
16755
16634
  "datafeeder.upload.error.title.fileFormat": "Das ausgewählte Dateiformat wird nicht unterstützt",
16756
16635
  "datafeeder.upload.error.title.fileHasntSelected": "Keine Datei ausgewählt",
@@ -16758,19 +16637,19 @@ var de = {
16758
16637
  "datafeeder.upload.error.title.noRightsToSendData": "Sie dürfen diesen Datensatz nicht veröffentlichen",
16759
16638
  "datafeeder.upload.illustration.enrichment": "Anreicherung",
16760
16639
  "datafeeder.upload.illustration.import": "Import",
16761
- "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten war noch nie einfacher",
16640
+ "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten \n war noch nie so einfach",
16762
16641
  "datafeeder.upload.illustration.validation": "Validierung",
16763
- "datafeeder.upload.illustration.verification": "Verifizierung",
16642
+ "datafeeder.upload.illustration.verification": "Überprüfung",
16764
16643
  "datafeeder.upload.inputLabel": "Importieren Sie Ihre Datei",
16765
16644
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
16766
16645
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
16767
16646
  "datafeeder.upload.uploadButton": "Hochladen",
16768
- "datafeeder.validation.encoding": "Kodierung",
16647
+ "datafeeder.validation.encoding": "Codierung",
16769
16648
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
16770
16649
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
16771
16650
  "datafeeder.validation.projection": "Raumbezugssystem:",
16772
- "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem",
16773
- "datafeeder.validation.sample.title": "Und eine Beispieleinheit aus dem Datensatz",
16651
+ "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem aus",
16652
+ "datafeeder.validation.sample.title": "Und eine Beispielentität aus dem Datensatz",
16774
16653
  "datafeeder.wizard.emptyRequiredValuesMessage": "Bitte füllen Sie die obligatorischen Felder aus",
16775
16654
  "datafeeder.wizardSummarize.createdAt": "Erstellt am",
16776
16655
  "datafeeder.wizardSummarize.scale": "Maßstab",
@@ -16780,19 +16659,20 @@ var de = {
16780
16659
  "datahub.header.news": "Startseite",
16781
16660
  "datahub.header.organisations": "Organisationen",
16782
16661
  "datahub.header.popularRecords": "Die beliebtesten",
16783
- "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten von meiner Organisation</div>",
16784
- "datahub.news.contact.contactus": "",
16785
- "datahub.news.contact.html": "",
16786
- "datahub.news.contact.title": "",
16662
+ "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
16663
+ "datahub.news.contact.contactus": "Kontaktieren Sie uns",
16664
+ "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>",
16665
+ "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
16787
16666
  "datahub.news.feed": "Nachrichtenfeed",
16788
16667
  "datahub.news.figures": "Indikatoren",
16789
- "datahub.search.back": "Zurück zu den Ergebnissen",
16668
+ "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
16669
+ "datahub.search.back": "Zurück",
16790
16670
  "datahub.search.filter.all": "Alle",
16791
- "datahub.search.filter.generatedByWfs": "Generiert durch API",
16671
+ "datahub.search.filter.generatedByWfs": "Generiert durch eine API",
16792
16672
  "datahub.search.filter.others": "Andere",
16793
16673
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
16794
16674
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
16795
- "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht geparst werden: \"{ info }\"",
16675
+ "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
16796
16676
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
16797
16677
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
16798
16678
  "domain.record.status.completed": "Abgeschlossen",
@@ -16800,18 +16680,18 @@ var de = {
16800
16680
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
16801
16681
  "domain.record.status.removed": "Entfernt",
16802
16682
  "domain.record.status.under_development": "In Erstellung",
16803
- "domain.record.updateFrequency.asNeeded": "Bei Bedarf",
16804
- "domain.record.updateFrequency.continual": "Kontinuierlich",
16683
+ "domain.record.updateFrequency.asNeeded": "Nach Bedarf",
16684
+ "domain.record.updateFrequency.continual": "Fortlaufend",
16805
16685
  "domain.record.updateFrequency.day": "{count, plural, =0{0} one{Ein} other{{count}}} mal am Tag",
16806
- "domain.record.updateFrequency.irregular": "Unregelmässig",
16686
+ "domain.record.updateFrequency.irregular": "Unregelmäßig",
16807
16687
  "domain.record.updateFrequency.month": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Monat",
16808
16688
  "domain.record.updateFrequency.notPlanned": "Nicht geplant",
16809
- "domain.record.updateFrequency.periodic": "Regelmässig",
16689
+ "domain.record.updateFrequency.periodic": "Regelmäßig",
16810
16690
  "domain.record.updateFrequency.unknown": "Unbekannt",
16811
16691
  "domain.record.updateFrequency.week": "{count, plural, =0{0} one{Ein} other{{count}}} mal in der Woche",
16812
16692
  "domain.record.updateFrequency.year": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Jahr",
16813
16693
  "downloads.format.unknown": "unbekannt",
16814
- "downloads.wfs.featuretype.not.found": "Die Schicht wurde nicht gefunden",
16694
+ "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16815
16695
  dropFile: dropFile$6,
16816
16696
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16817
16697
  "facets.block.title.OrgForResource": "Organisation",
@@ -16846,10 +16726,18 @@ var de = {
16846
16726
  "map.add.layer.file": "Aus einer Datei",
16847
16727
  "map.add.layer.wfs": "Aus WFS",
16848
16728
  "map.add.layer.wms": "Aus WMS",
16729
+ "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16730
+ "map.geocoding.placeholder": "",
16731
+ "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16732
+ "map.layer.add": "Hinzufügen",
16733
+ "map.layers.available": "Verfügbare Layer",
16849
16734
  "map.layers.list": "Ebenen",
16850
16735
  "map.loading.data": "Kartendaten werden geladen...",
16736
+ "map.loading.service": "Dienst wird geladen...",
16851
16737
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
16852
16738
  "map.select.layer": "Datenquelle",
16739
+ "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
16740
+ "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
16853
16741
  "multiselect.filter.placeholder": "Suche",
16854
16742
  "nav.back": "Zurück",
16855
16743
  next: next$6,
@@ -16865,56 +16753,61 @@ var de = {
16865
16753
  "pagination.pageOf": "von",
16866
16754
  previous: previous$6,
16867
16755
  "record.action.download": "Herunterladen",
16868
- "record.action.view": "Ansehen",
16756
+ "record.action.view": "Anzeigen",
16869
16757
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
16870
16758
  "record.metadata.about": "Beschreibung",
16871
16759
  "record.metadata.api": "API",
16872
- "record.metadata.api.form.closeButton": "",
16873
- "record.metadata.api.form.closeForm": "",
16874
- "record.metadata.api.form.create": "",
16875
- "record.metadata.api.form.customUrl": "",
16876
- "record.metadata.api.form.limit": "",
16877
- "record.metadata.api.form.limit.all": "",
16878
- "record.metadata.api.form.offset": "",
16879
- "record.metadata.api.form.openForm": "",
16880
- "record.metadata.api.form.reset": "",
16881
- "record.metadata.api.form.title": "",
16882
- "record.metadata.api.form.type": "",
16883
- "record.metadata.author": "",
16760
+ "record.metadata.api.form.closeButton": "Schließen",
16761
+ "record.metadata.api.form.closeForm": "Formular schließen",
16762
+ "record.metadata.api.form.create": "Ihre Anfrage erstellen",
16763
+ "record.metadata.api.form.customUrl": "Benutzerdefinierte URL",
16764
+ "record.metadata.api.form.limit": "Anzahl der Datensätze",
16765
+ "record.metadata.api.form.limit.all": "Alle",
16766
+ "record.metadata.api.form.offset": "Anzahl des ersten Datensatzes",
16767
+ "record.metadata.api.form.openForm": "Formular öffnen",
16768
+ "record.metadata.api.form.reset": "Zurücksetzen",
16769
+ "record.metadata.api.form.title": "Benutzerdefinierte URL generieren",
16770
+ "record.metadata.api.form.type": "Ausgabeformat",
16771
+ "record.metadata.author": "Autor",
16884
16772
  "record.metadata.catalog": "Katalog",
16885
16773
  "record.metadata.contact": "Kontakt",
16886
- "record.metadata.createdOn": "Erstellt am",
16887
- "record.metadata.details": "Details",
16774
+ "record.metadata.details": "Technische Informationen",
16888
16775
  "record.metadata.download": "Downloads",
16889
- "record.metadata.formats": "",
16776
+ "record.metadata.formats": "Formate",
16890
16777
  "record.metadata.isOpenData": "Open Data",
16891
16778
  "record.metadata.keywords": "Stichworte",
16779
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16892
16780
  "record.metadata.links": "Links",
16893
- "record.metadata.noUsage": "Für diesen Datensatz sind keine Verwendungsbedingungen angegeben.",
16781
+ "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16894
16782
  "record.metadata.origin": "Über die Daten",
16783
+ "record.metadata.owner": "",
16895
16784
  "record.metadata.preview": "Vorschau",
16896
16785
  "record.metadata.publications": "Veröffentlichungen",
16897
- "record.metadata.quality": "",
16898
- "record.metadata.quality.contact.failed": "",
16899
- "record.metadata.quality.contact.success": "",
16900
- "record.metadata.quality.description.failed": "",
16901
- "record.metadata.quality.description.success": "",
16902
- "record.metadata.quality.details": "",
16903
- "record.metadata.quality.keywords.failed": "",
16904
- "record.metadata.quality.keywords.success": "",
16905
- "record.metadata.quality.legalConstraints.failed": "",
16906
- "record.metadata.quality.legalConstraints.success": "",
16907
- "record.metadata.quality.organisation.failed": "",
16908
- "record.metadata.quality.organisation.success": "",
16909
- "record.metadata.quality.title.failed": "",
16910
- "record.metadata.quality.title.success": "",
16911
- "record.metadata.quality.topic.failed": "",
16912
- "record.metadata.quality.topic.success": "",
16913
- "record.metadata.quality.updateFrequency.failed": "",
16914
- "record.metadata.quality.updateFrequency.success": "",
16786
+ "record.metadata.quality": "Metadatenqualität",
16787
+ "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
16788
+ "record.metadata.quality.contact.success": "Kontakt angegeben",
16789
+ "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
16790
+ "record.metadata.quality.description.success": "Beschreibung angegeben",
16791
+ "record.metadata.quality.details": "Details",
16792
+ "record.metadata.quality.keywords.failed": "Schlagwörter nicht angegeben",
16793
+ "record.metadata.quality.keywords.success": "Schlagwörter angegeben",
16794
+ "record.metadata.quality.legalConstraints.failed": "Rechtliche Beschränkungen nicht angegeben",
16795
+ "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
16796
+ "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
16797
+ "record.metadata.quality.organisation.success": "Organisation angegeben",
16798
+ "record.metadata.quality.title.failed": "Titel nicht angegeben",
16799
+ "record.metadata.quality.title.success": "Titel angegeben",
16800
+ "record.metadata.quality.topic.failed": "Thema nicht angegeben",
16801
+ "record.metadata.quality.topic.success": "Thema angegeben",
16802
+ "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
16803
+ "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16915
16804
  "record.metadata.related": "Ähnliche Datensätze",
16916
- "record.metadata.sheet": "Weitere Informationen erhalten Sie unter :",
16805
+ "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16806
+ "record.metadata.status": "",
16807
+ "record.metadata.themes": "Kategorien",
16917
16808
  "record.metadata.title": "Titel",
16809
+ "record.metadata.type": "Geographischer Datensatz",
16810
+ "record.metadata.uniqueId": "Eindeutige Kennung",
16918
16811
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16919
16812
  "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16920
16813
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
@@ -16926,23 +16819,23 @@ var de = {
16926
16819
  "record.was.created.time": "erstellte diesen Datensatz {time}",
16927
16820
  records: records$6,
16928
16821
  "results.layout.selectOne": "Layout auswählen",
16929
- "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{auf {hits} insgesamt angezeigt.}}",
16930
- "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie andere Wörter</li><li>Geben Sie weniger Wörter ein</li></ul>",
16822
+ "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{angezeigt von {hits} insgesamt.}}",
16823
+ "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie es mit anderen Worten</li><li>Beschränken Sie die Suchwörter</li></ul>",
16931
16824
  "results.records.hits.found": "{hits, plural, =0{Keine Dokumente entsprechen der angegebenen Suche.} one{1 Datensatz gefunden.} other{{hits} Datensätze gefunden.}}",
16932
- "results.records.hits.selected": "",
16825
+ "results.records.hits.selected": "{ amount } ausgewählt",
16933
16826
  "results.showMore": "Mehr Ergebnisse anzeigen...",
16934
- "results.sortBy.dateStamp": "Letzte Aktualisierungen",
16827
+ "results.sortBy.dateStamp": "Neueste",
16935
16828
  "results.sortBy.popularity": "Beliebtheit",
16936
- "results.sortBy.qualityScore": "",
16829
+ "results.sortBy.qualityScore": "Qualitätsbewertung",
16937
16830
  "results.sortBy.relevancy": "Relevanz",
16938
16831
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
16939
16832
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
16940
- "search.error.receivedError": "Ein Fehler wurde empfangen",
16833
+ "search.error.receivedError": "Ein Fehler ist aufgetreten",
16941
16834
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
16942
- "search.field.any.placeholder": "Suche nach Datensätzen ...",
16835
+ "search.field.any.placeholder": "Suche Datensätze ...",
16943
16836
  "search.field.sortBy": "Sortieren nach:",
16944
16837
  "search.filters.clear": "Zurücksetzen",
16945
- "search.filters.contact": "Kontakt",
16838
+ "search.filters.contact": "Kontakte",
16946
16839
  "search.filters.format": "Formate",
16947
16840
  "search.filters.inspireKeyword": "INSPIRE-Schlüsselwort",
16948
16841
  "search.filters.isSpatial": "Ist räumliche Daten",
@@ -16960,13 +16853,13 @@ var de = {
16960
16853
  "search.filters.license.unknown": "Unbekannt oder nicht vorhanden",
16961
16854
  "search.filters.maximize": "Erweitern",
16962
16855
  "search.filters.minimize": "Minimieren",
16963
- "search.filters.myRecords": "",
16964
- "search.filters.myRecordsHelp": "",
16965
- "search.filters.otherRecords": "",
16856
+ "search.filters.myRecords": "Nur meine Datensätze anzeigen",
16857
+ "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.",
16858
+ "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
16966
16859
  "search.filters.publicationYear": "Veröffentlichungsjahr",
16967
16860
  "search.filters.publisher": "Organisationen",
16968
- "search.filters.representationType": "",
16969
- "search.filters.resourceType": "",
16861
+ "search.filters.representationType": "Repräsentationstyp",
16862
+ "search.filters.resourceType": "Ressourcentyp",
16970
16863
  "search.filters.standard": "Standard",
16971
16864
  "search.filters.title": "Ergebnisse filtern",
16972
16865
  "search.filters.topic": "Thema",
@@ -16978,6 +16871,7 @@ var de = {
16978
16871
  "table.object.count": "Objekte in diesem Datensatz",
16979
16872
  "table.select.data": "Datenquelle",
16980
16873
  "tooltip.html.copy": "HTML kopieren",
16874
+ "tooltip.id.copy": "",
16981
16875
  "tooltip.url.copy": "URL kopieren",
16982
16876
  "tooltip.url.open": "URL öffnen",
16983
16877
  "ui.readLess": "Weniger lesen",
@@ -17011,20 +16905,21 @@ var en = {
17011
16905
  "chart.type.line": "line chart",
17012
16906
  "chart.type.lineSmooth": "smooth line chart",
17013
16907
  "chart.type.pie": "pie chart",
16908
+ "dashboard.createRecord": "New record",
17014
16909
  "dashboard.labels.mySpace": "My space",
17015
- "dashboard.records.all": "Catalog",
16910
+ "dashboard.records.all": "Metadata records",
17016
16911
  "dashboard.records.myDraft": "My drafts",
17017
16912
  "dashboard.records.myLibrary": "My library",
17018
16913
  "dashboard.records.myOrg": "Organization",
17019
16914
  "dashboard.records.myRecords": "My Records",
17020
- "dashboard.records.noRecord": "No record for this organization",
17021
- "dashboard.records.noUser": "No users for this organization",
17022
16915
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17023
16916
  "dashboard.records.search": "Search for \"{searchText}\"",
17024
16917
  "dashboard.records.userDetail": "Name",
17025
16918
  "dashboard.records.userEmail": "Email",
17026
16919
  "dashboard.records.username": "Username",
17027
16920
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
16921
+ "dashboard.results.listMetadata": "Show metadata",
16922
+ "dashboard.results.listResources": "Show resources",
17028
16923
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17029
16924
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17030
16925
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17110,7 +17005,8 @@ var en = {
17110
17005
  "datahub.news.contact.title": "A specific need?",
17111
17006
  "datahub.news.feed": "News feed",
17112
17007
  "datahub.news.figures": "Indicators",
17113
- "datahub.search.back": "Back to results",
17008
+ "datahub.record.addToFavorites": "Add to favorites",
17009
+ "datahub.search.back": "Back",
17114
17010
  "datahub.search.filter.all": "All",
17115
17011
  "datahub.search.filter.generatedByWfs": "generated by an API",
17116
17012
  "datahub.search.filter.others": "Others",
@@ -17170,10 +17066,18 @@ var en = {
17170
17066
  "map.add.layer.file": "From a file",
17171
17067
  "map.add.layer.wfs": "From WFS",
17172
17068
  "map.add.layer.wms": "From WMS",
17069
+ "map.addFromFile.placeholder": "Click or drop a file here",
17070
+ "map.geocoding.placeholder": "Search for a place",
17071
+ "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17072
+ "map.layer.add": "Add",
17073
+ "map.layers.available": "Available Layers",
17173
17074
  "map.layers.list": "Layers",
17174
17075
  "map.loading.data": "Loading map data...",
17076
+ "map.loading.service": "Loading service...",
17175
17077
  "map.navigation.message": "Please use CTRL + mouse (or two fingers on mobile) to navigate the map",
17176
17078
  "map.select.layer": "Data source",
17079
+ "map.wfs.urlInput.hint": "Enter WFS service URL",
17080
+ "map.wms.urlInput.hint": "Enter WMS service URL",
17177
17081
  "multiselect.filter.placeholder": "Search",
17178
17082
  "nav.back": "Back",
17179
17083
  next: next$5,
@@ -17207,41 +17111,46 @@ var en = {
17207
17111
  "record.metadata.author": "Author",
17208
17112
  "record.metadata.catalog": "Catalog",
17209
17113
  "record.metadata.contact": "Contact",
17210
- "record.metadata.createdOn": "Created on",
17211
- "record.metadata.details": "Details",
17114
+ "record.metadata.details": "Technical information",
17212
17115
  "record.metadata.download": "Downloads",
17213
17116
  "record.metadata.formats": "Formats",
17214
17117
  "record.metadata.isOpenData": "Open Data",
17215
17118
  "record.metadata.keywords": "Keywords",
17119
+ "record.metadata.lastUpdate": "Last updated on",
17216
17120
  "record.metadata.links": "Links",
17217
17121
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17218
17122
  "record.metadata.origin": "About the data",
17123
+ "record.metadata.owner": "Catalog of origin",
17219
17124
  "record.metadata.preview": "Preview",
17220
17125
  "record.metadata.publications": "publications",
17221
17126
  "record.metadata.quality": "Metadata Quality",
17222
- "record.metadata.quality.contact.failed": "Contact is not completed",
17223
- "record.metadata.quality.contact.success": "Contact is completed",
17224
- "record.metadata.quality.description.failed": "Description is not completed",
17225
- "record.metadata.quality.description.success": "Description is completed",
17127
+ "record.metadata.quality.contact.failed": "Contact is not specified",
17128
+ "record.metadata.quality.contact.success": "Contact is specified",
17129
+ "record.metadata.quality.description.failed": "Description is not specified",
17130
+ "record.metadata.quality.description.success": "Description is specified",
17226
17131
  "record.metadata.quality.details": "Details",
17227
- "record.metadata.quality.keywords.failed": "Keywords are not completed",
17228
- "record.metadata.quality.keywords.success": "Keywords are completed",
17229
- "record.metadata.quality.legalConstraints.failed": "Legal constraints are not completed",
17230
- "record.metadata.quality.legalConstraints.success": "Legal constraints are completed",
17231
- "record.metadata.quality.organisation.failed": "Organisation is not completed",
17232
- "record.metadata.quality.organisation.success": "Organisation is completed",
17233
- "record.metadata.quality.title.failed": "Title is not completed",
17234
- "record.metadata.quality.title.success": "Title is completed",
17235
- "record.metadata.quality.topic.failed": "Topic is not completed",
17236
- "record.metadata.quality.topic.success": "Topic is completed",
17237
- "record.metadata.quality.updateFrequency.failed": "Update frequency is not completed",
17238
- "record.metadata.quality.updateFrequency.success": "Update frequency is completed",
17132
+ "record.metadata.quality.keywords.failed": "Keywords are not specified",
17133
+ "record.metadata.quality.keywords.success": "Keywords are specified",
17134
+ "record.metadata.quality.legalConstraints.failed": "Legal constraints are not specified",
17135
+ "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
17136
+ "record.metadata.quality.organisation.failed": "Organisation is not specified",
17137
+ "record.metadata.quality.organisation.success": "Organisation is specified",
17138
+ "record.metadata.quality.title.failed": "Title is not specified",
17139
+ "record.metadata.quality.title.success": "Title is specified",
17140
+ "record.metadata.quality.topic.failed": "Topic is not specified",
17141
+ "record.metadata.quality.topic.success": "Topic is specified",
17142
+ "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17143
+ "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17239
17144
  "record.metadata.related": "Related records",
17240
- "record.metadata.sheet": "More information available from:",
17145
+ "record.metadata.sheet": "Original metadata",
17146
+ "record.metadata.status": "Status",
17147
+ "record.metadata.themes": "Categories",
17241
17148
  "record.metadata.title": "Title",
17149
+ "record.metadata.type": "Geographical dataset",
17150
+ "record.metadata.uniqueId": "Unique Identifier",
17242
17151
  "record.metadata.updateFrequency": "Data Update Frequency",
17243
17152
  "record.metadata.updateStatus": "Data Update Status",
17244
- "record.metadata.updatedOn": "Last Data Information Update",
17153
+ "record.metadata.updatedOn": "Metadata's last update",
17245
17154
  "record.metadata.usage": "Usage & constraints",
17246
17155
  "record.more.details": "Read more",
17247
17156
  "record.tab.chart": "Chart",
@@ -17302,6 +17211,7 @@ var en = {
17302
17211
  "table.object.count": "objects in this dataset",
17303
17212
  "table.select.data": "Data source",
17304
17213
  "tooltip.html.copy": "Copy HTML",
17214
+ "tooltip.id.copy": "Copy unique identifier",
17305
17215
  "tooltip.url.copy": "Copy URL",
17306
17216
  "tooltip.url.open": "Open URL",
17307
17217
  "ui.readLess": "Read less",
@@ -17335,20 +17245,21 @@ var es = {
17335
17245
  "chart.type.line": "gráfico de líneas",
17336
17246
  "chart.type.lineSmooth": "gráfico de líneas suave",
17337
17247
  "chart.type.pie": "gráfico circular",
17248
+ "dashboard.createRecord": "",
17338
17249
  "dashboard.labels.mySpace": "Mi espacio",
17339
17250
  "dashboard.records.all": "Catálogo",
17340
17251
  "dashboard.records.myDraft": "Mis borradores",
17341
17252
  "dashboard.records.myLibrary": "Mi biblioteca",
17342
17253
  "dashboard.records.myOrg": "Organización",
17343
17254
  "dashboard.records.myRecords": "Mis Registros",
17344
- "dashboard.records.noRecord": "",
17345
- "dashboard.records.noUser": "",
17346
17255
  "dashboard.records.publishedRecords": "",
17347
17256
  "dashboard.records.search": "Buscar \"{searchText}\"",
17348
17257
  "dashboard.records.userDetail": "",
17349
17258
  "dashboard.records.userEmail": "",
17350
17259
  "dashboard.records.username": "",
17351
17260
  "dashboard.records.users": "",
17261
+ "dashboard.results.listMetadata": "",
17262
+ "dashboard.results.listResources": "",
17352
17263
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17353
17264
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17354
17265
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17434,6 +17345,7 @@ var es = {
17434
17345
  "datahub.news.contact.title": "",
17435
17346
  "datahub.news.feed": "",
17436
17347
  "datahub.news.figures": "",
17348
+ "datahub.record.addToFavorites": "",
17437
17349
  "datahub.search.back": "",
17438
17350
  "datahub.search.filter.all": "",
17439
17351
  "datahub.search.filter.generatedByWfs": "",
@@ -17494,10 +17406,18 @@ var es = {
17494
17406
  "map.add.layer.file": "",
17495
17407
  "map.add.layer.wfs": "",
17496
17408
  "map.add.layer.wms": "",
17409
+ "map.addFromFile.placeholder": "",
17410
+ "map.geocoding.placeholder": "",
17411
+ "map.help.addFromFile": "",
17412
+ "map.layer.add": "",
17413
+ "map.layers.available": "",
17497
17414
  "map.layers.list": "",
17498
17415
  "map.loading.data": "",
17416
+ "map.loading.service": "",
17499
17417
  "map.navigation.message": "",
17500
17418
  "map.select.layer": "",
17419
+ "map.wfs.urlInput.hint": "",
17420
+ "map.wms.urlInput.hint": "",
17501
17421
  "multiselect.filter.placeholder": "",
17502
17422
  "nav.back": "",
17503
17423
  next: next$4,
@@ -17531,15 +17451,16 @@ var es = {
17531
17451
  "record.metadata.author": "",
17532
17452
  "record.metadata.catalog": "",
17533
17453
  "record.metadata.contact": "",
17534
- "record.metadata.createdOn": "",
17535
17454
  "record.metadata.details": "",
17536
17455
  "record.metadata.download": "",
17537
17456
  "record.metadata.formats": "",
17538
17457
  "record.metadata.isOpenData": "",
17539
17458
  "record.metadata.keywords": "",
17459
+ "record.metadata.lastUpdate": "",
17540
17460
  "record.metadata.links": "",
17541
17461
  "record.metadata.noUsage": "",
17542
17462
  "record.metadata.origin": "",
17463
+ "record.metadata.owner": "",
17543
17464
  "record.metadata.preview": "",
17544
17465
  "record.metadata.publications": "",
17545
17466
  "record.metadata.quality": "",
@@ -17562,7 +17483,11 @@ var es = {
17562
17483
  "record.metadata.quality.updateFrequency.success": "",
17563
17484
  "record.metadata.related": "",
17564
17485
  "record.metadata.sheet": "",
17486
+ "record.metadata.status": "",
17487
+ "record.metadata.themes": "",
17565
17488
  "record.metadata.title": "",
17489
+ "record.metadata.type": "",
17490
+ "record.metadata.uniqueId": "",
17566
17491
  "record.metadata.updateFrequency": "",
17567
17492
  "record.metadata.updateStatus": "",
17568
17493
  "record.metadata.updatedOn": "",
@@ -17626,6 +17551,7 @@ var es = {
17626
17551
  "table.object.count": "",
17627
17552
  "table.select.data": "",
17628
17553
  "tooltip.html.copy": "",
17554
+ "tooltip.id.copy": "",
17629
17555
  "tooltip.url.copy": "",
17630
17556
  "tooltip.url.open": "",
17631
17557
  "ui.readLess": "",
@@ -17659,20 +17585,21 @@ var fr = {
17659
17585
  "chart.type.line": "ligne",
17660
17586
  "chart.type.lineSmooth": "ligne lisse",
17661
17587
  "chart.type.pie": "camembert",
17588
+ "dashboard.createRecord": "",
17662
17589
  "dashboard.labels.mySpace": "Mon espace",
17663
17590
  "dashboard.records.all": "Catalogue",
17664
17591
  "dashboard.records.myDraft": "Mes brouillons",
17665
17592
  "dashboard.records.myLibrary": "Ma bibliothèque",
17666
17593
  "dashboard.records.myOrg": "Mon organisation",
17667
17594
  "dashboard.records.myRecords": "Mes fiches publiées",
17668
- "dashboard.records.noRecord": "Aucun jeu de données pour cette organisation",
17669
- "dashboard.records.noUser": "Aucun utilisateur pour cette organisation",
17670
17595
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17671
17596
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17672
17597
  "dashboard.records.userDetail": "Nom",
17673
17598
  "dashboard.records.userEmail": "Email",
17674
17599
  "dashboard.records.username": "Nom d'utilisateur",
17675
17600
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17601
+ "dashboard.results.listMetadata": "",
17602
+ "dashboard.results.listResources": "",
17676
17603
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17677
17604
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17678
17605
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17754,11 +17681,12 @@ var fr = {
17754
17681
  "datahub.header.popularRecords": "Les plus appréciées",
17755
17682
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17756
17683
  "datahub.news.contact.contactus": "Contactez-nous",
17757
- "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont la pour vous répondre.</p>",
17684
+ "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont pour vous répondre.</p>",
17758
17685
  "datahub.news.contact.title": "Un besoin spécifique ?",
17759
17686
  "datahub.news.feed": "Fil d'activité",
17760
17687
  "datahub.news.figures": "Quelques chiffres",
17761
- "datahub.search.back": "Retour aux résultats",
17688
+ "datahub.record.addToFavorites": "Ajouter aux favoris",
17689
+ "datahub.search.back": "Retour",
17762
17690
  "datahub.search.filter.all": "Tous",
17763
17691
  "datahub.search.filter.generatedByWfs": "généré par une API",
17764
17692
  "datahub.search.filter.others": "Autres",
@@ -17818,10 +17746,18 @@ var fr = {
17818
17746
  "map.add.layer.file": "",
17819
17747
  "map.add.layer.wfs": "",
17820
17748
  "map.add.layer.wms": "",
17749
+ "map.addFromFile.placeholder": "",
17750
+ "map.geocoding.placeholder": "",
17751
+ "map.help.addFromFile": "",
17752
+ "map.layer.add": "",
17753
+ "map.layers.available": "",
17821
17754
  "map.layers.list": "",
17822
17755
  "map.loading.data": "Chargement des données...",
17756
+ "map.loading.service": "",
17823
17757
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17824
17758
  "map.select.layer": "Source de données",
17759
+ "map.wfs.urlInput.hint": "",
17760
+ "map.wms.urlInput.hint": "",
17825
17761
  "multiselect.filter.placeholder": "Rechercher",
17826
17762
  "nav.back": "Retour",
17827
17763
  next: next$3,
@@ -17855,15 +17791,16 @@ var fr = {
17855
17791
  "record.metadata.author": "Auteur",
17856
17792
  "record.metadata.catalog": "Catalogue",
17857
17793
  "record.metadata.contact": "Contact",
17858
- "record.metadata.createdOn": "Créé le",
17859
- "record.metadata.details": "Détails",
17794
+ "record.metadata.details": "Informations techniques",
17860
17795
  "record.metadata.download": "Téléchargements",
17861
17796
  "record.metadata.formats": "Formats",
17862
17797
  "record.metadata.isOpenData": "Donnée Ouverte",
17863
17798
  "record.metadata.keywords": "Mots clés",
17799
+ "record.metadata.lastUpdate": "Mis à jour le",
17864
17800
  "record.metadata.links": "Liens",
17865
17801
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17866
17802
  "record.metadata.origin": "À propos des données",
17803
+ "record.metadata.owner": "Catalogue d'origine",
17867
17804
  "record.metadata.preview": "Aperçu",
17868
17805
  "record.metadata.publications": "données",
17869
17806
  "record.metadata.quality": "Qualité des métadonnées",
@@ -17885,11 +17822,15 @@ var fr = {
17885
17822
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
17886
17823
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17887
17824
  "record.metadata.related": "Voir aussi",
17888
- "record.metadata.sheet": "Plus d'informations à l'adresse suivante :",
17825
+ "record.metadata.sheet": "Fiche de métadonnées d'origine",
17826
+ "record.metadata.status": "",
17827
+ "record.metadata.themes": "Catégories",
17889
17828
  "record.metadata.title": "Titre",
17829
+ "record.metadata.type": "Donnée géographique",
17830
+ "record.metadata.uniqueId": "Identificateur de ressource unique",
17890
17831
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17891
17832
  "record.metadata.updateStatus": "Statut de mise à jour des données",
17892
- "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17833
+ "record.metadata.updatedOn": "Mise à jour de la fiche de métadonnée",
17893
17834
  "record.metadata.usage": "Conditions d'utilisation",
17894
17835
  "record.more.details": "Détails",
17895
17836
  "record.tab.chart": "Graphique",
@@ -17950,6 +17891,7 @@ var fr = {
17950
17891
  "table.object.count": "enregistrements dans ces données",
17951
17892
  "table.select.data": "Source de données",
17952
17893
  "tooltip.html.copy": "Copier le HTML",
17894
+ "tooltip.id.copy": "Copier l'identifiant unique",
17953
17895
  "tooltip.url.copy": "Copier l'URL",
17954
17896
  "tooltip.url.open": "Ouvrir l'URL",
17955
17897
  "ui.readLess": "Réduire",
@@ -17983,20 +17925,21 @@ var it = {
17983
17925
  "chart.type.line": "grafico a linee",
17984
17926
  "chart.type.lineSmooth": "grafico a linea liscia",
17985
17927
  "chart.type.pie": "grafico a torta",
17928
+ "dashboard.createRecord": "",
17986
17929
  "dashboard.labels.mySpace": "Il mio spazio",
17987
17930
  "dashboard.records.all": "Catalogo",
17988
17931
  "dashboard.records.myDraft": "Le mie bozze",
17989
17932
  "dashboard.records.myLibrary": "La mia biblioteca",
17990
17933
  "dashboard.records.myOrg": "La mia organizzazione",
17991
17934
  "dashboard.records.myRecords": "I miei dati",
17992
- "dashboard.records.noRecord": "Nessun dati per questa organizzazione",
17993
- "dashboard.records.noUser": "Nessun utente per questa organizzazione",
17994
17935
  "dashboard.records.publishedRecords": "dati pubblicati",
17995
17936
  "dashboard.records.search": "Risultati per \"{searchText}\"",
17996
17937
  "dashboard.records.userDetail": "Nome",
17997
17938
  "dashboard.records.userEmail": "Email",
17998
17939
  "dashboard.records.username": "Nome utente",
17999
17940
  "dashboard.records.users": "utenti",
17941
+ "dashboard.results.listMetadata": "",
17942
+ "dashboard.results.listResources": "",
18000
17943
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18001
17944
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18002
17945
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18077,12 +18020,13 @@ var it = {
18077
18020
  "datahub.header.organisations": "Organizzazioni",
18078
18021
  "datahub.header.popularRecords": "Più popolari",
18079
18022
  "datahub.header.title.html": "<div class=\"text-white\">Tutti i dati<br>pubblici della mia organizzazione</div>",
18080
- "datahub.news.contact.contactus": "",
18081
- "datahub.news.contact.html": "",
18082
- "datahub.news.contact.title": "",
18023
+ "datahub.news.contact.contactus": "Contattateci",
18024
+ "datahub.news.contact.html": "<p>Ha bisogno di dati che non sono attualmente disponibili sulla piattaforma? </p><p> I nostri team sono qui per aiutarla.</p>",
18025
+ "datahub.news.contact.title": "Ha un bisogno specifico?",
18083
18026
  "datahub.news.feed": "Feed di attività",
18084
18027
  "datahub.news.figures": "Alcune figure",
18085
- "datahub.search.back": "Torna ai risultati",
18028
+ "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
18029
+ "datahub.search.back": "Ritorna",
18086
18030
  "datahub.search.filter.all": "Tutti",
18087
18031
  "datahub.search.filter.generatedByWfs": "generato da un'API",
18088
18032
  "datahub.search.filter.others": "Altri",
@@ -18109,7 +18053,7 @@ var it = {
18109
18053
  "downloads.format.unknown": "sconosciuto",
18110
18054
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18111
18055
  dropFile: dropFile$2,
18112
- "externalviewer.dataset.unnamed": "",
18056
+ "externalviewer.dataset.unnamed": "Layer del datahub",
18113
18057
  "facets.block.title.OrgForResource": "Organizzazione",
18114
18058
  "facets.block.title.availableInServices": "Disponibile per",
18115
18059
  "facets.block.title.cl_hierarchyLevel.key": "Tipo di risorsa",
@@ -18142,10 +18086,18 @@ var it = {
18142
18086
  "map.add.layer.file": "Da un file",
18143
18087
  "map.add.layer.wfs": "Da un WFS",
18144
18088
  "map.add.layer.wms": "Da un WMS",
18089
+ "map.addFromFile.placeholder": "",
18090
+ "map.geocoding.placeholder": "",
18091
+ "map.help.addFromFile": "",
18092
+ "map.layer.add": "",
18093
+ "map.layers.available": "",
18145
18094
  "map.layers.list": "Layers",
18146
18095
  "map.loading.data": "Caricamento dati...",
18096
+ "map.loading.service": "",
18147
18097
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18148
18098
  "map.select.layer": "Sorgente dati",
18099
+ "map.wfs.urlInput.hint": "",
18100
+ "map.wms.urlInput.hint": "",
18149
18101
  "multiselect.filter.placeholder": "Cerca",
18150
18102
  "nav.back": "Indietro",
18151
18103
  next: next$2,
@@ -18179,15 +18131,16 @@ var it = {
18179
18131
  "record.metadata.author": "Autore",
18180
18132
  "record.metadata.catalog": "Catalogo",
18181
18133
  "record.metadata.contact": "Contatto",
18182
- "record.metadata.createdOn": "Creato il",
18183
- "record.metadata.details": "Dettagli",
18134
+ "record.metadata.details": "Informazioni tecniche",
18184
18135
  "record.metadata.download": "Download",
18185
18136
  "record.metadata.formats": "Formati",
18186
18137
  "record.metadata.isOpenData": "Data aperta",
18187
18138
  "record.metadata.keywords": "Parole chiave",
18139
+ "record.metadata.lastUpdate": "Ultimo aggiornamento",
18188
18140
  "record.metadata.links": "Collegamenti",
18189
18141
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18190
18142
  "record.metadata.origin": "Informazioni sui dati",
18143
+ "record.metadata.owner": "Catalogo originale",
18191
18144
  "record.metadata.preview": "Anteprima",
18192
18145
  "record.metadata.publications": "pubblicazioni",
18193
18146
  "record.metadata.quality": "Qualità dei metadati",
@@ -18209,11 +18162,15 @@ var it = {
18209
18162
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
18210
18163
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18211
18164
  "record.metadata.related": "Vedi anche",
18212
- "record.metadata.sheet": "Per ulteriori informazioni, cliccate qui:",
18165
+ "record.metadata.sheet": "Origine del metadata",
18166
+ "record.metadata.status": "",
18167
+ "record.metadata.themes": "Categorie",
18213
18168
  "record.metadata.title": "Titolo",
18169
+ "record.metadata.type": "Dati geografici",
18170
+ "record.metadata.uniqueId": "Identificatore unico di risorsa",
18214
18171
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18215
18172
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18216
- "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18173
+ "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18217
18174
  "record.metadata.usage": "Condizioni d'uso",
18218
18175
  "record.more.details": "Dettagli",
18219
18176
  "record.tab.chart": "Grafico",
@@ -18222,10 +18179,10 @@ var it = {
18222
18179
  "record.was.created.time": "ha creato questi dati {time}",
18223
18180
  records: records$2,
18224
18181
  "results.layout.selectOne": "Mostra risultati",
18225
- "results.records.hits.displayedOn": "",
18182
+ "results.records.hits.displayedOn": "{displayed, plural, =0{Nessun record} one{1 record visualizzato} other{{displayed} records visualizzati}} {hits, plural, other{su {hits} in totale.}}",
18226
18183
  "results.records.hits.empty.help.html": "Suggerimenti: <ul class='list-disc list-inside'><li>Prova con altre parole chiave</li><li>Cerca con meno parole</li></ul>",
18227
18184
  "results.records.hits.found": "{hits, plural, =0{Nessuna corrispondenza.} one{1 record trovato.} other{{hits} risultati.}}",
18228
- "results.records.hits.selected": "",
18185
+ "results.records.hits.selected": "{amount, plural, one{1 selezionato} other{{ amount } selezionati}}",
18229
18186
  "results.showMore": "Altri risultati...",
18230
18187
  "results.sortBy.dateStamp": "Più recente",
18231
18188
  "results.sortBy.popularity": "Popolarità",
@@ -18274,10 +18231,11 @@ var it = {
18274
18231
  "table.object.count": "record in questi dati",
18275
18232
  "table.select.data": "Sorgente dati",
18276
18233
  "tooltip.html.copy": "Copiare il HTML",
18234
+ "tooltip.id.copy": "Copiare l'identificatore unico",
18277
18235
  "tooltip.url.copy": "Copiare l'URL",
18278
18236
  "tooltip.url.open": "Aprire l'URL",
18279
- "ui.readLess": "",
18280
- "ui.readMore": "",
18237
+ "ui.readLess": "Ridurre",
18238
+ "ui.readMore": "Leggi di più",
18281
18239
  "wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
18282
18240
  "wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
18283
18241
  "wfs.unreachable.cors": "Il servizio non è accessibile a causa di limitazioni CORS",
@@ -18307,20 +18265,21 @@ var nl = {
18307
18265
  "chart.type.line": "lijndiagram",
18308
18266
  "chart.type.lineSmooth": "glad lijndiagram",
18309
18267
  "chart.type.pie": "cirkeldiagram",
18268
+ "dashboard.createRecord": "",
18310
18269
  "dashboard.labels.mySpace": "Mijn ruimte",
18311
18270
  "dashboard.records.all": "Catalogus",
18312
18271
  "dashboard.records.myDraft": "Mijn concepten",
18313
18272
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18314
18273
  "dashboard.records.myOrg": "Organisatie",
18315
18274
  "dashboard.records.myRecords": "Mijn Records",
18316
- "dashboard.records.noRecord": "",
18317
- "dashboard.records.noUser": "",
18318
18275
  "dashboard.records.publishedRecords": "",
18319
18276
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18320
18277
  "dashboard.records.userDetail": "",
18321
18278
  "dashboard.records.userEmail": "",
18322
18279
  "dashboard.records.username": "",
18323
18280
  "dashboard.records.users": "",
18281
+ "dashboard.results.listMetadata": "",
18282
+ "dashboard.results.listResources": "",
18324
18283
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18325
18284
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18326
18285
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18406,6 +18365,7 @@ var nl = {
18406
18365
  "datahub.news.contact.title": "",
18407
18366
  "datahub.news.feed": "",
18408
18367
  "datahub.news.figures": "",
18368
+ "datahub.record.addToFavorites": "",
18409
18369
  "datahub.search.back": "",
18410
18370
  "datahub.search.filter.all": "",
18411
18371
  "datahub.search.filter.generatedByWfs": "",
@@ -18466,10 +18426,18 @@ var nl = {
18466
18426
  "map.add.layer.file": "",
18467
18427
  "map.add.layer.wfs": "",
18468
18428
  "map.add.layer.wms": "",
18429
+ "map.addFromFile.placeholder": "",
18430
+ "map.geocoding.placeholder": "",
18431
+ "map.help.addFromFile": "",
18432
+ "map.layer.add": "",
18433
+ "map.layers.available": "",
18469
18434
  "map.layers.list": "",
18470
18435
  "map.loading.data": "",
18436
+ "map.loading.service": "",
18471
18437
  "map.navigation.message": "",
18472
18438
  "map.select.layer": "",
18439
+ "map.wfs.urlInput.hint": "",
18440
+ "map.wms.urlInput.hint": "",
18473
18441
  "multiselect.filter.placeholder": "",
18474
18442
  "nav.back": "",
18475
18443
  next: next$1,
@@ -18503,15 +18471,16 @@ var nl = {
18503
18471
  "record.metadata.author": "",
18504
18472
  "record.metadata.catalog": "",
18505
18473
  "record.metadata.contact": "",
18506
- "record.metadata.createdOn": "",
18507
18474
  "record.metadata.details": "",
18508
18475
  "record.metadata.download": "",
18509
18476
  "record.metadata.formats": "",
18510
18477
  "record.metadata.isOpenData": "",
18511
18478
  "record.metadata.keywords": "",
18479
+ "record.metadata.lastUpdate": "",
18512
18480
  "record.metadata.links": "",
18513
18481
  "record.metadata.noUsage": "",
18514
18482
  "record.metadata.origin": "",
18483
+ "record.metadata.owner": "",
18515
18484
  "record.metadata.preview": "",
18516
18485
  "record.metadata.publications": "",
18517
18486
  "record.metadata.quality": "",
@@ -18534,7 +18503,11 @@ var nl = {
18534
18503
  "record.metadata.quality.updateFrequency.success": "",
18535
18504
  "record.metadata.related": "",
18536
18505
  "record.metadata.sheet": "",
18506
+ "record.metadata.status": "",
18507
+ "record.metadata.themes": "",
18537
18508
  "record.metadata.title": "",
18509
+ "record.metadata.type": "",
18510
+ "record.metadata.uniqueId": "",
18538
18511
  "record.metadata.updateFrequency": "",
18539
18512
  "record.metadata.updateStatus": "",
18540
18513
  "record.metadata.updatedOn": "",
@@ -18598,6 +18571,7 @@ var nl = {
18598
18571
  "table.object.count": "",
18599
18572
  "table.select.data": "",
18600
18573
  "tooltip.html.copy": "",
18574
+ "tooltip.id.copy": "",
18601
18575
  "tooltip.url.copy": "",
18602
18576
  "tooltip.url.open": "",
18603
18577
  "ui.readLess": "",
@@ -18631,20 +18605,21 @@ var pt = {
18631
18605
  "chart.type.line": "gráfico de linha",
18632
18606
  "chart.type.lineSmooth": "gráfico de linha suave",
18633
18607
  "chart.type.pie": "gráfico de pizza",
18608
+ "dashboard.createRecord": "",
18634
18609
  "dashboard.labels.mySpace": "Meu espaço",
18635
18610
  "dashboard.records.all": "Catálogo",
18636
18611
  "dashboard.records.myDraft": "Meus rascunhos",
18637
18612
  "dashboard.records.myLibrary": "Minha biblioteca",
18638
18613
  "dashboard.records.myOrg": "Organização",
18639
18614
  "dashboard.records.myRecords": "Meus Registros",
18640
- "dashboard.records.noRecord": "",
18641
- "dashboard.records.noUser": "",
18642
18615
  "dashboard.records.publishedRecords": "",
18643
18616
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18644
18617
  "dashboard.records.userDetail": "",
18645
18618
  "dashboard.records.userEmail": "",
18646
18619
  "dashboard.records.username": "",
18647
18620
  "dashboard.records.users": "",
18621
+ "dashboard.results.listMetadata": "",
18622
+ "dashboard.results.listResources": "",
18648
18623
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18649
18624
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18650
18625
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18730,6 +18705,7 @@ var pt = {
18730
18705
  "datahub.news.contact.title": "",
18731
18706
  "datahub.news.feed": "",
18732
18707
  "datahub.news.figures": "",
18708
+ "datahub.record.addToFavorites": "",
18733
18709
  "datahub.search.back": "",
18734
18710
  "datahub.search.filter.all": "",
18735
18711
  "datahub.search.filter.generatedByWfs": "",
@@ -18790,10 +18766,18 @@ var pt = {
18790
18766
  "map.add.layer.file": "",
18791
18767
  "map.add.layer.wfs": "",
18792
18768
  "map.add.layer.wms": "",
18769
+ "map.addFromFile.placeholder": "",
18770
+ "map.geocoding.placeholder": "",
18771
+ "map.help.addFromFile": "",
18772
+ "map.layer.add": "",
18773
+ "map.layers.available": "",
18793
18774
  "map.layers.list": "",
18794
18775
  "map.loading.data": "",
18776
+ "map.loading.service": "",
18795
18777
  "map.navigation.message": "",
18796
18778
  "map.select.layer": "",
18779
+ "map.wfs.urlInput.hint": "",
18780
+ "map.wms.urlInput.hint": "",
18797
18781
  "multiselect.filter.placeholder": "",
18798
18782
  "nav.back": "",
18799
18783
  next: next,
@@ -18827,15 +18811,16 @@ var pt = {
18827
18811
  "record.metadata.author": "",
18828
18812
  "record.metadata.catalog": "",
18829
18813
  "record.metadata.contact": "",
18830
- "record.metadata.createdOn": "",
18831
18814
  "record.metadata.details": "",
18832
18815
  "record.metadata.download": "",
18833
18816
  "record.metadata.formats": "",
18834
18817
  "record.metadata.isOpenData": "",
18835
18818
  "record.metadata.keywords": "",
18819
+ "record.metadata.lastUpdate": "",
18836
18820
  "record.metadata.links": "",
18837
18821
  "record.metadata.noUsage": "",
18838
18822
  "record.metadata.origin": "",
18823
+ "record.metadata.owner": "",
18839
18824
  "record.metadata.preview": "",
18840
18825
  "record.metadata.publications": "",
18841
18826
  "record.metadata.quality": "",
@@ -18858,7 +18843,11 @@ var pt = {
18858
18843
  "record.metadata.quality.updateFrequency.success": "",
18859
18844
  "record.metadata.related": "",
18860
18845
  "record.metadata.sheet": "",
18846
+ "record.metadata.status": "",
18847
+ "record.metadata.themes": "",
18861
18848
  "record.metadata.title": "",
18849
+ "record.metadata.type": "",
18850
+ "record.metadata.uniqueId": "",
18862
18851
  "record.metadata.updateFrequency": "",
18863
18852
  "record.metadata.updateStatus": "",
18864
18853
  "record.metadata.updatedOn": "",
@@ -18922,6 +18911,7 @@ var pt = {
18922
18911
  "table.object.count": "",
18923
18912
  "table.select.data": "",
18924
18913
  "tooltip.html.copy": "",
18914
+ "tooltip.id.copy": "",
18925
18915
  "tooltip.url.copy": "",
18926
18916
  "tooltip.url.open": "",
18927
18917
  "ui.readLess": "",
@@ -19105,6 +19095,40 @@ class Gn4FieldMapper {
19105
19095
  kind,
19106
19096
  };
19107
19097
  },
19098
+ geom: (output, source) => {
19099
+ const geoms = getAsArray(selectField(source, 'geom'));
19100
+ const shapes = getAsArray(selectField(source, 'shape'));
19101
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19102
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19103
+ return {
19104
+ ...output,
19105
+ spatialExtents: [
19106
+ ...spatialExtents,
19107
+ ...geoms.map((geom, index) => {
19108
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19109
+ const geometry = shapes[index] ?? geom;
19110
+ return {
19111
+ ...(description !== null ? { description } : null),
19112
+ geometry,
19113
+ };
19114
+ }),
19115
+ ],
19116
+ };
19117
+ },
19118
+ resourceTemporalDateRange: (output, source) => {
19119
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19120
+ return {
19121
+ ...output,
19122
+ temporalExtents: ranges.map((range) => {
19123
+ const start = selectField(range, 'gte');
19124
+ const end = selectField(range, 'lte');
19125
+ return {
19126
+ ...(start !== null ? { start: toDate(start) } : null),
19127
+ ...(end !== null ? { end: toDate(end) } : null),
19128
+ };
19129
+ }),
19130
+ };
19131
+ },
19108
19132
  };
19109
19133
  this.genericField = (output) => output;
19110
19134
  this.constraintField = (fieldName, output, source) => ({
@@ -19259,6 +19283,7 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19259
19283
  useLimitations: [],
19260
19284
  spatialExtents: [],
19261
19285
  temporalExtents: [],
19286
+ overviews: [],
19262
19287
  };
19263
19288
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19264
19289
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -20292,36 +20317,23 @@ class SelectionService {
20292
20317
  this.selectedRecordsIdentifiers$.next(filtered);
20293
20318
  }
20294
20319
  selectRecords(records) {
20295
- const newIds = [];
20296
- records.map((record) => {
20297
- newIds.push(record.uniqueIdentifier);
20298
- });
20299
- const apiResponse = this.selectionsApi.add(BUCKET_ID, newIds);
20300
- return apiResponse.pipe(tap$2(() => {
20320
+ const newIds = records.map((record) => record.uniqueIdentifier);
20321
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20301
20322
  this.addIdsToSelected(newIds);
20302
- }), map$2(() => undefined));
20323
+ });
20303
20324
  }
20304
20325
  deselectRecords(records) {
20305
- const idsToBeRemoved = [];
20306
- records.map((record) => {
20307
- idsToBeRemoved.push(record.uniqueIdentifier);
20308
- });
20309
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved);
20310
- return apiResponse.pipe(tap$2(() => {
20326
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20327
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20311
20328
  this.removeIdsFromSelected(idsToBeRemoved);
20312
- }), map$2(() => undefined));
20313
- }
20314
- clearSelection() {
20315
- const currentSelectedResponse = this.selectionsApi.get(BUCKET_ID);
20316
- let currentSelection;
20317
- this.subscription = currentSelectedResponse.subscribe((value) => {
20318
- currentSelection = [...value];
20319
20329
  });
20320
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20321
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20322
- return apiResponse.pipe(tap$2(() => {
20330
+ }
20331
+ async clearSelection() {
20332
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20333
+ const currentSelection = Array.from(response);
20334
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20323
20335
  this.removeIdsFromSelected(currentSelection);
20324
- }), map$2(() => undefined));
20336
+ });
20325
20337
  }
20326
20338
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20327
20339
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20639,6 +20651,8 @@ const defaultMapOptions = {
20639
20651
  };
20640
20652
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20641
20653
 
20654
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20655
+
20642
20656
  var MapContextLayerTypeEnum;
20643
20657
  (function (MapContextLayerTypeEnum) {
20644
20658
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -20946,6 +20960,33 @@ function propagateToDocumentOnly(event) {
20946
20960
  }, 0);
20947
20961
  }
20948
20962
 
20963
+ function normalize(input) {
20964
+ return input
20965
+ .toLowerCase()
20966
+ .normalize('NFD') // explode composite chars (e.g. é) into multiple chars
20967
+ .replace(/[\u0300-\u036f]/g, '') // remove accents
20968
+ .replace(/œ/g, 'oe') // remove accents
20969
+ .replace(/[^a-z0-9\s]/g, ' '); // replace special characters with space
20970
+ }
20971
+ function asNormalizedParts(input) {
20972
+ return normalize(input)
20973
+ .split(/\s+/)
20974
+ .map((part) => part.trim())
20975
+ .filter((part) => part.length > 0);
20976
+ }
20977
+ /**
20978
+ * This creates a filter function based on a pattern (typically a user-input
20979
+ * search text).
20980
+ * @param pattern
20981
+ */
20982
+ function createFuzzyFilter(pattern) {
20983
+ const patternParts = asNormalizedParts(pattern);
20984
+ return (input) => {
20985
+ const inputParts = asNormalizedParts(input);
20986
+ return patternParts.every((patternPart) => inputParts.some((part) => part.includes(patternPart)));
20987
+ };
20988
+ }
20989
+
20949
20990
  marker('downloads.wfs.featuretype.not.found');
20950
20991
  const FORMATS = {
20951
20992
  csv: {
@@ -20987,9 +21028,15 @@ const FORMATS = {
20987
21028
  color: '#328556',
20988
21029
  mimeTypes: ['x-gis/x-shapefile'],
20989
21030
  },
21031
+ gml: {
21032
+ extensions: ['gml'],
21033
+ priority: 5,
21034
+ color: '#c92bce',
21035
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21036
+ },
20990
21037
  kml: {
20991
21038
  extensions: ['kml', 'kmz'],
20992
- priority: 5,
21039
+ priority: 6,
20993
21040
  color: '#348009',
20994
21041
  mimeTypes: [
20995
21042
  'application/vnd.google-earth.kml+xml',
@@ -20998,34 +21045,40 @@ const FORMATS = {
20998
21045
  },
20999
21046
  gpkg: {
21000
21047
  extensions: ['gpkg', 'geopackage'],
21001
- priority: 6,
21048
+ priority: 7,
21002
21049
  color: '#ea79ba',
21003
21050
  mimeTypes: ['application/geopackage+sqlite3'],
21004
21051
  },
21005
21052
  zip: {
21006
21053
  extensions: ['zip', 'tar.gz'],
21007
- priority: 7,
21054
+ priority: 8,
21008
21055
  color: '#f2bb3a',
21009
21056
  mimeTypes: ['application/zip', 'application/x-zip'],
21010
21057
  },
21011
21058
  pdf: {
21012
21059
  extensions: ['pdf'],
21013
- priority: 8,
21060
+ priority: 9,
21014
21061
  color: '#db544a',
21015
21062
  mimeTypes: ['application/pdf'],
21016
21063
  },
21017
21064
  jpg: {
21018
21065
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21019
- priority: 8,
21066
+ priority: 9,
21020
21067
  color: '#673ab7',
21021
21068
  mimeTypes: ['image/jpg'],
21022
21069
  },
21023
21070
  svg: {
21024
21071
  extensions: ['svg'],
21025
- priority: 9,
21072
+ priority: 10,
21026
21073
  color: '#d98294',
21027
21074
  mimeTypes: ['image/svg+xml'],
21028
21075
  },
21076
+ dxf: {
21077
+ extensions: ['dxf'],
21078
+ priority: 11,
21079
+ color: '#de630b',
21080
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21081
+ },
21029
21082
  };
21030
21083
  function getFormatPriority(linkFormat) {
21031
21084
  for (const format in FORMATS) {
@@ -21042,14 +21095,18 @@ function getFormatPriority(linkFormat) {
21042
21095
  function getLinkPriority(link) {
21043
21096
  return getFormatPriority(getFileFormat(link));
21044
21097
  }
21045
- function extensionToFormat(extension) {
21046
- for (const format in FORMATS) {
21047
- for (const alias of FORMATS[format].extensions) {
21048
- if (alias === extension.toLowerCase())
21049
- return format;
21098
+ function getFileFormatFromServiceOutput(serviceOutput) {
21099
+ function formatMatcher(format) {
21100
+ const output = serviceOutput.toLowerCase();
21101
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21102
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21103
+ }
21104
+ for (const formatName in FORMATS) {
21105
+ if (formatMatcher(FORMATS[formatName])) {
21106
+ return formatName;
21050
21107
  }
21051
21108
  }
21052
- return undefined;
21109
+ return null;
21053
21110
  }
21054
21111
  function getFileFormat(link) {
21055
21112
  if ('mimeType' in link) {
@@ -21190,72 +21247,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21190
21247
  }]
21191
21248
  }] });
21192
21249
 
21193
- const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
21194
-
21195
- class MapUtilsWMSService {
21196
- constructor(proxy) {
21197
- this.proxy = proxy;
21198
- }
21199
- getCapabilities(layer) {
21200
- return from(new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady());
21201
- }
21202
- getLayerFull(layer) {
21203
- return this.getCapabilities(layer).pipe(map$1((endpoint) => endpoint.getLayerByName(layer.name)));
21204
- }
21205
- getLayerLonLatBBox(layer) {
21206
- return this.getLayerFull(layer).pipe(switchMap$1((wmsLayerFull) => from(this.getLonLatBBox(wmsLayerFull))));
21207
- }
21208
- async getLonLatBBox(wmsLayerFull) {
21209
- const { boundingBoxes } = wmsLayerFull;
21210
- const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21211
- if (lonLatCRS) {
21212
- return boundingBoxes[lonLatCRS];
21213
- }
21214
- else {
21215
- const availableEPSGCode = Object.keys(boundingBoxes)[0];
21216
- register(proj4);
21217
- const proj = await fromEPSGCode(availableEPSGCode);
21218
- proj4.defs(availableEPSGCode, proj);
21219
- const bboxWithFiniteNumbers = [
21220
- parseFloat(boundingBoxes[availableEPSGCode][0]),
21221
- parseFloat(boundingBoxes[availableEPSGCode][1]),
21222
- parseFloat(boundingBoxes[availableEPSGCode][2]),
21223
- parseFloat(boundingBoxes[availableEPSGCode][3]),
21224
- ];
21225
- const extent = transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21226
- return extent;
21227
- }
21228
- }
21229
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21230
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, providedIn: 'root' }); }
21231
- }
21232
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, decorators: [{
21233
- type: Injectable,
21234
- args: [{
21235
- providedIn: 'root',
21236
- }]
21237
- }], ctorParameters: function () { return [{ type: ProxyService }]; } });
21238
-
21239
21250
  const FEATURE_PROJECTION = 'EPSG:3857';
21240
21251
  const DATA_PROJECTION = 'EPSG:4326';
21252
+ const GEOJSON = new GeoJSON();
21241
21253
  class MapUtilsService {
21242
- constructor(http, wmsUtils) {
21254
+ constructor(http, proxy) {
21243
21255
  this.http = http;
21244
- this.wmsUtils = wmsUtils;
21256
+ this.proxy = proxy;
21245
21257
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21246
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21258
+ return GEOJSON.readFeatures(featureCollection, {
21247
21259
  featureProjection,
21248
21260
  dataProjection,
21249
21261
  });
21250
- return olFeatures;
21251
21262
  };
21252
21263
  }
21253
21264
  createEmptyMap() {
21254
- const map = new Map$1({
21265
+ return new Map$1({
21255
21266
  controls: [],
21256
21267
  pixelRatio: 1,
21257
21268
  });
21258
- return map;
21259
21269
  }
21260
21270
  isWMSLayer(layer) {
21261
21271
  return (layer.getSource() instanceof TileWMS ||
@@ -21270,8 +21280,7 @@ class MapUtilsService {
21270
21280
  ...source.getParams(),
21271
21281
  INFO_FORMAT: 'application/json',
21272
21282
  };
21273
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21274
- return url;
21283
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21275
21284
  }
21276
21285
  getVectorFeaturesFromClick(olMap, event) {
21277
21286
  const features = [];
@@ -21299,38 +21308,56 @@ class MapUtilsService {
21299
21308
  /**
21300
21309
  * Will emit `null` if no extent could be computed
21301
21310
  */
21302
- getLayerExtent(layer) {
21303
- let geographicExtent;
21311
+ async getLayerExtent(layer) {
21312
+ let latLonExtent;
21304
21313
  if (layer &&
21305
21314
  layer.type === 'geojson' &&
21306
21315
  'data' in layer &&
21307
21316
  typeof layer.data === 'object' &&
21308
21317
  layer.data.features[0] &&
21309
21318
  layer.data.features[0].geometry) {
21310
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21311
- .readFeatures(layerData)
21319
+ latLonExtent = new GeoJSON()
21320
+ .readFeatures(layer.data)
21312
21321
  .map((feature) => feature.getGeometry())
21313
21322
  .filter((geom) => !!geom)
21314
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21323
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21315
21324
  }
21316
21325
  else if (layer && layer.type === 'wms') {
21317
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21326
+ latLonExtent = await this.getWmsLayerExtent(layer);
21318
21327
  }
21319
21328
  else if (layer && layer.type === 'wmts') {
21320
21329
  if (layer.extent) {
21321
- geographicExtent = of(layer.extent);
21330
+ latLonExtent = layer.extent;
21322
21331
  }
21323
21332
  else {
21324
- return of(layer.options.tileGrid.getExtent());
21333
+ return layer.options.tileGrid.getExtent();
21325
21334
  }
21326
21335
  }
21327
21336
  else {
21328
- return of(null);
21337
+ return null;
21338
+ }
21339
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21340
+ return null;
21341
+ }
21342
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21343
+ }
21344
+ async getWmsLayerExtent(layer) {
21345
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21346
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21347
+ if (!Object.keys(boundingBoxes).length) {
21348
+ return null;
21349
+ }
21350
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21351
+ if (lonLatCRS) {
21352
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21353
+ }
21354
+ else {
21355
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21356
+ register(proj4);
21357
+ const proj = await fromEPSGCode(availableEPSGCode);
21358
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21359
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21329
21360
  }
21330
- return geographicExtent.pipe(map$1((extent) => [
21331
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
21332
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
21333
- ]), map$1((extent) => (isEmpty(extent) ? null : extent)));
21334
21361
  }
21335
21362
  getWmtsLayerFromCapabilities(link) {
21336
21363
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21386,7 +21413,18 @@ ${e.stack || e.message || e}`);
21386
21413
  ])
21387
21414
  .getArray());
21388
21415
  }
21389
- 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 }); }
21416
+ getRecordExtent(record) {
21417
+ if (!('spatialExtents' in record)) {
21418
+ return null;
21419
+ }
21420
+ // transform an array of geojson geometries into a bbox
21421
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21422
+ const geom = GEOJSON.readGeometry(curr.geometry);
21423
+ return extend(prev, geom.getExtent());
21424
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21425
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21426
+ }
21427
+ 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 }); }
21390
21428
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21391
21429
  }
21392
21430
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21394,7 +21432,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21394
21432
  args: [{
21395
21433
  providedIn: 'root',
21396
21434
  }]
21397
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21435
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21398
21436
  function dragPanCondition(event) {
21399
21437
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21400
21438
  if (!dragPanCondition) {
@@ -22469,6 +22507,7 @@ const DEFAULT_VIEW = {
22469
22507
  center: [0, 15],
22470
22508
  zoom: 2,
22471
22509
  };
22510
+ const WFS_MAX_FEATURES = 10000;
22472
22511
  class MapContextService {
22473
22512
  constructor(mapUtils, styleService) {
22474
22513
  this.mapUtils = mapUtils;
@@ -22527,6 +22566,7 @@ class MapContextService {
22527
22566
  urlObj.searchParams.set('typename', layerModel.name);
22528
22567
  urlObj.searchParams.set('srsname', 'EPSG:3857');
22529
22568
  urlObj.searchParams.set('bbox', `${extent.join(',')},EPSG:3857`);
22569
+ urlObj.searchParams.set('maxFeatures', WFS_MAX_FEATURES.toString());
22530
22570
  return urlObj.toString();
22531
22571
  },
22532
22572
  strategy: bbox,
@@ -23074,6 +23114,7 @@ class ThumbnailComponent {
23074
23114
  constructor(optionalPlaceholderUrl) {
23075
23115
  this.optionalPlaceholderUrl = optionalPlaceholderUrl;
23076
23116
  this.fit = 'cover';
23117
+ this.placeholderShown = new EventEmitter();
23077
23118
  this.placeholderUrl = this.optionalPlaceholderUrl || DEFAULT_PLACEHOLDER;
23078
23119
  this.images = [];
23079
23120
  }
@@ -23109,6 +23150,7 @@ class ThumbnailComponent {
23109
23150
  setNewSrcImage(image) {
23110
23151
  this.imgFit = image.fit;
23111
23152
  this.imgUrl = image.url;
23153
+ this.placeholderShown.emit(this.isPlaceholder);
23112
23154
  }
23113
23155
  setPlaceholder() {
23114
23156
  this.setNewSrcImage({ url: this.placeholderUrl, fit: 'scale-down' });
@@ -23131,7 +23173,7 @@ class ThumbnailComponent {
23131
23173
  }
23132
23174
  }
23133
23175
  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 }); }
23134
- 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 }); }
23176
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23135
23177
  }
23136
23178
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23137
23179
  type: Component,
@@ -23151,11 +23193,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23151
23193
  }], containerElement: [{
23152
23194
  type: ViewChild,
23153
23195
  args: ['containerElement']
23196
+ }], placeholderShown: [{
23197
+ type: Output
23154
23198
  }] } });
23155
23199
 
23156
23200
  class RecordPreviewCardComponent extends RecordPreviewComponent {
23157
23201
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23158
- 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 }); }
23202
+ 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 }); }
23159
23203
  }
23160
23204
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, decorators: [{
23161
23205
  type: Component,
@@ -23164,7 +23208,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23164
23208
 
23165
23209
  class RecordPreviewListComponent extends RecordPreviewComponent {
23166
23210
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23167
- 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 }); }
23211
+ 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 }); }
23168
23212
  }
23169
23213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, decorators: [{
23170
23214
  type: Component,
@@ -23312,7 +23356,7 @@ class RecordPreviewRowComponent extends RecordPreviewComponent {
23312
23356
  this.elementRef = elementRef;
23313
23357
  }
23314
23358
  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 }); }
23315
- 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 }); }
23359
+ 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 }); }
23316
23360
  }
23317
23361
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewRowComponent, decorators: [{
23318
23362
  type: Component,
@@ -23330,7 +23374,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23330
23374
 
23331
23375
  class RecordPreviewTitleComponent extends RecordPreviewComponent {
23332
23376
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23333
- 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 }); }
23377
+ 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 }); }
23334
23378
  }
23335
23379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, decorators: [{
23336
23380
  type: Component,
@@ -23370,7 +23414,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
23370
23414
  return this.timeFormat.format(this.record.recordCreated, Date.now());
23371
23415
  }
23372
23416
  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 }); }
23373
- 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 }); }
23417
+ 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 }); }
23374
23418
  }
23375
23419
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewFeedComponent, decorators: [{
23376
23420
  type: Component,
@@ -23703,6 +23747,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23703
23747
  args: ['contentDiv']
23704
23748
  }] } });
23705
23749
 
23750
+ class CopyTextButtonComponent {
23751
+ constructor() {
23752
+ this.displayText = true;
23753
+ this.rows = 1;
23754
+ }
23755
+ copyText(event) {
23756
+ navigator.clipboard.writeText(this.text);
23757
+ event.target.blur();
23758
+ }
23759
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23760
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23761
+ }
23762
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
23763
+ type: Component,
23764
+ args: [{ selector: 'gn-ui-copy-text-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n" }]
23765
+ }], propDecorators: { text: [{
23766
+ type: Input
23767
+ }], tooltipText: [{
23768
+ type: Input
23769
+ }], displayText: [{
23770
+ type: Input
23771
+ }], rows: [{
23772
+ type: Input
23773
+ }] } });
23774
+
23706
23775
  class ContentGhostComponent {
23707
23776
  constructor() {
23708
23777
  this.ghostClass = '';
@@ -23857,6 +23926,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23857
23926
  args: ['container']
23858
23927
  }] } });
23859
23928
 
23929
+ class MarkdownParserComponent {
23930
+ get parsedMarkdown() {
23931
+ return marked.parse(this.textContent);
23932
+ }
23933
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23934
+ 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 ::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!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}: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 }); }
23935
+ }
23936
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23937
+ type: Component,
23938
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, 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!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}: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"] }]
23939
+ }], propDecorators: { textContent: [{
23940
+ type: Input
23941
+ }] } });
23942
+
23860
23943
  class MetadataInfoComponent {
23861
23944
  constructor() {
23862
23945
  this.keyword = new EventEmitter();
@@ -23894,12 +23977,16 @@ class MetadataInfoComponent {
23894
23977
  onKeywordClick(keyword) {
23895
23978
  this.keyword.emit(keyword);
23896
23979
  }
23980
+ copyText() {
23981
+ navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
23982
+ event.target.blur();
23983
+ }
23897
23984
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23898
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<p\n class=\"text-[28px] text-title text-center mb-6 font-title sm:text-left\"\n translate\n>\n record.metadata.about\n</p>\n<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <p\n class=\"whitespace-pre-line break-words sm:mb-4 sm:pr-16\"\n [innerHTML]=\"metadata.abstract\"\n gnUiLinkify\n ></p>\n <ng-container *ngIf=\"metadata.keywords?.length\">\n <p class=\"mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </ng-container>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"py-5 px-5 rounded bg-gray-100 text-gray-700\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23985
+ 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 }); }
23899
23986
  }
23900
23987
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
23901
23988
  type: Component,
23902
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p\n class=\"text-[28px] text-title text-center mb-6 font-title sm:text-left\"\n translate\n>\n record.metadata.about\n</p>\n<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <p\n class=\"whitespace-pre-line break-words sm:mb-4 sm:pr-16\"\n [innerHTML]=\"metadata.abstract\"\n gnUiLinkify\n ></p>\n <ng-container *ngIf=\"metadata.keywords?.length\">\n <p class=\"mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </ng-container>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"py-5 px-5 rounded bg-gray-100 text-gray-700\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}\n"] }]
23989
+ 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"] }]
23903
23990
  }], propDecorators: { metadata: [{
23904
23991
  type: Input
23905
23992
  }], incomplete: [{
@@ -23968,11 +24055,11 @@ class ButtonComponent {
23968
24055
  propagateToDocumentOnly(event);
23969
24056
  }
23970
24057
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23971
- 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 }); }
24058
+ 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 ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23972
24059
  }
23973
24060
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
23974
24061
  type: Component,
23975
- 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"] }]
24062
+ 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 ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
23976
24063
  }], propDecorators: { type: [{
23977
24064
  type: Input
23978
24065
  }], disabled: [{
@@ -24047,48 +24134,23 @@ class DownloadsListComponent {
24047
24134
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24048
24135
  }
24049
24136
  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 }); }
24050
- 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 }); }
24137
+ 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 }); }
24051
24138
  }
24052
24139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24053
24140
  type: Component,
24054
- 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" }]
24141
+ 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" }]
24055
24142
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24056
24143
  type: Input
24057
24144
  }] } });
24058
24145
 
24059
- class CopyTextButtonComponent {
24146
+ class ApiCardComponent {
24060
24147
  constructor() {
24061
- this.displayText = true;
24062
- this.rows = 1;
24148
+ this.currentlyActive = false;
24149
+ this.openRecordApiForm = new EventEmitter();
24063
24150
  }
24064
- copyText(event) {
24065
- navigator.clipboard.writeText(this.text);
24066
- event.target.blur();
24067
- }
24068
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24069
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24070
- }
24071
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24072
- type: Component,
24073
- args: [{ selector: 'gn-ui-copy-text-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n" }]
24074
- }], propDecorators: { text: [{
24075
- type: Input
24076
- }], tooltipText: [{
24077
- type: Input
24078
- }], displayText: [{
24079
- type: Input
24080
- }], rows: [{
24081
- type: Input
24082
- }] } });
24083
-
24084
- class ApiCardComponent {
24085
- constructor() {
24086
- this.currentlyActive = false;
24087
- this.openRecordApiForm = new EventEmitter();
24088
- }
24089
- ngOnInit() {
24090
- this.displayApiFormButton =
24091
- this.link.accessServiceProtocol === 'ogcFeatures' ? true : false;
24151
+ ngOnInit() {
24152
+ this.displayApiFormButton =
24153
+ this.link.accessServiceProtocol === 'ogcFeatures' ? true : false;
24092
24154
  }
24093
24155
  ngOnChanges(changes) {
24094
24156
  this.currentlyActive =
@@ -24277,11 +24339,11 @@ class CarouselComponent {
24277
24339
  this.emblaApi.scrollTo(stepIndex);
24278
24340
  }
24279
24341
  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 }); }
24280
- 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 }); }
24342
+ 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 }); }
24281
24343
  }
24282
24344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24283
24345
  type: Component,
24284
- 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"] }]
24346
+ 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"] }]
24285
24347
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24286
24348
  type: Input
24287
24349
  }], stepsContainerClass: [{
@@ -24325,6 +24387,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24325
24387
  }]
24326
24388
  }] });
24327
24389
 
24390
+ class InteractiveTableColumnComponent {
24391
+ constructor() {
24392
+ this.grow = false;
24393
+ this.sortable = false;
24394
+ this.activeSort = null;
24395
+ this.sortChange = new EventEmitter();
24396
+ }
24397
+ handleSortChange() {
24398
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24399
+ this.sortChange.emit(this.activeSort);
24400
+ }
24401
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24402
+ 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 }); }
24403
+ }
24404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24405
+ type: Component,
24406
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24407
+ }], propDecorators: { header: [{
24408
+ type: ContentChild,
24409
+ args: ['header']
24410
+ }], cell: [{
24411
+ type: ContentChild,
24412
+ args: ['cell']
24413
+ }], grow: [{
24414
+ type: Input
24415
+ }], sortable: [{
24416
+ type: Input
24417
+ }], activeSort: [{
24418
+ type: Input
24419
+ }], sortChange: [{
24420
+ type: Output
24421
+ }] } });
24422
+
24423
+ class InteractiveTableComponent {
24424
+ constructor() {
24425
+ this.items = [];
24426
+ this.itemClick = new EventEmitter();
24427
+ }
24428
+ get gridStyle() {
24429
+ return {
24430
+ 'grid-template-columns': this.columns
24431
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24432
+ .join(' '),
24433
+ };
24434
+ }
24435
+ handleRowClick(item) {
24436
+ this.itemClick.emit(item);
24437
+ }
24438
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24439
+ 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 }); }
24440
+ }
24441
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24442
+ type: Component,
24443
+ 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"] }]
24444
+ }], propDecorators: { columns: [{
24445
+ type: ContentChildren,
24446
+ args: [InteractiveTableColumnComponent]
24447
+ }], items: [{
24448
+ type: Input
24449
+ }], itemClick: [{
24450
+ type: Output
24451
+ }] } });
24452
+
24328
24453
  class LinkCardComponent {
24329
24454
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24330
24455
  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 }); }
@@ -24338,11 +24463,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24338
24463
 
24339
24464
  class RelatedRecordCardComponent {
24340
24465
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24341
- 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 }); }
24466
+ 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 }); }
24342
24467
  }
24343
24468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
24344
24469
  type: Component,
24345
- 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" }]
24470
+ 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" }]
24346
24471
  }], propDecorators: { record: [{
24347
24472
  type: Input
24348
24473
  }] } });
@@ -24360,15 +24485,21 @@ class MetadataContactComponent {
24360
24485
  ? this.metadata.contactsForResource
24361
24486
  : this.metadata.contacts) || []);
24362
24487
  }
24488
+ get address() {
24489
+ const addressParts = this.contacts[0].address
24490
+ .split(',')
24491
+ .map((part) => part.trim());
24492
+ return addressParts;
24493
+ }
24363
24494
  onOrganizationClick() {
24364
24495
  this.organizationClick.emit(this.shownOrganization);
24365
24496
  }
24366
24497
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24367
- 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 *ngIf=\"shownOrganization\" class=\"mb-6 sm:mb-12\">\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.contact\n </p>\n <div class=\"flex mb-1\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n >\n {{ shownOrganization.name }}\n </div>\n </div>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-gray-700 text-sm hover:underline\"\n target=\"_blank\"\n >{{ contacts[0].email }}</a\n >\n <div *ngIf=\"shownOrganization.website\" class=\"mb-2\">\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\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n</div>\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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24498
+ 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 }); }
24368
24499
  }
24369
24500
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24370
24501
  type: Component,
24371
- args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"shownOrganization\" class=\"mb-6 sm:mb-12\">\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.contact\n </p>\n <div class=\"flex mb-1\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n >\n {{ shownOrganization.name }}\n </div>\n </div>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-gray-700 text-sm hover:underline\"\n target=\"_blank\"\n >{{ contacts[0].email }}</a\n >\n <div *ngIf=\"shownOrganization.website\" class=\"mb-2\">\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\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n</div>\n" }]
24502
+ 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" }]
24372
24503
  }], propDecorators: { metadata: [{
24373
24504
  type: Input
24374
24505
  }], organizationClick: [{
@@ -24634,7 +24765,10 @@ class DropdownMultiselectComponent {
24634
24765
  return this.choices.filter((choice) => this.selected.indexOf(choice.value) > -1);
24635
24766
  }
24636
24767
  get filteredChoicesByText() {
24637
- return this.choices.filter((choice) => choice.label.toLowerCase().includes(this.searchInputValue?.toLowerCase()));
24768
+ if (!this.searchInputValue)
24769
+ return this.choices;
24770
+ const filter = createFuzzyFilter(this.searchInputValue);
24771
+ return this.choices.filter((choice) => filter(choice.label));
24638
24772
  }
24639
24773
  get focusedIndex() {
24640
24774
  return this.checkboxes.reduce((prev, curr, curIndex) => curr.nativeElement === document.activeElement ? curIndex : prev, -1);
@@ -24769,11 +24903,11 @@ class DropdownMultiselectComponent {
24769
24903
  this.setFocus();
24770
24904
  }
24771
24905
  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 }); }
24772
- 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 }); }
24906
+ 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 }); }
24773
24907
  }
24774
24908
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24775
24909
  type: Component,
24776
- 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" }]
24910
+ 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" }]
24777
24911
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24778
24912
  type: Input
24779
24913
  }], choices: [{
@@ -25032,11 +25166,11 @@ class AutocompleteComponent {
25032
25166
  }
25033
25167
  }
25034
25168
  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 }); }
25035
- 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 }); }
25169
+ 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 }); }
25036
25170
  }
25037
25171
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25038
25172
  type: Component,
25039
- 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"] }]
25173
+ 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"] }]
25040
25174
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25041
25175
  type: Input
25042
25176
  }], action: [{
@@ -25085,11 +25219,11 @@ class StarToggleComponent {
25085
25219
  event.preventDefault();
25086
25220
  }
25087
25221
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25088
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25222
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25089
25223
  }
25090
25224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, decorators: [{
25091
25225
  type: Component,
25092
- args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
25226
+ args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
25093
25227
  }], propDecorators: { toggled: [{
25094
25228
  type: Input
25095
25229
  }], disabled: [{
@@ -25201,11 +25335,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25201
25335
 
25202
25336
  class NavigationButtonComponent {
25203
25337
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25204
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center backdrop-blur p-1 bg-primary-opacity-50 text-white rounded\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle\">{{ icon }}</mat-icon>\n <span class=\"mx-2 hidden group-hover:inline\">{{ label }}</span>\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25338
+ 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 }); }
25205
25339
  }
25206
25340
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25207
25341
  type: Component,
25208
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center backdrop-blur p-1 bg-primary-opacity-50 text-white rounded\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle\">{{ icon }}</mat-icon>\n <span class=\"mx-2 hidden group-hover:inline\">{{ label }}</span>\n</button>\n" }]
25342
+ 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" }]
25209
25343
  }], propDecorators: { label: [{
25210
25344
  type: Input
25211
25345
  }], icon: [{
@@ -25412,11 +25546,11 @@ class CheckboxComponent {
25412
25546
  this.changed.emit(this.checked);
25413
25547
  }
25414
25548
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25415
- 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 }); }
25549
+ 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 }); }
25416
25550
  }
25417
25551
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25418
25552
  type: Component,
25419
- 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"] }]
25553
+ 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"] }]
25420
25554
  }], propDecorators: { type: [{
25421
25555
  type: Input
25422
25556
  }], checked: [{
@@ -25471,6 +25605,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25471
25605
  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"] }]
25472
25606
  }] });
25473
25607
 
25608
+ class EditableLabelDirective {
25609
+ constructor(el, renderer) {
25610
+ this.el = el;
25611
+ this.renderer = renderer;
25612
+ this.editableLabelChanged = new EventEmitter();
25613
+ }
25614
+ ngAfterViewInit() {
25615
+ if (this.gnUiEditableLabel !== false) {
25616
+ const appendedInput = this.renderer.createElement('input');
25617
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25618
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25619
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25620
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25621
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25622
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25623
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25624
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25625
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25626
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25627
+ const hostContent = this.el.nativeElement.textContent || '';
25628
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25629
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25630
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25631
+ this.renderer.listen(appendedInput, 'input', (event) => {
25632
+ this.editableLabelChanged.emit(event.target.value);
25633
+ });
25634
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25635
+ }
25636
+ }
25637
+ 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 }); }
25638
+ 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 }); }
25639
+ }
25640
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25641
+ type: Directive,
25642
+ args: [{
25643
+ selector: '[gnUiEditableLabel]',
25644
+ standalone: true,
25645
+ }]
25646
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25647
+ type: Output
25648
+ }], gnUiEditableLabel: [{
25649
+ type: Input
25650
+ }] } });
25651
+
25474
25652
  class UiInputsModule {
25475
25653
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25476
25654
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
@@ -25510,7 +25688,8 @@ class UiInputsModule {
25510
25688
  MatFormFieldModule,
25511
25689
  MatInputModule,
25512
25690
  MatDatepickerModule,
25513
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25691
+ MatNativeDateModule,
25692
+ EditableLabelDirective], exports: [DropdownSelectorComponent,
25514
25693
  AutocompleteComponent,
25515
25694
  ButtonComponent,
25516
25695
  TextInputComponent,
@@ -25526,7 +25705,8 @@ class UiInputsModule {
25526
25705
  CopyTextButtonComponent,
25527
25706
  CheckboxComponent,
25528
25707
  SearchInputComponent,
25529
- DateRangePickerComponent] }); }
25708
+ DateRangePickerComponent,
25709
+ EditableLabelDirective] }); }
25530
25710
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25531
25711
  TranslateModule.forChild(),
25532
25712
  NgxDropzoneModule,
@@ -25592,6 +25772,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25592
25772
  MatInputModule,
25593
25773
  MatDatepickerModule,
25594
25774
  MatNativeDateModule,
25775
+ EditableLabelDirective,
25595
25776
  ],
25596
25777
  exports: [
25597
25778
  DropdownSelectorComponent,
@@ -25611,6 +25792,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25611
25792
  CheckboxComponent,
25612
25793
  SearchInputComponent,
25613
25794
  DateRangePickerComponent,
25795
+ EditableLabelDirective,
25614
25796
  ],
25615
25797
  }]
25616
25798
  }] });
@@ -25768,6 +25950,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25768
25950
  type: Input
25769
25951
  }] } });
25770
25952
 
25953
+ class ImageOverlayPreviewComponent {
25954
+ constructor() {
25955
+ this.isPlaceholderShown = new EventEmitter();
25956
+ }
25957
+ openLightbox(src) {
25958
+ basicLightbox.create(`<img src="${src}"/>`).show();
25959
+ }
25960
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25961
+ 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"] }] }); }
25962
+ }
25963
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25964
+ type: Component,
25965
+ 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" }]
25966
+ }], propDecorators: { imageUrl: [{
25967
+ type: Input
25968
+ }], isPlaceholderShown: [{
25969
+ type: Output
25970
+ }] } });
25971
+
25771
25972
  class UiElementsModule {
25772
25973
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25773
25974
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -25789,7 +25990,9 @@ class UiElementsModule {
25789
25990
  GnUiLinkifyDirective,
25790
25991
  PaginationButtonsComponent,
25791
25992
  MaxLinesComponent,
25792
- RecordApiFormComponent], imports: [CommonModule,
25993
+ RecordApiFormComponent,
25994
+ MarkdownParserComponent,
25995
+ ImageOverlayPreviewComponent], imports: [CommonModule,
25793
25996
  MatIconModule,
25794
25997
  MatTooltipModule,
25795
25998
  UiWidgetsModule,
@@ -25814,7 +26017,10 @@ class UiElementsModule {
25814
26017
  AvatarComponent,
25815
26018
  UserPreviewComponent,
25816
26019
  PaginationButtonsComponent,
25817
- RecordApiFormComponent] }); }
26020
+ MaxLinesComponent,
26021
+ RecordApiFormComponent,
26022
+ MarkdownParserComponent,
26023
+ ImageOverlayPreviewComponent] }); }
25818
26024
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, imports: [CommonModule,
25819
26025
  MatIconModule,
25820
26026
  MatTooltipModule,
@@ -25863,6 +26069,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25863
26069
  PaginationButtonsComponent,
25864
26070
  MaxLinesComponent,
25865
26071
  RecordApiFormComponent,
26072
+ MarkdownParserComponent,
26073
+ ImageOverlayPreviewComponent,
25866
26074
  ],
25867
26075
  exports: [
25868
26076
  MetadataInfoComponent,
@@ -25882,148 +26090,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25882
26090
  AvatarComponent,
25883
26091
  UserPreviewComponent,
25884
26092
  PaginationButtonsComponent,
26093
+ MaxLinesComponent,
25885
26094
  RecordApiFormComponent,
26095
+ MarkdownParserComponent,
26096
+ ImageOverlayPreviewComponent,
25886
26097
  ],
25887
26098
  }]
25888
26099
  }] });
25889
26100
 
25890
- class RecordTableComponent {
25891
- constructor() {
25892
- this.selectedRecords = [];
25893
- this.records = [];
25894
- this.recordClick = new EventEmitter();
25895
- this.recordsSelect = new EventEmitter();
25896
- this.recordsDeselect = new EventEmitter();
25897
- this.sortByChange = new EventEmitter();
25898
- }
25899
- dateToString(date) {
25900
- return date?.toLocaleDateString(undefined, {
25901
- year: 'numeric',
25902
- month: 'long',
25903
- day: 'numeric',
25904
- timeZone: 'UTC',
25905
- });
25906
- }
25907
- getStatus(isPublishedToAll) {
25908
- return isPublishedToAll ? 'published' : 'not published';
25909
- }
25910
- formatUserInfo(userInfo) {
25911
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
25912
- if (infos && infos.length === 4) {
25913
- return `${infos[2]} ${infos[1]}`;
25914
- }
25915
- return undefined;
25916
- }
25917
- getRecordFormats(record) {
25918
- if (record.kind === 'service' || !('distributions' in record)) {
25919
- return [];
25920
- }
25921
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
25922
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
25923
- return formats;
25924
- }
25925
- getBadgeColor(format) {
25926
- return getBadgeColor(format);
25927
- }
25928
- getOrderForColumn(col) {
25929
- if (!this.sortBy) {
25930
- return null;
25931
- }
25932
- let order = null;
25933
- const sortedArray = Array.isArray(this.sortBy[0])
25934
- ? this.sortBy
25935
- : [this.sortBy];
25936
- sortedArray.forEach((sortedCol) => {
25937
- if (sortedCol[1] === col) {
25938
- order = sortedCol[0];
25939
- }
25940
- });
25941
- return order;
25942
- }
25943
- setSortBy(col) {
25944
- const sortOrder = this.getOrderForColumn(col);
25945
- let newOrder;
25946
- if (sortOrder) {
25947
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
25948
- }
25949
- else {
25950
- newOrder = 'asc';
25951
- }
25952
- this.sortByChange.emit([newOrder, col]);
25953
- this.sortBy = [newOrder, col];
25954
- }
25955
- isSortedBy(col, order) {
25956
- const sortOrder = this.getOrderForColumn(col);
25957
- return sortOrder === order;
25958
- }
25959
- isChecked(record) {
25960
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
25961
- return true;
25962
- }
25963
- return false;
25964
- }
25965
- handleRecordSelectedChange(selected, record) {
25966
- if (!selected) {
25967
- this.recordsDeselect.emit([record]);
25968
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
25969
- }
25970
- else {
25971
- this.recordsSelect.emit([record]);
25972
- this.selectedRecords.push(record.uniqueIdentifier);
25973
- }
25974
- }
25975
- selectAll() {
25976
- if (this.isAllSelected()) {
25977
- this.recordsDeselect.emit(this.records);
25978
- this.selectedRecords = [];
25979
- }
25980
- else {
25981
- this.recordsSelect.emit(this.records);
25982
- this.selectedRecords = this.records.map((record) => {
25983
- return record.uniqueIdentifier;
25984
- });
25985
- }
25986
- }
25987
- isAllSelected() {
25988
- if (this.selectedRecords.length === this.records.length) {
25989
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
25990
- if (allRecords.length === this.records.length) {
25991
- return true;
25992
- }
25993
- }
25994
- return false;
25995
- }
25996
- isSomeSelected() {
25997
- if (this.selectedRecords.length > 0 &&
25998
- this.selectedRecords.length < this.records.length) {
25999
- return true;
26000
- }
26001
- return false;
26002
- }
26003
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26004
- 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"] }] }); }
26005
- }
26006
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26007
- type: Component,
26008
- 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"] }]
26009
- }], propDecorators: { selectedRecords: [{
26010
- type: Input
26011
- }], records: [{
26012
- type: Input
26013
- }], totalHits: [{
26014
- type: Input
26015
- }], sortBy: [{
26016
- type: Input
26017
- }], recordClick: [{
26018
- type: Output
26019
- }], recordsSelect: [{
26020
- type: Output
26021
- }], recordsDeselect: [{
26022
- type: Output
26023
- }], sortByChange: [{
26024
- type: Output
26025
- }] } });
26026
-
26027
26101
  class UiSearchModule {
26028
26102
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26029
26103
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26036,8 +26110,7 @@ class UiSearchModule {
26036
26110
  ResultsHitsNumberComponent,
26037
26111
  ResultsListItemComponent,
26038
26112
  RecordPreviewFeedComponent,
26039
- RecordPreviewRowComponent,
26040
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26113
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26041
26114
  FacetsModule$1,
26042
26115
  FormsModule,
26043
26116
  ReactiveFormsModule,
@@ -26048,7 +26121,8 @@ class UiSearchModule {
26048
26121
  UiElementsModule,
26049
26122
  MatIconModule,
26050
26123
  MatCheckboxModule,
26051
- RouterLink], exports: [RecordPreviewListComponent,
26124
+ RouterLink,
26125
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26052
26126
  RecordPreviewCardComponent,
26053
26127
  RecordPreviewTextComponent,
26054
26128
  RecordPreviewTitleComponent,
@@ -26058,8 +26132,7 @@ class UiSearchModule {
26058
26132
  RecordPreviewComponent,
26059
26133
  ResultsHitsNumberComponent,
26060
26134
  RecordPreviewFeedComponent,
26061
- RecordPreviewRowComponent,
26062
- RecordTableComponent] }); }
26135
+ RecordPreviewRowComponent] }); }
26063
26136
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26064
26137
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26065
26138
  ], imports: [CommonModule,
@@ -26074,7 +26147,8 @@ class UiSearchModule {
26074
26147
  UiInputsModule,
26075
26148
  UiElementsModule,
26076
26149
  MatIconModule,
26077
- MatCheckboxModule, FacetsModule$1] }); }
26150
+ MatCheckboxModule,
26151
+ InteractiveTableComponent, FacetsModule$1] }); }
26078
26152
  }
26079
26153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26080
26154
  type: NgModule,
@@ -26091,7 +26165,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26091
26165
  ResultsListItemComponent,
26092
26166
  RecordPreviewFeedComponent,
26093
26167
  RecordPreviewRowComponent,
26094
- RecordTableComponent,
26095
26168
  ],
26096
26169
  imports: [
26097
26170
  CommonModule,
@@ -26108,6 +26181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26108
26181
  MatIconModule,
26109
26182
  MatCheckboxModule,
26110
26183
  RouterLink,
26184
+ InteractiveTableComponent,
26111
26185
  ],
26112
26186
  exports: [
26113
26187
  RecordPreviewListComponent,
@@ -26121,7 +26195,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26121
26195
  ResultsHitsNumberComponent,
26122
26196
  RecordPreviewFeedComponent,
26123
26197
  RecordPreviewRowComponent,
26124
- RecordTableComponent,
26125
26198
  ],
26126
26199
  providers: [
26127
26200
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26680,6 +26753,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26680
26753
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26681
26754
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26682
26755
 
26756
+ // this geometry will be used to filter & boost results accordingly
26757
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26758
+
26683
26759
  class SearchFacade {
26684
26760
  constructor(store, filterGeometry) {
26685
26761
  this.store = store;
@@ -26784,6 +26860,7 @@ class SearchFacade {
26784
26860
  this.store.dispatch(new SetFilters({}, this.searchId));
26785
26861
  this.store.dispatch(new SetSortBy([], this.searchId));
26786
26862
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
26863
+ return this;
26787
26864
  }
26788
26865
  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 }); }
26789
26866
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27168,8 +27245,11 @@ class FuzzySearchComponent {
27168
27245
  this.searchService.updateFilters({ any });
27169
27246
  }
27170
27247
  }
27171
- handleInputCleared() {
27172
- this.searchService.updateFilters({ any: '' });
27248
+ async handleInputCleared() {
27249
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27250
+ if (currentSearchFilters.any) {
27251
+ this.searchService.updateFilters({ any: '' });
27252
+ }
27173
27253
  }
27174
27254
  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 }); }
27175
27255
  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 }); }
@@ -27249,6 +27329,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27249
27329
  args: [RESULTS_LAYOUT_CONFIG]
27250
27330
  }] }]; } });
27251
27331
 
27332
+ // expects the replacement key ${uuid}
27333
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27334
+
27252
27335
  class FavoriteStarComponent {
27253
27336
  set record(value) {
27254
27337
  this.record_ = value;
@@ -27269,6 +27352,7 @@ class FavoriteStarComponent {
27269
27352
  this.changeDetector = changeDetector;
27270
27353
  this.authService = authService;
27271
27354
  this.translateService = translateService;
27355
+ this.displayCount = true;
27272
27356
  this.isFavorite$ = this.favoritesService.myFavoritesUuid$.pipe(map$1((favorites) => favorites.indexOf(this.record.uniqueIdentifier) > -1));
27273
27357
  this.isAnonymous$ = this.platformService.isAnonymous();
27274
27358
  this.loading = false;
@@ -27331,12 +27415,14 @@ class FavoriteStarComponent {
27331
27415
  });
27332
27416
  }
27333
27417
  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 }); }
27334
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div>\n <span class=\"align-text-top mr-1.5 favorite-count\" *ngIf=\"hasFavoriteCount\">{{\n favoriteCount\n }}</span>\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27418
+ 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 }); }
27335
27419
  }
27336
27420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27337
27421
  type: Component,
27338
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <span class=\"align-text-top mr-1.5 favorite-count\" *ngIf=\"hasFavoriteCount\">{{\n favoriteCount\n }}</span>\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n" }]
27339
- }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { record: [{
27422
+ 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" }]
27423
+ }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27424
+ type: Input
27425
+ }], record: [{
27340
27426
  type: Input
27341
27427
  }], starToggleRef: [{
27342
27428
  type: ViewChild,
@@ -27379,7 +27465,7 @@ class ResultsListContainerComponent {
27379
27465
  return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
27380
27466
  }
27381
27467
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsListContainerComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }, { token: RECORD_URL_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
27382
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-search-results-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-search-results-error>\n <gn-ui-search-results-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-search-results-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["record"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }] }); }
27468
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-search-results-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-search-results-error>\n <gn-ui-search-results-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-search-results-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }] }); }
27383
27469
  }
27384
27470
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
27385
27471
  type: Component,
@@ -27507,9 +27593,11 @@ class SearchEffects {
27507
27593
  // I could not get this to work (maybe a bug in rxjs?)
27508
27594
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27509
27595
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27510
- return of([state, favorites, null]);
27596
+ return of([state, favorites, undefined]);
27511
27597
  }
27512
27598
  return this.filterGeometry$.pipe(tap$2((geom) => {
27599
+ if (!geom)
27600
+ return;
27513
27601
  try {
27514
27602
  const trace = valid$1(geom, true);
27515
27603
  if (trace?.length > 0) {
@@ -27521,7 +27609,7 @@ class SearchEffects {
27521
27609
  throw new Error();
27522
27610
  }
27523
27611
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27524
- return of([state, favorites, null]);
27612
+ return of([state, favorites, undefined]);
27525
27613
  }));
27526
27614
  }), switchMap$1(([state, favorites, geometry]) => {
27527
27615
  const { currentPage, pageSize, sort } = state.params;
@@ -27958,10 +28046,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27958
28046
  type: Input
27959
28047
  }] } });
27960
28048
 
27961
- // this geometry will be used to filter & boost results accordingly
27962
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
27963
- // expects the replacement key ${uuid}
27964
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27965
28049
  class FeatureSearchModule {
27966
28050
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27967
28051
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28060,6 +28144,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28060
28144
  }]
28061
28145
  }] });
28062
28146
 
28147
+ class ResultsTableComponent {
28148
+ constructor(searchFacade, searchService, selectionService) {
28149
+ this.searchFacade = searchFacade;
28150
+ this.searchService = searchService;
28151
+ this.selectionService = selectionService;
28152
+ this.recordClick = new EventEmitter();
28153
+ this.records$ = this.searchFacade.results$;
28154
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28155
+ }
28156
+ dateToString(date) {
28157
+ return date?.toLocaleDateString(undefined, {
28158
+ year: 'numeric',
28159
+ month: 'long',
28160
+ day: 'numeric',
28161
+ timeZone: 'UTC',
28162
+ });
28163
+ }
28164
+ getStatus(isPublishedToAll) {
28165
+ return isPublishedToAll ? 'published' : 'not published';
28166
+ }
28167
+ getRecordFormats(record) {
28168
+ if (record.kind === 'service' || !('distributions' in record)) {
28169
+ return [];
28170
+ }
28171
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28172
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28173
+ return formats;
28174
+ }
28175
+ formatUserInfo(userInfo) {
28176
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28177
+ if (infos && infos.length === 4) {
28178
+ return `${infos[2]} ${infos[1]}`;
28179
+ }
28180
+ return undefined;
28181
+ }
28182
+ getBadgeColor(format) {
28183
+ return getBadgeColor(format);
28184
+ }
28185
+ handleRecordClick(item) {
28186
+ this.recordClick.emit(item);
28187
+ }
28188
+ setSortBy(col, order) {
28189
+ this.searchService.setSortBy([order, col]);
28190
+ }
28191
+ isSortedBy(col) {
28192
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28193
+ const sortArray = Array.isArray(sortOrder[0])
28194
+ ? sortOrder
28195
+ : [sortOrder];
28196
+ for (const sort of sortArray) {
28197
+ if (sort[1] === col) {
28198
+ return sort[0];
28199
+ }
28200
+ }
28201
+ return null;
28202
+ }));
28203
+ }
28204
+ isChecked(record) {
28205
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28206
+ return selectedRecords.includes(record.uniqueIdentifier);
28207
+ }));
28208
+ }
28209
+ handleRecordSelectedChange(selected, record) {
28210
+ if (!selected) {
28211
+ this.selectionService.deselectRecords([record]);
28212
+ }
28213
+ else {
28214
+ this.selectionService.selectRecords([record]);
28215
+ }
28216
+ }
28217
+ async toggleSelectAll() {
28218
+ const records = await firstValueFrom(this.records$);
28219
+ if (await firstValueFrom(this.isAllSelected())) {
28220
+ this.selectionService.deselectRecords(records);
28221
+ }
28222
+ else {
28223
+ this.selectionService.selectRecords(records);
28224
+ }
28225
+ }
28226
+ isAllSelected() {
28227
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28228
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28229
+ }));
28230
+ }
28231
+ isSomeSelected() {
28232
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28233
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28234
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28235
+ return !allSelected && someSelected;
28236
+ }));
28237
+ }
28238
+ 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 }); }
28239
+ 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"] }] }); }
28240
+ }
28241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28242
+ type: Component,
28243
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28244
+ CommonModule,
28245
+ UiInputsModule,
28246
+ InteractiveTableComponent,
28247
+ InteractiveTableColumnComponent,
28248
+ MatIconModule,
28249
+ TranslateModule,
28250
+ ], 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" }]
28251
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28252
+ type: Output
28253
+ }] } });
28254
+
28063
28255
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28064
28256
  get mapLinks() {
28065
28257
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28094,7 +28286,7 @@ class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28094
28286
  return getLinkLabel(link);
28095
28287
  }
28096
28288
  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 }); }
28097
- 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 }); }
28289
+ 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 }); }
28098
28290
  }
28099
28291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerRecordPreviewComponent, decorators: [{
28100
28292
  type: Component,
@@ -28138,6 +28330,208 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28138
28330
  ], template: "<div class=\"h-full text-sm\">\n <gn-ui-fuzzy-search></gn-ui-fuzzy-search>\n <gn-ui-results-list-container\n layout=\"ADDLAYER\"\n ></gn-ui-results-list-container>\n</div>\n", styles: ["::ng-deep .mat-tab-body-wrapper{flex-grow:1}\n"] }]
28139
28331
  }], ctorParameters: function () { return [{ type: SearchFacade }]; } });
28140
28332
 
28333
+ class AddLayerFromWmsComponent {
28334
+ constructor(mapFacade, changeDetectorRef) {
28335
+ this.mapFacade = mapFacade;
28336
+ this.changeDetectorRef = changeDetectorRef;
28337
+ this.wmsUrl = '';
28338
+ this.loading = false;
28339
+ this.layers = [];
28340
+ this.wmsEndpoint = null;
28341
+ this.urlChange = new Subject();
28342
+ this.errorMessage = null;
28343
+ }
28344
+ ngOnInit() {
28345
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => this.loadLayers());
28346
+ }
28347
+ async loadLayers() {
28348
+ this.errorMessage = null;
28349
+ try {
28350
+ this.loading = true;
28351
+ if (this.wmsUrl.trim() === '') {
28352
+ this.layers = [];
28353
+ return;
28354
+ }
28355
+ this.wmsEndpoint = await new WmsEndpoint(this.wmsUrl).isReady();
28356
+ this.layers = this.wmsEndpoint.getLayers();
28357
+ }
28358
+ catch (error) {
28359
+ const err = error;
28360
+ this.layers = [];
28361
+ this.errorMessage = 'Error loading layers: ' + err.message;
28362
+ }
28363
+ finally {
28364
+ this.loading = false;
28365
+ this.changeDetectorRef.markForCheck();
28366
+ }
28367
+ }
28368
+ addLayer(layer) {
28369
+ const layerToAdd = {
28370
+ name: layer.name,
28371
+ url: this.wmsUrl.toString(),
28372
+ type: MapContextLayerTypeEnum.WMS,
28373
+ };
28374
+ this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
28375
+ }
28376
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28377
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28378
+ }
28379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, decorators: [{
28380
+ type: Component,
28381
+ 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" }]
28382
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28383
+
28384
+ const INVALID_FILE_FORMAT_ERROR_MESSAGE = 'Invalid file format';
28385
+ class AddLayerFromFileComponent {
28386
+ constructor(mapFacade, changeDetectorRef) {
28387
+ this.mapFacade = mapFacade;
28388
+ this.changeDetectorRef = changeDetectorRef;
28389
+ this.errorMessage = null;
28390
+ this.successMessage = null;
28391
+ this.loading = false;
28392
+ this.acceptedMimeType = ['.geojson'];
28393
+ this.maxFileSize = 5000000;
28394
+ }
28395
+ async handleFileChange(file) {
28396
+ if (!file) {
28397
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28398
+ return;
28399
+ }
28400
+ if (file.size > this.maxFileSize) {
28401
+ this.displayMessage('File size exceeds the limit of 5MB', 'error');
28402
+ return;
28403
+ }
28404
+ await this.addLayer(file);
28405
+ }
28406
+ async addLayer(file) {
28407
+ this.errorMessage = null;
28408
+ this.loading = true;
28409
+ try {
28410
+ if (!this.isFileFormatValid(file)) {
28411
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28412
+ return;
28413
+ }
28414
+ const fileExtension = this.getFileExtension(file);
28415
+ switch (fileExtension) {
28416
+ case 'geojson':
28417
+ await this.addGeoJsonLayer(file);
28418
+ break;
28419
+ default:
28420
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28421
+ break;
28422
+ }
28423
+ }
28424
+ catch (error) {
28425
+ const err = error;
28426
+ this.displayMessage('Error loading file: ' + err.message, 'error');
28427
+ }
28428
+ finally {
28429
+ this.loading = false;
28430
+ }
28431
+ }
28432
+ addGeoJsonLayer(file) {
28433
+ return new Promise((resolve, reject) => {
28434
+ try {
28435
+ const reader = new FileReader();
28436
+ reader.onload = () => {
28437
+ const result = reader.result;
28438
+ const title = file.name.split('.').slice(0, -1).join('.');
28439
+ const layerToAdd = {
28440
+ type: 'geojson',
28441
+ data: result,
28442
+ };
28443
+ this.mapFacade.addLayer({ ...layerToAdd, title: title });
28444
+ this.displayMessage('File successfully added to map', 'success');
28445
+ resolve();
28446
+ };
28447
+ reader.onerror = reject;
28448
+ reader.readAsText(file);
28449
+ }
28450
+ catch (error) {
28451
+ reject(error);
28452
+ }
28453
+ });
28454
+ }
28455
+ isFileFormatValid(file) {
28456
+ const fileExtension = this.getFileExtension(file);
28457
+ return this.acceptedMimeType.includes(`.${fileExtension}`);
28458
+ }
28459
+ getFileExtension(file) {
28460
+ return file.name.split('.').pop();
28461
+ }
28462
+ displayMessage(message, type) {
28463
+ if (type === 'success') {
28464
+ this.successMessage = message;
28465
+ }
28466
+ else if (type === 'error') {
28467
+ this.errorMessage = message;
28468
+ }
28469
+ setTimeout(() => {
28470
+ this.successMessage = null;
28471
+ this.errorMessage = null;
28472
+ this.changeDetectorRef.detectChanges();
28473
+ }, 5000);
28474
+ }
28475
+ 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 }); }
28476
+ 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" }] }); }
28477
+ }
28478
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, decorators: [{
28479
+ type: Component,
28480
+ 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" }]
28481
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28482
+
28483
+ class AddLayerFromWfsComponent {
28484
+ constructor(mapFacade, changeDetectorRef) {
28485
+ this.mapFacade = mapFacade;
28486
+ this.changeDetectorRef = changeDetectorRef;
28487
+ this.wfsUrl = '';
28488
+ this.loading = false;
28489
+ this.layers = [];
28490
+ this.wfsEndpoint = null;
28491
+ this.urlChange = new Subject();
28492
+ this.errorMessage = null;
28493
+ }
28494
+ ngOnInit() {
28495
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => this.loadLayers());
28496
+ }
28497
+ async loadLayers() {
28498
+ this.errorMessage = null;
28499
+ try {
28500
+ this.loading = true;
28501
+ if (this.wfsUrl.trim() === '') {
28502
+ this.layers = [];
28503
+ return;
28504
+ }
28505
+ this.wfsEndpoint = await new WfsEndpoint(this.wfsUrl).isReady();
28506
+ this.layers = this.wfsEndpoint.getFeatureTypes();
28507
+ console.log(this.layers);
28508
+ }
28509
+ catch (error) {
28510
+ const err = error;
28511
+ this.layers = [];
28512
+ this.errorMessage = 'Error loading layers: ' + err.message;
28513
+ }
28514
+ finally {
28515
+ this.loading = false;
28516
+ this.changeDetectorRef.markForCheck();
28517
+ }
28518
+ }
28519
+ addLayer(layer) {
28520
+ const layerToAdd = {
28521
+ name: layer.name,
28522
+ url: this.wfsUrl.toString(),
28523
+ type: MapContextLayerTypeEnum.WFS,
28524
+ };
28525
+ this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
28526
+ }
28527
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28528
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28529
+ }
28530
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
28531
+ type: Component,
28532
+ args: [{ selector: 'gn-ui-add-layer-from-wfs', template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n" }]
28533
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28534
+
28141
28535
  class LayersPanelComponent {
28142
28536
  constructor(mapFacade) {
28143
28537
  this.mapFacade = mapFacade;
@@ -28147,11 +28541,11 @@ class LayersPanelComponent {
28147
28541
  this.mapFacade.removeLayer(index);
28148
28542
  }
28149
28543
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
28150
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LayersPanelComponent, selector: "gn-ui-layers-panel", ngImport: i0, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from WMS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from WFS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from file</div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ExpandablePanelButtonComponent, selector: "gn-ui-expandable-panel-button", inputs: ["titleTemplate", "collapsed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$3.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28544
+ 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 }); }
28151
28545
  }
28152
28546
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
28153
28547
  type: Component,
28154
- args: [{ selector: 'gn-ui-layers-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from WMS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from WFS</div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from file</div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n" }]
28548
+ 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" }]
28155
28549
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28156
28550
 
28157
28551
  class MapEffects {
@@ -28184,6 +28578,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28184
28578
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28185
28579
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28186
28580
 
28581
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28582
+ class GeocodingService {
28583
+ constructor(provider) {
28584
+ this.provider = provider;
28585
+ }
28586
+ query(text) {
28587
+ let queryObservable;
28588
+ switch (this.provider[0]) {
28589
+ case 'geoadmin':
28590
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28591
+ break;
28592
+ case 'geonames':
28593
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28594
+ break;
28595
+ case 'data-gouv-fr':
28596
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28597
+ break;
28598
+ default:
28599
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28600
+ }
28601
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28602
+ }
28603
+ 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 }); }
28604
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28605
+ }
28606
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28607
+ type: Injectable,
28608
+ args: [{
28609
+ providedIn: 'root',
28610
+ }]
28611
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28612
+ type: Inject,
28613
+ args: [GEOCODING_PROVIDER]
28614
+ }] }]; } });
28615
+
28616
+ class GeocodingComponent {
28617
+ constructor(mapManager, geocodingService) {
28618
+ this.mapManager = mapManager;
28619
+ this.geocodingService = geocodingService;
28620
+ this.searchText = '';
28621
+ this.results = [];
28622
+ this.searchTextChanged = new Subject();
28623
+ this.destroy$ = new Subject();
28624
+ this.errorMessage = null;
28625
+ this.searchTextChanged
28626
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28627
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28628
+ this.errorMessage =
28629
+ 'An error occurred while searching. Please try again.';
28630
+ console.error(error);
28631
+ return [];
28632
+ }));
28633
+ }), takeUntil(this.destroy$))
28634
+ .subscribe((results) => {
28635
+ this.results = results;
28636
+ });
28637
+ }
28638
+ ngOnDestroy() {
28639
+ this.destroy$.next();
28640
+ this.destroy$.complete();
28641
+ }
28642
+ onSearchChange(searchText) {
28643
+ if (!searchText) {
28644
+ this.clearSearch();
28645
+ return;
28646
+ }
28647
+ else {
28648
+ this.searchTextChanged.next(searchText);
28649
+ }
28650
+ }
28651
+ clearSearch() {
28652
+ this.searchText = '';
28653
+ this.results = [];
28654
+ this.errorMessage = null;
28655
+ }
28656
+ zoomToLocation(result) {
28657
+ const map = this.mapManager.map;
28658
+ const view = map.getView();
28659
+ const geometry = result.geom;
28660
+ if (geometry.type === 'Point') {
28661
+ this.zoomToPoint(geometry.coordinates, view);
28662
+ }
28663
+ else if (geometry.type === 'Polygon') {
28664
+ this.zoomToPolygon(geometry.coordinates, view);
28665
+ }
28666
+ else {
28667
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28668
+ }
28669
+ }
28670
+ zoomToPoint(pointCoords, view) {
28671
+ const transformedCoords = fromLonLat(pointCoords);
28672
+ view.setCenter(transformedCoords);
28673
+ view.setZoom(12);
28674
+ }
28675
+ zoomToPolygon(polygonCoords, view) {
28676
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28677
+ const polygon = new Polygon([transformedCoords]);
28678
+ view.fit(polygon, {
28679
+ duration: 100,
28680
+ maxZoom: 12,
28681
+ });
28682
+ }
28683
+ onEnterPress() {
28684
+ if (this.results && this.results.length > 0) {
28685
+ this.zoomToLocation(this.results[0]);
28686
+ }
28687
+ }
28688
+ 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 }); }
28689
+ 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" }] }); }
28690
+ }
28691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28692
+ type: Component,
28693
+ 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" }]
28694
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28695
+
28187
28696
  class FeatureMapModule {
28188
28697
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28189
28698
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28191,7 +28700,11 @@ class FeatureMapModule {
28191
28700
  LayersPanelComponent,
28192
28701
  AddLayerFromCatalogComponent,
28193
28702
  MapContainerComponent,
28194
- AddLayerRecordPreviewComponent], imports: [CommonModule,
28703
+ AddLayerRecordPreviewComponent,
28704
+ AddLayerFromWmsComponent,
28705
+ AddLayerFromFileComponent,
28706
+ AddLayerFromWfsComponent,
28707
+ GeocodingComponent], imports: [CommonModule,
28195
28708
  UiMapModule,
28196
28709
  UiLayoutModule,
28197
28710
  MatIconModule,
@@ -28202,13 +28715,18 @@ class FeatureMapModule {
28202
28715
  MapInstanceDirective,
28203
28716
  LayersPanelComponent,
28204
28717
  AddLayerFromCatalogComponent,
28205
- MapContainerComponent] }); }
28718
+ MapContainerComponent,
28719
+ GeocodingComponent] }); }
28206
28720
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28207
28721
  {
28208
28722
  provide: FEATURE_MAP_OPTIONS,
28209
28723
  useValue: defaultMapOptions,
28210
28724
  },
28211
28725
  MapFacade,
28726
+ {
28727
+ provide: GEOCODING_PROVIDER,
28728
+ useValue: ['geonames', { maxRows: 5 }],
28729
+ },
28212
28730
  ], imports: [CommonModule,
28213
28731
  UiMapModule,
28214
28732
  UiLayoutModule,
@@ -28231,6 +28749,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28231
28749
  AddLayerFromCatalogComponent,
28232
28750
  MapContainerComponent,
28233
28751
  AddLayerRecordPreviewComponent,
28752
+ AddLayerFromWmsComponent,
28753
+ AddLayerFromFileComponent,
28754
+ AddLayerFromWfsComponent,
28755
+ GeocodingComponent,
28234
28756
  ],
28235
28757
  exports: [
28236
28758
  MapContextComponent,
@@ -28238,6 +28760,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28238
28760
  LayersPanelComponent,
28239
28761
  AddLayerFromCatalogComponent,
28240
28762
  MapContainerComponent,
28763
+ GeocodingComponent,
28241
28764
  ],
28242
28765
  imports: [
28243
28766
  CommonModule,
@@ -28258,6 +28781,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28258
28781
  useValue: defaultMapOptions,
28259
28782
  },
28260
28783
  MapFacade,
28784
+ {
28785
+ provide: GEOCODING_PROVIDER,
28786
+ useValue: ['geonames', { maxRows: 5 }],
28787
+ },
28261
28788
  ],
28262
28789
  }]
28263
28790
  }] });
@@ -28352,7 +28879,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28352
28879
  ...state,
28353
28880
  chartConfig,
28354
28881
  })), on(close, (state) => {
28355
- // eslint-disable-next-line
28882
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28356
28883
  const { metadata, related, ...stateWithoutMd } = state;
28357
28884
  return stateWithoutMd;
28358
28885
  }));
@@ -29619,15 +30146,16 @@ class DataService {
29619
30146
  // Pour DL toutes les données
29620
30147
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
29621
30148
  ...wfsLink,
30149
+ type: 'download',
29622
30150
  url: new URL(urls[format]),
29623
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30151
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29624
30152
  }))));
29625
30153
  }
29626
30154
  getDownloadLinksFromEsriRest(esriRestLink) {
29627
30155
  return ['json', 'geojson'].map((format) => ({
29628
30156
  ...esriRestLink,
29629
30157
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
29630
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30158
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29631
30159
  }));
29632
30160
  }
29633
30161
  readAsGeoJson(link) {
@@ -30021,12 +30549,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30021
30549
  }] } });
30022
30550
 
30023
30551
  class MapViewComponent {
30024
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30552
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30025
30553
  this.mdViewFacade = mdViewFacade;
30026
30554
  this.mapManager = mapManager;
30027
30555
  this.mapUtils = mapUtils;
30028
30556
  this.dataService = dataService;
30029
- this.proxy = proxy;
30030
30557
  this.featureInfo = featureInfo;
30031
30558
  this.changeRef = changeRef;
30032
30559
  this.styleService = styleService;
@@ -30061,7 +30588,7 @@ class MapViewComponent {
30061
30588
  return of([]);
30062
30589
  }), finalize(() => (this.loading = false)));
30063
30590
  }));
30064
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30591
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30065
30592
  console.warn(error); // FIXME: report this to the user somehow
30066
30593
  return of(undefined);
30067
30594
  }), map$1((extent) => ({
@@ -30069,7 +30596,18 @@ class MapViewComponent {
30069
30596
  view: {
30070
30597
  extent,
30071
30598
  },
30072
- })), tap$1(() => this.resetSelection()))));
30599
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30600
+ if (context.view.extent)
30601
+ return context;
30602
+ const extent = this.mapUtils.getRecordExtent(metadata);
30603
+ return {
30604
+ ...context,
30605
+ view: {
30606
+ ...context.view,
30607
+ extent,
30608
+ },
30609
+ };
30610
+ }));
30073
30611
  }
30074
30612
  ngOnDestroy() {
30075
30613
  this.subscription.unsubscribe();
@@ -30122,13 +30660,13 @@ class MapViewComponent {
30122
30660
  selectLinkToDisplay(link) {
30123
30661
  this.selectedLinkIndex$.next(link);
30124
30662
  }
30125
- 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 }); }
30663
+ 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 }); }
30126
30664
  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 }); }
30127
30665
  }
30128
30666
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30129
30667
  type: Component,
30130
30668
  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" }]
30131
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30669
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30132
30670
 
30133
30671
  class DataViewComponent {
30134
30672
  constructor(mdViewFacade) {
@@ -30211,7 +30749,7 @@ class OrganisationPreviewComponent {
30211
30749
  this.clickedOrganisation.emit(this.organisation);
30212
30750
  }
30213
30751
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30214
- 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 }); }
30752
+ 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 }); }
30215
30753
  }
30216
30754
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, decorators: [{
30217
30755
  type: Component,
@@ -30280,7 +30818,7 @@ class LanguageSwitcherComponent {
30280
30818
  ngOnInit() {
30281
30819
  const languages = this.languagePlaceholder || DEFAULT_LANGUAGES;
30282
30820
  this.languageList = languages.map((language) => ({
30283
- label: `language.${language}`,
30821
+ label: `${language}`.toUpperCase(),
30284
30822
  value: language,
30285
30823
  }));
30286
30824
  }
@@ -30295,11 +30833,11 @@ class LanguageSwitcherComponent {
30295
30833
  this.translate.use(value);
30296
30834
  }
30297
30835
  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 }); }
30298
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
30836
+ 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"] }] }); }
30299
30837
  }
30300
30838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30301
30839
  type: Component,
30302
- args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n>\n</gn-ui-dropdown-selector>\n" }]
30840
+ 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" }]
30303
30841
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30304
30842
  type: Optional
30305
30843
  }, {
@@ -30441,20 +30979,8 @@ class OrganisationsComponent {
30441
30979
  filterOrganisations(organisations, filterBy) {
30442
30980
  if (!filterBy)
30443
30981
  return organisations;
30444
- const filterRegex = new RegExp(this.normalizeString(filterBy) //ignore accents and case
30445
- .replace(/[^a-z0-9\s]/g, ' ') //ignore special characters (also without spaces like l')
30446
- .replace(/\s(?=.)/g, '.*') //replace whitespaces by "AND" separator
30447
- .replace(/\s/g, ''), //remove potential whitespaces left
30448
- 'i');
30449
- return [...organisations].filter((org) => {
30450
- return this.normalizeString(org.name).match(filterRegex);
30451
- });
30452
- }
30453
- normalizeString(str) {
30454
- return str
30455
- .normalize('NFD')
30456
- .replace(/[\u0300-\u036f]/g, '')
30457
- .toLowerCase();
30982
+ const filter = createFuzzyFilter(filterBy);
30983
+ return organisations.filter((org) => filter(org.name));
30458
30984
  }
30459
30985
  sortOrganisations(organisations, sortBy) {
30460
30986
  let order;
@@ -30592,13 +31118,6 @@ class MyOrgService {
30592
31118
  constructor(platformService, orgService) {
30593
31119
  this.platformService = platformService;
30594
31120
  this.orgService = orgService;
30595
- this.myOrgDataSubject = new BehaviorSubject({
30596
- orgName: '',
30597
- logoUrl: '',
30598
- recordCount: 0,
30599
- userCount: 0,
30600
- userList: [],
30601
- });
30602
31121
  this.myOrgData$ = combineLatest([
30603
31122
  this.platformService.getMe(),
30604
31123
  this.platformService.getUsers(),
@@ -30617,7 +31136,7 @@ class MyOrgService {
30617
31136
  userList,
30618
31137
  userCount,
30619
31138
  };
30620
- }));
31139
+ }), shareReplay(1));
30621
31140
  }
30622
31141
  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 }); }
30623
31142
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31310,11 +31829,11 @@ class RecordFormComponent {
31310
31829
  return field.config.model;
31311
31830
  }
31312
31831
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31313
- 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 }); }
31832
+ 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 }); }
31314
31833
  }
31315
31834
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31316
31835
  type: Component,
31317
- 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" }]
31836
+ 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" }]
31318
31837
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31319
31838
 
31320
31839
  const ROUTER_STATE_KEY = 'router';
@@ -31682,5 +32201,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31682
32201
  * Generated bundle index. Do not edit.
31683
32202
  */
31684
32203
 
31685
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AutocompleteComponent, AvatarComponent, 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_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_RESOURCES_VALUES, EditorService, 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, 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, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapUtilsWMSService, MapViewComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, 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, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslateTestingModule, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, currentPage, defaultMapOptions, dragPanCondition, 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, 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 };
32204
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
31686
32205
  //# sourceMappingURL=geonetwork-ui.mjs.map