geonetwork-ui 2.2.0-dev.0f95f702 → 2.2.0-dev.1533e02e

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 (368) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +77 -52
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +5 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +16 -11
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -16
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +21 -18
  7. package/esm2022/libs/api/repository/src/index.mjs +2 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  9. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  10. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  12. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  13. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  15. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  16. package/esm2022/libs/feature/auth/src/lib/feature-auth.module.mjs +2 -2
  17. package/esm2022/libs/feature/catalog/src/lib/feature-catalog.module.mjs +2 -2
  18. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  19. package/esm2022/libs/feature/catalog/src/lib/organisations/organisations.component.mjs +4 -15
  20. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  21. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  22. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  23. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +1 -1
  24. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +106 -0
  25. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +64 -0
  26. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +63 -0
  27. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  28. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  29. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +26 -3
  30. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  31. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  32. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +6 -3
  33. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +3 -1
  34. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  35. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  36. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  37. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  38. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  39. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +9 -6
  40. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +3 -7
  41. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  42. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  43. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  44. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  45. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +3 -3
  46. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  47. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +8 -6
  48. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  49. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +2 -2
  50. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +4 -4
  51. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +1 -1
  52. package/esm2022/libs/ui/elements/src/index.mjs +4 -1
  53. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  54. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +27 -0
  55. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +17 -0
  56. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +10 -3
  57. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -16
  58. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +2 -3
  59. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  60. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +3 -3
  61. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +7 -3
  62. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +15 -3
  63. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  64. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  65. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +24 -5
  66. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  67. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +8 -5
  68. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  69. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  70. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +2 -2
  71. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +8 -3
  72. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  73. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  74. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  75. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  76. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  77. package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +1 -1
  78. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +1 -1
  79. package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +1 -1
  80. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +1 -1
  81. package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +1 -1
  82. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  83. package/esm2022/libs/util/i18n/src/index.mjs +2 -2
  84. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  85. package/esm2022/libs/util/shared/src/lib/utils/fuzzy-filter.mjs +27 -0
  86. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  87. package/esm2022/translations/de.json +105 -89
  88. package/esm2022/translations/en.json +41 -25
  89. package/esm2022/translations/es.json +20 -4
  90. package/esm2022/translations/fr.json +25 -9
  91. package/esm2022/translations/it.json +32 -16
  92. package/esm2022/translations/nl.json +20 -4
  93. package/esm2022/translations/pt.json +20 -4
  94. package/fesm2022/geonetwork-ui.mjs +1317 -758
  95. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  96. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  97. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  98. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  99. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  100. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  101. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  102. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
  103. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  104. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  105. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  106. package/libs/api/repository/src/index.d.ts +1 -0
  107. package/libs/api/repository/src/index.d.ts.map +1 -1
  108. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  109. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  110. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  111. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  112. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +15 -15
  113. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  114. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  115. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  116. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  117. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  118. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  119. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  120. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  121. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  122. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  123. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  124. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  125. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  126. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts +0 -1
  127. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts.map +1 -1
  128. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  129. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  130. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  131. package/libs/feature/map/src/index.d.ts +1 -0
  132. package/libs/feature/map/src/index.d.ts.map +1 -1
  133. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +22 -0
  134. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -0
  135. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +22 -0
  136. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -0
  137. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +22 -0
  138. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -0
  139. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  140. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  141. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  142. package/libs/feature/map/src/lib/feature-map.module.d.ts +16 -12
  143. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  144. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  145. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  146. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  147. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  148. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  149. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  150. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  151. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  152. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  153. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  154. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  155. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  156. package/libs/feature/search/src/index.d.ts +3 -0
  157. package/libs/feature/search/src/index.d.ts.map +1 -1
  158. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +6 -5
  159. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  160. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  161. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  162. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  163. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  164. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  165. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  166. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  167. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  168. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  169. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  170. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  171. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  172. package/libs/feature/search/src/lib/state/effects.d.ts +1 -1
  173. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  174. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  175. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  176. package/libs/feature/search/src/lib/utils/service/fields.d.ts +1 -1
  177. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  178. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  179. package/libs/ui/elements/src/index.d.ts +3 -0
  180. package/libs/ui/elements/src/index.d.ts.map +1 -1
  181. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  182. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +10 -0
  183. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -0
  184. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +8 -0
  185. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -0
  186. package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts +1 -0
  187. package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts.map +1 -1
  188. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +7 -2
  189. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  190. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  191. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  192. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  193. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +3 -2
  194. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  195. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -11
  196. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  197. package/libs/ui/inputs/src/index.d.ts +1 -0
  198. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  199. package/libs/ui/inputs/src/lib/button/button.component.d.ts +2 -1
  200. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  201. package/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.d.ts.map +1 -1
  202. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  203. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  204. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  205. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  206. package/libs/ui/layout/src/index.d.ts +2 -0
  207. package/libs/ui/layout/src/index.d.ts.map +1 -1
  208. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  209. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  210. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  211. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  212. package/libs/ui/search/src/index.d.ts +0 -1
  213. package/libs/ui/search/src/index.d.ts.map +1 -1
  214. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  215. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  216. package/libs/util/i18n/src/index.d.ts +1 -1
  217. package/libs/util/i18n/src/index.d.ts.map +1 -1
  218. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  219. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  220. package/libs/util/shared/src/lib/utils/fuzzy-filter.d.ts +9 -0
  221. package/libs/util/shared/src/lib/utils/fuzzy-filter.d.ts.map +1 -0
  222. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  223. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  224. package/package.json +11 -6
  225. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
  226. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
  227. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
  228. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  229. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +112 -65
  230. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +4 -2
  231. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
  232. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
  233. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
  234. package/src/libs/api/repository/src/index.ts +1 -0
  235. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  236. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  237. package/src/libs/common/domain/src/lib/index.ts +2 -0
  238. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +17 -18
  239. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  240. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  241. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  242. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  243. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  244. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  245. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -2
  246. package/src/libs/feature/auth/src/lib/feature-auth.module.ts +1 -1
  247. package/src/libs/feature/catalog/src/lib/feature-catalog.module.ts +1 -1
  248. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  249. package/src/libs/feature/catalog/src/lib/organisations/organisations.component.ts +3 -17
  250. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  251. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  252. package/src/libs/feature/map/src/index.ts +1 -0
  253. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.css +0 -0
  254. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +21 -0
  255. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +107 -0
  256. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.css +0 -0
  257. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +37 -0
  258. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +64 -0
  259. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.css +0 -0
  260. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +55 -0
  261. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +63 -0
  262. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  263. package/src/libs/feature/map/src/lib/feature-map.module.ts +14 -0
  264. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  265. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  266. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  267. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  268. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +9 -3
  269. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +6 -0
  270. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  271. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  272. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  273. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  274. package/src/libs/feature/search/src/index.ts +3 -0
  275. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +12 -4
  276. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +3 -5
  277. package/src/libs/feature/search/src/lib/feature-search.module.ts +2 -11
  278. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  279. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  280. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  281. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  282. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  283. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  284. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  285. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  286. package/src/libs/feature/search/src/lib/state/effects.ts +6 -5
  287. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  288. package/src/libs/feature/search/src/lib/utils/service/fields.ts +1 -1
  289. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -0
  290. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.ts +1 -1
  291. package/src/libs/ui/elements/src/index.ts +3 -0
  292. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  293. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +0 -0
  294. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +30 -0
  295. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
  296. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +264 -0
  297. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.html +1 -0
  298. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +16 -0
  299. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +93 -27
  300. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.ts +7 -0
  301. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +4 -0
  302. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +104 -50
  303. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +31 -7
  304. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +1 -2
  305. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  306. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  307. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  308. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +4 -0
  309. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +7 -0
  310. package/src/libs/ui/inputs/src/index.ts +1 -0
  311. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  312. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  313. package/src/libs/ui/inputs/src/lib/button/button.component.ts +26 -3
  314. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  315. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  316. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.ts +7 -4
  317. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  318. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +8 -3
  319. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.css +1 -0
  320. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  321. package/src/libs/ui/layout/src/index.ts +2 -0
  322. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  323. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  324. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  325. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  326. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  327. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  328. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  329. package/src/libs/ui/search/src/index.ts +0 -1
  330. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  331. package/src/libs/util/i18n/src/index.ts +1 -1
  332. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  333. package/src/libs/util/shared/src/lib/utils/fuzzy-filter.ts +32 -0
  334. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  335. package/translations/de.json +105 -89
  336. package/translations/en.json +41 -25
  337. package/translations/es.json +20 -4
  338. package/translations/fr.json +25 -9
  339. package/translations/it.json +32 -16
  340. package/translations/nl.json +20 -4
  341. package/translations/pt.json +20 -4
  342. package/translations/sk.json +20 -4
  343. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  344. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  345. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  346. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  347. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  348. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  349. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  350. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  351. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  352. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  353. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  354. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  355. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  356. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  357. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  358. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  359. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  360. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  361. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  362. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  363. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  364. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  365. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  366. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  367. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  368. /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';
@@ -645,28 +649,32 @@ function extractStatus() {
645
649
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
646
650
  }
647
651
  // from gmd:resourceConstraints
648
- function extractAccessConstraints() {
649
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
650
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
652
+ function extractLegalConstraints() {
653
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
654
+ ...(url && { url }),
651
655
  text,
652
- type: 'other',
653
656
  })));
654
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
657
+ }
658
+ // from gmd:resourceConstraints
659
+ function extractSecurityConstraints() {
660
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
661
+ ...(url && { url }),
655
662
  text,
656
- type: 'security',
657
663
  })));
658
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
659
664
  }
660
665
  // from gmd:resourceConstraints
661
- function extractUseLimitations() {
662
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
666
+ function extractOtherConstraints() {
667
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
669
+ text,
670
+ })));
663
671
  }
664
672
  // from gmd:resourceConstraints
665
673
  function extractLicenses() {
666
- return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(pipe(findChildElement('gmd:otherConstraints'), combine(extractCharacterString(), extractUrl()), map(([text, url]) => ({
674
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
667
675
  ...(url && { url }),
668
676
  text,
669
- })))));
677
+ })));
670
678
  }
671
679
  // from gmd:MD_Distribution
672
680
  function extractDatasetDistributions() {
@@ -838,11 +846,14 @@ function readStatus(rootEl) {
838
846
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
839
847
  }
840
848
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
841
- function readAccessConstraints(rootEl) {
842
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
849
+ function readLegalConstraints(rootEl) {
850
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
843
851
  }
844
- function readUseLimitations(rootEl) {
845
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
852
+ function readSecurityConstraints(rootEl) {
853
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
854
+ }
855
+ function readOtherConstraints(rootEl) {
856
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
846
857
  }
847
858
  function readLicenses(rootEl) {
848
859
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
@@ -1075,23 +1086,23 @@ function appendKeywords(keywords, type) {
1075
1086
  ? appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', type)))
1076
1087
  : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1077
1088
  }
1078
- function removeAccessConstraints() {
1079
- const securityConstraintsFilter = pipe(findChildrenElement('gmd:MD_SecurityConstraints'), (array) => array.length > 0);
1080
- // remove legal constraints that *only* have 'otherRestrictions'
1081
- const otherConstraintsFilter = pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code === 'otherRestrictions'));
1082
- return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray((el) => securityConstraintsFilter(el) || otherConstraintsFilter(el))));
1083
- }
1084
- function createAccessConstraint(constraint) {
1085
- if (constraint.type === 'security') {
1089
+ function createConstraint(constraint, type) {
1090
+ if (type === 'security') {
1086
1091
  return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_SecurityConstraints'), appendChildren(pipe(createElement('gmd:classification'), createChild('gmd:MD_ClassificationCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode'), addAttribute('codeListValue', 'restricted')), pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1087
1092
  }
1088
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1093
+ else if (type === 'legal') {
1094
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1095
+ }
1096
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1089
1097
  }
1090
- function removeUseLimitations() {
1098
+ function removeOtherConstraints() {
1091
1099
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1092
1100
  }
1093
- function createUseLimitation(useLimitation) {
1094
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1101
+ function removeSecurityConstraints() {
1102
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1103
+ }
1104
+ function removeLegalConstraints() {
1105
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code !== 'license')))));
1095
1106
  }
1096
1107
  function removeLicenses() {
1097
1108
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.some((code) => code === 'license')))));
@@ -1195,14 +1206,17 @@ function writeKeywords(record, rootEl) {
1195
1206
  function writeThemes(record, rootEl) {
1196
1207
  pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1197
1208
  }
1198
- function writeAccessConstraints(record, rootEl) {
1199
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1200
- }
1201
1209
  function writeLicenses(record, rootEl) {
1202
1210
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1203
1211
  }
1204
- function writeUseLimitations(record, rootEl) {
1205
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1212
+ function writeLegalConstraints(record, rootEl) {
1213
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1214
+ }
1215
+ function writeSecurityConstraints(record, rootEl) {
1216
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1217
+ }
1218
+ function writeOtherConstraints(record, rootEl) {
1219
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1206
1220
  }
1207
1221
  function writeUpdateFrequency(record, rootEl) {
1208
1222
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1300,8 +1314,9 @@ function toModel(xml) {
1300
1314
  const recordCreated = recordUpdated;
1301
1315
  const keywords = readKeywords(rootEl);
1302
1316
  const themes = readThemes(rootEl);
1303
- const accessConstraints = readAccessConstraints(rootEl);
1304
- const useLimitations = readUseLimitations(rootEl);
1317
+ const legalConstraints = readLegalConstraints(rootEl);
1318
+ const otherConstraints = readOtherConstraints(rootEl);
1319
+ const securityConstraints = readSecurityConstraints(rootEl);
1305
1320
  const licenses = readLicenses(rootEl);
1306
1321
  const overviews = readOverviews(rootEl);
1307
1322
  // not used yet
@@ -1329,9 +1344,10 @@ function toModel(xml) {
1329
1344
  contactsForResource: [],
1330
1345
  keywords,
1331
1346
  themes,
1332
- accessConstraints,
1333
- useLimitations,
1334
1347
  licenses,
1348
+ legalConstraints,
1349
+ securityConstraints,
1350
+ otherConstraints,
1335
1351
  ...(datasetCreated && { datasetCreated }),
1336
1352
  ...(datasetUpdated && { datasetUpdated }),
1337
1353
  lineage,
@@ -1356,9 +1372,10 @@ function toModel(xml) {
1356
1372
  contacts,
1357
1373
  keywords,
1358
1374
  themes,
1359
- accessConstraints,
1360
- useLimitations,
1361
1375
  licenses,
1376
+ legalConstraints,
1377
+ securityConstraints,
1378
+ otherConstraints,
1362
1379
  overviews,
1363
1380
  onlineResources,
1364
1381
  };
@@ -1384,9 +1401,11 @@ function toXml(record, originalXml) {
1384
1401
  fieldChanged('contacts') && writeContacts(record, rootEl);
1385
1402
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1386
1403
  fieldChanged('themes') && writeThemes(record, rootEl);
1387
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1404
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1405
+ fieldChanged('securityConstraints') &&
1406
+ writeSecurityConstraints(record, rootEl);
1388
1407
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1389
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1408
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1390
1409
  if (record.kind === 'dataset') {
1391
1410
  writeStatus(record, rootEl);
1392
1411
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1412,6 +1431,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1412
1431
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1413
1432
  const toDate = (field) => new Date(field);
1414
1433
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1434
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1415
1435
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1416
1436
  const getAsUrl = (field, location = window.location.toString()) => {
1417
1437
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -16538,133 +16558,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16538
16558
  }]
16539
16559
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16540
16560
 
16541
- // IMPORTANT:
16542
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/test-translate-loader.service.ts
16543
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16544
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16545
- class TestTranslateLoader extends TranslateLoader {
16546
- constructor(_translations = {}) {
16547
- super();
16548
- this._translations = _translations;
16549
- }
16550
- /**
16551
- * Returns an {Observable} of translations for the specified language. If the
16552
- * language is not recognized, an empty translations object will be returned.
16553
- *
16554
- * @param language the language for which the translations should be retrieved.
16555
- * @returns the translations for the specified
16556
- * language or an empty set of translations if the language is not recognized.
16557
- */
16558
- getTranslation(language) {
16559
- return of(this._translations[language] || {});
16560
- }
16561
- }
16562
-
16563
- // IMPORTANT:
16564
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/testing.module.ts
16565
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16566
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16567
- /**
16568
- * The TranslateTestingModule provides the {TranslateModule} as well as a
16569
- * {TranslateService} configured to return translations specific for the
16570
- * test environment.
16571
- *
16572
- * @export
16573
- */
16574
- class TranslateTestingModule {
16575
- constructor() {
16576
- this._translations = {};
16577
- }
16578
- static withTranslations(languageOrTranslations, translations) {
16579
- const translateTestingModule = new TranslateTestingModule();
16580
- if (typeof languageOrTranslations === 'string') {
16581
- return translateTestingModule.withTranslations(languageOrTranslations, translations);
16582
- }
16583
- return translateTestingModule.withTranslations(languageOrTranslations);
16584
- }
16585
- get ngModule() {
16586
- return TranslateTestingModule;
16587
- }
16588
- get providers() {
16589
- const translateService = new TranslateService(null, new TestTranslateLoader(this._translations), this._compiler || new TranslateFakeCompiler(), new TranslateDefaultParser(), new FakeMissingTranslationHandler(), true, true, false, this._defaultLanguage);
16590
- return [
16591
- {
16592
- provide: TranslateService,
16593
- useValue: translateService,
16594
- },
16595
- ];
16596
- }
16597
- withTranslations(languageOrTranslations, translations) {
16598
- if (typeof languageOrTranslations === 'string' && translations) {
16599
- this.addTranslations(languageOrTranslations, translations);
16600
- this._defaultLanguage = languageOrTranslations;
16601
- }
16602
- else if (languageOrTranslations) {
16603
- Object.keys(languageOrTranslations).forEach((language) => this.addTranslations(language, languageOrTranslations[language]));
16604
- }
16605
- return this;
16606
- }
16607
- /**
16608
- * Updates the {TranslationTestingModule} to provide a {TranslateService} that will
16609
- * use the provided {TranslateCompiler} to translate the test translations.
16610
- *
16611
- * @example
16612
- *
16613
- * TranslateTestingModule.withTranslations('en', {people: '{gender, select, male{He is} female{She is} other{They are}} {how})'})
16614
- * .withCompiler(new TranslateMessageFormatCompiler());
16615
- *
16616
- * @param compiler the compiler to use to compile the test translations.
16617
- * @returns the instance that can be used to chain additional configuration.
16618
- * @memberof TranslateTestingModule
16619
- */
16620
- withCompiler(compiler) {
16621
- this._compiler = compiler;
16622
- return this;
16623
- }
16624
- /**
16625
- * Updates the {TranslateTestingModule} to use the provided language as the default language.
16626
- * By default, the default language will be set to the first language provided.
16627
- *
16628
- * @example
16629
- *
16630
- * TranslateTestingModule.withTranslations('es', SPANISH_TRANSLATIONS)
16631
- * .withTranslations('en', ENGLISH_TRANSLATIONS)
16632
- * .withDefaultLanguage('en');
16633
- *
16634
- * @param language the new default language for translations.
16635
- * @returns the instance that can be used to chain additional configuration.
16636
- * @memberof TranslateTestingModule
16637
- */
16638
- withDefaultLanguage(language) {
16639
- this._defaultLanguage = language || this._defaultLanguage;
16640
- return this;
16641
- }
16642
- addTranslations(language, translations) {
16643
- if (!this._defaultLanguage) {
16644
- this._defaultLanguage = language;
16645
- }
16646
- if (this._translations[language]) {
16647
- this._translations[language] = {
16648
- ...this._translations[language],
16649
- ...translations,
16650
- };
16651
- }
16652
- else {
16653
- this._translations[language] = translations;
16654
- }
16655
- }
16656
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16657
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule], exports: [TranslateModule] }); }
16658
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule, TranslateModule] }); }
16659
- }
16660
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, decorators: [{
16661
- type: NgModule,
16662
- args: [{
16663
- imports: [TranslateModule],
16664
- exports: [TranslateModule],
16665
- }]
16666
- }] });
16667
-
16668
16561
  var dropFile$6 = "Datei ablegen";
16669
16562
  var next$6 = "weiter";
16670
16563
  var previous$6 = "zurück";
@@ -16687,20 +16580,21 @@ var de = {
16687
16580
  "chart.type.line": "Liniendiagramm",
16688
16581
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16689
16582
  "chart.type.pie": "Kreisdiagramm",
16690
- "dashboard.labels.mySpace": "",
16691
- "dashboard.records.all": "",
16692
- "dashboard.records.myDraft": "",
16693
- "dashboard.records.myLibrary": "",
16694
- "dashboard.records.myOrg": "",
16695
- "dashboard.records.myRecords": "",
16696
- "dashboard.records.noRecord": "",
16697
- "dashboard.records.noUser": "",
16698
- "dashboard.records.publishedRecords": "",
16699
- "dashboard.records.search": "",
16700
- "dashboard.records.userDetail": "",
16701
- "dashboard.records.userEmail": "",
16702
- "dashboard.records.username": "",
16703
- "dashboard.records.users": "",
16583
+ "dashboard.createRecord": "",
16584
+ "dashboard.labels.mySpace": "Mein Bereich",
16585
+ "dashboard.records.all": "Katalog",
16586
+ "dashboard.records.myDraft": "Meine Entwürfe",
16587
+ "dashboard.records.myLibrary": "Meine Bibliothek",
16588
+ "dashboard.records.myOrg": "Meine Organisation",
16589
+ "dashboard.records.myRecords": "Meine Datensätze",
16590
+ "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16591
+ "dashboard.records.search": "Suche nach \"{searchText}\"",
16592
+ "dashboard.records.userDetail": "Name",
16593
+ "dashboard.records.userEmail": "E-Mail",
16594
+ "dashboard.records.username": "Benutzername",
16595
+ "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16596
+ "dashboard.results.listMetadata": "",
16597
+ "dashboard.results.listResources": "",
16704
16598
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16705
16599
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16706
16600
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16714,7 +16608,7 @@ var de = {
16714
16608
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
16715
16609
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
16716
16610
  "datafeeder.form.dropdown": "Für welche Skala wurde er erstellt?",
16717
- "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tags aus, die zu Ihrem Datensatz passen",
16611
+ "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tage aus, die zu Ihrem Datensatz passen",
16718
16612
  "datafeeder.form.title": "Geben Sie Ihrem Datensatz den besten Titel",
16719
16613
  "datafeeder.formsPage.title": "Erzählen Sie uns mehr über Ihren Datensatz",
16720
16614
  "datafeeder.month.april": "April",
@@ -16729,16 +16623,16 @@ var de = {
16729
16623
  "datafeeder.month.november": "November",
16730
16624
  "datafeeder.month.october": "Oktober",
16731
16625
  "datafeeder.month.september": "September",
16732
- "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist",
16733
- "datafeeder.publish.illustration.title": "Ein weiterer Datensatz zum Veröffentlichen?",
16626
+ "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist.",
16627
+ "datafeeder.publish.illustration.title": "Ein weiterer Datensatz \n zum Veröffentlichen?",
16734
16628
  "datafeeder.publish.subtitle": "Das Veröffentlichen kann einige Minuten dauern.",
16735
- "datafeeder.publish.title": "Vielen Dank! Ihr Datensatz wird veröffentlicht",
16629
+ "datafeeder.publish.title": "Vielen Dank! \n Ihr Datensatz wird veröffentlicht",
16736
16630
  "datafeeder.publish.upload": "Jetzt hochladen",
16737
16631
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
16738
16632
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
16739
16633
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
16740
16634
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
16741
- "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! Ihr Datensatz wurde veröffentlicht",
16635
+ "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
16742
16636
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
16743
16637
  "datafeeder.summarizePage.illustration": "Kein Fehler? Los geht's!",
16744
16638
  "datafeeder.summarizePage.previous": "Zurück",
@@ -16746,11 +16640,11 @@ var de = {
16746
16640
  "datafeeder.summarizePage.title": "Sie sind fast fertig...",
16747
16641
  "datafeeder.upload.acceptedFormats": "Akzeptierte Dateiformate:",
16748
16642
  "datafeeder.upload.checkboxLabel": "Ich besitze die Rechte zur Veröffentlichung dieses Datensatzes",
16749
- "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geospatialen Datensatz enthält",
16643
+ "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geografischen Datensatz enthält",
16750
16644
  "datafeeder.upload.error.subtitle.cantOpenFile": "Bitte überprüfen Sie, ob die Datei gültig ist",
16751
16645
  "datafeeder.upload.error.subtitle.fileFormat": "Beachten Sie: Nur SHP-Dateien",
16752
- "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximal {size} MB",
16753
- "datafeeder.upload.error.title.analysis": "Fehler bei der Datensatzanalyse",
16646
+ "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximale Dateigröße {size} MB",
16647
+ "datafeeder.upload.error.title.analysis": "Fehler während der Datensatzanalyse",
16754
16648
  "datafeeder.upload.error.title.cantOpenFile": "Fehler beim Öffnen der Datei",
16755
16649
  "datafeeder.upload.error.title.fileFormat": "Das ausgewählte Dateiformat wird nicht unterstützt",
16756
16650
  "datafeeder.upload.error.title.fileHasntSelected": "Keine Datei ausgewählt",
@@ -16758,19 +16652,19 @@ var de = {
16758
16652
  "datafeeder.upload.error.title.noRightsToSendData": "Sie dürfen diesen Datensatz nicht veröffentlichen",
16759
16653
  "datafeeder.upload.illustration.enrichment": "Anreicherung",
16760
16654
  "datafeeder.upload.illustration.import": "Import",
16761
- "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten war noch nie einfacher",
16655
+ "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten \n war noch nie so einfach",
16762
16656
  "datafeeder.upload.illustration.validation": "Validierung",
16763
- "datafeeder.upload.illustration.verification": "Verifizierung",
16657
+ "datafeeder.upload.illustration.verification": "Überprüfung",
16764
16658
  "datafeeder.upload.inputLabel": "Importieren Sie Ihre Datei",
16765
16659
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
16766
16660
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
16767
16661
  "datafeeder.upload.uploadButton": "Hochladen",
16768
- "datafeeder.validation.encoding": "Kodierung",
16662
+ "datafeeder.validation.encoding": "Codierung",
16769
16663
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
16770
16664
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
16771
16665
  "datafeeder.validation.projection": "Raumbezugssystem:",
16772
- "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem",
16773
- "datafeeder.validation.sample.title": "Und eine Beispieleinheit aus dem Datensatz",
16666
+ "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem aus",
16667
+ "datafeeder.validation.sample.title": "Und eine Beispielentität aus dem Datensatz",
16774
16668
  "datafeeder.wizard.emptyRequiredValuesMessage": "Bitte füllen Sie die obligatorischen Felder aus",
16775
16669
  "datafeeder.wizardSummarize.createdAt": "Erstellt am",
16776
16670
  "datafeeder.wizardSummarize.scale": "Maßstab",
@@ -16780,19 +16674,20 @@ var de = {
16780
16674
  "datahub.header.news": "Startseite",
16781
16675
  "datahub.header.organisations": "Organisationen",
16782
16676
  "datahub.header.popularRecords": "Die beliebtesten",
16783
- "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten von meiner Organisation</div>",
16784
- "datahub.news.contact.contactus": "",
16785
- "datahub.news.contact.html": "",
16786
- "datahub.news.contact.title": "",
16677
+ "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
16678
+ "datahub.news.contact.contactus": "Kontaktieren Sie uns",
16679
+ "datahub.news.contact.html": "<p>Brauchen Sie Daten, die derzeit nicht auf der Plattform vorhanden sind?</p><p>Unsere Teams stehen Ihnen zur Verfügung.</p>",
16680
+ "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
16787
16681
  "datahub.news.feed": "Nachrichtenfeed",
16788
16682
  "datahub.news.figures": "Indikatoren",
16789
- "datahub.search.back": "Zurück zu den Ergebnissen",
16683
+ "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
16684
+ "datahub.search.back": "Zurück",
16790
16685
  "datahub.search.filter.all": "Alle",
16791
- "datahub.search.filter.generatedByWfs": "Generiert durch API",
16686
+ "datahub.search.filter.generatedByWfs": "Generiert durch eine API",
16792
16687
  "datahub.search.filter.others": "Andere",
16793
16688
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
16794
16689
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
16795
- "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht geparst werden: \"{ info }\"",
16690
+ "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
16796
16691
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
16797
16692
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
16798
16693
  "domain.record.status.completed": "Abgeschlossen",
@@ -16800,18 +16695,18 @@ var de = {
16800
16695
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
16801
16696
  "domain.record.status.removed": "Entfernt",
16802
16697
  "domain.record.status.under_development": "In Erstellung",
16803
- "domain.record.updateFrequency.asNeeded": "Bei Bedarf",
16804
- "domain.record.updateFrequency.continual": "Kontinuierlich",
16698
+ "domain.record.updateFrequency.asNeeded": "Nach Bedarf",
16699
+ "domain.record.updateFrequency.continual": "Fortlaufend",
16805
16700
  "domain.record.updateFrequency.day": "{count, plural, =0{0} one{Ein} other{{count}}} mal am Tag",
16806
- "domain.record.updateFrequency.irregular": "Unregelmässig",
16701
+ "domain.record.updateFrequency.irregular": "Unregelmäßig",
16807
16702
  "domain.record.updateFrequency.month": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Monat",
16808
16703
  "domain.record.updateFrequency.notPlanned": "Nicht geplant",
16809
- "domain.record.updateFrequency.periodic": "Regelmässig",
16704
+ "domain.record.updateFrequency.periodic": "Regelmäßig",
16810
16705
  "domain.record.updateFrequency.unknown": "Unbekannt",
16811
16706
  "domain.record.updateFrequency.week": "{count, plural, =0{0} one{Ein} other{{count}}} mal in der Woche",
16812
16707
  "domain.record.updateFrequency.year": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Jahr",
16813
16708
  "downloads.format.unknown": "unbekannt",
16814
- "downloads.wfs.featuretype.not.found": "Die Schicht wurde nicht gefunden",
16709
+ "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16815
16710
  dropFile: dropFile$6,
16816
16711
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16817
16712
  "facets.block.title.OrgForResource": "Organisation",
@@ -16846,10 +16741,18 @@ var de = {
16846
16741
  "map.add.layer.file": "Aus einer Datei",
16847
16742
  "map.add.layer.wfs": "Aus WFS",
16848
16743
  "map.add.layer.wms": "Aus WMS",
16744
+ "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16745
+ "map.geocoding.placeholder": "",
16746
+ "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16747
+ "map.layer.add": "Hinzufügen",
16748
+ "map.layers.available": "Verfügbare Layer",
16849
16749
  "map.layers.list": "Ebenen",
16850
16750
  "map.loading.data": "Kartendaten werden geladen...",
16751
+ "map.loading.service": "Dienst wird geladen...",
16851
16752
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
16852
16753
  "map.select.layer": "Datenquelle",
16754
+ "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
16755
+ "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
16853
16756
  "multiselect.filter.placeholder": "Suche",
16854
16757
  "nav.back": "Zurück",
16855
16758
  next: next$6,
@@ -16865,56 +16768,61 @@ var de = {
16865
16768
  "pagination.pageOf": "von",
16866
16769
  previous: previous$6,
16867
16770
  "record.action.download": "Herunterladen",
16868
- "record.action.view": "Ansehen",
16771
+ "record.action.view": "Anzeigen",
16869
16772
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
16870
16773
  "record.metadata.about": "Beschreibung",
16871
16774
  "record.metadata.api": "API",
16872
- "record.metadata.api.form.closeButton": "",
16873
- "record.metadata.api.form.closeForm": "",
16874
- "record.metadata.api.form.create": "",
16875
- "record.metadata.api.form.customUrl": "",
16876
- "record.metadata.api.form.limit": "",
16877
- "record.metadata.api.form.limit.all": "",
16878
- "record.metadata.api.form.offset": "",
16879
- "record.metadata.api.form.openForm": "",
16880
- "record.metadata.api.form.reset": "",
16881
- "record.metadata.api.form.title": "",
16882
- "record.metadata.api.form.type": "",
16883
- "record.metadata.author": "",
16775
+ "record.metadata.api.form.closeButton": "Schließen",
16776
+ "record.metadata.api.form.closeForm": "Formular schließen",
16777
+ "record.metadata.api.form.create": "Ihre Anfrage erstellen",
16778
+ "record.metadata.api.form.customUrl": "Benutzerdefinierte URL",
16779
+ "record.metadata.api.form.limit": "Anzahl der Datensätze",
16780
+ "record.metadata.api.form.limit.all": "Alle",
16781
+ "record.metadata.api.form.offset": "Anzahl des ersten Datensatzes",
16782
+ "record.metadata.api.form.openForm": "Formular öffnen",
16783
+ "record.metadata.api.form.reset": "Zurücksetzen",
16784
+ "record.metadata.api.form.title": "Benutzerdefinierte URL generieren",
16785
+ "record.metadata.api.form.type": "Ausgabeformat",
16786
+ "record.metadata.author": "Autor",
16884
16787
  "record.metadata.catalog": "Katalog",
16885
16788
  "record.metadata.contact": "Kontakt",
16886
- "record.metadata.createdOn": "Erstellt am",
16887
- "record.metadata.details": "Details",
16789
+ "record.metadata.details": "Technische Informationen",
16888
16790
  "record.metadata.download": "Downloads",
16889
- "record.metadata.formats": "",
16890
- "record.metadata.isOpenData": "Open Data",
16791
+ "record.metadata.formats": "Formate",
16891
16792
  "record.metadata.keywords": "Stichworte",
16793
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16892
16794
  "record.metadata.links": "Links",
16893
- "record.metadata.noUsage": "Für diesen Datensatz sind keine Verwendungsbedingungen angegeben.",
16795
+ "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16894
16796
  "record.metadata.origin": "Über die Daten",
16797
+ "record.metadata.otherConstraints": "",
16798
+ "record.metadata.owner": "",
16895
16799
  "record.metadata.preview": "Vorschau",
16896
16800
  "record.metadata.publications": "Veröffentlichungen",
16897
- "record.metadata.quality": "",
16898
- "record.metadata.quality.contact.failed": "",
16899
- "record.metadata.quality.contact.success": "",
16900
- "record.metadata.quality.description.failed": "",
16901
- "record.metadata.quality.description.success": "",
16902
- "record.metadata.quality.details": "",
16903
- "record.metadata.quality.keywords.failed": "",
16904
- "record.metadata.quality.keywords.success": "",
16905
- "record.metadata.quality.legalConstraints.failed": "",
16906
- "record.metadata.quality.legalConstraints.success": "",
16907
- "record.metadata.quality.organisation.failed": "",
16908
- "record.metadata.quality.organisation.success": "",
16909
- "record.metadata.quality.title.failed": "",
16910
- "record.metadata.quality.title.success": "",
16911
- "record.metadata.quality.topic.failed": "",
16912
- "record.metadata.quality.topic.success": "",
16913
- "record.metadata.quality.updateFrequency.failed": "",
16914
- "record.metadata.quality.updateFrequency.success": "",
16801
+ "record.metadata.quality": "Metadatenqualität",
16802
+ "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
16803
+ "record.metadata.quality.contact.success": "Kontakt angegeben",
16804
+ "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
16805
+ "record.metadata.quality.description.success": "Beschreibung angegeben",
16806
+ "record.metadata.quality.details": "Details",
16807
+ "record.metadata.quality.keywords.failed": "Schlagwörter nicht angegeben",
16808
+ "record.metadata.quality.keywords.success": "Schlagwörter angegeben",
16809
+ "record.metadata.quality.legalConstraints.failed": "Rechtliche Beschränkungen nicht angegeben",
16810
+ "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
16811
+ "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
16812
+ "record.metadata.quality.organisation.success": "Organisation angegeben",
16813
+ "record.metadata.quality.title.failed": "Titel nicht angegeben",
16814
+ "record.metadata.quality.title.success": "Titel angegeben",
16815
+ "record.metadata.quality.topic.failed": "Thema nicht angegeben",
16816
+ "record.metadata.quality.topic.success": "Thema angegeben",
16817
+ "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
16818
+ "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16915
16819
  "record.metadata.related": "Ähnliche Datensätze",
16916
- "record.metadata.sheet": "Weitere Informationen erhalten Sie unter :",
16820
+ "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16821
+ "record.metadata.status": "",
16822
+ "record.metadata.themes": "Kategorien",
16917
16823
  "record.metadata.title": "Titel",
16824
+ "record.metadata.type": "Geographischer Datensatz",
16825
+ "record.metadata.uniqueId": "Eindeutige Kennung",
16918
16826
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16919
16827
  "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16920
16828
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
@@ -16926,23 +16834,23 @@ var de = {
16926
16834
  "record.was.created.time": "erstellte diesen Datensatz {time}",
16927
16835
  records: records$6,
16928
16836
  "results.layout.selectOne": "Layout auswählen",
16929
- "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{auf {hits} insgesamt angezeigt.}}",
16930
- "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie andere Wörter</li><li>Geben Sie weniger Wörter ein</li></ul>",
16837
+ "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{angezeigt von {hits} insgesamt.}}",
16838
+ "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie es mit anderen Worten</li><li>Beschränken Sie die Suchwörter</li></ul>",
16931
16839
  "results.records.hits.found": "{hits, plural, =0{Keine Dokumente entsprechen der angegebenen Suche.} one{1 Datensatz gefunden.} other{{hits} Datensätze gefunden.}}",
16932
- "results.records.hits.selected": "",
16840
+ "results.records.hits.selected": "{ amount } ausgewählt",
16933
16841
  "results.showMore": "Mehr Ergebnisse anzeigen...",
16934
- "results.sortBy.dateStamp": "Letzte Aktualisierungen",
16842
+ "results.sortBy.dateStamp": "Neueste",
16935
16843
  "results.sortBy.popularity": "Beliebtheit",
16936
- "results.sortBy.qualityScore": "",
16844
+ "results.sortBy.qualityScore": "Qualitätsbewertung",
16937
16845
  "results.sortBy.relevancy": "Relevanz",
16938
16846
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
16939
16847
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
16940
- "search.error.receivedError": "Ein Fehler wurde empfangen",
16848
+ "search.error.receivedError": "Ein Fehler ist aufgetreten",
16941
16849
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
16942
- "search.field.any.placeholder": "Suche nach Datensätzen ...",
16850
+ "search.field.any.placeholder": "Suche Datensätze ...",
16943
16851
  "search.field.sortBy": "Sortieren nach:",
16944
16852
  "search.filters.clear": "Zurücksetzen",
16945
- "search.filters.contact": "Kontakt",
16853
+ "search.filters.contact": "Kontakte",
16946
16854
  "search.filters.format": "Formate",
16947
16855
  "search.filters.inspireKeyword": "INSPIRE-Schlüsselwort",
16948
16856
  "search.filters.isSpatial": "Ist räumliche Daten",
@@ -16960,13 +16868,13 @@ var de = {
16960
16868
  "search.filters.license.unknown": "Unbekannt oder nicht vorhanden",
16961
16869
  "search.filters.maximize": "Erweitern",
16962
16870
  "search.filters.minimize": "Minimieren",
16963
- "search.filters.myRecords": "",
16964
- "search.filters.myRecordsHelp": "",
16965
- "search.filters.otherRecords": "",
16871
+ "search.filters.myRecords": "Nur meine Datensätze anzeigen",
16872
+ "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.",
16873
+ "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
16966
16874
  "search.filters.publicationYear": "Veröffentlichungsjahr",
16967
16875
  "search.filters.publisher": "Organisationen",
16968
- "search.filters.representationType": "",
16969
- "search.filters.resourceType": "",
16876
+ "search.filters.representationType": "Repräsentationstyp",
16877
+ "search.filters.resourceType": "Ressourcentyp",
16970
16878
  "search.filters.standard": "Standard",
16971
16879
  "search.filters.title": "Ergebnisse filtern",
16972
16880
  "search.filters.topic": "Thema",
@@ -16978,6 +16886,7 @@ var de = {
16978
16886
  "table.object.count": "Objekte in diesem Datensatz",
16979
16887
  "table.select.data": "Datenquelle",
16980
16888
  "tooltip.html.copy": "HTML kopieren",
16889
+ "tooltip.id.copy": "",
16981
16890
  "tooltip.url.copy": "URL kopieren",
16982
16891
  "tooltip.url.open": "URL öffnen",
16983
16892
  "ui.readLess": "Weniger lesen",
@@ -17011,20 +16920,21 @@ var en = {
17011
16920
  "chart.type.line": "line chart",
17012
16921
  "chart.type.lineSmooth": "smooth line chart",
17013
16922
  "chart.type.pie": "pie chart",
16923
+ "dashboard.createRecord": "New record",
17014
16924
  "dashboard.labels.mySpace": "My space",
17015
- "dashboard.records.all": "Catalog",
16925
+ "dashboard.records.all": "Metadata records",
17016
16926
  "dashboard.records.myDraft": "My drafts",
17017
16927
  "dashboard.records.myLibrary": "My library",
17018
16928
  "dashboard.records.myOrg": "Organization",
17019
16929
  "dashboard.records.myRecords": "My Records",
17020
- "dashboard.records.noRecord": "No record for this organization",
17021
- "dashboard.records.noUser": "No users for this organization",
17022
16930
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17023
16931
  "dashboard.records.search": "Search for \"{searchText}\"",
17024
16932
  "dashboard.records.userDetail": "Name",
17025
16933
  "dashboard.records.userEmail": "Email",
17026
16934
  "dashboard.records.username": "Username",
17027
16935
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
16936
+ "dashboard.results.listMetadata": "Show metadata",
16937
+ "dashboard.results.listResources": "Show resources",
17028
16938
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17029
16939
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17030
16940
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17110,7 +17020,8 @@ var en = {
17110
17020
  "datahub.news.contact.title": "A specific need?",
17111
17021
  "datahub.news.feed": "News feed",
17112
17022
  "datahub.news.figures": "Indicators",
17113
- "datahub.search.back": "Back to results",
17023
+ "datahub.record.addToFavorites": "Add to favorites",
17024
+ "datahub.search.back": "Back",
17114
17025
  "datahub.search.filter.all": "All",
17115
17026
  "datahub.search.filter.generatedByWfs": "generated by an API",
17116
17027
  "datahub.search.filter.others": "Others",
@@ -17170,10 +17081,18 @@ var en = {
17170
17081
  "map.add.layer.file": "From a file",
17171
17082
  "map.add.layer.wfs": "From WFS",
17172
17083
  "map.add.layer.wms": "From WMS",
17084
+ "map.addFromFile.placeholder": "Click or drop a file here",
17085
+ "map.geocoding.placeholder": "Search for a place",
17086
+ "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17087
+ "map.layer.add": "Add",
17088
+ "map.layers.available": "Available Layers",
17173
17089
  "map.layers.list": "Layers",
17174
17090
  "map.loading.data": "Loading map data...",
17091
+ "map.loading.service": "Loading service...",
17175
17092
  "map.navigation.message": "Please use CTRL + mouse (or two fingers on mobile) to navigate the map",
17176
17093
  "map.select.layer": "Data source",
17094
+ "map.wfs.urlInput.hint": "Enter WFS service URL",
17095
+ "map.wms.urlInput.hint": "Enter WMS service URL",
17177
17096
  "multiselect.filter.placeholder": "Search",
17178
17097
  "nav.back": "Back",
17179
17098
  next: next$5,
@@ -17207,42 +17126,47 @@ var en = {
17207
17126
  "record.metadata.author": "Author",
17208
17127
  "record.metadata.catalog": "Catalog",
17209
17128
  "record.metadata.contact": "Contact",
17210
- "record.metadata.createdOn": "Created on",
17211
- "record.metadata.details": "Details",
17129
+ "record.metadata.details": "Technical information",
17212
17130
  "record.metadata.download": "Downloads",
17213
17131
  "record.metadata.formats": "Formats",
17214
- "record.metadata.isOpenData": "Open Data",
17215
17132
  "record.metadata.keywords": "Keywords",
17133
+ "record.metadata.lastUpdate": "Last updated on",
17216
17134
  "record.metadata.links": "Links",
17217
17135
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17218
17136
  "record.metadata.origin": "About the data",
17137
+ "record.metadata.otherConstraints": "Additional Conditions",
17138
+ "record.metadata.owner": "Catalog of origin",
17219
17139
  "record.metadata.preview": "Preview",
17220
17140
  "record.metadata.publications": "publications",
17221
17141
  "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",
17142
+ "record.metadata.quality.contact.failed": "Contact is not specified",
17143
+ "record.metadata.quality.contact.success": "Contact is specified",
17144
+ "record.metadata.quality.description.failed": "Description is not specified",
17145
+ "record.metadata.quality.description.success": "Description is specified",
17226
17146
  "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",
17147
+ "record.metadata.quality.keywords.failed": "Keywords are not specified",
17148
+ "record.metadata.quality.keywords.success": "Keywords are specified",
17149
+ "record.metadata.quality.legalConstraints.failed": "Legal constraints are not specified",
17150
+ "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
17151
+ "record.metadata.quality.organisation.failed": "Organisation is not specified",
17152
+ "record.metadata.quality.organisation.success": "Organisation is specified",
17153
+ "record.metadata.quality.title.failed": "Title is not specified",
17154
+ "record.metadata.quality.title.success": "Title is specified",
17155
+ "record.metadata.quality.topic.failed": "Topic is not specified",
17156
+ "record.metadata.quality.topic.success": "Topic is specified",
17157
+ "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17158
+ "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17239
17159
  "record.metadata.related": "Related records",
17240
- "record.metadata.sheet": "More information available from:",
17160
+ "record.metadata.sheet": "Original metadata",
17161
+ "record.metadata.status": "Status",
17162
+ "record.metadata.themes": "Categories",
17241
17163
  "record.metadata.title": "Title",
17164
+ "record.metadata.type": "Geographical dataset",
17165
+ "record.metadata.uniqueId": "Unique Identifier",
17242
17166
  "record.metadata.updateFrequency": "Data Update Frequency",
17243
17167
  "record.metadata.updateStatus": "Data Update Status",
17244
17168
  "record.metadata.updatedOn": "Last Data Information Update",
17245
- "record.metadata.usage": "Usage & constraints",
17169
+ "record.metadata.usage": "License and Conditions",
17246
17170
  "record.more.details": "Read more",
17247
17171
  "record.tab.chart": "Chart",
17248
17172
  "record.tab.data": "Table",
@@ -17302,6 +17226,7 @@ var en = {
17302
17226
  "table.object.count": "objects in this dataset",
17303
17227
  "table.select.data": "Data source",
17304
17228
  "tooltip.html.copy": "Copy HTML",
17229
+ "tooltip.id.copy": "Copy unique identifier",
17305
17230
  "tooltip.url.copy": "Copy URL",
17306
17231
  "tooltip.url.open": "Open URL",
17307
17232
  "ui.readLess": "Read less",
@@ -17335,20 +17260,21 @@ var es = {
17335
17260
  "chart.type.line": "gráfico de líneas",
17336
17261
  "chart.type.lineSmooth": "gráfico de líneas suave",
17337
17262
  "chart.type.pie": "gráfico circular",
17263
+ "dashboard.createRecord": "",
17338
17264
  "dashboard.labels.mySpace": "Mi espacio",
17339
17265
  "dashboard.records.all": "Catálogo",
17340
17266
  "dashboard.records.myDraft": "Mis borradores",
17341
17267
  "dashboard.records.myLibrary": "Mi biblioteca",
17342
17268
  "dashboard.records.myOrg": "Organización",
17343
17269
  "dashboard.records.myRecords": "Mis Registros",
17344
- "dashboard.records.noRecord": "",
17345
- "dashboard.records.noUser": "",
17346
17270
  "dashboard.records.publishedRecords": "",
17347
17271
  "dashboard.records.search": "Buscar \"{searchText}\"",
17348
17272
  "dashboard.records.userDetail": "",
17349
17273
  "dashboard.records.userEmail": "",
17350
17274
  "dashboard.records.username": "",
17351
17275
  "dashboard.records.users": "",
17276
+ "dashboard.results.listMetadata": "",
17277
+ "dashboard.results.listResources": "",
17352
17278
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17353
17279
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17354
17280
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17434,6 +17360,7 @@ var es = {
17434
17360
  "datahub.news.contact.title": "",
17435
17361
  "datahub.news.feed": "",
17436
17362
  "datahub.news.figures": "",
17363
+ "datahub.record.addToFavorites": "",
17437
17364
  "datahub.search.back": "",
17438
17365
  "datahub.search.filter.all": "",
17439
17366
  "datahub.search.filter.generatedByWfs": "",
@@ -17494,10 +17421,18 @@ var es = {
17494
17421
  "map.add.layer.file": "",
17495
17422
  "map.add.layer.wfs": "",
17496
17423
  "map.add.layer.wms": "",
17424
+ "map.addFromFile.placeholder": "",
17425
+ "map.geocoding.placeholder": "",
17426
+ "map.help.addFromFile": "",
17427
+ "map.layer.add": "",
17428
+ "map.layers.available": "",
17497
17429
  "map.layers.list": "",
17498
17430
  "map.loading.data": "",
17431
+ "map.loading.service": "",
17499
17432
  "map.navigation.message": "",
17500
17433
  "map.select.layer": "",
17434
+ "map.wfs.urlInput.hint": "",
17435
+ "map.wms.urlInput.hint": "",
17501
17436
  "multiselect.filter.placeholder": "",
17502
17437
  "nav.back": "",
17503
17438
  next: next$4,
@@ -17531,15 +17466,16 @@ var es = {
17531
17466
  "record.metadata.author": "",
17532
17467
  "record.metadata.catalog": "",
17533
17468
  "record.metadata.contact": "",
17534
- "record.metadata.createdOn": "",
17535
17469
  "record.metadata.details": "",
17536
17470
  "record.metadata.download": "",
17537
17471
  "record.metadata.formats": "",
17538
- "record.metadata.isOpenData": "",
17539
17472
  "record.metadata.keywords": "",
17473
+ "record.metadata.lastUpdate": "",
17540
17474
  "record.metadata.links": "",
17541
17475
  "record.metadata.noUsage": "",
17542
17476
  "record.metadata.origin": "",
17477
+ "record.metadata.otherConstraints": "",
17478
+ "record.metadata.owner": "",
17543
17479
  "record.metadata.preview": "",
17544
17480
  "record.metadata.publications": "",
17545
17481
  "record.metadata.quality": "",
@@ -17562,7 +17498,11 @@ var es = {
17562
17498
  "record.metadata.quality.updateFrequency.success": "",
17563
17499
  "record.metadata.related": "",
17564
17500
  "record.metadata.sheet": "",
17501
+ "record.metadata.status": "",
17502
+ "record.metadata.themes": "",
17565
17503
  "record.metadata.title": "",
17504
+ "record.metadata.type": "",
17505
+ "record.metadata.uniqueId": "",
17566
17506
  "record.metadata.updateFrequency": "",
17567
17507
  "record.metadata.updateStatus": "",
17568
17508
  "record.metadata.updatedOn": "",
@@ -17626,6 +17566,7 @@ var es = {
17626
17566
  "table.object.count": "",
17627
17567
  "table.select.data": "",
17628
17568
  "tooltip.html.copy": "",
17569
+ "tooltip.id.copy": "",
17629
17570
  "tooltip.url.copy": "",
17630
17571
  "tooltip.url.open": "",
17631
17572
  "ui.readLess": "",
@@ -17659,20 +17600,21 @@ var fr = {
17659
17600
  "chart.type.line": "ligne",
17660
17601
  "chart.type.lineSmooth": "ligne lisse",
17661
17602
  "chart.type.pie": "camembert",
17603
+ "dashboard.createRecord": "",
17662
17604
  "dashboard.labels.mySpace": "Mon espace",
17663
17605
  "dashboard.records.all": "Catalogue",
17664
17606
  "dashboard.records.myDraft": "Mes brouillons",
17665
17607
  "dashboard.records.myLibrary": "Ma bibliothèque",
17666
17608
  "dashboard.records.myOrg": "Mon organisation",
17667
17609
  "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
17610
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17671
17611
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17672
17612
  "dashboard.records.userDetail": "Nom",
17673
17613
  "dashboard.records.userEmail": "Email",
17674
17614
  "dashboard.records.username": "Nom d'utilisateur",
17675
17615
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17616
+ "dashboard.results.listMetadata": "",
17617
+ "dashboard.results.listResources": "",
17676
17618
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17677
17619
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17678
17620
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17754,11 +17696,12 @@ var fr = {
17754
17696
  "datahub.header.popularRecords": "Les plus appréciées",
17755
17697
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17756
17698
  "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>",
17699
+ "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
17700
  "datahub.news.contact.title": "Un besoin spécifique ?",
17759
17701
  "datahub.news.feed": "Fil d'activité",
17760
17702
  "datahub.news.figures": "Quelques chiffres",
17761
- "datahub.search.back": "Retour aux résultats",
17703
+ "datahub.record.addToFavorites": "Ajouter aux favoris",
17704
+ "datahub.search.back": "Retour",
17762
17705
  "datahub.search.filter.all": "Tous",
17763
17706
  "datahub.search.filter.generatedByWfs": "généré par une API",
17764
17707
  "datahub.search.filter.others": "Autres",
@@ -17818,10 +17761,18 @@ var fr = {
17818
17761
  "map.add.layer.file": "",
17819
17762
  "map.add.layer.wfs": "",
17820
17763
  "map.add.layer.wms": "",
17764
+ "map.addFromFile.placeholder": "",
17765
+ "map.geocoding.placeholder": "",
17766
+ "map.help.addFromFile": "",
17767
+ "map.layer.add": "",
17768
+ "map.layers.available": "",
17821
17769
  "map.layers.list": "",
17822
17770
  "map.loading.data": "Chargement des données...",
17771
+ "map.loading.service": "",
17823
17772
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17824
17773
  "map.select.layer": "Source de données",
17774
+ "map.wfs.urlInput.hint": "",
17775
+ "map.wms.urlInput.hint": "",
17825
17776
  "multiselect.filter.placeholder": "Rechercher",
17826
17777
  "nav.back": "Retour",
17827
17778
  next: next$3,
@@ -17855,15 +17806,16 @@ var fr = {
17855
17806
  "record.metadata.author": "Auteur",
17856
17807
  "record.metadata.catalog": "Catalogue",
17857
17808
  "record.metadata.contact": "Contact",
17858
- "record.metadata.createdOn": "Créé le",
17859
- "record.metadata.details": "Détails",
17809
+ "record.metadata.details": "Informations techniques",
17860
17810
  "record.metadata.download": "Téléchargements",
17861
17811
  "record.metadata.formats": "Formats",
17862
- "record.metadata.isOpenData": "Donnée Ouverte",
17863
17812
  "record.metadata.keywords": "Mots clés",
17813
+ "record.metadata.lastUpdate": "Mis à jour le",
17864
17814
  "record.metadata.links": "Liens",
17865
17815
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17866
17816
  "record.metadata.origin": "À propos des données",
17817
+ "record.metadata.otherConstraints": "Limitations d'usage",
17818
+ "record.metadata.owner": "Catalogue d'origine",
17867
17819
  "record.metadata.preview": "Aperçu",
17868
17820
  "record.metadata.publications": "données",
17869
17821
  "record.metadata.quality": "Qualité des métadonnées",
@@ -17885,12 +17837,16 @@ var fr = {
17885
17837
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
17886
17838
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17887
17839
  "record.metadata.related": "Voir aussi",
17888
- "record.metadata.sheet": "Plus d'informations à l'adresse suivante :",
17840
+ "record.metadata.sheet": "Fiche de métadonnées d'origine",
17841
+ "record.metadata.status": "",
17842
+ "record.metadata.themes": "Catégories",
17889
17843
  "record.metadata.title": "Titre",
17844
+ "record.metadata.type": "Donnée géographique",
17845
+ "record.metadata.uniqueId": "Identificateur de ressource unique",
17890
17846
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17891
17847
  "record.metadata.updateStatus": "Statut de mise à jour des données",
17892
17848
  "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17893
- "record.metadata.usage": "Conditions d'utilisation",
17849
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17894
17850
  "record.more.details": "Détails",
17895
17851
  "record.tab.chart": "Graphique",
17896
17852
  "record.tab.data": "Tableau",
@@ -17950,6 +17906,7 @@ var fr = {
17950
17906
  "table.object.count": "enregistrements dans ces données",
17951
17907
  "table.select.data": "Source de données",
17952
17908
  "tooltip.html.copy": "Copier le HTML",
17909
+ "tooltip.id.copy": "Copier l'identifiant unique",
17953
17910
  "tooltip.url.copy": "Copier l'URL",
17954
17911
  "tooltip.url.open": "Ouvrir l'URL",
17955
17912
  "ui.readLess": "Réduire",
@@ -17983,20 +17940,21 @@ var it = {
17983
17940
  "chart.type.line": "grafico a linee",
17984
17941
  "chart.type.lineSmooth": "grafico a linea liscia",
17985
17942
  "chart.type.pie": "grafico a torta",
17943
+ "dashboard.createRecord": "",
17986
17944
  "dashboard.labels.mySpace": "Il mio spazio",
17987
17945
  "dashboard.records.all": "Catalogo",
17988
17946
  "dashboard.records.myDraft": "Le mie bozze",
17989
17947
  "dashboard.records.myLibrary": "La mia biblioteca",
17990
17948
  "dashboard.records.myOrg": "La mia organizzazione",
17991
17949
  "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
17950
  "dashboard.records.publishedRecords": "dati pubblicati",
17995
17951
  "dashboard.records.search": "Risultati per \"{searchText}\"",
17996
17952
  "dashboard.records.userDetail": "Nome",
17997
17953
  "dashboard.records.userEmail": "Email",
17998
17954
  "dashboard.records.username": "Nome utente",
17999
17955
  "dashboard.records.users": "utenti",
17956
+ "dashboard.results.listMetadata": "",
17957
+ "dashboard.results.listResources": "",
18000
17958
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18001
17959
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18002
17960
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18077,12 +18035,13 @@ var it = {
18077
18035
  "datahub.header.organisations": "Organizzazioni",
18078
18036
  "datahub.header.popularRecords": "Più popolari",
18079
18037
  "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": "",
18038
+ "datahub.news.contact.contactus": "Contattateci",
18039
+ "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>",
18040
+ "datahub.news.contact.title": "Ha un bisogno specifico?",
18083
18041
  "datahub.news.feed": "Feed di attività",
18084
18042
  "datahub.news.figures": "Alcune figure",
18085
- "datahub.search.back": "Torna ai risultati",
18043
+ "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
18044
+ "datahub.search.back": "Ritorna",
18086
18045
  "datahub.search.filter.all": "Tutti",
18087
18046
  "datahub.search.filter.generatedByWfs": "generato da un'API",
18088
18047
  "datahub.search.filter.others": "Altri",
@@ -18109,7 +18068,7 @@ var it = {
18109
18068
  "downloads.format.unknown": "sconosciuto",
18110
18069
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18111
18070
  dropFile: dropFile$2,
18112
- "externalviewer.dataset.unnamed": "",
18071
+ "externalviewer.dataset.unnamed": "Layer del datahub",
18113
18072
  "facets.block.title.OrgForResource": "Organizzazione",
18114
18073
  "facets.block.title.availableInServices": "Disponibile per",
18115
18074
  "facets.block.title.cl_hierarchyLevel.key": "Tipo di risorsa",
@@ -18142,10 +18101,18 @@ var it = {
18142
18101
  "map.add.layer.file": "Da un file",
18143
18102
  "map.add.layer.wfs": "Da un WFS",
18144
18103
  "map.add.layer.wms": "Da un WMS",
18104
+ "map.addFromFile.placeholder": "",
18105
+ "map.geocoding.placeholder": "",
18106
+ "map.help.addFromFile": "",
18107
+ "map.layer.add": "",
18108
+ "map.layers.available": "",
18145
18109
  "map.layers.list": "Layers",
18146
18110
  "map.loading.data": "Caricamento dati...",
18111
+ "map.loading.service": "",
18147
18112
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18148
18113
  "map.select.layer": "Sorgente dati",
18114
+ "map.wfs.urlInput.hint": "",
18115
+ "map.wms.urlInput.hint": "",
18149
18116
  "multiselect.filter.placeholder": "Cerca",
18150
18117
  "nav.back": "Indietro",
18151
18118
  next: next$2,
@@ -18179,15 +18146,16 @@ var it = {
18179
18146
  "record.metadata.author": "Autore",
18180
18147
  "record.metadata.catalog": "Catalogo",
18181
18148
  "record.metadata.contact": "Contatto",
18182
- "record.metadata.createdOn": "Creato il",
18183
- "record.metadata.details": "Dettagli",
18149
+ "record.metadata.details": "Informazioni tecniche",
18184
18150
  "record.metadata.download": "Download",
18185
18151
  "record.metadata.formats": "Formati",
18186
- "record.metadata.isOpenData": "Data aperta",
18187
18152
  "record.metadata.keywords": "Parole chiave",
18153
+ "record.metadata.lastUpdate": "Ultimo aggiornamento",
18188
18154
  "record.metadata.links": "Collegamenti",
18189
18155
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18190
18156
  "record.metadata.origin": "Informazioni sui dati",
18157
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18158
+ "record.metadata.owner": "Catalogo originale",
18191
18159
  "record.metadata.preview": "Anteprima",
18192
18160
  "record.metadata.publications": "pubblicazioni",
18193
18161
  "record.metadata.quality": "Qualità dei metadati",
@@ -18209,12 +18177,16 @@ var it = {
18209
18177
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
18210
18178
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18211
18179
  "record.metadata.related": "Vedi anche",
18212
- "record.metadata.sheet": "Per ulteriori informazioni, cliccate qui:",
18180
+ "record.metadata.sheet": "Origine del metadata",
18181
+ "record.metadata.status": "",
18182
+ "record.metadata.themes": "Categorie",
18213
18183
  "record.metadata.title": "Titolo",
18184
+ "record.metadata.type": "Dati geografici",
18185
+ "record.metadata.uniqueId": "Identificatore unico di risorsa",
18214
18186
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18215
18187
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18216
18188
  "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18217
- "record.metadata.usage": "Condizioni d'uso",
18189
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18218
18190
  "record.more.details": "Dettagli",
18219
18191
  "record.tab.chart": "Grafico",
18220
18192
  "record.tab.data": "Tabella",
@@ -18222,10 +18194,10 @@ var it = {
18222
18194
  "record.was.created.time": "ha creato questi dati {time}",
18223
18195
  records: records$2,
18224
18196
  "results.layout.selectOne": "Mostra risultati",
18225
- "results.records.hits.displayedOn": "",
18197
+ "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
18198
  "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
18199
  "results.records.hits.found": "{hits, plural, =0{Nessuna corrispondenza.} one{1 record trovato.} other{{hits} risultati.}}",
18228
- "results.records.hits.selected": "",
18200
+ "results.records.hits.selected": "{amount, plural, one{1 selezionato} other{{ amount } selezionati}}",
18229
18201
  "results.showMore": "Altri risultati...",
18230
18202
  "results.sortBy.dateStamp": "Più recente",
18231
18203
  "results.sortBy.popularity": "Popolarità",
@@ -18274,10 +18246,11 @@ var it = {
18274
18246
  "table.object.count": "record in questi dati",
18275
18247
  "table.select.data": "Sorgente dati",
18276
18248
  "tooltip.html.copy": "Copiare il HTML",
18249
+ "tooltip.id.copy": "Copiare l'identificatore unico",
18277
18250
  "tooltip.url.copy": "Copiare l'URL",
18278
18251
  "tooltip.url.open": "Aprire l'URL",
18279
- "ui.readLess": "",
18280
- "ui.readMore": "",
18252
+ "ui.readLess": "Ridurre",
18253
+ "ui.readMore": "Leggi di più",
18281
18254
  "wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
18282
18255
  "wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
18283
18256
  "wfs.unreachable.cors": "Il servizio non è accessibile a causa di limitazioni CORS",
@@ -18307,20 +18280,21 @@ var nl = {
18307
18280
  "chart.type.line": "lijndiagram",
18308
18281
  "chart.type.lineSmooth": "glad lijndiagram",
18309
18282
  "chart.type.pie": "cirkeldiagram",
18283
+ "dashboard.createRecord": "",
18310
18284
  "dashboard.labels.mySpace": "Mijn ruimte",
18311
18285
  "dashboard.records.all": "Catalogus",
18312
18286
  "dashboard.records.myDraft": "Mijn concepten",
18313
18287
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18314
18288
  "dashboard.records.myOrg": "Organisatie",
18315
18289
  "dashboard.records.myRecords": "Mijn Records",
18316
- "dashboard.records.noRecord": "",
18317
- "dashboard.records.noUser": "",
18318
18290
  "dashboard.records.publishedRecords": "",
18319
18291
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18320
18292
  "dashboard.records.userDetail": "",
18321
18293
  "dashboard.records.userEmail": "",
18322
18294
  "dashboard.records.username": "",
18323
18295
  "dashboard.records.users": "",
18296
+ "dashboard.results.listMetadata": "",
18297
+ "dashboard.results.listResources": "",
18324
18298
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18325
18299
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18326
18300
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18406,6 +18380,7 @@ var nl = {
18406
18380
  "datahub.news.contact.title": "",
18407
18381
  "datahub.news.feed": "",
18408
18382
  "datahub.news.figures": "",
18383
+ "datahub.record.addToFavorites": "",
18409
18384
  "datahub.search.back": "",
18410
18385
  "datahub.search.filter.all": "",
18411
18386
  "datahub.search.filter.generatedByWfs": "",
@@ -18466,10 +18441,18 @@ var nl = {
18466
18441
  "map.add.layer.file": "",
18467
18442
  "map.add.layer.wfs": "",
18468
18443
  "map.add.layer.wms": "",
18444
+ "map.addFromFile.placeholder": "",
18445
+ "map.geocoding.placeholder": "",
18446
+ "map.help.addFromFile": "",
18447
+ "map.layer.add": "",
18448
+ "map.layers.available": "",
18469
18449
  "map.layers.list": "",
18470
18450
  "map.loading.data": "",
18451
+ "map.loading.service": "",
18471
18452
  "map.navigation.message": "",
18472
18453
  "map.select.layer": "",
18454
+ "map.wfs.urlInput.hint": "",
18455
+ "map.wms.urlInput.hint": "",
18473
18456
  "multiselect.filter.placeholder": "",
18474
18457
  "nav.back": "",
18475
18458
  next: next$1,
@@ -18503,15 +18486,16 @@ var nl = {
18503
18486
  "record.metadata.author": "",
18504
18487
  "record.metadata.catalog": "",
18505
18488
  "record.metadata.contact": "",
18506
- "record.metadata.createdOn": "",
18507
18489
  "record.metadata.details": "",
18508
18490
  "record.metadata.download": "",
18509
18491
  "record.metadata.formats": "",
18510
- "record.metadata.isOpenData": "",
18511
18492
  "record.metadata.keywords": "",
18493
+ "record.metadata.lastUpdate": "",
18512
18494
  "record.metadata.links": "",
18513
18495
  "record.metadata.noUsage": "",
18514
18496
  "record.metadata.origin": "",
18497
+ "record.metadata.otherConstraints": "",
18498
+ "record.metadata.owner": "",
18515
18499
  "record.metadata.preview": "",
18516
18500
  "record.metadata.publications": "",
18517
18501
  "record.metadata.quality": "",
@@ -18534,7 +18518,11 @@ var nl = {
18534
18518
  "record.metadata.quality.updateFrequency.success": "",
18535
18519
  "record.metadata.related": "",
18536
18520
  "record.metadata.sheet": "",
18521
+ "record.metadata.status": "",
18522
+ "record.metadata.themes": "",
18537
18523
  "record.metadata.title": "",
18524
+ "record.metadata.type": "",
18525
+ "record.metadata.uniqueId": "",
18538
18526
  "record.metadata.updateFrequency": "",
18539
18527
  "record.metadata.updateStatus": "",
18540
18528
  "record.metadata.updatedOn": "",
@@ -18598,6 +18586,7 @@ var nl = {
18598
18586
  "table.object.count": "",
18599
18587
  "table.select.data": "",
18600
18588
  "tooltip.html.copy": "",
18589
+ "tooltip.id.copy": "",
18601
18590
  "tooltip.url.copy": "",
18602
18591
  "tooltip.url.open": "",
18603
18592
  "ui.readLess": "",
@@ -18631,20 +18620,21 @@ var pt = {
18631
18620
  "chart.type.line": "gráfico de linha",
18632
18621
  "chart.type.lineSmooth": "gráfico de linha suave",
18633
18622
  "chart.type.pie": "gráfico de pizza",
18623
+ "dashboard.createRecord": "",
18634
18624
  "dashboard.labels.mySpace": "Meu espaço",
18635
18625
  "dashboard.records.all": "Catálogo",
18636
18626
  "dashboard.records.myDraft": "Meus rascunhos",
18637
18627
  "dashboard.records.myLibrary": "Minha biblioteca",
18638
18628
  "dashboard.records.myOrg": "Organização",
18639
18629
  "dashboard.records.myRecords": "Meus Registros",
18640
- "dashboard.records.noRecord": "",
18641
- "dashboard.records.noUser": "",
18642
18630
  "dashboard.records.publishedRecords": "",
18643
18631
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18644
18632
  "dashboard.records.userDetail": "",
18645
18633
  "dashboard.records.userEmail": "",
18646
18634
  "dashboard.records.username": "",
18647
18635
  "dashboard.records.users": "",
18636
+ "dashboard.results.listMetadata": "",
18637
+ "dashboard.results.listResources": "",
18648
18638
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18649
18639
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18650
18640
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18730,6 +18720,7 @@ var pt = {
18730
18720
  "datahub.news.contact.title": "",
18731
18721
  "datahub.news.feed": "",
18732
18722
  "datahub.news.figures": "",
18723
+ "datahub.record.addToFavorites": "",
18733
18724
  "datahub.search.back": "",
18734
18725
  "datahub.search.filter.all": "",
18735
18726
  "datahub.search.filter.generatedByWfs": "",
@@ -18790,10 +18781,18 @@ var pt = {
18790
18781
  "map.add.layer.file": "",
18791
18782
  "map.add.layer.wfs": "",
18792
18783
  "map.add.layer.wms": "",
18784
+ "map.addFromFile.placeholder": "",
18785
+ "map.geocoding.placeholder": "",
18786
+ "map.help.addFromFile": "",
18787
+ "map.layer.add": "",
18788
+ "map.layers.available": "",
18793
18789
  "map.layers.list": "",
18794
18790
  "map.loading.data": "",
18791
+ "map.loading.service": "",
18795
18792
  "map.navigation.message": "",
18796
18793
  "map.select.layer": "",
18794
+ "map.wfs.urlInput.hint": "",
18795
+ "map.wms.urlInput.hint": "",
18797
18796
  "multiselect.filter.placeholder": "",
18798
18797
  "nav.back": "",
18799
18798
  next: next,
@@ -18827,15 +18826,16 @@ var pt = {
18827
18826
  "record.metadata.author": "",
18828
18827
  "record.metadata.catalog": "",
18829
18828
  "record.metadata.contact": "",
18830
- "record.metadata.createdOn": "",
18831
18829
  "record.metadata.details": "",
18832
18830
  "record.metadata.download": "",
18833
18831
  "record.metadata.formats": "",
18834
- "record.metadata.isOpenData": "",
18835
18832
  "record.metadata.keywords": "",
18833
+ "record.metadata.lastUpdate": "",
18836
18834
  "record.metadata.links": "",
18837
18835
  "record.metadata.noUsage": "",
18838
18836
  "record.metadata.origin": "",
18837
+ "record.metadata.otherConstraints": "",
18838
+ "record.metadata.owner": "",
18839
18839
  "record.metadata.preview": "",
18840
18840
  "record.metadata.publications": "",
18841
18841
  "record.metadata.quality": "",
@@ -18858,7 +18858,11 @@ var pt = {
18858
18858
  "record.metadata.quality.updateFrequency.success": "",
18859
18859
  "record.metadata.related": "",
18860
18860
  "record.metadata.sheet": "",
18861
+ "record.metadata.status": "",
18862
+ "record.metadata.themes": "",
18861
18863
  "record.metadata.title": "",
18864
+ "record.metadata.type": "",
18865
+ "record.metadata.uniqueId": "",
18862
18866
  "record.metadata.updateFrequency": "",
18863
18867
  "record.metadata.updateStatus": "",
18864
18868
  "record.metadata.updatedOn": "",
@@ -18922,6 +18926,7 @@ var pt = {
18922
18926
  "table.object.count": "",
18923
18927
  "table.select.data": "",
18924
18928
  "tooltip.html.copy": "",
18929
+ "tooltip.id.copy": "",
18925
18930
  "tooltip.url.copy": "",
18926
18931
  "tooltip.url.open": "",
18927
18932
  "ui.readLess": "",
@@ -19066,20 +19071,11 @@ class Gn4FieldMapper {
19066
19071
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19067
19072
  ],
19068
19073
  }),
19069
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19070
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19071
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19072
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19073
- licenseObject: (output, source) => ({
19074
- ...output,
19075
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19076
- const link = getAsUrl(selectField(license, 'link'));
19077
- return {
19078
- text: selectTranslatedValue(license, this.lang3),
19079
- ...(link ? { link } : {}),
19080
- };
19081
- }),
19082
- }),
19074
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19075
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19076
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19077
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19078
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19083
19079
  lineageObject: (output, source) => ({
19084
19080
  ...output,
19085
19081
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19105,33 +19101,78 @@ class Gn4FieldMapper {
19105
19101
  kind,
19106
19102
  };
19107
19103
  },
19104
+ geom: (output, source) => {
19105
+ const geoms = getAsArray(selectField(source, 'geom'));
19106
+ const shapes = getAsArray(selectField(source, 'shape'));
19107
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19108
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19109
+ return {
19110
+ ...output,
19111
+ spatialExtents: [
19112
+ ...spatialExtents,
19113
+ ...geoms.map((geom, index) => {
19114
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19115
+ const geometry = shapes[index] ?? geom;
19116
+ return {
19117
+ ...(description !== null ? { description } : null),
19118
+ geometry,
19119
+ };
19120
+ }),
19121
+ ],
19122
+ };
19123
+ },
19124
+ resourceTemporalDateRange: (output, source) => {
19125
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19126
+ return {
19127
+ ...output,
19128
+ temporalExtents: ranges.map((range) => {
19129
+ const start = selectField(range, 'gte');
19130
+ const end = selectField(range, 'lte');
19131
+ return {
19132
+ ...(start !== null ? { start: toDate(start) } : null),
19133
+ ...(end !== null ? { end: toDate(end) } : null),
19134
+ };
19135
+ }),
19136
+ };
19137
+ },
19108
19138
  };
19109
19139
  this.genericField = (output) => output;
19110
- this.constraintField = (fieldName, output, source) => ({
19111
- ...output,
19112
- ...(fieldName.endsWith('UseLimitationObject')
19113
- ? {
19114
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19115
- ? [
19116
- ...(output.legalConstraints || []),
19117
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19118
- ]
19119
- : output.legalConstraints || [],
19120
- useLimitations: [
19121
- ...(output.useLimitations || []),
19122
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19123
- ],
19124
- }
19125
- : {
19126
- accessConstraints: [
19127
- ...(output.accessConstraints || []),
19128
- ...selectField(source, fieldName).map((field) => ({
19129
- text: selectTranslatedValue(field, this.lang3),
19130
- type: this.getConstraintsType(fieldName),
19131
- })),
19132
- ],
19133
- }),
19134
- });
19140
+ this.constraintField = (type, output, constraintArray) => {
19141
+ let outputField;
19142
+ switch (type) {
19143
+ case 'license':
19144
+ outputField = 'licenses';
19145
+ break;
19146
+ case 'legal':
19147
+ outputField = 'legalConstraints';
19148
+ break;
19149
+ case 'security':
19150
+ outputField = 'securityConstraints';
19151
+ break;
19152
+ case 'other':
19153
+ outputField = 'otherConstraints';
19154
+ break;
19155
+ }
19156
+ const outputArray = outputField in output ? output[outputField] : [];
19157
+ outputArray.push(...constraintArray.map((item) => {
19158
+ const text = selectTranslatedValue(item, this.lang3);
19159
+ const url = getAsUrl(selectField(item, 'link'));
19160
+ return {
19161
+ text,
19162
+ ...(url ? { url } : {}),
19163
+ };
19164
+ }));
19165
+ const result = {
19166
+ ...output,
19167
+ [outputField]: outputArray,
19168
+ };
19169
+ // avoid legal constraints being duplicates of licenses
19170
+ if ('legalConstraints' in result &&
19171
+ (type === 'legal' || type === 'license')) {
19172
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19173
+ }
19174
+ return result;
19175
+ };
19135
19176
  this.mapLink = (sourceLink) => {
19136
19177
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19137
19178
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19179,17 +19220,6 @@ class Gn4FieldMapper {
19179
19220
  extras: { ...(output.extras || {}), ...value },
19180
19221
  });
19181
19222
  }
19182
- getConstraintsType(indexField) {
19183
- switch (indexField) {
19184
- case 'MD_LegalConstraintsUseLimitationObject':
19185
- return 'legal';
19186
- case 'MD_SecurityConstraintsUseLimitationObject':
19187
- return 'security';
19188
- case 'MD_ConstraintsUseLimitationObject':
19189
- default:
19190
- return 'other';
19191
- }
19192
- }
19193
19223
  getMappingFn(fieldName) {
19194
19224
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19195
19225
  }
@@ -19251,14 +19281,16 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19251
19281
  recordUpdated: null,
19252
19282
  ownerOrganization: null,
19253
19283
  licenses: [],
19284
+ legalConstraints: [],
19285
+ securityConstraints: [],
19286
+ otherConstraints: [],
19254
19287
  contacts: [],
19255
19288
  contactsForResource: [],
19256
- accessConstraints: [],
19257
19289
  keywords: [],
19258
19290
  themes: [],
19259
- useLimitations: [],
19260
19291
  spatialExtents: [],
19261
19292
  temporalExtents: [],
19293
+ overviews: [],
19262
19294
  };
19263
19295
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19264
19296
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -20292,36 +20324,23 @@ class SelectionService {
20292
20324
  this.selectedRecordsIdentifiers$.next(filtered);
20293
20325
  }
20294
20326
  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(() => {
20327
+ const newIds = records.map((record) => record.uniqueIdentifier);
20328
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20301
20329
  this.addIdsToSelected(newIds);
20302
- }), map$2(() => undefined));
20330
+ });
20303
20331
  }
20304
20332
  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(() => {
20333
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20334
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20311
20335
  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
20336
  });
20320
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20321
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20322
- return apiResponse.pipe(tap$2(() => {
20337
+ }
20338
+ async clearSelection() {
20339
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20340
+ const currentSelection = Array.from(response);
20341
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20323
20342
  this.removeIdsFromSelected(currentSelection);
20324
- }), map$2(() => undefined));
20343
+ });
20325
20344
  }
20326
20345
  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
20346
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20639,6 +20658,8 @@ const defaultMapOptions = {
20639
20658
  };
20640
20659
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20641
20660
 
20661
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20662
+
20642
20663
  var MapContextLayerTypeEnum;
20643
20664
  (function (MapContextLayerTypeEnum) {
20644
20665
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -20946,6 +20967,33 @@ function propagateToDocumentOnly(event) {
20946
20967
  }, 0);
20947
20968
  }
20948
20969
 
20970
+ function normalize(input) {
20971
+ return input
20972
+ .toLowerCase()
20973
+ .normalize('NFD') // explode composite chars (e.g. é) into multiple chars
20974
+ .replace(/[\u0300-\u036f]/g, '') // remove accents
20975
+ .replace(/œ/g, 'oe') // remove accents
20976
+ .replace(/[^a-z0-9\s]/g, ' '); // replace special characters with space
20977
+ }
20978
+ function asNormalizedParts(input) {
20979
+ return normalize(input)
20980
+ .split(/\s+/)
20981
+ .map((part) => part.trim())
20982
+ .filter((part) => part.length > 0);
20983
+ }
20984
+ /**
20985
+ * This creates a filter function based on a pattern (typically a user-input
20986
+ * search text).
20987
+ * @param pattern
20988
+ */
20989
+ function createFuzzyFilter(pattern) {
20990
+ const patternParts = asNormalizedParts(pattern);
20991
+ return (input) => {
20992
+ const inputParts = asNormalizedParts(input);
20993
+ return patternParts.every((patternPart) => inputParts.some((part) => part.includes(patternPart)));
20994
+ };
20995
+ }
20996
+
20949
20997
  marker('downloads.wfs.featuretype.not.found');
20950
20998
  const FORMATS = {
20951
20999
  csv: {
@@ -20987,9 +21035,15 @@ const FORMATS = {
20987
21035
  color: '#328556',
20988
21036
  mimeTypes: ['x-gis/x-shapefile'],
20989
21037
  },
21038
+ gml: {
21039
+ extensions: ['gml'],
21040
+ priority: 5,
21041
+ color: '#c92bce',
21042
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21043
+ },
20990
21044
  kml: {
20991
21045
  extensions: ['kml', 'kmz'],
20992
- priority: 5,
21046
+ priority: 6,
20993
21047
  color: '#348009',
20994
21048
  mimeTypes: [
20995
21049
  'application/vnd.google-earth.kml+xml',
@@ -20998,34 +21052,40 @@ const FORMATS = {
20998
21052
  },
20999
21053
  gpkg: {
21000
21054
  extensions: ['gpkg', 'geopackage'],
21001
- priority: 6,
21055
+ priority: 7,
21002
21056
  color: '#ea79ba',
21003
21057
  mimeTypes: ['application/geopackage+sqlite3'],
21004
21058
  },
21005
21059
  zip: {
21006
21060
  extensions: ['zip', 'tar.gz'],
21007
- priority: 7,
21061
+ priority: 8,
21008
21062
  color: '#f2bb3a',
21009
21063
  mimeTypes: ['application/zip', 'application/x-zip'],
21010
21064
  },
21011
21065
  pdf: {
21012
21066
  extensions: ['pdf'],
21013
- priority: 8,
21067
+ priority: 9,
21014
21068
  color: '#db544a',
21015
21069
  mimeTypes: ['application/pdf'],
21016
21070
  },
21017
21071
  jpg: {
21018
21072
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21019
- priority: 8,
21073
+ priority: 9,
21020
21074
  color: '#673ab7',
21021
21075
  mimeTypes: ['image/jpg'],
21022
21076
  },
21023
21077
  svg: {
21024
21078
  extensions: ['svg'],
21025
- priority: 9,
21079
+ priority: 10,
21026
21080
  color: '#d98294',
21027
21081
  mimeTypes: ['image/svg+xml'],
21028
21082
  },
21083
+ dxf: {
21084
+ extensions: ['dxf'],
21085
+ priority: 11,
21086
+ color: '#de630b',
21087
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21088
+ },
21029
21089
  };
21030
21090
  function getFormatPriority(linkFormat) {
21031
21091
  for (const format in FORMATS) {
@@ -21042,14 +21102,18 @@ function getFormatPriority(linkFormat) {
21042
21102
  function getLinkPriority(link) {
21043
21103
  return getFormatPriority(getFileFormat(link));
21044
21104
  }
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;
21105
+ function getFileFormatFromServiceOutput(serviceOutput) {
21106
+ function formatMatcher(format) {
21107
+ const output = serviceOutput.toLowerCase();
21108
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21109
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21110
+ }
21111
+ for (const formatName in FORMATS) {
21112
+ if (formatMatcher(FORMATS[formatName])) {
21113
+ return formatName;
21050
21114
  }
21051
21115
  }
21052
- return undefined;
21116
+ return null;
21053
21117
  }
21054
21118
  function getFileFormat(link) {
21055
21119
  if ('mimeType' in link) {
@@ -21190,72 +21254,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21190
21254
  }]
21191
21255
  }] });
21192
21256
 
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
21257
  const FEATURE_PROJECTION = 'EPSG:3857';
21240
21258
  const DATA_PROJECTION = 'EPSG:4326';
21259
+ const GEOJSON = new GeoJSON();
21241
21260
  class MapUtilsService {
21242
- constructor(http, wmsUtils) {
21261
+ constructor(http, proxy) {
21243
21262
  this.http = http;
21244
- this.wmsUtils = wmsUtils;
21263
+ this.proxy = proxy;
21245
21264
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21246
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21265
+ return GEOJSON.readFeatures(featureCollection, {
21247
21266
  featureProjection,
21248
21267
  dataProjection,
21249
21268
  });
21250
- return olFeatures;
21251
21269
  };
21252
21270
  }
21253
21271
  createEmptyMap() {
21254
- const map = new Map$1({
21272
+ return new Map$1({
21255
21273
  controls: [],
21256
21274
  pixelRatio: 1,
21257
21275
  });
21258
- return map;
21259
21276
  }
21260
21277
  isWMSLayer(layer) {
21261
21278
  return (layer.getSource() instanceof TileWMS ||
@@ -21270,8 +21287,7 @@ class MapUtilsService {
21270
21287
  ...source.getParams(),
21271
21288
  INFO_FORMAT: 'application/json',
21272
21289
  };
21273
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21274
- return url;
21290
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21275
21291
  }
21276
21292
  getVectorFeaturesFromClick(olMap, event) {
21277
21293
  const features = [];
@@ -21299,38 +21315,56 @@ class MapUtilsService {
21299
21315
  /**
21300
21316
  * Will emit `null` if no extent could be computed
21301
21317
  */
21302
- getLayerExtent(layer) {
21303
- let geographicExtent;
21318
+ async getLayerExtent(layer) {
21319
+ let latLonExtent;
21304
21320
  if (layer &&
21305
21321
  layer.type === 'geojson' &&
21306
21322
  'data' in layer &&
21307
21323
  typeof layer.data === 'object' &&
21308
21324
  layer.data.features[0] &&
21309
21325
  layer.data.features[0].geometry) {
21310
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21311
- .readFeatures(layerData)
21326
+ latLonExtent = new GeoJSON()
21327
+ .readFeatures(layer.data)
21312
21328
  .map((feature) => feature.getGeometry())
21313
21329
  .filter((geom) => !!geom)
21314
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21330
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21315
21331
  }
21316
21332
  else if (layer && layer.type === 'wms') {
21317
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21333
+ latLonExtent = await this.getWmsLayerExtent(layer);
21318
21334
  }
21319
21335
  else if (layer && layer.type === 'wmts') {
21320
21336
  if (layer.extent) {
21321
- geographicExtent = of(layer.extent);
21337
+ latLonExtent = layer.extent;
21322
21338
  }
21323
21339
  else {
21324
- return of(layer.options.tileGrid.getExtent());
21340
+ return layer.options.tileGrid.getExtent();
21325
21341
  }
21326
21342
  }
21327
21343
  else {
21328
- return of(null);
21344
+ return null;
21345
+ }
21346
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21347
+ return null;
21348
+ }
21349
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21350
+ }
21351
+ async getWmsLayerExtent(layer) {
21352
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21353
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21354
+ if (!Object.keys(boundingBoxes).length) {
21355
+ return null;
21356
+ }
21357
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21358
+ if (lonLatCRS) {
21359
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21360
+ }
21361
+ else {
21362
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21363
+ register(proj4);
21364
+ const proj = await fromEPSGCode(availableEPSGCode);
21365
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21366
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21329
21367
  }
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
21368
  }
21335
21369
  getWmtsLayerFromCapabilities(link) {
21336
21370
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21386,7 +21420,18 @@ ${e.stack || e.message || e}`);
21386
21420
  ])
21387
21421
  .getArray());
21388
21422
  }
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 }); }
21423
+ getRecordExtent(record) {
21424
+ if (!('spatialExtents' in record)) {
21425
+ return null;
21426
+ }
21427
+ // transform an array of geojson geometries into a bbox
21428
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21429
+ const geom = GEOJSON.readGeometry(curr.geometry);
21430
+ return extend(prev, geom.getExtent());
21431
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21432
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21433
+ }
21434
+ 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
21435
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21391
21436
  }
21392
21437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21394,7 +21439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21394
21439
  args: [{
21395
21440
  providedIn: 'root',
21396
21441
  }]
21397
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21442
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21398
21443
  function dragPanCondition(event) {
21399
21444
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21400
21445
  if (!dragPanCondition) {
@@ -22469,6 +22514,7 @@ const DEFAULT_VIEW = {
22469
22514
  center: [0, 15],
22470
22515
  zoom: 2,
22471
22516
  };
22517
+ const WFS_MAX_FEATURES = 10000;
22472
22518
  class MapContextService {
22473
22519
  constructor(mapUtils, styleService) {
22474
22520
  this.mapUtils = mapUtils;
@@ -22527,6 +22573,7 @@ class MapContextService {
22527
22573
  urlObj.searchParams.set('typename', layerModel.name);
22528
22574
  urlObj.searchParams.set('srsname', 'EPSG:3857');
22529
22575
  urlObj.searchParams.set('bbox', `${extent.join(',')},EPSG:3857`);
22576
+ urlObj.searchParams.set('maxFeatures', WFS_MAX_FEATURES.toString());
22530
22577
  return urlObj.toString();
22531
22578
  },
22532
22579
  strategy: bbox,
@@ -23074,6 +23121,7 @@ class ThumbnailComponent {
23074
23121
  constructor(optionalPlaceholderUrl) {
23075
23122
  this.optionalPlaceholderUrl = optionalPlaceholderUrl;
23076
23123
  this.fit = 'cover';
23124
+ this.placeholderShown = new EventEmitter();
23077
23125
  this.placeholderUrl = this.optionalPlaceholderUrl || DEFAULT_PLACEHOLDER;
23078
23126
  this.images = [];
23079
23127
  }
@@ -23109,6 +23157,7 @@ class ThumbnailComponent {
23109
23157
  setNewSrcImage(image) {
23110
23158
  this.imgFit = image.fit;
23111
23159
  this.imgUrl = image.url;
23160
+ this.placeholderShown.emit(this.isPlaceholder);
23112
23161
  }
23113
23162
  setPlaceholder() {
23114
23163
  this.setNewSrcImage({ url: this.placeholderUrl, fit: 'scale-down' });
@@ -23131,7 +23180,7 @@ class ThumbnailComponent {
23131
23180
  }
23132
23181
  }
23133
23182
  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 }); }
23183
+ 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
23184
  }
23136
23185
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23137
23186
  type: Component,
@@ -23151,11 +23200,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23151
23200
  }], containerElement: [{
23152
23201
  type: ViewChild,
23153
23202
  args: ['containerElement']
23203
+ }], placeholderShown: [{
23204
+ type: Output
23154
23205
  }] } });
23155
23206
 
23156
23207
  class RecordPreviewCardComponent extends RecordPreviewComponent {
23157
23208
  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 }); }
23209
+ 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
23210
  }
23160
23211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, decorators: [{
23161
23212
  type: Component,
@@ -23164,7 +23215,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23164
23215
 
23165
23216
  class RecordPreviewListComponent extends RecordPreviewComponent {
23166
23217
  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 }); }
23218
+ 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
23219
  }
23169
23220
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, decorators: [{
23170
23221
  type: Component,
@@ -23261,8 +23312,7 @@ class MetadataQualityComponent {
23261
23312
  : this.calculatedQualityScore;
23262
23313
  }
23263
23314
  get calculatedQualityScore() {
23264
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23265
- this.items.length);
23315
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23266
23316
  }
23267
23317
  showMenu() {
23268
23318
  this.isMenuShown = true;
@@ -23312,7 +23362,7 @@ class RecordPreviewRowComponent extends RecordPreviewComponent {
23312
23362
  this.elementRef = elementRef;
23313
23363
  }
23314
23364
  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 }); }
23365
+ 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
23366
  }
23317
23367
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewRowComponent, decorators: [{
23318
23368
  type: Component,
@@ -23330,7 +23380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23330
23380
 
23331
23381
  class RecordPreviewTitleComponent extends RecordPreviewComponent {
23332
23382
  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 }); }
23383
+ 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
23384
  }
23335
23385
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, decorators: [{
23336
23386
  type: Component,
@@ -23370,7 +23420,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
23370
23420
  return this.timeFormat.format(this.record.recordCreated, Date.now());
23371
23421
  }
23372
23422
  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 }); }
23423
+ 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
23424
  }
23375
23425
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewFeedComponent, decorators: [{
23376
23426
  type: Component,
@@ -23703,14 +23753,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23703
23753
  args: ['contentDiv']
23704
23754
  }] } });
23705
23755
 
23706
- class ContentGhostComponent {
23756
+ class CopyTextButtonComponent {
23707
23757
  constructor() {
23708
- this.ghostClass = '';
23758
+ this.displayText = true;
23759
+ this.rows = 1;
23709
23760
  }
23710
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23711
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: { showContent: "showContent", ghostClass: "ghostClass" }, ngImport: i0, template: "<div\n *ngIf=\"!showContent\"\n class=\"ghost bg-gray-100 rounded-lg relative overflow-hidden {{ ghostClass }}\"\n></div>\n<ng-content *ngIf=\"showContent\"></ng-content>\n", styles: [".ghost{min-height:2rem;min-width:2rem;overflow:hidden}.ghost:after{content:\"\";position:absolute;top:0;bottom:0;width:50%;background-image:linear-gradient(to left,rgba(251,251,251,.05),rgba(251,251,251,.3),rgba(251,251,251,.6),rgba(251,251,251,.3),rgba(251,251,251,.05));animation:loading 1s infinite}@keyframes loading{0%{left:-50%}to{left:100%}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23761
+ copyText(event) {
23762
+ navigator.clipboard.writeText(this.text);
23763
+ event.target.blur();
23764
+ }
23765
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23766
+ 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 }); }
23712
23767
  }
23713
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, decorators: [{
23768
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
23769
+ type: Component,
23770
+ 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" }]
23771
+ }], propDecorators: { text: [{
23772
+ type: Input
23773
+ }], tooltipText: [{
23774
+ type: Input
23775
+ }], displayText: [{
23776
+ type: Input
23777
+ }], rows: [{
23778
+ type: Input
23779
+ }] } });
23780
+
23781
+ class ContentGhostComponent {
23782
+ constructor() {
23783
+ this.ghostClass = '';
23784
+ }
23785
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23786
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: { showContent: "showContent", ghostClass: "ghostClass" }, ngImport: i0, template: "<div\n *ngIf=\"!showContent\"\n class=\"ghost bg-gray-100 rounded-lg relative overflow-hidden {{ ghostClass }}\"\n></div>\n<ng-content *ngIf=\"showContent\"></ng-content>\n", styles: [".ghost{min-height:2rem;min-width:2rem;overflow:hidden}.ghost:after{content:\"\";position:absolute;top:0;bottom:0;width:50%;background-image:linear-gradient(to left,rgba(251,251,251,.05),rgba(251,251,251,.3),rgba(251,251,251,.6),rgba(251,251,251,.3),rgba(251,251,251,.05));animation:loading 1s infinite}@keyframes loading{0%{left:-50%}to{left:100%}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23787
+ }
23788
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, decorators: [{
23714
23789
  type: Component,
23715
23790
  args: [{ selector: 'gn-ui-content-ghost', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"!showContent\"\n class=\"ghost bg-gray-100 rounded-lg relative overflow-hidden {{ ghostClass }}\"\n></div>\n<ng-content *ngIf=\"showContent\"></ng-content>\n", styles: [".ghost{min-height:2rem;min-width:2rem;overflow:hidden}.ghost:after{content:\"\";position:absolute;top:0;bottom:0;width:50%;background-image:linear-gradient(to left,rgba(251,251,251,.05),rgba(251,251,251,.3),rgba(251,251,251,.6),rgba(251,251,251,.3),rgba(251,251,251,.05));animation:loading 1s infinite}@keyframes loading{0%{left:-50%}to{left:100%}}\n"] }]
23716
23791
  }], propDecorators: { showContent: [{
@@ -23857,22 +23932,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23857
23932
  args: ['container']
23858
23933
  }] } });
23859
23934
 
23935
+ class MarkdownParserComponent {
23936
+ get parsedMarkdown() {
23937
+ return marked.parse(this.textContent);
23938
+ }
23939
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23940
+ 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}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23941
+ }
23942
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23943
+ type: Component,
23944
+ 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}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
23945
+ }], propDecorators: { textContent: [{
23946
+ type: Input
23947
+ }] } });
23948
+
23860
23949
  class MetadataInfoComponent {
23861
23950
  constructor() {
23862
23951
  this.keyword = new EventEmitter();
23863
23952
  }
23864
23953
  get hasUsage() {
23865
23954
  return (this.metadata.extras?.isOpenData === true ||
23866
- this.metadata.useLimitations?.length ||
23867
- this.metadata.accessConstraints?.length);
23955
+ (this.metadata.legalConstraints?.length > 0 &&
23956
+ this.legalConstraints.length > 0) ||
23957
+ (this.metadata.otherConstraints?.length > 0 &&
23958
+ this.otherConstraints.length > 0) ||
23959
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
23868
23960
  }
23869
- get usages() {
23961
+ get legalConstraints() {
23870
23962
  let array = [];
23871
- if (this.metadata.useLimitations?.length) {
23872
- array = array.concat(this.metadata.useLimitations);
23963
+ if (this.metadata.legalConstraints?.length) {
23964
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
23873
23965
  }
23874
- if (this.metadata.accessConstraints?.length) {
23875
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
23966
+ return array;
23967
+ }
23968
+ get otherConstraints() {
23969
+ let array = [];
23970
+ if (this.metadata.otherConstraints?.length) {
23971
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
23972
+ }
23973
+ return array;
23974
+ }
23975
+ get licenses() {
23976
+ let array = [];
23977
+ if (this.metadata.licenses?.length) {
23978
+ array = array.concat(this.metadata.licenses
23979
+ .filter((c) => c.text)
23980
+ .map((c) => ({ text: c.text, url: c.url })));
23876
23981
  }
23877
23982
  return array;
23878
23983
  }
@@ -23895,11 +24000,11 @@ class MetadataInfoComponent {
23895
24000
  this.keyword.emit(keyword);
23896
24001
  }
23897
24002
  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 }); }
24003
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: 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
24004
  }
23900
24005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
23901
24006
  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"] }]
24007
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
23903
24008
  }], propDecorators: { metadata: [{
23904
24009
  type: Input
23905
24010
  }], incomplete: [{
@@ -23935,13 +24040,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23935
24040
 
23936
24041
  class ButtonComponent {
23937
24042
  constructor() {
23938
- this.type = 'default';
23939
24043
  this.disabled = false;
23940
24044
  this.extraClass = '';
23941
24045
  this.buttonClick = new EventEmitter();
23942
24046
  }
24047
+ // btn-classes are explicited to allow tailwind recognize them and add it in css.
24048
+ set type(value) {
24049
+ switch (value) {
24050
+ case 'primary':
24051
+ this.btnClass = 'btn-primary';
24052
+ break;
24053
+ case 'secondary':
24054
+ this.btnClass = 'btn-secondary';
24055
+ break;
24056
+ case 'outline':
24057
+ this.btnClass = 'btn-outline';
24058
+ break;
24059
+ case 'light':
24060
+ this.btnClass = 'btn-light';
24061
+ break;
24062
+ default:
24063
+ this.btnClass = 'btn-default';
24064
+ break;
24065
+ }
24066
+ }
23943
24067
  get classList() {
23944
- return `btn-${this.type} ${this.extraClass}`;
24068
+ return `${this.btnClass} ${this.extraClass}`;
23945
24069
  }
23946
24070
  handleClick(event) {
23947
24071
  this.buttonClick.emit();
@@ -23949,11 +24073,11 @@ class ButtonComponent {
23949
24073
  propagateToDocumentOnly(event);
23950
24074
  }
23951
24075
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23952
- 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 }); }
24076
+ 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 }); }
23953
24077
  }
23954
24078
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
23955
24079
  type: Component,
23956
- 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"] }]
24080
+ 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"] }]
23957
24081
  }], propDecorators: { type: [{
23958
24082
  type: Input
23959
24083
  }], disabled: [{
@@ -24028,40 +24152,15 @@ class DownloadsListComponent {
24028
24152
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24029
24153
  }
24030
24154
  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 }); }
24031
- 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 }); }
24155
+ 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 }); }
24032
24156
  }
24033
24157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24034
24158
  type: Component,
24035
- 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" }]
24159
+ 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" }]
24036
24160
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24037
24161
  type: Input
24038
24162
  }] } });
24039
24163
 
24040
- class CopyTextButtonComponent {
24041
- constructor() {
24042
- this.displayText = true;
24043
- this.rows = 1;
24044
- }
24045
- copyText(event) {
24046
- navigator.clipboard.writeText(this.text);
24047
- event.target.blur();
24048
- }
24049
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24050
- 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 }); }
24051
- }
24052
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24053
- type: Component,
24054
- 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" }]
24055
- }], propDecorators: { text: [{
24056
- type: Input
24057
- }], tooltipText: [{
24058
- type: Input
24059
- }], displayText: [{
24060
- type: Input
24061
- }], rows: [{
24062
- type: Input
24063
- }] } });
24064
-
24065
24164
  class ApiCardComponent {
24066
24165
  constructor() {
24067
24166
  this.currentlyActive = false;
@@ -24258,11 +24357,11 @@ class CarouselComponent {
24258
24357
  this.emblaApi.scrollTo(stepIndex);
24259
24358
  }
24260
24359
  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 }); }
24261
- 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 }); }
24360
+ 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 }); }
24262
24361
  }
24263
24362
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24264
24363
  type: Component,
24265
- 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"] }]
24364
+ 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"] }]
24266
24365
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24267
24366
  type: Input
24268
24367
  }], stepsContainerClass: [{
@@ -24306,6 +24405,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24306
24405
  }]
24307
24406
  }] });
24308
24407
 
24408
+ class InteractiveTableColumnComponent {
24409
+ constructor() {
24410
+ this.grow = false;
24411
+ this.sortable = false;
24412
+ this.activeSort = null;
24413
+ this.sortChange = new EventEmitter();
24414
+ }
24415
+ handleSortChange() {
24416
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24417
+ this.sortChange.emit(this.activeSort);
24418
+ }
24419
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24420
+ 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 }); }
24421
+ }
24422
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24423
+ type: Component,
24424
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24425
+ }], propDecorators: { header: [{
24426
+ type: ContentChild,
24427
+ args: ['header']
24428
+ }], cell: [{
24429
+ type: ContentChild,
24430
+ args: ['cell']
24431
+ }], grow: [{
24432
+ type: Input
24433
+ }], sortable: [{
24434
+ type: Input
24435
+ }], activeSort: [{
24436
+ type: Input
24437
+ }], sortChange: [{
24438
+ type: Output
24439
+ }] } });
24440
+
24441
+ class InteractiveTableComponent {
24442
+ constructor() {
24443
+ this.items = [];
24444
+ this.itemClick = new EventEmitter();
24445
+ }
24446
+ get gridStyle() {
24447
+ return {
24448
+ 'grid-template-columns': this.columns
24449
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24450
+ .join(' '),
24451
+ };
24452
+ }
24453
+ handleRowClick(item) {
24454
+ this.itemClick.emit(item);
24455
+ }
24456
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24457
+ 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 }); }
24458
+ }
24459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24460
+ type: Component,
24461
+ 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"] }]
24462
+ }], propDecorators: { columns: [{
24463
+ type: ContentChildren,
24464
+ args: [InteractiveTableColumnComponent]
24465
+ }], items: [{
24466
+ type: Input
24467
+ }], itemClick: [{
24468
+ type: Output
24469
+ }] } });
24470
+
24309
24471
  class LinkCardComponent {
24310
24472
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24311
24473
  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 }); }
@@ -24319,11 +24481,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24319
24481
 
24320
24482
  class RelatedRecordCardComponent {
24321
24483
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24322
- 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 }); }
24484
+ 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 }); }
24323
24485
  }
24324
24486
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
24325
24487
  type: Component,
24326
- 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" }]
24488
+ 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" }]
24327
24489
  }], propDecorators: { record: [{
24328
24490
  type: Input
24329
24491
  }] } });
@@ -24341,15 +24503,21 @@ class MetadataContactComponent {
24341
24503
  ? this.metadata.contactsForResource
24342
24504
  : this.metadata.contacts) || []);
24343
24505
  }
24506
+ get address() {
24507
+ const addressParts = this.contacts[0].address
24508
+ .split(',')
24509
+ .map((part) => part.trim());
24510
+ return addressParts;
24511
+ }
24344
24512
  onOrganizationClick() {
24345
24513
  this.organizationClick.emit(this.shownOrganization);
24346
24514
  }
24347
24515
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24348
- 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 }); }
24516
+ 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 }); }
24349
24517
  }
24350
24518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24351
24519
  type: Component,
24352
- 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" }]
24520
+ 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" }]
24353
24521
  }], propDecorators: { metadata: [{
24354
24522
  type: Input
24355
24523
  }], organizationClick: [{
@@ -24615,7 +24783,10 @@ class DropdownMultiselectComponent {
24615
24783
  return this.choices.filter((choice) => this.selected.indexOf(choice.value) > -1);
24616
24784
  }
24617
24785
  get filteredChoicesByText() {
24618
- return this.choices.filter((choice) => choice.label.toLowerCase().includes(this.searchInputValue?.toLowerCase()));
24786
+ if (!this.searchInputValue)
24787
+ return this.choices;
24788
+ const filter = createFuzzyFilter(this.searchInputValue);
24789
+ return this.choices.filter((choice) => filter(choice.label));
24619
24790
  }
24620
24791
  get focusedIndex() {
24621
24792
  return this.checkboxes.reduce((prev, curr, curIndex) => curr.nativeElement === document.activeElement ? curIndex : prev, -1);
@@ -24750,11 +24921,11 @@ class DropdownMultiselectComponent {
24750
24921
  this.setFocus();
24751
24922
  }
24752
24923
  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 }); }
24753
- 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 }); }
24924
+ 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 }); }
24754
24925
  }
24755
24926
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24756
24927
  type: Component,
24757
- 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" }]
24928
+ 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" }]
24758
24929
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24759
24930
  type: Input
24760
24931
  }], choices: [{
@@ -25013,11 +25184,11 @@ class AutocompleteComponent {
25013
25184
  }
25014
25185
  }
25015
25186
  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 }); }
25016
- 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 }); }
25187
+ 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 }); }
25017
25188
  }
25018
25189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25019
25190
  type: Component,
25020
- 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"] }]
25191
+ 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"] }]
25021
25192
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25022
25193
  type: Input
25023
25194
  }], action: [{
@@ -25066,11 +25237,11 @@ class StarToggleComponent {
25066
25237
  event.preventDefault();
25067
25238
  }
25068
25239
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25069
- 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 }); }
25240
+ 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 }); }
25070
25241
  }
25071
25242
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, decorators: [{
25072
25243
  type: Component,
25073
- 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"] }]
25244
+ 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"] }]
25074
25245
  }], propDecorators: { toggled: [{
25075
25246
  type: Input
25076
25247
  }], disabled: [{
@@ -25182,11 +25353,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25182
25353
 
25183
25354
  class NavigationButtonComponent {
25184
25355
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25185
- 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 }); }
25356
+ 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 }); }
25186
25357
  }
25187
25358
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25188
25359
  type: Component,
25189
- 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" }]
25360
+ 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" }]
25190
25361
  }], propDecorators: { label: [{
25191
25362
  type: Input
25192
25363
  }], icon: [{
@@ -25393,11 +25564,11 @@ class CheckboxComponent {
25393
25564
  this.changed.emit(this.checked);
25394
25565
  }
25395
25566
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25396
- 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 }); }
25567
+ 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 }); }
25397
25568
  }
25398
25569
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25399
25570
  type: Component,
25400
- 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"] }]
25571
+ 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"] }]
25401
25572
  }], propDecorators: { type: [{
25402
25573
  type: Input
25403
25574
  }], checked: [{
@@ -25452,6 +25623,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25452
25623
  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"] }]
25453
25624
  }] });
25454
25625
 
25626
+ class EditableLabelDirective {
25627
+ constructor(el, renderer) {
25628
+ this.el = el;
25629
+ this.renderer = renderer;
25630
+ this.editableLabelChanged = new EventEmitter();
25631
+ }
25632
+ ngAfterViewInit() {
25633
+ if (this.gnUiEditableLabel !== false) {
25634
+ const appendedInput = this.renderer.createElement('input');
25635
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25636
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25637
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25638
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25639
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25640
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25641
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25642
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25643
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25644
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25645
+ const hostContent = this.el.nativeElement.textContent || '';
25646
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25647
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25648
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25649
+ this.renderer.listen(appendedInput, 'input', (event) => {
25650
+ this.editableLabelChanged.emit(event.target.value);
25651
+ });
25652
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25653
+ }
25654
+ }
25655
+ 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 }); }
25656
+ 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 }); }
25657
+ }
25658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25659
+ type: Directive,
25660
+ args: [{
25661
+ selector: '[gnUiEditableLabel]',
25662
+ standalone: true,
25663
+ }]
25664
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25665
+ type: Output
25666
+ }], gnUiEditableLabel: [{
25667
+ type: Input
25668
+ }] } });
25669
+
25455
25670
  class UiInputsModule {
25456
25671
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25457
25672
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
@@ -25491,7 +25706,8 @@ class UiInputsModule {
25491
25706
  MatFormFieldModule,
25492
25707
  MatInputModule,
25493
25708
  MatDatepickerModule,
25494
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25709
+ MatNativeDateModule,
25710
+ EditableLabelDirective], exports: [DropdownSelectorComponent,
25495
25711
  AutocompleteComponent,
25496
25712
  ButtonComponent,
25497
25713
  TextInputComponent,
@@ -25507,7 +25723,8 @@ class UiInputsModule {
25507
25723
  CopyTextButtonComponent,
25508
25724
  CheckboxComponent,
25509
25725
  SearchInputComponent,
25510
- DateRangePickerComponent] }); }
25726
+ DateRangePickerComponent,
25727
+ EditableLabelDirective] }); }
25511
25728
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25512
25729
  TranslateModule.forChild(),
25513
25730
  NgxDropzoneModule,
@@ -25573,6 +25790,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25573
25790
  MatInputModule,
25574
25791
  MatDatepickerModule,
25575
25792
  MatNativeDateModule,
25793
+ EditableLabelDirective,
25576
25794
  ],
25577
25795
  exports: [
25578
25796
  DropdownSelectorComponent,
@@ -25592,6 +25810,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25592
25810
  CheckboxComponent,
25593
25811
  SearchInputComponent,
25594
25812
  DateRangePickerComponent,
25813
+ EditableLabelDirective,
25595
25814
  ],
25596
25815
  }]
25597
25816
  }] });
@@ -25691,7 +25910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25691
25910
 
25692
25911
  const DEFAULT_PARAMS = {
25693
25912
  OFFSET: '',
25694
- LIMIT: '',
25913
+ LIMIT: '-1',
25695
25914
  FORMAT: 'json',
25696
25915
  };
25697
25916
  class RecordApiFormComponent {
@@ -25720,6 +25939,8 @@ class RecordApiFormComponent {
25720
25939
  }
25721
25940
  return outputUrl;
25722
25941
  }));
25942
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
25943
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25723
25944
  }
25724
25945
  set apiLink(value) {
25725
25946
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25729,10 +25950,11 @@ class RecordApiFormComponent {
25729
25950
  this.offset$.next(value);
25730
25951
  }
25731
25952
  setLimit(value) {
25732
- this.limit$.next(value);
25953
+ const newLimit = value === '' ? '-1' : value;
25954
+ this.limit$.next(newLimit);
25733
25955
  }
25734
25956
  setFormat(value) {
25735
- this.format$.next(value);
25957
+ this.format$.next(String(value));
25736
25958
  }
25737
25959
  resetUrl() {
25738
25960
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25740,15 +25962,34 @@ class RecordApiFormComponent {
25740
25962
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25741
25963
  }
25742
25964
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25743
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25965
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25744
25966
  }
25745
25967
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25746
25968
  type: Component,
25747
- args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
25969
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
25748
25970
  }], propDecorators: { apiLink: [{
25749
25971
  type: Input
25750
25972
  }] } });
25751
25973
 
25974
+ class ImageOverlayPreviewComponent {
25975
+ constructor() {
25976
+ this.isPlaceholderShown = new EventEmitter();
25977
+ }
25978
+ openLightbox(src) {
25979
+ basicLightbox.create(`<img src="${src}"/>`).show();
25980
+ }
25981
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25982
+ 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"] }] }); }
25983
+ }
25984
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25985
+ type: Component,
25986
+ 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" }]
25987
+ }], propDecorators: { imageUrl: [{
25988
+ type: Input
25989
+ }], isPlaceholderShown: [{
25990
+ type: Output
25991
+ }] } });
25992
+
25752
25993
  class UiElementsModule {
25753
25994
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25754
25995
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -25770,7 +26011,9 @@ class UiElementsModule {
25770
26011
  GnUiLinkifyDirective,
25771
26012
  PaginationButtonsComponent,
25772
26013
  MaxLinesComponent,
25773
- RecordApiFormComponent], imports: [CommonModule,
26014
+ RecordApiFormComponent,
26015
+ MarkdownParserComponent,
26016
+ ImageOverlayPreviewComponent], imports: [CommonModule,
25774
26017
  MatIconModule,
25775
26018
  MatTooltipModule,
25776
26019
  UiWidgetsModule,
@@ -25795,7 +26038,10 @@ class UiElementsModule {
25795
26038
  AvatarComponent,
25796
26039
  UserPreviewComponent,
25797
26040
  PaginationButtonsComponent,
25798
- RecordApiFormComponent] }); }
26041
+ MaxLinesComponent,
26042
+ RecordApiFormComponent,
26043
+ MarkdownParserComponent,
26044
+ ImageOverlayPreviewComponent] }); }
25799
26045
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, imports: [CommonModule,
25800
26046
  MatIconModule,
25801
26047
  MatTooltipModule,
@@ -25844,6 +26090,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25844
26090
  PaginationButtonsComponent,
25845
26091
  MaxLinesComponent,
25846
26092
  RecordApiFormComponent,
26093
+ MarkdownParserComponent,
26094
+ ImageOverlayPreviewComponent,
25847
26095
  ],
25848
26096
  exports: [
25849
26097
  MetadataInfoComponent,
@@ -25863,148 +26111,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25863
26111
  AvatarComponent,
25864
26112
  UserPreviewComponent,
25865
26113
  PaginationButtonsComponent,
26114
+ MaxLinesComponent,
25866
26115
  RecordApiFormComponent,
26116
+ MarkdownParserComponent,
26117
+ ImageOverlayPreviewComponent,
25867
26118
  ],
25868
26119
  }]
25869
26120
  }] });
25870
26121
 
25871
- class RecordTableComponent {
25872
- constructor() {
25873
- this.selectedRecords = [];
25874
- this.records = [];
25875
- this.recordClick = new EventEmitter();
25876
- this.recordsSelect = new EventEmitter();
25877
- this.recordsDeselect = new EventEmitter();
25878
- this.sortByChange = new EventEmitter();
25879
- }
25880
- dateToString(date) {
25881
- return date?.toLocaleDateString(undefined, {
25882
- year: 'numeric',
25883
- month: 'long',
25884
- day: 'numeric',
25885
- timeZone: 'UTC',
25886
- });
25887
- }
25888
- getStatus(isPublishedToAll) {
25889
- return isPublishedToAll ? 'published' : 'not published';
25890
- }
25891
- formatUserInfo(userInfo) {
25892
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
25893
- if (infos && infos.length === 4) {
25894
- return `${infos[2]} ${infos[1]}`;
25895
- }
25896
- return undefined;
25897
- }
25898
- getRecordFormats(record) {
25899
- if (record.kind === 'service' || !('distributions' in record)) {
25900
- return [];
25901
- }
25902
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
25903
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
25904
- return formats;
25905
- }
25906
- getBadgeColor(format) {
25907
- return getBadgeColor(format);
25908
- }
25909
- getOrderForColumn(col) {
25910
- if (!this.sortBy) {
25911
- return null;
25912
- }
25913
- let order = null;
25914
- const sortedArray = Array.isArray(this.sortBy[0])
25915
- ? this.sortBy
25916
- : [this.sortBy];
25917
- sortedArray.forEach((sortedCol) => {
25918
- if (sortedCol[1] === col) {
25919
- order = sortedCol[0];
25920
- }
25921
- });
25922
- return order;
25923
- }
25924
- setSortBy(col) {
25925
- const sortOrder = this.getOrderForColumn(col);
25926
- let newOrder;
25927
- if (sortOrder) {
25928
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
25929
- }
25930
- else {
25931
- newOrder = 'asc';
25932
- }
25933
- this.sortByChange.emit([newOrder, col]);
25934
- this.sortBy = [newOrder, col];
25935
- }
25936
- isSortedBy(col, order) {
25937
- const sortOrder = this.getOrderForColumn(col);
25938
- return sortOrder === order;
25939
- }
25940
- isChecked(record) {
25941
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
25942
- return true;
25943
- }
25944
- return false;
25945
- }
25946
- handleRecordSelectedChange(selected, record) {
25947
- if (!selected) {
25948
- this.recordsDeselect.emit([record]);
25949
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
25950
- }
25951
- else {
25952
- this.recordsSelect.emit([record]);
25953
- this.selectedRecords.push(record.uniqueIdentifier);
25954
- }
25955
- }
25956
- selectAll() {
25957
- if (this.isAllSelected()) {
25958
- this.recordsDeselect.emit(this.records);
25959
- this.selectedRecords = [];
25960
- }
25961
- else {
25962
- this.recordsSelect.emit(this.records);
25963
- this.selectedRecords = this.records.map((record) => {
25964
- return record.uniqueIdentifier;
25965
- });
25966
- }
25967
- }
25968
- isAllSelected() {
25969
- if (this.selectedRecords.length === this.records.length) {
25970
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
25971
- if (allRecords.length === this.records.length) {
25972
- return true;
25973
- }
25974
- }
25975
- return false;
25976
- }
25977
- isSomeSelected() {
25978
- if (this.selectedRecords.length > 0 &&
25979
- this.selectedRecords.length < this.records.length) {
25980
- return true;
25981
- }
25982
- return false;
25983
- }
25984
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25985
- 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"] }] }); }
25986
- }
25987
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
25988
- type: Component,
25989
- 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"] }]
25990
- }], propDecorators: { selectedRecords: [{
25991
- type: Input
25992
- }], records: [{
25993
- type: Input
25994
- }], totalHits: [{
25995
- type: Input
25996
- }], sortBy: [{
25997
- type: Input
25998
- }], recordClick: [{
25999
- type: Output
26000
- }], recordsSelect: [{
26001
- type: Output
26002
- }], recordsDeselect: [{
26003
- type: Output
26004
- }], sortByChange: [{
26005
- type: Output
26006
- }] } });
26007
-
26008
26122
  class UiSearchModule {
26009
26123
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26010
26124
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26017,8 +26131,7 @@ class UiSearchModule {
26017
26131
  ResultsHitsNumberComponent,
26018
26132
  ResultsListItemComponent,
26019
26133
  RecordPreviewFeedComponent,
26020
- RecordPreviewRowComponent,
26021
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26134
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26022
26135
  FacetsModule$1,
26023
26136
  FormsModule,
26024
26137
  ReactiveFormsModule,
@@ -26029,7 +26142,8 @@ class UiSearchModule {
26029
26142
  UiElementsModule,
26030
26143
  MatIconModule,
26031
26144
  MatCheckboxModule,
26032
- RouterLink], exports: [RecordPreviewListComponent,
26145
+ RouterLink,
26146
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26033
26147
  RecordPreviewCardComponent,
26034
26148
  RecordPreviewTextComponent,
26035
26149
  RecordPreviewTitleComponent,
@@ -26039,8 +26153,7 @@ class UiSearchModule {
26039
26153
  RecordPreviewComponent,
26040
26154
  ResultsHitsNumberComponent,
26041
26155
  RecordPreviewFeedComponent,
26042
- RecordPreviewRowComponent,
26043
- RecordTableComponent] }); }
26156
+ RecordPreviewRowComponent] }); }
26044
26157
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26045
26158
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26046
26159
  ], imports: [CommonModule,
@@ -26055,7 +26168,8 @@ class UiSearchModule {
26055
26168
  UiInputsModule,
26056
26169
  UiElementsModule,
26057
26170
  MatIconModule,
26058
- MatCheckboxModule, FacetsModule$1] }); }
26171
+ MatCheckboxModule,
26172
+ InteractiveTableComponent, FacetsModule$1] }); }
26059
26173
  }
26060
26174
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26061
26175
  type: NgModule,
@@ -26072,7 +26186,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26072
26186
  ResultsListItemComponent,
26073
26187
  RecordPreviewFeedComponent,
26074
26188
  RecordPreviewRowComponent,
26075
- RecordTableComponent,
26076
26189
  ],
26077
26190
  imports: [
26078
26191
  CommonModule,
@@ -26089,6 +26202,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26089
26202
  MatIconModule,
26090
26203
  MatCheckboxModule,
26091
26204
  RouterLink,
26205
+ InteractiveTableComponent,
26092
26206
  ],
26093
26207
  exports: [
26094
26208
  RecordPreviewListComponent,
@@ -26102,7 +26216,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26102
26216
  ResultsHitsNumberComponent,
26103
26217
  RecordPreviewFeedComponent,
26104
26218
  RecordPreviewRowComponent,
26105
- RecordTableComponent,
26106
26219
  ],
26107
26220
  providers: [
26108
26221
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26661,6 +26774,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26661
26774
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26662
26775
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26663
26776
 
26777
+ // this geometry will be used to filter & boost results accordingly
26778
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26779
+
26664
26780
  class SearchFacade {
26665
26781
  constructor(store, filterGeometry) {
26666
26782
  this.store = store;
@@ -26765,6 +26881,7 @@ class SearchFacade {
26765
26881
  this.store.dispatch(new SetFilters({}, this.searchId));
26766
26882
  this.store.dispatch(new SetSortBy([], this.searchId));
26767
26883
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
26884
+ return this;
26768
26885
  }
26769
26886
  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 }); }
26770
26887
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27149,8 +27266,11 @@ class FuzzySearchComponent {
27149
27266
  this.searchService.updateFilters({ any });
27150
27267
  }
27151
27268
  }
27152
- handleInputCleared() {
27153
- this.searchService.updateFilters({ any: '' });
27269
+ async handleInputCleared() {
27270
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27271
+ if (currentSearchFilters.any) {
27272
+ this.searchService.updateFilters({ any: '' });
27273
+ }
27154
27274
  }
27155
27275
  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 }); }
27156
27276
  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 }); }
@@ -27230,6 +27350,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27230
27350
  args: [RESULTS_LAYOUT_CONFIG]
27231
27351
  }] }]; } });
27232
27352
 
27353
+ // expects the replacement key ${uuid}
27354
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27355
+
27233
27356
  class FavoriteStarComponent {
27234
27357
  set record(value) {
27235
27358
  this.record_ = value;
@@ -27250,6 +27373,7 @@ class FavoriteStarComponent {
27250
27373
  this.changeDetector = changeDetector;
27251
27374
  this.authService = authService;
27252
27375
  this.translateService = translateService;
27376
+ this.displayCount = true;
27253
27377
  this.isFavorite$ = this.favoritesService.myFavoritesUuid$.pipe(map$1((favorites) => favorites.indexOf(this.record.uniqueIdentifier) > -1));
27254
27378
  this.isAnonymous$ = this.platformService.isAnonymous();
27255
27379
  this.loading = false;
@@ -27312,12 +27436,14 @@ class FavoriteStarComponent {
27312
27436
  });
27313
27437
  }
27314
27438
  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 }); }
27315
- 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 }); }
27439
+ 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 }); }
27316
27440
  }
27317
27441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27318
27442
  type: Component,
27319
- 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" }]
27320
- }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { record: [{
27443
+ 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" }]
27444
+ }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27445
+ type: Input
27446
+ }], record: [{
27321
27447
  type: Input
27322
27448
  }], starToggleRef: [{
27323
27449
  type: ViewChild,
@@ -27360,7 +27486,7 @@ class ResultsListContainerComponent {
27360
27486
  return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
27361
27487
  }
27362
27488
  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 }); }
27363
- 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" }] }); }
27489
+ 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" }] }); }
27364
27490
  }
27365
27491
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
27366
27492
  type: Component,
@@ -27488,9 +27614,11 @@ class SearchEffects {
27488
27614
  // I could not get this to work (maybe a bug in rxjs?)
27489
27615
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27490
27616
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27491
- return of([state, favorites, null]);
27617
+ return of([state, favorites, undefined]);
27492
27618
  }
27493
27619
  return this.filterGeometry$.pipe(tap$2((geom) => {
27620
+ if (!geom)
27621
+ return;
27494
27622
  try {
27495
27623
  const trace = valid$1(geom, true);
27496
27624
  if (trace?.length > 0) {
@@ -27502,7 +27630,7 @@ class SearchEffects {
27502
27630
  throw new Error();
27503
27631
  }
27504
27632
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27505
- return of([state, favorites, null]);
27633
+ return of([state, favorites, undefined]);
27506
27634
  }));
27507
27635
  }), switchMap$1(([state, favorites, geometry]) => {
27508
27636
  const { currentPage, pageSize, sort } = state.params;
@@ -27939,10 +28067,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27939
28067
  type: Input
27940
28068
  }] } });
27941
28069
 
27942
- // this geometry will be used to filter & boost results accordingly
27943
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
27944
- // expects the replacement key ${uuid}
27945
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27946
28070
  class FeatureSearchModule {
27947
28071
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27948
28072
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28041,6 +28165,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28041
28165
  }]
28042
28166
  }] });
28043
28167
 
28168
+ class ResultsTableComponent {
28169
+ constructor(searchFacade, searchService, selectionService) {
28170
+ this.searchFacade = searchFacade;
28171
+ this.searchService = searchService;
28172
+ this.selectionService = selectionService;
28173
+ this.recordClick = new EventEmitter();
28174
+ this.records$ = this.searchFacade.results$;
28175
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28176
+ }
28177
+ dateToString(date) {
28178
+ return date?.toLocaleDateString(undefined, {
28179
+ year: 'numeric',
28180
+ month: 'long',
28181
+ day: 'numeric',
28182
+ timeZone: 'UTC',
28183
+ });
28184
+ }
28185
+ getStatus(isPublishedToAll) {
28186
+ return isPublishedToAll ? 'published' : 'not published';
28187
+ }
28188
+ getRecordFormats(record) {
28189
+ if (record.kind === 'service' || !('distributions' in record)) {
28190
+ return [];
28191
+ }
28192
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28193
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28194
+ return formats;
28195
+ }
28196
+ formatUserInfo(userInfo) {
28197
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28198
+ if (infos && infos.length === 4) {
28199
+ return `${infos[2]} ${infos[1]}`;
28200
+ }
28201
+ return undefined;
28202
+ }
28203
+ getBadgeColor(format) {
28204
+ return getBadgeColor(format);
28205
+ }
28206
+ handleRecordClick(item) {
28207
+ this.recordClick.emit(item);
28208
+ }
28209
+ setSortBy(col, order) {
28210
+ this.searchService.setSortBy([order, col]);
28211
+ }
28212
+ isSortedBy(col) {
28213
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28214
+ const sortArray = Array.isArray(sortOrder[0])
28215
+ ? sortOrder
28216
+ : [sortOrder];
28217
+ for (const sort of sortArray) {
28218
+ if (sort[1] === col) {
28219
+ return sort[0];
28220
+ }
28221
+ }
28222
+ return null;
28223
+ }));
28224
+ }
28225
+ isChecked(record) {
28226
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28227
+ return selectedRecords.includes(record.uniqueIdentifier);
28228
+ }));
28229
+ }
28230
+ handleRecordSelectedChange(selected, record) {
28231
+ if (!selected) {
28232
+ this.selectionService.deselectRecords([record]);
28233
+ }
28234
+ else {
28235
+ this.selectionService.selectRecords([record]);
28236
+ }
28237
+ }
28238
+ async toggleSelectAll() {
28239
+ const records = await firstValueFrom(this.records$);
28240
+ if (await firstValueFrom(this.isAllSelected())) {
28241
+ this.selectionService.deselectRecords(records);
28242
+ }
28243
+ else {
28244
+ this.selectionService.selectRecords(records);
28245
+ }
28246
+ }
28247
+ isAllSelected() {
28248
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28249
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28250
+ }));
28251
+ }
28252
+ isSomeSelected() {
28253
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28254
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28255
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28256
+ return !allSelected && someSelected;
28257
+ }));
28258
+ }
28259
+ 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 }); }
28260
+ 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"] }] }); }
28261
+ }
28262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28263
+ type: Component,
28264
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28265
+ CommonModule,
28266
+ UiInputsModule,
28267
+ InteractiveTableComponent,
28268
+ InteractiveTableColumnComponent,
28269
+ MatIconModule,
28270
+ TranslateModule,
28271
+ ], 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" }]
28272
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28273
+ type: Output
28274
+ }] } });
28275
+
28044
28276
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28045
28277
  get mapLinks() {
28046
28278
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28075,7 +28307,7 @@ class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28075
28307
  return getLinkLabel(link);
28076
28308
  }
28077
28309
  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 }); }
28078
- 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 }); }
28310
+ 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 }); }
28079
28311
  }
28080
28312
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerRecordPreviewComponent, decorators: [{
28081
28313
  type: Component,
@@ -28119,6 +28351,208 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28119
28351
  ], 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"] }]
28120
28352
  }], ctorParameters: function () { return [{ type: SearchFacade }]; } });
28121
28353
 
28354
+ class AddLayerFromWmsComponent {
28355
+ constructor(mapFacade, changeDetectorRef) {
28356
+ this.mapFacade = mapFacade;
28357
+ this.changeDetectorRef = changeDetectorRef;
28358
+ this.wmsUrl = '';
28359
+ this.loading = false;
28360
+ this.layers = [];
28361
+ this.wmsEndpoint = null;
28362
+ this.urlChange = new Subject();
28363
+ this.errorMessage = null;
28364
+ }
28365
+ ngOnInit() {
28366
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => this.loadLayers());
28367
+ }
28368
+ async loadLayers() {
28369
+ this.errorMessage = null;
28370
+ try {
28371
+ this.loading = true;
28372
+ if (this.wmsUrl.trim() === '') {
28373
+ this.layers = [];
28374
+ return;
28375
+ }
28376
+ this.wmsEndpoint = await new WmsEndpoint(this.wmsUrl).isReady();
28377
+ this.layers = this.wmsEndpoint.getLayers();
28378
+ }
28379
+ catch (error) {
28380
+ const err = error;
28381
+ this.layers = [];
28382
+ this.errorMessage = 'Error loading layers: ' + err.message;
28383
+ }
28384
+ finally {
28385
+ this.loading = false;
28386
+ this.changeDetectorRef.markForCheck();
28387
+ }
28388
+ }
28389
+ addLayer(layer) {
28390
+ const layerToAdd = {
28391
+ name: layer.name,
28392
+ url: this.wmsUrl.toString(),
28393
+ type: MapContextLayerTypeEnum.WMS,
28394
+ };
28395
+ this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
28396
+ }
28397
+ 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 }); }
28398
+ 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" }] }); }
28399
+ }
28400
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, decorators: [{
28401
+ type: Component,
28402
+ 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" }]
28403
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28404
+
28405
+ const INVALID_FILE_FORMAT_ERROR_MESSAGE = 'Invalid file format';
28406
+ class AddLayerFromFileComponent {
28407
+ constructor(mapFacade, changeDetectorRef) {
28408
+ this.mapFacade = mapFacade;
28409
+ this.changeDetectorRef = changeDetectorRef;
28410
+ this.errorMessage = null;
28411
+ this.successMessage = null;
28412
+ this.loading = false;
28413
+ this.acceptedMimeType = ['.geojson'];
28414
+ this.maxFileSize = 5000000;
28415
+ }
28416
+ async handleFileChange(file) {
28417
+ if (!file) {
28418
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28419
+ return;
28420
+ }
28421
+ if (file.size > this.maxFileSize) {
28422
+ this.displayMessage('File size exceeds the limit of 5MB', 'error');
28423
+ return;
28424
+ }
28425
+ await this.addLayer(file);
28426
+ }
28427
+ async addLayer(file) {
28428
+ this.errorMessage = null;
28429
+ this.loading = true;
28430
+ try {
28431
+ if (!this.isFileFormatValid(file)) {
28432
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28433
+ return;
28434
+ }
28435
+ const fileExtension = this.getFileExtension(file);
28436
+ switch (fileExtension) {
28437
+ case 'geojson':
28438
+ await this.addGeoJsonLayer(file);
28439
+ break;
28440
+ default:
28441
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28442
+ break;
28443
+ }
28444
+ }
28445
+ catch (error) {
28446
+ const err = error;
28447
+ this.displayMessage('Error loading file: ' + err.message, 'error');
28448
+ }
28449
+ finally {
28450
+ this.loading = false;
28451
+ }
28452
+ }
28453
+ addGeoJsonLayer(file) {
28454
+ return new Promise((resolve, reject) => {
28455
+ try {
28456
+ const reader = new FileReader();
28457
+ reader.onload = () => {
28458
+ const result = reader.result;
28459
+ const title = file.name.split('.').slice(0, -1).join('.');
28460
+ const layerToAdd = {
28461
+ type: 'geojson',
28462
+ data: result,
28463
+ };
28464
+ this.mapFacade.addLayer({ ...layerToAdd, title: title });
28465
+ this.displayMessage('File successfully added to map', 'success');
28466
+ resolve();
28467
+ };
28468
+ reader.onerror = reject;
28469
+ reader.readAsText(file);
28470
+ }
28471
+ catch (error) {
28472
+ reject(error);
28473
+ }
28474
+ });
28475
+ }
28476
+ isFileFormatValid(file) {
28477
+ const fileExtension = this.getFileExtension(file);
28478
+ return this.acceptedMimeType.includes(`.${fileExtension}`);
28479
+ }
28480
+ getFileExtension(file) {
28481
+ return file.name.split('.').pop();
28482
+ }
28483
+ displayMessage(message, type) {
28484
+ if (type === 'success') {
28485
+ this.successMessage = message;
28486
+ }
28487
+ else if (type === 'error') {
28488
+ this.errorMessage = message;
28489
+ }
28490
+ setTimeout(() => {
28491
+ this.successMessage = null;
28492
+ this.errorMessage = null;
28493
+ this.changeDetectorRef.detectChanges();
28494
+ }, 5000);
28495
+ }
28496
+ 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 }); }
28497
+ 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" }] }); }
28498
+ }
28499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, decorators: [{
28500
+ type: Component,
28501
+ 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" }]
28502
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28503
+
28504
+ class AddLayerFromWfsComponent {
28505
+ constructor(mapFacade, changeDetectorRef) {
28506
+ this.mapFacade = mapFacade;
28507
+ this.changeDetectorRef = changeDetectorRef;
28508
+ this.wfsUrl = '';
28509
+ this.loading = false;
28510
+ this.layers = [];
28511
+ this.wfsEndpoint = null;
28512
+ this.urlChange = new Subject();
28513
+ this.errorMessage = null;
28514
+ }
28515
+ ngOnInit() {
28516
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => this.loadLayers());
28517
+ }
28518
+ async loadLayers() {
28519
+ this.errorMessage = null;
28520
+ try {
28521
+ this.loading = true;
28522
+ if (this.wfsUrl.trim() === '') {
28523
+ this.layers = [];
28524
+ return;
28525
+ }
28526
+ this.wfsEndpoint = await new WfsEndpoint(this.wfsUrl).isReady();
28527
+ this.layers = this.wfsEndpoint.getFeatureTypes();
28528
+ console.log(this.layers);
28529
+ }
28530
+ catch (error) {
28531
+ const err = error;
28532
+ this.layers = [];
28533
+ this.errorMessage = 'Error loading layers: ' + err.message;
28534
+ }
28535
+ finally {
28536
+ this.loading = false;
28537
+ this.changeDetectorRef.markForCheck();
28538
+ }
28539
+ }
28540
+ addLayer(layer) {
28541
+ const layerToAdd = {
28542
+ name: layer.name,
28543
+ url: this.wfsUrl.toString(),
28544
+ type: MapContextLayerTypeEnum.WFS,
28545
+ };
28546
+ this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
28547
+ }
28548
+ 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 }); }
28549
+ 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" }] }); }
28550
+ }
28551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
28552
+ type: Component,
28553
+ 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" }]
28554
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28555
+
28122
28556
  class LayersPanelComponent {
28123
28557
  constructor(mapFacade) {
28124
28558
  this.mapFacade = mapFacade;
@@ -28128,11 +28562,11 @@ class LayersPanelComponent {
28128
28562
  this.mapFacade.removeLayer(index);
28129
28563
  }
28130
28564
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
28131
- 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 }); }
28565
+ 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 }); }
28132
28566
  }
28133
28567
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
28134
28568
  type: Component,
28135
- 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" }]
28569
+ 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" }]
28136
28570
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28137
28571
 
28138
28572
  class MapEffects {
@@ -28165,6 +28599,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28165
28599
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28166
28600
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28167
28601
 
28602
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28603
+ class GeocodingService {
28604
+ constructor(provider) {
28605
+ this.provider = provider;
28606
+ }
28607
+ query(text) {
28608
+ let queryObservable;
28609
+ switch (this.provider[0]) {
28610
+ case 'geoadmin':
28611
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28612
+ break;
28613
+ case 'geonames':
28614
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28615
+ break;
28616
+ case 'data-gouv-fr':
28617
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28618
+ break;
28619
+ default:
28620
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28621
+ }
28622
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28623
+ }
28624
+ 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 }); }
28625
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28626
+ }
28627
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28628
+ type: Injectable,
28629
+ args: [{
28630
+ providedIn: 'root',
28631
+ }]
28632
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28633
+ type: Inject,
28634
+ args: [GEOCODING_PROVIDER]
28635
+ }] }]; } });
28636
+
28637
+ class GeocodingComponent {
28638
+ constructor(mapManager, geocodingService) {
28639
+ this.mapManager = mapManager;
28640
+ this.geocodingService = geocodingService;
28641
+ this.searchText = '';
28642
+ this.results = [];
28643
+ this.searchTextChanged = new Subject();
28644
+ this.destroy$ = new Subject();
28645
+ this.errorMessage = null;
28646
+ this.searchTextChanged
28647
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28648
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28649
+ this.errorMessage =
28650
+ 'An error occurred while searching. Please try again.';
28651
+ console.error(error);
28652
+ return [];
28653
+ }));
28654
+ }), takeUntil(this.destroy$))
28655
+ .subscribe((results) => {
28656
+ this.results = results;
28657
+ });
28658
+ }
28659
+ ngOnDestroy() {
28660
+ this.destroy$.next();
28661
+ this.destroy$.complete();
28662
+ }
28663
+ onSearchChange(searchText) {
28664
+ if (!searchText) {
28665
+ this.clearSearch();
28666
+ return;
28667
+ }
28668
+ else {
28669
+ this.searchTextChanged.next(searchText);
28670
+ }
28671
+ }
28672
+ clearSearch() {
28673
+ this.searchText = '';
28674
+ this.results = [];
28675
+ this.errorMessage = null;
28676
+ }
28677
+ zoomToLocation(result) {
28678
+ const map = this.mapManager.map;
28679
+ const view = map.getView();
28680
+ const geometry = result.geom;
28681
+ if (geometry.type === 'Point') {
28682
+ this.zoomToPoint(geometry.coordinates, view);
28683
+ }
28684
+ else if (geometry.type === 'Polygon') {
28685
+ this.zoomToPolygon(geometry.coordinates, view);
28686
+ }
28687
+ else {
28688
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28689
+ }
28690
+ }
28691
+ zoomToPoint(pointCoords, view) {
28692
+ const transformedCoords = fromLonLat(pointCoords);
28693
+ view.setCenter(transformedCoords);
28694
+ view.setZoom(12);
28695
+ }
28696
+ zoomToPolygon(polygonCoords, view) {
28697
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28698
+ const polygon = new Polygon([transformedCoords]);
28699
+ view.fit(polygon, {
28700
+ duration: 100,
28701
+ maxZoom: 12,
28702
+ });
28703
+ }
28704
+ onEnterPress() {
28705
+ if (this.results && this.results.length > 0) {
28706
+ this.zoomToLocation(this.results[0]);
28707
+ }
28708
+ }
28709
+ 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 }); }
28710
+ 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" }] }); }
28711
+ }
28712
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28713
+ type: Component,
28714
+ 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" }]
28715
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28716
+
28168
28717
  class FeatureMapModule {
28169
28718
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28170
28719
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28172,7 +28721,11 @@ class FeatureMapModule {
28172
28721
  LayersPanelComponent,
28173
28722
  AddLayerFromCatalogComponent,
28174
28723
  MapContainerComponent,
28175
- AddLayerRecordPreviewComponent], imports: [CommonModule,
28724
+ AddLayerRecordPreviewComponent,
28725
+ AddLayerFromWmsComponent,
28726
+ AddLayerFromFileComponent,
28727
+ AddLayerFromWfsComponent,
28728
+ GeocodingComponent], imports: [CommonModule,
28176
28729
  UiMapModule,
28177
28730
  UiLayoutModule,
28178
28731
  MatIconModule,
@@ -28183,13 +28736,18 @@ class FeatureMapModule {
28183
28736
  MapInstanceDirective,
28184
28737
  LayersPanelComponent,
28185
28738
  AddLayerFromCatalogComponent,
28186
- MapContainerComponent] }); }
28739
+ MapContainerComponent,
28740
+ GeocodingComponent] }); }
28187
28741
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28188
28742
  {
28189
28743
  provide: FEATURE_MAP_OPTIONS,
28190
28744
  useValue: defaultMapOptions,
28191
28745
  },
28192
28746
  MapFacade,
28747
+ {
28748
+ provide: GEOCODING_PROVIDER,
28749
+ useValue: ['geonames', { maxRows: 5 }],
28750
+ },
28193
28751
  ], imports: [CommonModule,
28194
28752
  UiMapModule,
28195
28753
  UiLayoutModule,
@@ -28212,6 +28770,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28212
28770
  AddLayerFromCatalogComponent,
28213
28771
  MapContainerComponent,
28214
28772
  AddLayerRecordPreviewComponent,
28773
+ AddLayerFromWmsComponent,
28774
+ AddLayerFromFileComponent,
28775
+ AddLayerFromWfsComponent,
28776
+ GeocodingComponent,
28215
28777
  ],
28216
28778
  exports: [
28217
28779
  MapContextComponent,
@@ -28219,6 +28781,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28219
28781
  LayersPanelComponent,
28220
28782
  AddLayerFromCatalogComponent,
28221
28783
  MapContainerComponent,
28784
+ GeocodingComponent,
28222
28785
  ],
28223
28786
  imports: [
28224
28787
  CommonModule,
@@ -28239,6 +28802,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28239
28802
  useValue: defaultMapOptions,
28240
28803
  },
28241
28804
  MapFacade,
28805
+ {
28806
+ provide: GEOCODING_PROVIDER,
28807
+ useValue: ['geonames', { maxRows: 5 }],
28808
+ },
28242
28809
  ],
28243
28810
  }]
28244
28811
  }] });
@@ -28333,7 +28900,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28333
28900
  ...state,
28334
28901
  chartConfig,
28335
28902
  })), on(close, (state) => {
28336
- // eslint-disable-next-line
28903
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28337
28904
  const { metadata, related, ...stateWithoutMd } = state;
28338
28905
  return stateWithoutMd;
28339
28906
  }));
@@ -29600,15 +30167,16 @@ class DataService {
29600
30167
  // Pour DL toutes les données
29601
30168
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
29602
30169
  ...wfsLink,
30170
+ type: 'download',
29603
30171
  url: new URL(urls[format]),
29604
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30172
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29605
30173
  }))));
29606
30174
  }
29607
30175
  getDownloadLinksFromEsriRest(esriRestLink) {
29608
30176
  return ['json', 'geojson'].map((format) => ({
29609
30177
  ...esriRestLink,
29610
30178
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
29611
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30179
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29612
30180
  }));
29613
30181
  }
29614
30182
  readAsGeoJson(link) {
@@ -30002,12 +30570,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30002
30570
  }] } });
30003
30571
 
30004
30572
  class MapViewComponent {
30005
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30573
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30006
30574
  this.mdViewFacade = mdViewFacade;
30007
30575
  this.mapManager = mapManager;
30008
30576
  this.mapUtils = mapUtils;
30009
30577
  this.dataService = dataService;
30010
- this.proxy = proxy;
30011
30578
  this.featureInfo = featureInfo;
30012
30579
  this.changeRef = changeRef;
30013
30580
  this.styleService = styleService;
@@ -30042,7 +30609,7 @@ class MapViewComponent {
30042
30609
  return of([]);
30043
30610
  }), finalize(() => (this.loading = false)));
30044
30611
  }));
30045
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30612
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30046
30613
  console.warn(error); // FIXME: report this to the user somehow
30047
30614
  return of(undefined);
30048
30615
  }), map$1((extent) => ({
@@ -30050,7 +30617,18 @@ class MapViewComponent {
30050
30617
  view: {
30051
30618
  extent,
30052
30619
  },
30053
- })), tap$1(() => this.resetSelection()))));
30620
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30621
+ if (context.view.extent)
30622
+ return context;
30623
+ const extent = this.mapUtils.getRecordExtent(metadata);
30624
+ return {
30625
+ ...context,
30626
+ view: {
30627
+ ...context.view,
30628
+ extent,
30629
+ },
30630
+ };
30631
+ }));
30054
30632
  }
30055
30633
  ngOnDestroy() {
30056
30634
  this.subscription.unsubscribe();
@@ -30103,13 +30681,13 @@ class MapViewComponent {
30103
30681
  selectLinkToDisplay(link) {
30104
30682
  this.selectedLinkIndex$.next(link);
30105
30683
  }
30106
- 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 }); }
30684
+ 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 }); }
30107
30685
  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 }); }
30108
30686
  }
30109
30687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30110
30688
  type: Component,
30111
30689
  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" }]
30112
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30690
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30113
30691
 
30114
30692
  class DataViewComponent {
30115
30693
  constructor(mdViewFacade) {
@@ -30192,7 +30770,7 @@ class OrganisationPreviewComponent {
30192
30770
  this.clickedOrganisation.emit(this.organisation);
30193
30771
  }
30194
30772
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30195
- 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 }); }
30773
+ 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 }); }
30196
30774
  }
30197
30775
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, decorators: [{
30198
30776
  type: Component,
@@ -30261,7 +30839,7 @@ class LanguageSwitcherComponent {
30261
30839
  ngOnInit() {
30262
30840
  const languages = this.languagePlaceholder || DEFAULT_LANGUAGES;
30263
30841
  this.languageList = languages.map((language) => ({
30264
- label: `language.${language}`,
30842
+ label: `${language}`.toUpperCase(),
30265
30843
  value: language,
30266
30844
  }));
30267
30845
  }
@@ -30276,11 +30854,11 @@ class LanguageSwitcherComponent {
30276
30854
  this.translate.use(value);
30277
30855
  }
30278
30856
  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 }); }
30279
- 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"] }] }); }
30857
+ 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"] }] }); }
30280
30858
  }
30281
30859
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30282
30860
  type: Component,
30283
- 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" }]
30861
+ 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" }]
30284
30862
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30285
30863
  type: Optional
30286
30864
  }, {
@@ -30422,20 +31000,8 @@ class OrganisationsComponent {
30422
31000
  filterOrganisations(organisations, filterBy) {
30423
31001
  if (!filterBy)
30424
31002
  return organisations;
30425
- const filterRegex = new RegExp(this.normalizeString(filterBy) //ignore accents and case
30426
- .replace(/[^a-z0-9\s]/g, ' ') //ignore special characters (also without spaces like l')
30427
- .replace(/\s(?=.)/g, '.*') //replace whitespaces by "AND" separator
30428
- .replace(/\s/g, ''), //remove potential whitespaces left
30429
- 'i');
30430
- return [...organisations].filter((org) => {
30431
- return this.normalizeString(org.name).match(filterRegex);
30432
- });
30433
- }
30434
- normalizeString(str) {
30435
- return str
30436
- .normalize('NFD')
30437
- .replace(/[\u0300-\u036f]/g, '')
30438
- .toLowerCase();
31003
+ const filter = createFuzzyFilter(filterBy);
31004
+ return organisations.filter((org) => filter(org.name));
30439
31005
  }
30440
31006
  sortOrganisations(organisations, sortBy) {
30441
31007
  let order;
@@ -30573,13 +31139,6 @@ class MyOrgService {
30573
31139
  constructor(platformService, orgService) {
30574
31140
  this.platformService = platformService;
30575
31141
  this.orgService = orgService;
30576
- this.myOrgDataSubject = new BehaviorSubject({
30577
- orgName: '',
30578
- logoUrl: '',
30579
- recordCount: 0,
30580
- userCount: 0,
30581
- userList: [],
30582
- });
30583
31142
  this.myOrgData$ = combineLatest([
30584
31143
  this.platformService.getMe(),
30585
31144
  this.platformService.getUsers(),
@@ -30598,7 +31157,7 @@ class MyOrgService {
30598
31157
  userList,
30599
31158
  userCount,
30600
31159
  };
30601
- }));
31160
+ }), shareReplay(1));
30602
31161
  }
30603
31162
  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 }); }
30604
31163
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31291,11 +31850,11 @@ class RecordFormComponent {
31291
31850
  return field.config.model;
31292
31851
  }
31293
31852
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31294
- 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 }); }
31853
+ 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 }); }
31295
31854
  }
31296
31855
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31297
31856
  type: Component,
31298
- 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" }]
31857
+ 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" }]
31299
31858
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31300
31859
 
31301
31860
  const ROUTER_STATE_KEY = 'router';
@@ -31663,5 +32222,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31663
32222
  * Generated bundle index. Do not edit.
31664
32223
  */
31665
32224
 
31666
- 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 };
32225
+ 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 };
31667
32226
  //# sourceMappingURL=geonetwork-ui.mjs.map