geonetwork-ui 2.2.0-dev.55bb5e18 → 2.2.0-dev.6695ae4d

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 (313) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +77 -52
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +5 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +16 -11
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -16
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +21 -18
  7. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  9. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  10. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  12. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  14. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  15. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  16. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  17. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  18. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  19. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +1 -1
  20. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +106 -0
  21. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +64 -0
  22. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  23. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  24. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +23 -3
  25. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  26. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  27. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +5 -3
  28. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +3 -1
  29. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  30. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  31. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  32. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  33. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  34. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +1 -1
  35. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  36. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  37. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  38. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  39. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  40. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  41. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  42. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  43. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  44. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +1 -1
  45. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  46. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  47. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +27 -0
  48. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  49. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  50. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +38 -17
  51. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  52. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +3 -3
  53. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +7 -3
  54. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -3
  55. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  56. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  57. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  58. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  59. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  60. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  61. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +8 -3
  62. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  63. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  64. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  65. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  66. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  67. package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +1 -1
  68. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +1 -1
  69. package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +1 -1
  70. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +1 -1
  71. package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +1 -1
  72. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  73. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  74. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  75. package/esm2022/translations/de.json +105 -96
  76. package/esm2022/translations/en.json +33 -24
  77. package/esm2022/translations/es.json +13 -4
  78. package/esm2022/translations/fr.json +17 -8
  79. package/esm2022/translations/it.json +16 -7
  80. package/esm2022/translations/nl.json +13 -4
  81. package/esm2022/translations/pt.json +13 -4
  82. package/fesm2022/geonetwork-ui.mjs +1127 -731
  83. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  84. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  85. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  86. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  87. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  88. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  89. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  90. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
  91. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  92. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  93. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  94. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  95. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  96. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  97. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  98. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +15 -15
  99. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  100. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  101. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  102. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  103. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  104. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  105. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  106. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  107. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  108. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  109. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  110. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  111. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  112. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  113. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  114. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  115. package/libs/feature/map/src/index.d.ts +1 -0
  116. package/libs/feature/map/src/index.d.ts.map +1 -1
  117. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +22 -0
  118. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -0
  119. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +22 -0
  120. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -0
  121. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  122. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  123. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  124. package/libs/feature/map/src/lib/feature-map.module.d.ts +15 -12
  125. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  126. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  127. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  128. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  129. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  130. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  131. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  132. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  133. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  134. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  135. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  136. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  137. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  138. package/libs/feature/search/src/index.d.ts +3 -0
  139. package/libs/feature/search/src/index.d.ts.map +1 -1
  140. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  141. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  142. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  143. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  144. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  145. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  146. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  147. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  148. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  149. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  150. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  151. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  152. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  153. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  154. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  155. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  156. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  157. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  158. package/libs/ui/elements/src/index.d.ts +2 -0
  159. package/libs/ui/elements/src/index.d.ts.map +1 -1
  160. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  161. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +10 -0
  162. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -0
  163. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +8 -2
  164. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  165. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  166. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  167. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +3 -2
  168. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  169. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +12 -11
  170. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  171. package/libs/ui/inputs/src/index.d.ts +1 -0
  172. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  173. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  174. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  175. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  176. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  177. package/libs/ui/layout/src/index.d.ts +2 -0
  178. package/libs/ui/layout/src/index.d.ts.map +1 -1
  179. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  180. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  181. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  182. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  183. package/libs/ui/search/src/index.d.ts +0 -1
  184. package/libs/ui/search/src/index.d.ts.map +1 -1
  185. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  186. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  187. package/libs/util/i18n/src/index.d.ts +0 -1
  188. package/libs/util/i18n/src/index.d.ts.map +1 -1
  189. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  190. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  191. package/package.json +4 -1
  192. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
  193. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
  194. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
  195. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  196. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +112 -65
  197. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +4 -2
  198. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
  199. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
  200. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
  201. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  202. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  203. package/src/libs/common/domain/src/lib/index.ts +2 -0
  204. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +17 -18
  205. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  206. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  207. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  208. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  209. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  210. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  211. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  212. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  213. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  214. package/src/libs/feature/map/src/index.ts +1 -0
  215. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.css +0 -0
  216. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +21 -0
  217. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +107 -0
  218. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.css +0 -0
  219. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +37 -0
  220. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +64 -0
  221. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  222. package/src/libs/feature/map/src/lib/feature-map.module.ts +12 -0
  223. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  224. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  225. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  226. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  227. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +6 -2
  228. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +6 -0
  229. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  230. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  231. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  232. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  233. package/src/libs/feature/search/src/index.ts +3 -0
  234. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  235. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  236. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  237. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  238. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  239. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  240. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  241. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  242. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  243. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  244. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  245. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  246. package/src/libs/ui/elements/src/index.ts +2 -0
  247. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  248. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +0 -0
  249. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +30 -0
  250. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
  251. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +54 -54
  252. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +2 -2
  253. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +4 -0
  254. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +101 -25
  255. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +35 -7
  256. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  257. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  258. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  259. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +4 -0
  260. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +4 -0
  261. package/src/libs/ui/inputs/src/index.ts +1 -0
  262. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  263. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  264. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  265. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  266. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  267. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  268. package/src/libs/ui/layout/src/index.ts +2 -0
  269. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  270. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  271. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  272. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  273. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  274. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  275. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  276. package/src/libs/ui/search/src/index.ts +0 -1
  277. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  278. package/src/libs/util/i18n/src/index.ts +0 -1
  279. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  280. package/translations/de.json +105 -96
  281. package/translations/en.json +33 -24
  282. package/translations/es.json +13 -4
  283. package/translations/fr.json +17 -8
  284. package/translations/it.json +16 -7
  285. package/translations/nl.json +13 -4
  286. package/translations/pt.json +13 -4
  287. package/translations/sk.json +13 -4
  288. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  289. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  290. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  291. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  292. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  293. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  294. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  295. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  296. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  297. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  298. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  299. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  300. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  301. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  302. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  303. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  304. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  305. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  306. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  307. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  308. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  309. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  310. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  311. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  312. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  313. /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';
@@ -73,10 +73,13 @@ import { MatFormFieldModule } from '@angular/material/form-field';
73
73
  import * as i3$2 from '@angular/material/datepicker';
74
74
  import { MatDatepickerModule } from '@angular/material/datepicker';
75
75
  import { MatInputModule } from '@angular/material/input';
76
+ import * as basicLightbox from 'basiclightbox';
76
77
  import * as i1$8 from '@ngrx/effects';
77
78
  import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
78
79
  import tippy from 'tippy.js';
79
80
  import { valid as valid$1 } from 'geojson-validation';
81
+ import { Polygon } from 'ol/geom';
82
+ import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
80
83
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
81
84
  import * as i4$1 from '@angular/cdk/scrolling';
82
85
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -646,28 +649,32 @@ function extractStatus() {
646
649
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
647
650
  }
648
651
  // from gmd:resourceConstraints
649
- function extractAccessConstraints() {
650
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
651
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
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 }),
652
655
  text,
653
- type: 'other',
654
656
  })));
655
- 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 }),
656
662
  text,
657
- type: 'security',
658
663
  })));
659
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
660
664
  }
661
665
  // from gmd:resourceConstraints
662
- function extractUseLimitations() {
663
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
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
+ })));
664
671
  }
665
672
  // from gmd:resourceConstraints
666
673
  function extractLicenses() {
667
- return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(pipe(findChildElement('gmd:otherConstraints'), combine(extractCharacterString(), extractUrl()), map(([text, url]) => ({
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]) => ({
668
675
  ...(url && { url }),
669
676
  text,
670
- })))));
677
+ })));
671
678
  }
672
679
  // from gmd:MD_Distribution
673
680
  function extractDatasetDistributions() {
@@ -839,11 +846,14 @@ function readStatus(rootEl) {
839
846
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
840
847
  }
841
848
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
842
- function readAccessConstraints(rootEl) {
843
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
849
+ function readLegalConstraints(rootEl) {
850
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
844
851
  }
845
- function readUseLimitations(rootEl) {
846
- 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);
847
857
  }
848
858
  function readLicenses(rootEl) {
849
859
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
@@ -1076,23 +1086,23 @@ function appendKeywords(keywords, type) {
1076
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)))
1077
1087
  : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1078
1088
  }
1079
- function removeAccessConstraints() {
1080
- const securityConstraintsFilter = pipe(findChildrenElement('gmd:MD_SecurityConstraints'), (array) => array.length > 0);
1081
- // remove legal constraints that *only* have 'otherRestrictions'
1082
- const otherConstraintsFilter = pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code === 'otherRestrictions'));
1083
- return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray((el) => securityConstraintsFilter(el) || otherConstraintsFilter(el))));
1084
- }
1085
- function createAccessConstraint(constraint) {
1086
- if (constraint.type === 'security') {
1089
+ function createConstraint(constraint, type) {
1090
+ if (type === 'security') {
1087
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))));
1088
1092
  }
1089
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
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))));
1090
1097
  }
1091
- function removeUseLimitations() {
1098
+ function removeOtherConstraints() {
1092
1099
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1093
1100
  }
1094
- function createUseLimitation(useLimitation) {
1095
- 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')))));
1096
1106
  }
1097
1107
  function removeLicenses() {
1098
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')))));
@@ -1196,14 +1206,17 @@ function writeKeywords(record, rootEl) {
1196
1206
  function writeThemes(record, rootEl) {
1197
1207
  pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1198
1208
  }
1199
- function writeAccessConstraints(record, rootEl) {
1200
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1201
- }
1202
1209
  function writeLicenses(record, rootEl) {
1203
1210
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1204
1211
  }
1205
- function writeUseLimitations(record, rootEl) {
1206
- 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);
1207
1220
  }
1208
1221
  function writeUpdateFrequency(record, rootEl) {
1209
1222
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1301,8 +1314,9 @@ function toModel(xml) {
1301
1314
  const recordCreated = recordUpdated;
1302
1315
  const keywords = readKeywords(rootEl);
1303
1316
  const themes = readThemes(rootEl);
1304
- const accessConstraints = readAccessConstraints(rootEl);
1305
- const useLimitations = readUseLimitations(rootEl);
1317
+ const legalConstraints = readLegalConstraints(rootEl);
1318
+ const otherConstraints = readOtherConstraints(rootEl);
1319
+ const securityConstraints = readSecurityConstraints(rootEl);
1306
1320
  const licenses = readLicenses(rootEl);
1307
1321
  const overviews = readOverviews(rootEl);
1308
1322
  // not used yet
@@ -1330,9 +1344,10 @@ function toModel(xml) {
1330
1344
  contactsForResource: [],
1331
1345
  keywords,
1332
1346
  themes,
1333
- accessConstraints,
1334
- useLimitations,
1335
1347
  licenses,
1348
+ legalConstraints,
1349
+ securityConstraints,
1350
+ otherConstraints,
1336
1351
  ...(datasetCreated && { datasetCreated }),
1337
1352
  ...(datasetUpdated && { datasetUpdated }),
1338
1353
  lineage,
@@ -1357,9 +1372,10 @@ function toModel(xml) {
1357
1372
  contacts,
1358
1373
  keywords,
1359
1374
  themes,
1360
- accessConstraints,
1361
- useLimitations,
1362
1375
  licenses,
1376
+ legalConstraints,
1377
+ securityConstraints,
1378
+ otherConstraints,
1363
1379
  overviews,
1364
1380
  onlineResources,
1365
1381
  };
@@ -1385,9 +1401,11 @@ function toXml(record, originalXml) {
1385
1401
  fieldChanged('contacts') && writeContacts(record, rootEl);
1386
1402
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1387
1403
  fieldChanged('themes') && writeThemes(record, rootEl);
1388
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1404
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1405
+ fieldChanged('securityConstraints') &&
1406
+ writeSecurityConstraints(record, rootEl);
1389
1407
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1390
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1408
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1391
1409
  if (record.kind === 'dataset') {
1392
1410
  writeStatus(record, rootEl);
1393
1411
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1413,6 +1431,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1413
1431
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1414
1432
  const toDate = (field) => new Date(field);
1415
1433
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1434
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1416
1435
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1417
1436
  const getAsUrl = (field, location = window.location.toString()) => {
1418
1437
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -16539,133 +16558,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16539
16558
  }]
16540
16559
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16541
16560
 
16542
- // IMPORTANT:
16543
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/test-translate-loader.service.ts
16544
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16545
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16546
- class TestTranslateLoader extends TranslateLoader {
16547
- constructor(_translations = {}) {
16548
- super();
16549
- this._translations = _translations;
16550
- }
16551
- /**
16552
- * Returns an {Observable} of translations for the specified language. If the
16553
- * language is not recognized, an empty translations object will be returned.
16554
- *
16555
- * @param language the language for which the translations should be retrieved.
16556
- * @returns the translations for the specified
16557
- * language or an empty set of translations if the language is not recognized.
16558
- */
16559
- getTranslation(language) {
16560
- return of(this._translations[language] || {});
16561
- }
16562
- }
16563
-
16564
- // IMPORTANT:
16565
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/testing.module.ts
16566
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16567
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16568
- /**
16569
- * The TranslateTestingModule provides the {TranslateModule} as well as a
16570
- * {TranslateService} configured to return translations specific for the
16571
- * test environment.
16572
- *
16573
- * @export
16574
- */
16575
- class TranslateTestingModule {
16576
- constructor() {
16577
- this._translations = {};
16578
- }
16579
- static withTranslations(languageOrTranslations, translations) {
16580
- const translateTestingModule = new TranslateTestingModule();
16581
- if (typeof languageOrTranslations === 'string') {
16582
- return translateTestingModule.withTranslations(languageOrTranslations, translations);
16583
- }
16584
- return translateTestingModule.withTranslations(languageOrTranslations);
16585
- }
16586
- get ngModule() {
16587
- return TranslateTestingModule;
16588
- }
16589
- get providers() {
16590
- const translateService = new TranslateService(null, new TestTranslateLoader(this._translations), this._compiler || new TranslateFakeCompiler(), new TranslateDefaultParser(), new FakeMissingTranslationHandler(), true, true, false, this._defaultLanguage);
16591
- return [
16592
- {
16593
- provide: TranslateService,
16594
- useValue: translateService,
16595
- },
16596
- ];
16597
- }
16598
- withTranslations(languageOrTranslations, translations) {
16599
- if (typeof languageOrTranslations === 'string' && translations) {
16600
- this.addTranslations(languageOrTranslations, translations);
16601
- this._defaultLanguage = languageOrTranslations;
16602
- }
16603
- else if (languageOrTranslations) {
16604
- Object.keys(languageOrTranslations).forEach((language) => this.addTranslations(language, languageOrTranslations[language]));
16605
- }
16606
- return this;
16607
- }
16608
- /**
16609
- * Updates the {TranslationTestingModule} to provide a {TranslateService} that will
16610
- * use the provided {TranslateCompiler} to translate the test translations.
16611
- *
16612
- * @example
16613
- *
16614
- * TranslateTestingModule.withTranslations('en', {people: '{gender, select, male{He is} female{She is} other{They are}} {how})'})
16615
- * .withCompiler(new TranslateMessageFormatCompiler());
16616
- *
16617
- * @param compiler the compiler to use to compile the test translations.
16618
- * @returns the instance that can be used to chain additional configuration.
16619
- * @memberof TranslateTestingModule
16620
- */
16621
- withCompiler(compiler) {
16622
- this._compiler = compiler;
16623
- return this;
16624
- }
16625
- /**
16626
- * Updates the {TranslateTestingModule} to use the provided language as the default language.
16627
- * By default, the default language will be set to the first language provided.
16628
- *
16629
- * @example
16630
- *
16631
- * TranslateTestingModule.withTranslations('es', SPANISH_TRANSLATIONS)
16632
- * .withTranslations('en', ENGLISH_TRANSLATIONS)
16633
- * .withDefaultLanguage('en');
16634
- *
16635
- * @param language the new default language for translations.
16636
- * @returns the instance that can be used to chain additional configuration.
16637
- * @memberof TranslateTestingModule
16638
- */
16639
- withDefaultLanguage(language) {
16640
- this._defaultLanguage = language || this._defaultLanguage;
16641
- return this;
16642
- }
16643
- addTranslations(language, translations) {
16644
- if (!this._defaultLanguage) {
16645
- this._defaultLanguage = language;
16646
- }
16647
- if (this._translations[language]) {
16648
- this._translations[language] = {
16649
- ...this._translations[language],
16650
- ...translations,
16651
- };
16652
- }
16653
- else {
16654
- this._translations[language] = translations;
16655
- }
16656
- }
16657
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16658
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule], exports: [TranslateModule] }); }
16659
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule, TranslateModule] }); }
16660
- }
16661
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, decorators: [{
16662
- type: NgModule,
16663
- args: [{
16664
- imports: [TranslateModule],
16665
- exports: [TranslateModule],
16666
- }]
16667
- }] });
16668
-
16669
16561
  var dropFile$6 = "Datei ablegen";
16670
16562
  var next$6 = "weiter";
16671
16563
  var previous$6 = "zurück";
@@ -16688,20 +16580,21 @@ var de = {
16688
16580
  "chart.type.line": "Liniendiagramm",
16689
16581
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16690
16582
  "chart.type.pie": "Kreisdiagramm",
16691
- "dashboard.labels.mySpace": "",
16692
- "dashboard.records.all": "",
16693
- "dashboard.records.myDraft": "",
16694
- "dashboard.records.myLibrary": "",
16695
- "dashboard.records.myOrg": "",
16696
- "dashboard.records.myRecords": "",
16697
- "dashboard.records.noRecord": "",
16698
- "dashboard.records.noUser": "",
16699
- "dashboard.records.publishedRecords": "",
16700
- "dashboard.records.search": "",
16701
- "dashboard.records.userDetail": "",
16702
- "dashboard.records.userEmail": "",
16703
- "dashboard.records.username": "",
16704
- "dashboard.records.users": "",
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": "",
16705
16598
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16706
16599
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16707
16600
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16715,7 +16608,7 @@ var de = {
16715
16608
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
16716
16609
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
16717
16610
  "datafeeder.form.dropdown": "Für welche Skala wurde er erstellt?",
16718
- "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tags aus, die zu Ihrem Datensatz passen",
16611
+ "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tage aus, die zu Ihrem Datensatz passen",
16719
16612
  "datafeeder.form.title": "Geben Sie Ihrem Datensatz den besten Titel",
16720
16613
  "datafeeder.formsPage.title": "Erzählen Sie uns mehr über Ihren Datensatz",
16721
16614
  "datafeeder.month.april": "April",
@@ -16730,16 +16623,16 @@ var de = {
16730
16623
  "datafeeder.month.november": "November",
16731
16624
  "datafeeder.month.october": "Oktober",
16732
16625
  "datafeeder.month.september": "September",
16733
- "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist",
16734
- "datafeeder.publish.illustration.title": "Ein weiterer Datensatz zum Veröffentlichen?",
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?",
16735
16628
  "datafeeder.publish.subtitle": "Das Veröffentlichen kann einige Minuten dauern.",
16736
- "datafeeder.publish.title": "Vielen Dank! Ihr Datensatz wird veröffentlicht",
16629
+ "datafeeder.publish.title": "Vielen Dank! \n Ihr Datensatz wird veröffentlicht",
16737
16630
  "datafeeder.publish.upload": "Jetzt hochladen",
16738
16631
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
16739
16632
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
16740
16633
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
16741
16634
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
16742
- "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! Ihr Datensatz wurde veröffentlicht",
16635
+ "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
16743
16636
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
16744
16637
  "datafeeder.summarizePage.illustration": "Kein Fehler? Los geht's!",
16745
16638
  "datafeeder.summarizePage.previous": "Zurück",
@@ -16747,11 +16640,11 @@ var de = {
16747
16640
  "datafeeder.summarizePage.title": "Sie sind fast fertig...",
16748
16641
  "datafeeder.upload.acceptedFormats": "Akzeptierte Dateiformate:",
16749
16642
  "datafeeder.upload.checkboxLabel": "Ich besitze die Rechte zur Veröffentlichung dieses Datensatzes",
16750
- "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geospatialen Datensatz enthält",
16643
+ "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geografischen Datensatz enthält",
16751
16644
  "datafeeder.upload.error.subtitle.cantOpenFile": "Bitte überprüfen Sie, ob die Datei gültig ist",
16752
16645
  "datafeeder.upload.error.subtitle.fileFormat": "Beachten Sie: Nur SHP-Dateien",
16753
- "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximal {size} MB",
16754
- "datafeeder.upload.error.title.analysis": "Fehler bei der Datensatzanalyse",
16646
+ "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximale Dateigröße {size} MB",
16647
+ "datafeeder.upload.error.title.analysis": "Fehler während der Datensatzanalyse",
16755
16648
  "datafeeder.upload.error.title.cantOpenFile": "Fehler beim Öffnen der Datei",
16756
16649
  "datafeeder.upload.error.title.fileFormat": "Das ausgewählte Dateiformat wird nicht unterstützt",
16757
16650
  "datafeeder.upload.error.title.fileHasntSelected": "Keine Datei ausgewählt",
@@ -16759,19 +16652,19 @@ var de = {
16759
16652
  "datafeeder.upload.error.title.noRightsToSendData": "Sie dürfen diesen Datensatz nicht veröffentlichen",
16760
16653
  "datafeeder.upload.illustration.enrichment": "Anreicherung",
16761
16654
  "datafeeder.upload.illustration.import": "Import",
16762
- "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",
16763
16656
  "datafeeder.upload.illustration.validation": "Validierung",
16764
- "datafeeder.upload.illustration.verification": "Verifizierung",
16657
+ "datafeeder.upload.illustration.verification": "Überprüfung",
16765
16658
  "datafeeder.upload.inputLabel": "Importieren Sie Ihre Datei",
16766
16659
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
16767
16660
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
16768
16661
  "datafeeder.upload.uploadButton": "Hochladen",
16769
- "datafeeder.validation.encoding": "Kodierung",
16662
+ "datafeeder.validation.encoding": "Codierung",
16770
16663
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
16771
16664
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
16772
16665
  "datafeeder.validation.projection": "Raumbezugssystem:",
16773
- "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem",
16774
- "datafeeder.validation.sample.title": "Und eine Beispieleinheit aus dem Datensatz",
16666
+ "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem aus",
16667
+ "datafeeder.validation.sample.title": "Und eine Beispielentität aus dem Datensatz",
16775
16668
  "datafeeder.wizard.emptyRequiredValuesMessage": "Bitte füllen Sie die obligatorischen Felder aus",
16776
16669
  "datafeeder.wizardSummarize.createdAt": "Erstellt am",
16777
16670
  "datafeeder.wizardSummarize.scale": "Maßstab",
@@ -16781,20 +16674,20 @@ var de = {
16781
16674
  "datahub.header.news": "Startseite",
16782
16675
  "datahub.header.organisations": "Organisationen",
16783
16676
  "datahub.header.popularRecords": "Die beliebtesten",
16784
- "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten von meiner Organisation</div>",
16785
- "datahub.news.contact.contactus": "",
16786
- "datahub.news.contact.html": "",
16787
- "datahub.news.contact.title": "",
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?",
16788
16681
  "datahub.news.feed": "Nachrichtenfeed",
16789
16682
  "datahub.news.figures": "Indikatoren",
16790
- "datahub.record.addToFavorites": "",
16791
- "datahub.search.back": "Zurück zu den Ergebnissen",
16683
+ "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
16684
+ "datahub.search.back": "Zurück",
16792
16685
  "datahub.search.filter.all": "Alle",
16793
- "datahub.search.filter.generatedByWfs": "Generiert durch API",
16686
+ "datahub.search.filter.generatedByWfs": "Generiert durch eine API",
16794
16687
  "datahub.search.filter.others": "Andere",
16795
16688
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
16796
16689
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
16797
- "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht geparst werden: \"{ info }\"",
16690
+ "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
16798
16691
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
16799
16692
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
16800
16693
  "domain.record.status.completed": "Abgeschlossen",
@@ -16802,18 +16695,18 @@ var de = {
16802
16695
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
16803
16696
  "domain.record.status.removed": "Entfernt",
16804
16697
  "domain.record.status.under_development": "In Erstellung",
16805
- "domain.record.updateFrequency.asNeeded": "Bei Bedarf",
16806
- "domain.record.updateFrequency.continual": "Kontinuierlich",
16698
+ "domain.record.updateFrequency.asNeeded": "Nach Bedarf",
16699
+ "domain.record.updateFrequency.continual": "Fortlaufend",
16807
16700
  "domain.record.updateFrequency.day": "{count, plural, =0{0} one{Ein} other{{count}}} mal am Tag",
16808
- "domain.record.updateFrequency.irregular": "Unregelmässig",
16701
+ "domain.record.updateFrequency.irregular": "Unregelmäßig",
16809
16702
  "domain.record.updateFrequency.month": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Monat",
16810
16703
  "domain.record.updateFrequency.notPlanned": "Nicht geplant",
16811
- "domain.record.updateFrequency.periodic": "Regelmässig",
16704
+ "domain.record.updateFrequency.periodic": "Regelmäßig",
16812
16705
  "domain.record.updateFrequency.unknown": "Unbekannt",
16813
16706
  "domain.record.updateFrequency.week": "{count, plural, =0{0} one{Ein} other{{count}}} mal in der Woche",
16814
16707
  "domain.record.updateFrequency.year": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Jahr",
16815
16708
  "downloads.format.unknown": "unbekannt",
16816
- "downloads.wfs.featuretype.not.found": "Die Schicht wurde nicht gefunden",
16709
+ "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16817
16710
  dropFile: dropFile$6,
16818
16711
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16819
16712
  "facets.block.title.OrgForResource": "Organisation",
@@ -16848,14 +16741,18 @@ var de = {
16848
16741
  "map.add.layer.file": "Aus einer Datei",
16849
16742
  "map.add.layer.wfs": "Aus WFS",
16850
16743
  "map.add.layer.wms": "Aus WMS",
16851
- "map.layer.add": "",
16852
- "map.layers.available": "",
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",
16853
16749
  "map.layers.list": "Ebenen",
16854
16750
  "map.loading.data": "Kartendaten werden geladen...",
16855
- "map.loading.service": "",
16751
+ "map.loading.service": "Dienst wird geladen...",
16856
16752
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
16857
16753
  "map.select.layer": "Datenquelle",
16858
- "map.wms.urlInput.hint": "",
16754
+ "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
16755
+ "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
16859
16756
  "multiselect.filter.placeholder": "Suche",
16860
16757
  "nav.back": "Zurück",
16861
16758
  next: next$6,
@@ -16871,58 +16768,61 @@ var de = {
16871
16768
  "pagination.pageOf": "von",
16872
16769
  previous: previous$6,
16873
16770
  "record.action.download": "Herunterladen",
16874
- "record.action.view": "Ansehen",
16771
+ "record.action.view": "Anzeigen",
16875
16772
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
16876
16773
  "record.metadata.about": "Beschreibung",
16877
16774
  "record.metadata.api": "API",
16878
- "record.metadata.api.form.closeButton": "",
16879
- "record.metadata.api.form.closeForm": "",
16880
- "record.metadata.api.form.create": "",
16881
- "record.metadata.api.form.customUrl": "",
16882
- "record.metadata.api.form.limit": "",
16883
- "record.metadata.api.form.limit.all": "",
16884
- "record.metadata.api.form.offset": "",
16885
- "record.metadata.api.form.openForm": "",
16886
- "record.metadata.api.form.reset": "",
16887
- "record.metadata.api.form.title": "",
16888
- "record.metadata.api.form.type": "",
16889
- "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",
16890
16787
  "record.metadata.catalog": "Katalog",
16891
16788
  "record.metadata.contact": "Kontakt",
16892
- "record.metadata.createdOn": "Erstellt am",
16893
- "record.metadata.details": "Details",
16789
+ "record.metadata.details": "Technische Informationen",
16894
16790
  "record.metadata.download": "Downloads",
16895
- "record.metadata.formats": "",
16896
- "record.metadata.isOpenData": "Open Data",
16791
+ "record.metadata.formats": "Formate",
16897
16792
  "record.metadata.keywords": "Stichworte",
16898
- "record.metadata.lastUpdate": "",
16793
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16899
16794
  "record.metadata.links": "Links",
16900
- "record.metadata.noUsage": "Für diesen Datensatz sind keine Verwendungsbedingungen angegeben.",
16795
+ "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16901
16796
  "record.metadata.origin": "Über die Daten",
16797
+ "record.metadata.otherConstraints": "",
16798
+ "record.metadata.owner": "",
16902
16799
  "record.metadata.preview": "Vorschau",
16903
16800
  "record.metadata.publications": "Veröffentlichungen",
16904
- "record.metadata.quality": "",
16905
- "record.metadata.quality.contact.failed": "",
16906
- "record.metadata.quality.contact.success": "",
16907
- "record.metadata.quality.description.failed": "",
16908
- "record.metadata.quality.description.success": "",
16909
- "record.metadata.quality.details": "",
16910
- "record.metadata.quality.keywords.failed": "",
16911
- "record.metadata.quality.keywords.success": "",
16912
- "record.metadata.quality.legalConstraints.failed": "",
16913
- "record.metadata.quality.legalConstraints.success": "",
16914
- "record.metadata.quality.organisation.failed": "",
16915
- "record.metadata.quality.organisation.success": "",
16916
- "record.metadata.quality.title.failed": "",
16917
- "record.metadata.quality.title.success": "",
16918
- "record.metadata.quality.topic.failed": "",
16919
- "record.metadata.quality.topic.success": "",
16920
- "record.metadata.quality.updateFrequency.failed": "",
16921
- "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",
16922
16819
  "record.metadata.related": "Ähnliche Datensätze",
16923
- "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",
16924
16823
  "record.metadata.title": "Titel",
16925
- "record.metadata.type": "",
16824
+ "record.metadata.type": "Geographischer Datensatz",
16825
+ "record.metadata.uniqueId": "Eindeutige Kennung",
16926
16826
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16927
16827
  "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16928
16828
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
@@ -16934,23 +16834,23 @@ var de = {
16934
16834
  "record.was.created.time": "erstellte diesen Datensatz {time}",
16935
16835
  records: records$6,
16936
16836
  "results.layout.selectOne": "Layout auswählen",
16937
- "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{auf {hits} insgesamt angezeigt.}}",
16938
- "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>",
16939
16839
  "results.records.hits.found": "{hits, plural, =0{Keine Dokumente entsprechen der angegebenen Suche.} one{1 Datensatz gefunden.} other{{hits} Datensätze gefunden.}}",
16940
- "results.records.hits.selected": "",
16840
+ "results.records.hits.selected": "{ amount } ausgewählt",
16941
16841
  "results.showMore": "Mehr Ergebnisse anzeigen...",
16942
- "results.sortBy.dateStamp": "Letzte Aktualisierungen",
16842
+ "results.sortBy.dateStamp": "Neueste",
16943
16843
  "results.sortBy.popularity": "Beliebtheit",
16944
- "results.sortBy.qualityScore": "",
16844
+ "results.sortBy.qualityScore": "Qualitätsbewertung",
16945
16845
  "results.sortBy.relevancy": "Relevanz",
16946
16846
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
16947
16847
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
16948
- "search.error.receivedError": "Ein Fehler wurde empfangen",
16848
+ "search.error.receivedError": "Ein Fehler ist aufgetreten",
16949
16849
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
16950
- "search.field.any.placeholder": "Suche nach Datensätzen ...",
16850
+ "search.field.any.placeholder": "Suche Datensätze ...",
16951
16851
  "search.field.sortBy": "Sortieren nach:",
16952
16852
  "search.filters.clear": "Zurücksetzen",
16953
- "search.filters.contact": "Kontakt",
16853
+ "search.filters.contact": "Kontakte",
16954
16854
  "search.filters.format": "Formate",
16955
16855
  "search.filters.inspireKeyword": "INSPIRE-Schlüsselwort",
16956
16856
  "search.filters.isSpatial": "Ist räumliche Daten",
@@ -16968,13 +16868,13 @@ var de = {
16968
16868
  "search.filters.license.unknown": "Unbekannt oder nicht vorhanden",
16969
16869
  "search.filters.maximize": "Erweitern",
16970
16870
  "search.filters.minimize": "Minimieren",
16971
- "search.filters.myRecords": "",
16972
- "search.filters.myRecordsHelp": "",
16973
- "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",
16974
16874
  "search.filters.publicationYear": "Veröffentlichungsjahr",
16975
16875
  "search.filters.publisher": "Organisationen",
16976
- "search.filters.representationType": "",
16977
- "search.filters.resourceType": "",
16876
+ "search.filters.representationType": "Repräsentationstyp",
16877
+ "search.filters.resourceType": "Ressourcentyp",
16978
16878
  "search.filters.standard": "Standard",
16979
16879
  "search.filters.title": "Ergebnisse filtern",
16980
16880
  "search.filters.topic": "Thema",
@@ -16986,6 +16886,7 @@ var de = {
16986
16886
  "table.object.count": "Objekte in diesem Datensatz",
16987
16887
  "table.select.data": "Datenquelle",
16988
16888
  "tooltip.html.copy": "HTML kopieren",
16889
+ "tooltip.id.copy": "",
16989
16890
  "tooltip.url.copy": "URL kopieren",
16990
16891
  "tooltip.url.open": "URL öffnen",
16991
16892
  "ui.readLess": "Weniger lesen",
@@ -17019,20 +16920,21 @@ var en = {
17019
16920
  "chart.type.line": "line chart",
17020
16921
  "chart.type.lineSmooth": "smooth line chart",
17021
16922
  "chart.type.pie": "pie chart",
16923
+ "dashboard.createRecord": "New record",
17022
16924
  "dashboard.labels.mySpace": "My space",
17023
- "dashboard.records.all": "Catalog",
16925
+ "dashboard.records.all": "Metadata records",
17024
16926
  "dashboard.records.myDraft": "My drafts",
17025
16927
  "dashboard.records.myLibrary": "My library",
17026
16928
  "dashboard.records.myOrg": "Organization",
17027
16929
  "dashboard.records.myRecords": "My Records",
17028
- "dashboard.records.noRecord": "No record for this organization",
17029
- "dashboard.records.noUser": "No users for this organization",
17030
16930
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17031
16931
  "dashboard.records.search": "Search for \"{searchText}\"",
17032
16932
  "dashboard.records.userDetail": "Name",
17033
16933
  "dashboard.records.userEmail": "Email",
17034
16934
  "dashboard.records.username": "Username",
17035
16935
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
16936
+ "dashboard.results.listMetadata": "Show metadata",
16937
+ "dashboard.results.listResources": "Show resources",
17036
16938
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17037
16939
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17038
16940
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17179,6 +17081,9 @@ var en = {
17179
17081
  "map.add.layer.file": "From a file",
17180
17082
  "map.add.layer.wfs": "From WFS",
17181
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).",
17182
17087
  "map.layer.add": "Add",
17183
17088
  "map.layers.available": "Available Layers",
17184
17089
  "map.layers.list": "Layers",
@@ -17186,6 +17091,7 @@ var en = {
17186
17091
  "map.loading.service": "Loading service...",
17187
17092
  "map.navigation.message": "Please use CTRL + mouse (or two fingers on mobile) to navigate the map",
17188
17093
  "map.select.layer": "Data source",
17094
+ "map.wfs.urlInput.hint": "Enter WFS service URL",
17189
17095
  "map.wms.urlInput.hint": "Enter WMS service URL",
17190
17096
  "multiselect.filter.placeholder": "Search",
17191
17097
  "nav.back": "Back",
@@ -17220,44 +17126,47 @@ var en = {
17220
17126
  "record.metadata.author": "Author",
17221
17127
  "record.metadata.catalog": "Catalog",
17222
17128
  "record.metadata.contact": "Contact",
17223
- "record.metadata.createdOn": "Created on",
17224
- "record.metadata.details": "Details",
17129
+ "record.metadata.details": "Technical information",
17225
17130
  "record.metadata.download": "Downloads",
17226
17131
  "record.metadata.formats": "Formats",
17227
- "record.metadata.isOpenData": "Open Data",
17228
17132
  "record.metadata.keywords": "Keywords",
17229
17133
  "record.metadata.lastUpdate": "Last updated on",
17230
17134
  "record.metadata.links": "Links",
17231
17135
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17232
17136
  "record.metadata.origin": "About the data",
17137
+ "record.metadata.otherConstraints": "Additional Conditions",
17138
+ "record.metadata.owner": "Catalog of origin",
17233
17139
  "record.metadata.preview": "Preview",
17234
17140
  "record.metadata.publications": "publications",
17235
17141
  "record.metadata.quality": "Metadata Quality",
17236
- "record.metadata.quality.contact.failed": "Contact is not completed",
17237
- "record.metadata.quality.contact.success": "Contact is completed",
17238
- "record.metadata.quality.description.failed": "Description is not completed",
17239
- "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",
17240
17146
  "record.metadata.quality.details": "Details",
17241
- "record.metadata.quality.keywords.failed": "Keywords are not completed",
17242
- "record.metadata.quality.keywords.success": "Keywords are completed",
17243
- "record.metadata.quality.legalConstraints.failed": "Legal constraints are not completed",
17244
- "record.metadata.quality.legalConstraints.success": "Legal constraints are completed",
17245
- "record.metadata.quality.organisation.failed": "Organisation is not completed",
17246
- "record.metadata.quality.organisation.success": "Organisation is completed",
17247
- "record.metadata.quality.title.failed": "Title is not completed",
17248
- "record.metadata.quality.title.success": "Title is completed",
17249
- "record.metadata.quality.topic.failed": "Topic is not completed",
17250
- "record.metadata.quality.topic.success": "Topic is completed",
17251
- "record.metadata.quality.updateFrequency.failed": "Update frequency is not completed",
17252
- "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",
17253
17159
  "record.metadata.related": "Related records",
17254
- "record.metadata.sheet": "More information available from:",
17160
+ "record.metadata.sheet": "Original metadata",
17161
+ "record.metadata.status": "Status",
17162
+ "record.metadata.themes": "Categories",
17255
17163
  "record.metadata.title": "Title",
17256
17164
  "record.metadata.type": "Geographical dataset",
17165
+ "record.metadata.uniqueId": "Unique Identifier",
17257
17166
  "record.metadata.updateFrequency": "Data Update Frequency",
17258
17167
  "record.metadata.updateStatus": "Data Update Status",
17259
17168
  "record.metadata.updatedOn": "Last Data Information Update",
17260
- "record.metadata.usage": "Usage & constraints",
17169
+ "record.metadata.usage": "License and Conditions",
17261
17170
  "record.more.details": "Read more",
17262
17171
  "record.tab.chart": "Chart",
17263
17172
  "record.tab.data": "Table",
@@ -17317,6 +17226,7 @@ var en = {
17317
17226
  "table.object.count": "objects in this dataset",
17318
17227
  "table.select.data": "Data source",
17319
17228
  "tooltip.html.copy": "Copy HTML",
17229
+ "tooltip.id.copy": "Copy unique identifier",
17320
17230
  "tooltip.url.copy": "Copy URL",
17321
17231
  "tooltip.url.open": "Open URL",
17322
17232
  "ui.readLess": "Read less",
@@ -17350,20 +17260,21 @@ var es = {
17350
17260
  "chart.type.line": "gráfico de líneas",
17351
17261
  "chart.type.lineSmooth": "gráfico de líneas suave",
17352
17262
  "chart.type.pie": "gráfico circular",
17263
+ "dashboard.createRecord": "",
17353
17264
  "dashboard.labels.mySpace": "Mi espacio",
17354
17265
  "dashboard.records.all": "Catálogo",
17355
17266
  "dashboard.records.myDraft": "Mis borradores",
17356
17267
  "dashboard.records.myLibrary": "Mi biblioteca",
17357
17268
  "dashboard.records.myOrg": "Organización",
17358
17269
  "dashboard.records.myRecords": "Mis Registros",
17359
- "dashboard.records.noRecord": "",
17360
- "dashboard.records.noUser": "",
17361
17270
  "dashboard.records.publishedRecords": "",
17362
17271
  "dashboard.records.search": "Buscar \"{searchText}\"",
17363
17272
  "dashboard.records.userDetail": "",
17364
17273
  "dashboard.records.userEmail": "",
17365
17274
  "dashboard.records.username": "",
17366
17275
  "dashboard.records.users": "",
17276
+ "dashboard.results.listMetadata": "",
17277
+ "dashboard.results.listResources": "",
17367
17278
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17368
17279
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17369
17280
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17510,6 +17421,9 @@ var es = {
17510
17421
  "map.add.layer.file": "",
17511
17422
  "map.add.layer.wfs": "",
17512
17423
  "map.add.layer.wms": "",
17424
+ "map.addFromFile.placeholder": "",
17425
+ "map.geocoding.placeholder": "",
17426
+ "map.help.addFromFile": "",
17513
17427
  "map.layer.add": "",
17514
17428
  "map.layers.available": "",
17515
17429
  "map.layers.list": "",
@@ -17517,6 +17431,7 @@ var es = {
17517
17431
  "map.loading.service": "",
17518
17432
  "map.navigation.message": "",
17519
17433
  "map.select.layer": "",
17434
+ "map.wfs.urlInput.hint": "",
17520
17435
  "map.wms.urlInput.hint": "",
17521
17436
  "multiselect.filter.placeholder": "",
17522
17437
  "nav.back": "",
@@ -17551,16 +17466,16 @@ var es = {
17551
17466
  "record.metadata.author": "",
17552
17467
  "record.metadata.catalog": "",
17553
17468
  "record.metadata.contact": "",
17554
- "record.metadata.createdOn": "",
17555
17469
  "record.metadata.details": "",
17556
17470
  "record.metadata.download": "",
17557
17471
  "record.metadata.formats": "",
17558
- "record.metadata.isOpenData": "",
17559
17472
  "record.metadata.keywords": "",
17560
17473
  "record.metadata.lastUpdate": "",
17561
17474
  "record.metadata.links": "",
17562
17475
  "record.metadata.noUsage": "",
17563
17476
  "record.metadata.origin": "",
17477
+ "record.metadata.otherConstraints": "",
17478
+ "record.metadata.owner": "",
17564
17479
  "record.metadata.preview": "",
17565
17480
  "record.metadata.publications": "",
17566
17481
  "record.metadata.quality": "",
@@ -17583,8 +17498,11 @@ var es = {
17583
17498
  "record.metadata.quality.updateFrequency.success": "",
17584
17499
  "record.metadata.related": "",
17585
17500
  "record.metadata.sheet": "",
17501
+ "record.metadata.status": "",
17502
+ "record.metadata.themes": "",
17586
17503
  "record.metadata.title": "",
17587
17504
  "record.metadata.type": "",
17505
+ "record.metadata.uniqueId": "",
17588
17506
  "record.metadata.updateFrequency": "",
17589
17507
  "record.metadata.updateStatus": "",
17590
17508
  "record.metadata.updatedOn": "",
@@ -17648,6 +17566,7 @@ var es = {
17648
17566
  "table.object.count": "",
17649
17567
  "table.select.data": "",
17650
17568
  "tooltip.html.copy": "",
17569
+ "tooltip.id.copy": "",
17651
17570
  "tooltip.url.copy": "",
17652
17571
  "tooltip.url.open": "",
17653
17572
  "ui.readLess": "",
@@ -17681,20 +17600,21 @@ var fr = {
17681
17600
  "chart.type.line": "ligne",
17682
17601
  "chart.type.lineSmooth": "ligne lisse",
17683
17602
  "chart.type.pie": "camembert",
17603
+ "dashboard.createRecord": "",
17684
17604
  "dashboard.labels.mySpace": "Mon espace",
17685
17605
  "dashboard.records.all": "Catalogue",
17686
17606
  "dashboard.records.myDraft": "Mes brouillons",
17687
17607
  "dashboard.records.myLibrary": "Ma bibliothèque",
17688
17608
  "dashboard.records.myOrg": "Mon organisation",
17689
17609
  "dashboard.records.myRecords": "Mes fiches publiées",
17690
- "dashboard.records.noRecord": "Aucun jeu de données pour cette organisation",
17691
- "dashboard.records.noUser": "Aucun utilisateur pour cette organisation",
17692
17610
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17693
17611
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17694
17612
  "dashboard.records.userDetail": "Nom",
17695
17613
  "dashboard.records.userEmail": "Email",
17696
17614
  "dashboard.records.username": "Nom d'utilisateur",
17697
17615
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17616
+ "dashboard.results.listMetadata": "",
17617
+ "dashboard.results.listResources": "",
17698
17618
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17699
17619
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17700
17620
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17776,7 +17696,7 @@ var fr = {
17776
17696
  "datahub.header.popularRecords": "Les plus appréciées",
17777
17697
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17778
17698
  "datahub.news.contact.contactus": "Contactez-nous",
17779
- "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>",
17780
17700
  "datahub.news.contact.title": "Un besoin spécifique ?",
17781
17701
  "datahub.news.feed": "Fil d'activité",
17782
17702
  "datahub.news.figures": "Quelques chiffres",
@@ -17841,6 +17761,9 @@ var fr = {
17841
17761
  "map.add.layer.file": "",
17842
17762
  "map.add.layer.wfs": "",
17843
17763
  "map.add.layer.wms": "",
17764
+ "map.addFromFile.placeholder": "",
17765
+ "map.geocoding.placeholder": "",
17766
+ "map.help.addFromFile": "",
17844
17767
  "map.layer.add": "",
17845
17768
  "map.layers.available": "",
17846
17769
  "map.layers.list": "",
@@ -17848,6 +17771,7 @@ var fr = {
17848
17771
  "map.loading.service": "",
17849
17772
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17850
17773
  "map.select.layer": "Source de données",
17774
+ "map.wfs.urlInput.hint": "",
17851
17775
  "map.wms.urlInput.hint": "",
17852
17776
  "multiselect.filter.placeholder": "Rechercher",
17853
17777
  "nav.back": "Retour",
@@ -17882,16 +17806,16 @@ var fr = {
17882
17806
  "record.metadata.author": "Auteur",
17883
17807
  "record.metadata.catalog": "Catalogue",
17884
17808
  "record.metadata.contact": "Contact",
17885
- "record.metadata.createdOn": "Créé le",
17886
- "record.metadata.details": "Détails",
17809
+ "record.metadata.details": "Informations techniques",
17887
17810
  "record.metadata.download": "Téléchargements",
17888
17811
  "record.metadata.formats": "Formats",
17889
- "record.metadata.isOpenData": "Donnée Ouverte",
17890
17812
  "record.metadata.keywords": "Mots clés",
17891
17813
  "record.metadata.lastUpdate": "Mis à jour le",
17892
17814
  "record.metadata.links": "Liens",
17893
17815
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17894
17816
  "record.metadata.origin": "À propos des données",
17817
+ "record.metadata.otherConstraints": "Limitations d'usage",
17818
+ "record.metadata.owner": "Catalogue d'origine",
17895
17819
  "record.metadata.preview": "Aperçu",
17896
17820
  "record.metadata.publications": "données",
17897
17821
  "record.metadata.quality": "Qualité des métadonnées",
@@ -17913,13 +17837,16 @@ var fr = {
17913
17837
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
17914
17838
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17915
17839
  "record.metadata.related": "Voir aussi",
17916
- "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",
17917
17843
  "record.metadata.title": "Titre",
17918
17844
  "record.metadata.type": "Donnée géographique",
17845
+ "record.metadata.uniqueId": "Identificateur de ressource unique",
17919
17846
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17920
17847
  "record.metadata.updateStatus": "Statut de mise à jour des données",
17921
17848
  "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17922
- "record.metadata.usage": "Conditions d'utilisation",
17849
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17923
17850
  "record.more.details": "Détails",
17924
17851
  "record.tab.chart": "Graphique",
17925
17852
  "record.tab.data": "Tableau",
@@ -17979,6 +17906,7 @@ var fr = {
17979
17906
  "table.object.count": "enregistrements dans ces données",
17980
17907
  "table.select.data": "Source de données",
17981
17908
  "tooltip.html.copy": "Copier le HTML",
17909
+ "tooltip.id.copy": "Copier l'identifiant unique",
17982
17910
  "tooltip.url.copy": "Copier l'URL",
17983
17911
  "tooltip.url.open": "Ouvrir l'URL",
17984
17912
  "ui.readLess": "Réduire",
@@ -18012,20 +17940,21 @@ var it = {
18012
17940
  "chart.type.line": "grafico a linee",
18013
17941
  "chart.type.lineSmooth": "grafico a linea liscia",
18014
17942
  "chart.type.pie": "grafico a torta",
17943
+ "dashboard.createRecord": "",
18015
17944
  "dashboard.labels.mySpace": "Il mio spazio",
18016
17945
  "dashboard.records.all": "Catalogo",
18017
17946
  "dashboard.records.myDraft": "Le mie bozze",
18018
17947
  "dashboard.records.myLibrary": "La mia biblioteca",
18019
17948
  "dashboard.records.myOrg": "La mia organizzazione",
18020
17949
  "dashboard.records.myRecords": "I miei dati",
18021
- "dashboard.records.noRecord": "Nessun dati per questa organizzazione",
18022
- "dashboard.records.noUser": "Nessun utente per questa organizzazione",
18023
17950
  "dashboard.records.publishedRecords": "dati pubblicati",
18024
17951
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18025
17952
  "dashboard.records.userDetail": "Nome",
18026
17953
  "dashboard.records.userEmail": "Email",
18027
17954
  "dashboard.records.username": "Nome utente",
18028
17955
  "dashboard.records.users": "utenti",
17956
+ "dashboard.results.listMetadata": "",
17957
+ "dashboard.results.listResources": "",
18029
17958
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18030
17959
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18031
17960
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18172,6 +18101,9 @@ var it = {
18172
18101
  "map.add.layer.file": "Da un file",
18173
18102
  "map.add.layer.wfs": "Da un WFS",
18174
18103
  "map.add.layer.wms": "Da un WMS",
18104
+ "map.addFromFile.placeholder": "",
18105
+ "map.geocoding.placeholder": "",
18106
+ "map.help.addFromFile": "",
18175
18107
  "map.layer.add": "",
18176
18108
  "map.layers.available": "",
18177
18109
  "map.layers.list": "Layers",
@@ -18179,6 +18111,7 @@ var it = {
18179
18111
  "map.loading.service": "",
18180
18112
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18181
18113
  "map.select.layer": "Sorgente dati",
18114
+ "map.wfs.urlInput.hint": "",
18182
18115
  "map.wms.urlInput.hint": "",
18183
18116
  "multiselect.filter.placeholder": "Cerca",
18184
18117
  "nav.back": "Indietro",
@@ -18213,16 +18146,16 @@ var it = {
18213
18146
  "record.metadata.author": "Autore",
18214
18147
  "record.metadata.catalog": "Catalogo",
18215
18148
  "record.metadata.contact": "Contatto",
18216
- "record.metadata.createdOn": "Creato il",
18217
- "record.metadata.details": "Dettagli",
18149
+ "record.metadata.details": "Informazioni tecniche",
18218
18150
  "record.metadata.download": "Download",
18219
18151
  "record.metadata.formats": "Formati",
18220
- "record.metadata.isOpenData": "Data aperta",
18221
18152
  "record.metadata.keywords": "Parole chiave",
18222
18153
  "record.metadata.lastUpdate": "Ultimo aggiornamento",
18223
18154
  "record.metadata.links": "Collegamenti",
18224
18155
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18225
18156
  "record.metadata.origin": "Informazioni sui dati",
18157
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18158
+ "record.metadata.owner": "Catalogo originale",
18226
18159
  "record.metadata.preview": "Anteprima",
18227
18160
  "record.metadata.publications": "pubblicazioni",
18228
18161
  "record.metadata.quality": "Qualità dei metadati",
@@ -18244,13 +18177,16 @@ var it = {
18244
18177
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
18245
18178
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18246
18179
  "record.metadata.related": "Vedi anche",
18247
- "record.metadata.sheet": "Per ulteriori informazioni, cliccate qui:",
18180
+ "record.metadata.sheet": "Origine del metadata",
18181
+ "record.metadata.status": "",
18182
+ "record.metadata.themes": "Categorie",
18248
18183
  "record.metadata.title": "Titolo",
18249
18184
  "record.metadata.type": "Dati geografici",
18185
+ "record.metadata.uniqueId": "Identificatore unico di risorsa",
18250
18186
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18251
18187
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18252
18188
  "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18253
- "record.metadata.usage": "Condizioni d'uso",
18189
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18254
18190
  "record.more.details": "Dettagli",
18255
18191
  "record.tab.chart": "Grafico",
18256
18192
  "record.tab.data": "Tabella",
@@ -18310,6 +18246,7 @@ var it = {
18310
18246
  "table.object.count": "record in questi dati",
18311
18247
  "table.select.data": "Sorgente dati",
18312
18248
  "tooltip.html.copy": "Copiare il HTML",
18249
+ "tooltip.id.copy": "Copiare l'identificatore unico",
18313
18250
  "tooltip.url.copy": "Copiare l'URL",
18314
18251
  "tooltip.url.open": "Aprire l'URL",
18315
18252
  "ui.readLess": "Ridurre",
@@ -18343,20 +18280,21 @@ var nl = {
18343
18280
  "chart.type.line": "lijndiagram",
18344
18281
  "chart.type.lineSmooth": "glad lijndiagram",
18345
18282
  "chart.type.pie": "cirkeldiagram",
18283
+ "dashboard.createRecord": "",
18346
18284
  "dashboard.labels.mySpace": "Mijn ruimte",
18347
18285
  "dashboard.records.all": "Catalogus",
18348
18286
  "dashboard.records.myDraft": "Mijn concepten",
18349
18287
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18350
18288
  "dashboard.records.myOrg": "Organisatie",
18351
18289
  "dashboard.records.myRecords": "Mijn Records",
18352
- "dashboard.records.noRecord": "",
18353
- "dashboard.records.noUser": "",
18354
18290
  "dashboard.records.publishedRecords": "",
18355
18291
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18356
18292
  "dashboard.records.userDetail": "",
18357
18293
  "dashboard.records.userEmail": "",
18358
18294
  "dashboard.records.username": "",
18359
18295
  "dashboard.records.users": "",
18296
+ "dashboard.results.listMetadata": "",
18297
+ "dashboard.results.listResources": "",
18360
18298
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18361
18299
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18362
18300
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18503,6 +18441,9 @@ var nl = {
18503
18441
  "map.add.layer.file": "",
18504
18442
  "map.add.layer.wfs": "",
18505
18443
  "map.add.layer.wms": "",
18444
+ "map.addFromFile.placeholder": "",
18445
+ "map.geocoding.placeholder": "",
18446
+ "map.help.addFromFile": "",
18506
18447
  "map.layer.add": "",
18507
18448
  "map.layers.available": "",
18508
18449
  "map.layers.list": "",
@@ -18510,6 +18451,7 @@ var nl = {
18510
18451
  "map.loading.service": "",
18511
18452
  "map.navigation.message": "",
18512
18453
  "map.select.layer": "",
18454
+ "map.wfs.urlInput.hint": "",
18513
18455
  "map.wms.urlInput.hint": "",
18514
18456
  "multiselect.filter.placeholder": "",
18515
18457
  "nav.back": "",
@@ -18544,16 +18486,16 @@ var nl = {
18544
18486
  "record.metadata.author": "",
18545
18487
  "record.metadata.catalog": "",
18546
18488
  "record.metadata.contact": "",
18547
- "record.metadata.createdOn": "",
18548
18489
  "record.metadata.details": "",
18549
18490
  "record.metadata.download": "",
18550
18491
  "record.metadata.formats": "",
18551
- "record.metadata.isOpenData": "",
18552
18492
  "record.metadata.keywords": "",
18553
18493
  "record.metadata.lastUpdate": "",
18554
18494
  "record.metadata.links": "",
18555
18495
  "record.metadata.noUsage": "",
18556
18496
  "record.metadata.origin": "",
18497
+ "record.metadata.otherConstraints": "",
18498
+ "record.metadata.owner": "",
18557
18499
  "record.metadata.preview": "",
18558
18500
  "record.metadata.publications": "",
18559
18501
  "record.metadata.quality": "",
@@ -18576,8 +18518,11 @@ var nl = {
18576
18518
  "record.metadata.quality.updateFrequency.success": "",
18577
18519
  "record.metadata.related": "",
18578
18520
  "record.metadata.sheet": "",
18521
+ "record.metadata.status": "",
18522
+ "record.metadata.themes": "",
18579
18523
  "record.metadata.title": "",
18580
18524
  "record.metadata.type": "",
18525
+ "record.metadata.uniqueId": "",
18581
18526
  "record.metadata.updateFrequency": "",
18582
18527
  "record.metadata.updateStatus": "",
18583
18528
  "record.metadata.updatedOn": "",
@@ -18641,6 +18586,7 @@ var nl = {
18641
18586
  "table.object.count": "",
18642
18587
  "table.select.data": "",
18643
18588
  "tooltip.html.copy": "",
18589
+ "tooltip.id.copy": "",
18644
18590
  "tooltip.url.copy": "",
18645
18591
  "tooltip.url.open": "",
18646
18592
  "ui.readLess": "",
@@ -18674,20 +18620,21 @@ var pt = {
18674
18620
  "chart.type.line": "gráfico de linha",
18675
18621
  "chart.type.lineSmooth": "gráfico de linha suave",
18676
18622
  "chart.type.pie": "gráfico de pizza",
18623
+ "dashboard.createRecord": "",
18677
18624
  "dashboard.labels.mySpace": "Meu espaço",
18678
18625
  "dashboard.records.all": "Catálogo",
18679
18626
  "dashboard.records.myDraft": "Meus rascunhos",
18680
18627
  "dashboard.records.myLibrary": "Minha biblioteca",
18681
18628
  "dashboard.records.myOrg": "Organização",
18682
18629
  "dashboard.records.myRecords": "Meus Registros",
18683
- "dashboard.records.noRecord": "",
18684
- "dashboard.records.noUser": "",
18685
18630
  "dashboard.records.publishedRecords": "",
18686
18631
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18687
18632
  "dashboard.records.userDetail": "",
18688
18633
  "dashboard.records.userEmail": "",
18689
18634
  "dashboard.records.username": "",
18690
18635
  "dashboard.records.users": "",
18636
+ "dashboard.results.listMetadata": "",
18637
+ "dashboard.results.listResources": "",
18691
18638
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18692
18639
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18693
18640
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18834,6 +18781,9 @@ var pt = {
18834
18781
  "map.add.layer.file": "",
18835
18782
  "map.add.layer.wfs": "",
18836
18783
  "map.add.layer.wms": "",
18784
+ "map.addFromFile.placeholder": "",
18785
+ "map.geocoding.placeholder": "",
18786
+ "map.help.addFromFile": "",
18837
18787
  "map.layer.add": "",
18838
18788
  "map.layers.available": "",
18839
18789
  "map.layers.list": "",
@@ -18841,6 +18791,7 @@ var pt = {
18841
18791
  "map.loading.service": "",
18842
18792
  "map.navigation.message": "",
18843
18793
  "map.select.layer": "",
18794
+ "map.wfs.urlInput.hint": "",
18844
18795
  "map.wms.urlInput.hint": "",
18845
18796
  "multiselect.filter.placeholder": "",
18846
18797
  "nav.back": "",
@@ -18875,16 +18826,16 @@ var pt = {
18875
18826
  "record.metadata.author": "",
18876
18827
  "record.metadata.catalog": "",
18877
18828
  "record.metadata.contact": "",
18878
- "record.metadata.createdOn": "",
18879
18829
  "record.metadata.details": "",
18880
18830
  "record.metadata.download": "",
18881
18831
  "record.metadata.formats": "",
18882
- "record.metadata.isOpenData": "",
18883
18832
  "record.metadata.keywords": "",
18884
18833
  "record.metadata.lastUpdate": "",
18885
18834
  "record.metadata.links": "",
18886
18835
  "record.metadata.noUsage": "",
18887
18836
  "record.metadata.origin": "",
18837
+ "record.metadata.otherConstraints": "",
18838
+ "record.metadata.owner": "",
18888
18839
  "record.metadata.preview": "",
18889
18840
  "record.metadata.publications": "",
18890
18841
  "record.metadata.quality": "",
@@ -18907,8 +18858,11 @@ var pt = {
18907
18858
  "record.metadata.quality.updateFrequency.success": "",
18908
18859
  "record.metadata.related": "",
18909
18860
  "record.metadata.sheet": "",
18861
+ "record.metadata.status": "",
18862
+ "record.metadata.themes": "",
18910
18863
  "record.metadata.title": "",
18911
18864
  "record.metadata.type": "",
18865
+ "record.metadata.uniqueId": "",
18912
18866
  "record.metadata.updateFrequency": "",
18913
18867
  "record.metadata.updateStatus": "",
18914
18868
  "record.metadata.updatedOn": "",
@@ -18972,6 +18926,7 @@ var pt = {
18972
18926
  "table.object.count": "",
18973
18927
  "table.select.data": "",
18974
18928
  "tooltip.html.copy": "",
18929
+ "tooltip.id.copy": "",
18975
18930
  "tooltip.url.copy": "",
18976
18931
  "tooltip.url.open": "",
18977
18932
  "ui.readLess": "",
@@ -19116,20 +19071,11 @@ class Gn4FieldMapper {
19116
19071
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19117
19072
  ],
19118
19073
  }),
19119
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19120
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19121
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19122
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19123
- licenseObject: (output, source) => ({
19124
- ...output,
19125
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19126
- const link = getAsUrl(selectField(license, 'link'));
19127
- return {
19128
- text: selectTranslatedValue(license, this.lang3),
19129
- ...(link ? { link } : {}),
19130
- };
19131
- }),
19132
- }),
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'))),
19133
19079
  lineageObject: (output, source) => ({
19134
19080
  ...output,
19135
19081
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19155,33 +19101,78 @@ class Gn4FieldMapper {
19155
19101
  kind,
19156
19102
  };
19157
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
+ },
19158
19138
  };
19159
19139
  this.genericField = (output) => output;
19160
- this.constraintField = (fieldName, output, source) => ({
19161
- ...output,
19162
- ...(fieldName.endsWith('UseLimitationObject')
19163
- ? {
19164
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19165
- ? [
19166
- ...(output.legalConstraints || []),
19167
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19168
- ]
19169
- : output.legalConstraints || [],
19170
- useLimitations: [
19171
- ...(output.useLimitations || []),
19172
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19173
- ],
19174
- }
19175
- : {
19176
- accessConstraints: [
19177
- ...(output.accessConstraints || []),
19178
- ...selectField(source, fieldName).map((field) => ({
19179
- text: selectTranslatedValue(field, this.lang3),
19180
- type: this.getConstraintsType(fieldName),
19181
- })),
19182
- ],
19183
- }),
19184
- });
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
+ };
19185
19176
  this.mapLink = (sourceLink) => {
19186
19177
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19187
19178
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19229,17 +19220,6 @@ class Gn4FieldMapper {
19229
19220
  extras: { ...(output.extras || {}), ...value },
19230
19221
  });
19231
19222
  }
19232
- getConstraintsType(indexField) {
19233
- switch (indexField) {
19234
- case 'MD_LegalConstraintsUseLimitationObject':
19235
- return 'legal';
19236
- case 'MD_SecurityConstraintsUseLimitationObject':
19237
- return 'security';
19238
- case 'MD_ConstraintsUseLimitationObject':
19239
- default:
19240
- return 'other';
19241
- }
19242
- }
19243
19223
  getMappingFn(fieldName) {
19244
19224
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19245
19225
  }
@@ -19301,14 +19281,16 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19301
19281
  recordUpdated: null,
19302
19282
  ownerOrganization: null,
19303
19283
  licenses: [],
19284
+ legalConstraints: [],
19285
+ securityConstraints: [],
19286
+ otherConstraints: [],
19304
19287
  contacts: [],
19305
19288
  contactsForResource: [],
19306
- accessConstraints: [],
19307
19289
  keywords: [],
19308
19290
  themes: [],
19309
- useLimitations: [],
19310
19291
  spatialExtents: [],
19311
19292
  temporalExtents: [],
19293
+ overviews: [],
19312
19294
  };
19313
19295
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19314
19296
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -20342,36 +20324,23 @@ class SelectionService {
20342
20324
  this.selectedRecordsIdentifiers$.next(filtered);
20343
20325
  }
20344
20326
  selectRecords(records) {
20345
- const newIds = [];
20346
- records.map((record) => {
20347
- newIds.push(record.uniqueIdentifier);
20348
- });
20349
- const apiResponse = this.selectionsApi.add(BUCKET_ID, newIds);
20350
- return apiResponse.pipe(tap$2(() => {
20327
+ const newIds = records.map((record) => record.uniqueIdentifier);
20328
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20351
20329
  this.addIdsToSelected(newIds);
20352
- }), map$2(() => undefined));
20330
+ });
20353
20331
  }
20354
20332
  deselectRecords(records) {
20355
- const idsToBeRemoved = [];
20356
- records.map((record) => {
20357
- idsToBeRemoved.push(record.uniqueIdentifier);
20358
- });
20359
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved);
20360
- return apiResponse.pipe(tap$2(() => {
20333
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20334
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20361
20335
  this.removeIdsFromSelected(idsToBeRemoved);
20362
- }), map$2(() => undefined));
20363
- }
20364
- clearSelection() {
20365
- const currentSelectedResponse = this.selectionsApi.get(BUCKET_ID);
20366
- let currentSelection;
20367
- this.subscription = currentSelectedResponse.subscribe((value) => {
20368
- currentSelection = [...value];
20369
20336
  });
20370
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20371
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20372
- 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(() => {
20373
20342
  this.removeIdsFromSelected(currentSelection);
20374
- }), map$2(() => undefined));
20343
+ });
20375
20344
  }
20376
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 }); }
20377
20346
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20689,6 +20658,8 @@ const defaultMapOptions = {
20689
20658
  };
20690
20659
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20691
20660
 
20661
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20662
+
20692
20663
  var MapContextLayerTypeEnum;
20693
20664
  (function (MapContextLayerTypeEnum) {
20694
20665
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21064,9 +21035,15 @@ const FORMATS = {
21064
21035
  color: '#328556',
21065
21036
  mimeTypes: ['x-gis/x-shapefile'],
21066
21037
  },
21038
+ gml: {
21039
+ extensions: ['gml'],
21040
+ priority: 5,
21041
+ color: '#c92bce',
21042
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21043
+ },
21067
21044
  kml: {
21068
21045
  extensions: ['kml', 'kmz'],
21069
- priority: 5,
21046
+ priority: 6,
21070
21047
  color: '#348009',
21071
21048
  mimeTypes: [
21072
21049
  'application/vnd.google-earth.kml+xml',
@@ -21075,34 +21052,40 @@ const FORMATS = {
21075
21052
  },
21076
21053
  gpkg: {
21077
21054
  extensions: ['gpkg', 'geopackage'],
21078
- priority: 6,
21055
+ priority: 7,
21079
21056
  color: '#ea79ba',
21080
21057
  mimeTypes: ['application/geopackage+sqlite3'],
21081
21058
  },
21082
21059
  zip: {
21083
21060
  extensions: ['zip', 'tar.gz'],
21084
- priority: 7,
21061
+ priority: 8,
21085
21062
  color: '#f2bb3a',
21086
21063
  mimeTypes: ['application/zip', 'application/x-zip'],
21087
21064
  },
21088
21065
  pdf: {
21089
21066
  extensions: ['pdf'],
21090
- priority: 8,
21067
+ priority: 9,
21091
21068
  color: '#db544a',
21092
21069
  mimeTypes: ['application/pdf'],
21093
21070
  },
21094
21071
  jpg: {
21095
21072
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21096
- priority: 8,
21073
+ priority: 9,
21097
21074
  color: '#673ab7',
21098
21075
  mimeTypes: ['image/jpg'],
21099
21076
  },
21100
21077
  svg: {
21101
21078
  extensions: ['svg'],
21102
- priority: 9,
21079
+ priority: 10,
21103
21080
  color: '#d98294',
21104
21081
  mimeTypes: ['image/svg+xml'],
21105
21082
  },
21083
+ dxf: {
21084
+ extensions: ['dxf'],
21085
+ priority: 11,
21086
+ color: '#de630b',
21087
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21088
+ },
21106
21089
  };
21107
21090
  function getFormatPriority(linkFormat) {
21108
21091
  for (const format in FORMATS) {
@@ -21119,14 +21102,18 @@ function getFormatPriority(linkFormat) {
21119
21102
  function getLinkPriority(link) {
21120
21103
  return getFormatPriority(getFileFormat(link));
21121
21104
  }
21122
- function extensionToFormat(extension) {
21123
- for (const format in FORMATS) {
21124
- for (const alias of FORMATS[format].extensions) {
21125
- if (alias === extension.toLowerCase())
21126
- 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;
21127
21114
  }
21128
21115
  }
21129
- return undefined;
21116
+ return null;
21130
21117
  }
21131
21118
  function getFileFormat(link) {
21132
21119
  if ('mimeType' in link) {
@@ -21267,72 +21254,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21267
21254
  }]
21268
21255
  }] });
21269
21256
 
21270
- const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
21271
-
21272
- class MapUtilsWMSService {
21273
- constructor(proxy) {
21274
- this.proxy = proxy;
21275
- }
21276
- getCapabilities(layer) {
21277
- return from(new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady());
21278
- }
21279
- getLayerFull(layer) {
21280
- return this.getCapabilities(layer).pipe(map$1((endpoint) => endpoint.getLayerByName(layer.name)));
21281
- }
21282
- getLayerLonLatBBox(layer) {
21283
- return this.getLayerFull(layer).pipe(switchMap$1((wmsLayerFull) => from(this.getLonLatBBox(wmsLayerFull))));
21284
- }
21285
- async getLonLatBBox(wmsLayerFull) {
21286
- const { boundingBoxes } = wmsLayerFull;
21287
- const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21288
- if (lonLatCRS) {
21289
- return boundingBoxes[lonLatCRS];
21290
- }
21291
- else {
21292
- const availableEPSGCode = Object.keys(boundingBoxes)[0];
21293
- register(proj4);
21294
- const proj = await fromEPSGCode(availableEPSGCode);
21295
- proj4.defs(availableEPSGCode, proj);
21296
- const bboxWithFiniteNumbers = [
21297
- parseFloat(boundingBoxes[availableEPSGCode][0]),
21298
- parseFloat(boundingBoxes[availableEPSGCode][1]),
21299
- parseFloat(boundingBoxes[availableEPSGCode][2]),
21300
- parseFloat(boundingBoxes[availableEPSGCode][3]),
21301
- ];
21302
- const extent = transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21303
- return extent;
21304
- }
21305
- }
21306
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21307
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, providedIn: 'root' }); }
21308
- }
21309
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, decorators: [{
21310
- type: Injectable,
21311
- args: [{
21312
- providedIn: 'root',
21313
- }]
21314
- }], ctorParameters: function () { return [{ type: ProxyService }]; } });
21315
-
21316
21257
  const FEATURE_PROJECTION = 'EPSG:3857';
21317
21258
  const DATA_PROJECTION = 'EPSG:4326';
21259
+ const GEOJSON = new GeoJSON();
21318
21260
  class MapUtilsService {
21319
- constructor(http, wmsUtils) {
21261
+ constructor(http, proxy) {
21320
21262
  this.http = http;
21321
- this.wmsUtils = wmsUtils;
21263
+ this.proxy = proxy;
21322
21264
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21323
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21265
+ return GEOJSON.readFeatures(featureCollection, {
21324
21266
  featureProjection,
21325
21267
  dataProjection,
21326
21268
  });
21327
- return olFeatures;
21328
21269
  };
21329
21270
  }
21330
21271
  createEmptyMap() {
21331
- const map = new Map$1({
21272
+ return new Map$1({
21332
21273
  controls: [],
21333
21274
  pixelRatio: 1,
21334
21275
  });
21335
- return map;
21336
21276
  }
21337
21277
  isWMSLayer(layer) {
21338
21278
  return (layer.getSource() instanceof TileWMS ||
@@ -21347,8 +21287,7 @@ class MapUtilsService {
21347
21287
  ...source.getParams(),
21348
21288
  INFO_FORMAT: 'application/json',
21349
21289
  };
21350
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21351
- return url;
21290
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21352
21291
  }
21353
21292
  getVectorFeaturesFromClick(olMap, event) {
21354
21293
  const features = [];
@@ -21376,38 +21315,56 @@ class MapUtilsService {
21376
21315
  /**
21377
21316
  * Will emit `null` if no extent could be computed
21378
21317
  */
21379
- getLayerExtent(layer) {
21380
- let geographicExtent;
21318
+ async getLayerExtent(layer) {
21319
+ let latLonExtent;
21381
21320
  if (layer &&
21382
21321
  layer.type === 'geojson' &&
21383
21322
  'data' in layer &&
21384
21323
  typeof layer.data === 'object' &&
21385
21324
  layer.data.features[0] &&
21386
21325
  layer.data.features[0].geometry) {
21387
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21388
- .readFeatures(layerData)
21326
+ latLonExtent = new GeoJSON()
21327
+ .readFeatures(layer.data)
21389
21328
  .map((feature) => feature.getGeometry())
21390
21329
  .filter((geom) => !!geom)
21391
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21330
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21392
21331
  }
21393
21332
  else if (layer && layer.type === 'wms') {
21394
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21333
+ latLonExtent = await this.getWmsLayerExtent(layer);
21395
21334
  }
21396
21335
  else if (layer && layer.type === 'wmts') {
21397
21336
  if (layer.extent) {
21398
- geographicExtent = of(layer.extent);
21337
+ latLonExtent = layer.extent;
21399
21338
  }
21400
21339
  else {
21401
- return of(layer.options.tileGrid.getExtent());
21340
+ return layer.options.tileGrid.getExtent();
21402
21341
  }
21403
21342
  }
21404
21343
  else {
21405
- 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');
21406
21367
  }
21407
- return geographicExtent.pipe(map$1((extent) => [
21408
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
21409
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
21410
- ]), map$1((extent) => (isEmpty(extent) ? null : extent)));
21411
21368
  }
21412
21369
  getWmtsLayerFromCapabilities(link) {
21413
21370
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21463,7 +21420,18 @@ ${e.stack || e.message || e}`);
21463
21420
  ])
21464
21421
  .getArray());
21465
21422
  }
21466
- 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 }); }
21467
21435
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21468
21436
  }
21469
21437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21471,7 +21439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21471
21439
  args: [{
21472
21440
  providedIn: 'root',
21473
21441
  }]
21474
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21442
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21475
21443
  function dragPanCondition(event) {
21476
21444
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21477
21445
  if (!dragPanCondition) {
@@ -22546,6 +22514,7 @@ const DEFAULT_VIEW = {
22546
22514
  center: [0, 15],
22547
22515
  zoom: 2,
22548
22516
  };
22517
+ const WFS_MAX_FEATURES = 10000;
22549
22518
  class MapContextService {
22550
22519
  constructor(mapUtils, styleService) {
22551
22520
  this.mapUtils = mapUtils;
@@ -22604,6 +22573,7 @@ class MapContextService {
22604
22573
  urlObj.searchParams.set('typename', layerModel.name);
22605
22574
  urlObj.searchParams.set('srsname', 'EPSG:3857');
22606
22575
  urlObj.searchParams.set('bbox', `${extent.join(',')},EPSG:3857`);
22576
+ urlObj.searchParams.set('maxFeatures', WFS_MAX_FEATURES.toString());
22607
22577
  return urlObj.toString();
22608
22578
  },
22609
22579
  strategy: bbox,
@@ -23151,6 +23121,7 @@ class ThumbnailComponent {
23151
23121
  constructor(optionalPlaceholderUrl) {
23152
23122
  this.optionalPlaceholderUrl = optionalPlaceholderUrl;
23153
23123
  this.fit = 'cover';
23124
+ this.placeholderShown = new EventEmitter();
23154
23125
  this.placeholderUrl = this.optionalPlaceholderUrl || DEFAULT_PLACEHOLDER;
23155
23126
  this.images = [];
23156
23127
  }
@@ -23186,6 +23157,7 @@ class ThumbnailComponent {
23186
23157
  setNewSrcImage(image) {
23187
23158
  this.imgFit = image.fit;
23188
23159
  this.imgUrl = image.url;
23160
+ this.placeholderShown.emit(this.isPlaceholder);
23189
23161
  }
23190
23162
  setPlaceholder() {
23191
23163
  this.setNewSrcImage({ url: this.placeholderUrl, fit: 'scale-down' });
@@ -23208,7 +23180,7 @@ class ThumbnailComponent {
23208
23180
  }
23209
23181
  }
23210
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 }); }
23211
- 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 }); }
23212
23184
  }
23213
23185
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23214
23186
  type: Component,
@@ -23228,11 +23200,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23228
23200
  }], containerElement: [{
23229
23201
  type: ViewChild,
23230
23202
  args: ['containerElement']
23203
+ }], placeholderShown: [{
23204
+ type: Output
23231
23205
  }] } });
23232
23206
 
23233
23207
  class RecordPreviewCardComponent extends RecordPreviewComponent {
23234
23208
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23235
- 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 }); }
23236
23210
  }
23237
23211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewCardComponent, decorators: [{
23238
23212
  type: Component,
@@ -23241,7 +23215,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23241
23215
 
23242
23216
  class RecordPreviewListComponent extends RecordPreviewComponent {
23243
23217
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23244
- 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 }); }
23245
23219
  }
23246
23220
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewListComponent, decorators: [{
23247
23221
  type: Component,
@@ -23389,7 +23363,7 @@ class RecordPreviewRowComponent extends RecordPreviewComponent {
23389
23363
  this.elementRef = elementRef;
23390
23364
  }
23391
23365
  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 }); }
23392
- 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 }); }
23366
+ 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 }); }
23393
23367
  }
23394
23368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewRowComponent, decorators: [{
23395
23369
  type: Component,
@@ -23407,7 +23381,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23407
23381
 
23408
23382
  class RecordPreviewTitleComponent extends RecordPreviewComponent {
23409
23383
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23410
- 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 }); }
23384
+ 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 }); }
23411
23385
  }
23412
23386
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewTitleComponent, decorators: [{
23413
23387
  type: Component,
@@ -23447,7 +23421,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
23447
23421
  return this.timeFormat.format(this.record.recordCreated, Date.now());
23448
23422
  }
23449
23423
  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 }); }
23450
- 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 }); }
23424
+ 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 }); }
23451
23425
  }
23452
23426
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordPreviewFeedComponent, decorators: [{
23453
23427
  type: Component,
@@ -23780,22 +23754,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23780
23754
  args: ['contentDiv']
23781
23755
  }] } });
23782
23756
 
23783
- class ContentGhostComponent {
23757
+ class CopyTextButtonComponent {
23784
23758
  constructor() {
23785
- this.ghostClass = '';
23759
+ this.displayText = true;
23760
+ this.rows = 1;
23786
23761
  }
23787
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23788
- 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 }); }
23762
+ copyText(event) {
23763
+ navigator.clipboard.writeText(this.text);
23764
+ event.target.blur();
23765
+ }
23766
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23767
+ 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 }); }
23789
23768
  }
23790
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, decorators: [{
23769
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
23791
23770
  type: Component,
23792
- 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"] }]
23793
- }], propDecorators: { showContent: [{
23771
+ 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" }]
23772
+ }], propDecorators: { text: [{
23794
23773
  type: Input
23795
- }], ghostClass: [{
23774
+ }], tooltipText: [{
23796
23775
  type: Input
23797
- }] } });
23798
-
23776
+ }], displayText: [{
23777
+ type: Input
23778
+ }], rows: [{
23779
+ type: Input
23780
+ }] } });
23781
+
23782
+ class ContentGhostComponent {
23783
+ constructor() {
23784
+ this.ghostClass = '';
23785
+ }
23786
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23787
+ 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 }); }
23788
+ }
23789
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, decorators: [{
23790
+ type: Component,
23791
+ 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"] }]
23792
+ }], propDecorators: { showContent: [{
23793
+ type: Input
23794
+ }], ghostClass: [{
23795
+ type: Input
23796
+ }] } });
23797
+
23799
23798
  /* eslint-disable @angular-eslint/directive-selector */
23800
23799
  class GnUiLinkifyDirective {
23801
23800
  constructor(el, renderer) {
@@ -23939,11 +23938,11 @@ class MarkdownParserComponent {
23939
23938
  return marked.parse(this.textContent);
23940
23939
  }
23941
23940
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23942
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host /deep/ .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host /deep/ .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host /deep/ .markdown-body h1,:host /deep/ .markdown-body h2,:host /deep/ .markdown-body h3,:host /deep/ .markdown-body h4,:host /deep/ .markdown-body h5,:host /deep/ .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host /deep/ .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host /deep/ .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host /deep/ .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host /deep/ .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host /deep/ .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host /deep/ .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host /deep/ .markdown-body p{margin-top:0;margin-bottom:10px}:host /deep/ .markdown-body p > a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host /deep/ .markdown-body p > a:hover{color:var(--color-primary-darker)!important}:host /deep/ .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host /deep/ .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host /deep/ .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host /deep/ .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host /deep/ .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host /deep/ .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host /deep/ .markdown-body hr::before{display:table;content:\"\"}:host /deep/ .markdown-body hr::after{display:table;clear:both;content:\"\"}:host /deep/ .markdown-body ul,:host /deep/ .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host /deep/ .markdown-body ol ol,:host /deep/ .markdown-body ul ol{list-style-type:lower-roman}:host /deep/ .markdown-body ul ul ol,:host /deep/ .markdown-body ul ol ol,:host /deep/ .markdown-body ol ul ol,:host /deep/ .markdown-body ol ol ol{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host /deep/ .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host /deep/ .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host /deep/ .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body div > ol:not([type]){list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host /deep/ .markdown-body td,:host /deep/ .markdown-body th{padding:0}:host /deep/ .markdown-body th{color:var(--color-secondary)}:host /deep/ .markdown-body table th,:host /deep/ .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host /deep/ .markdown-body table td > :last-child{margin-bottom:0}:host /deep/ .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host /deep/ .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host /deep/ .markdown-body table img{background-color:transparent}:host /deep/ .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host /deep/ .markdown-body img[align=\"right\"]{padding-left:20px}:host /deep/ .markdown-body img[align=\"left\"]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23941
+ 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 }); }
23943
23942
  }
23944
23943
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23945
23944
  type: Component,
23946
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host /deep/ .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host /deep/ .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host /deep/ .markdown-body h1,:host /deep/ .markdown-body h2,:host /deep/ .markdown-body h3,:host /deep/ .markdown-body h4,:host /deep/ .markdown-body h5,:host /deep/ .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host /deep/ .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host /deep/ .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host /deep/ .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host /deep/ .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host /deep/ .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host /deep/ .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host /deep/ .markdown-body p{margin-top:0;margin-bottom:10px}:host /deep/ .markdown-body p > a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host /deep/ .markdown-body p > a:hover{color:var(--color-primary-darker)!important}:host /deep/ .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host /deep/ .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host /deep/ .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host /deep/ .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host /deep/ .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host /deep/ .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host /deep/ .markdown-body hr::before{display:table;content:\"\"}:host /deep/ .markdown-body hr::after{display:table;clear:both;content:\"\"}:host /deep/ .markdown-body ul,:host /deep/ .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host /deep/ .markdown-body ol ol,:host /deep/ .markdown-body ul ol{list-style-type:lower-roman}:host /deep/ .markdown-body ul ul ol,:host /deep/ .markdown-body ul ol ol,:host /deep/ .markdown-body ol ul ol,:host /deep/ .markdown-body ol ol ol{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host /deep/ .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host /deep/ .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host /deep/ .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body div > ol:not([type]){list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host /deep/ .markdown-body td,:host /deep/ .markdown-body th{padding:0}:host /deep/ .markdown-body th{color:var(--color-secondary)}:host /deep/ .markdown-body table th,:host /deep/ .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host /deep/ .markdown-body table td > :last-child{margin-bottom:0}:host /deep/ .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host /deep/ .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host /deep/ .markdown-body table img{background-color:transparent}:host /deep/ .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host /deep/ .markdown-body img[align=\"right\"]{padding-left:20px}:host /deep/ .markdown-body img[align=\"left\"]{padding-right:20px}\n"] }]
23945
+ 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"] }]
23947
23946
  }], propDecorators: { textContent: [{
23948
23947
  type: Input
23949
23948
  }] } });
@@ -23954,16 +23953,32 @@ class MetadataInfoComponent {
23954
23953
  }
23955
23954
  get hasUsage() {
23956
23955
  return (this.metadata.extras?.isOpenData === true ||
23957
- this.metadata.useLimitations?.length ||
23958
- this.metadata.accessConstraints?.length);
23956
+ (this.metadata.legalConstraints?.length > 0 &&
23957
+ this.legalConstraints.length > 0) ||
23958
+ (this.metadata.otherConstraints?.length > 0 &&
23959
+ this.otherConstraints.length > 0) ||
23960
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
23961
+ }
23962
+ get legalConstraints() {
23963
+ let array = [];
23964
+ if (this.metadata.legalConstraints?.length) {
23965
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
23966
+ }
23967
+ return array;
23959
23968
  }
23960
- get usages() {
23969
+ get otherConstraints() {
23961
23970
  let array = [];
23962
- if (this.metadata.useLimitations?.length) {
23963
- array = array.concat(this.metadata.useLimitations);
23971
+ if (this.metadata.otherConstraints?.length) {
23972
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
23964
23973
  }
23965
- if (this.metadata.accessConstraints?.length) {
23966
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
23974
+ return array;
23975
+ }
23976
+ get licenses() {
23977
+ let array = [];
23978
+ if (this.metadata.licenses?.length) {
23979
+ array = array.concat(this.metadata.licenses
23980
+ .filter((c) => c.text)
23981
+ .map((c) => ({ text: c.text, url: c.url })));
23967
23982
  }
23968
23983
  return array;
23969
23984
  }
@@ -23982,12 +23997,15 @@ class MetadataInfoComponent {
23982
23997
  fieldReady(propName) {
23983
23998
  return !this.incomplete || propName in this.metadata;
23984
23999
  }
24000
+ onKeywordClick(keyword) {
24001
+ this.keyword.emit(keyword);
24002
+ }
23985
24003
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23986
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"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: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24004
+ 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 }); }
23987
24005
  }
23988
24006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
23989
24007
  type: Component,
23990
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"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"] }]
24008
+ 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"] }]
23991
24009
  }], propDecorators: { metadata: [{
23992
24010
  type: Input
23993
24011
  }], incomplete: [{
@@ -24056,11 +24074,11 @@ class ButtonComponent {
24056
24074
  propagateToDocumentOnly(event);
24057
24075
  }
24058
24076
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24059
- 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 }); }
24077
+ 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 }); }
24060
24078
  }
24061
24079
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24062
24080
  type: Component,
24063
- 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"] }]
24081
+ 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"] }]
24064
24082
  }], propDecorators: { type: [{
24065
24083
  type: Input
24066
24084
  }], disabled: [{
@@ -24135,40 +24153,15 @@ class DownloadsListComponent {
24135
24153
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24136
24154
  }
24137
24155
  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 }); }
24138
- 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 }); }
24156
+ 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 }); }
24139
24157
  }
24140
24158
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24141
24159
  type: Component,
24142
- 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" }]
24160
+ 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" }]
24143
24161
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24144
24162
  type: Input
24145
24163
  }] } });
24146
24164
 
24147
- class CopyTextButtonComponent {
24148
- constructor() {
24149
- this.displayText = true;
24150
- this.rows = 1;
24151
- }
24152
- copyText(event) {
24153
- navigator.clipboard.writeText(this.text);
24154
- event.target.blur();
24155
- }
24156
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24157
- 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 }); }
24158
- }
24159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24160
- type: Component,
24161
- 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" }]
24162
- }], propDecorators: { text: [{
24163
- type: Input
24164
- }], tooltipText: [{
24165
- type: Input
24166
- }], displayText: [{
24167
- type: Input
24168
- }], rows: [{
24169
- type: Input
24170
- }] } });
24171
-
24172
24165
  class ApiCardComponent {
24173
24166
  constructor() {
24174
24167
  this.currentlyActive = false;
@@ -24365,11 +24358,11 @@ class CarouselComponent {
24365
24358
  this.emblaApi.scrollTo(stepIndex);
24366
24359
  }
24367
24360
  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 }); }
24368
- 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 }); }
24361
+ 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 }); }
24369
24362
  }
24370
24363
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24371
24364
  type: Component,
24372
- 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"] }]
24365
+ 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"] }]
24373
24366
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24374
24367
  type: Input
24375
24368
  }], stepsContainerClass: [{
@@ -24413,6 +24406,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24413
24406
  }]
24414
24407
  }] });
24415
24408
 
24409
+ class InteractiveTableColumnComponent {
24410
+ constructor() {
24411
+ this.grow = false;
24412
+ this.sortable = false;
24413
+ this.activeSort = null;
24414
+ this.sortChange = new EventEmitter();
24415
+ }
24416
+ handleSortChange() {
24417
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24418
+ this.sortChange.emit(this.activeSort);
24419
+ }
24420
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24421
+ 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 }); }
24422
+ }
24423
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24424
+ type: Component,
24425
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24426
+ }], propDecorators: { header: [{
24427
+ type: ContentChild,
24428
+ args: ['header']
24429
+ }], cell: [{
24430
+ type: ContentChild,
24431
+ args: ['cell']
24432
+ }], grow: [{
24433
+ type: Input
24434
+ }], sortable: [{
24435
+ type: Input
24436
+ }], activeSort: [{
24437
+ type: Input
24438
+ }], sortChange: [{
24439
+ type: Output
24440
+ }] } });
24441
+
24442
+ class InteractiveTableComponent {
24443
+ constructor() {
24444
+ this.items = [];
24445
+ this.itemClick = new EventEmitter();
24446
+ }
24447
+ get gridStyle() {
24448
+ return {
24449
+ 'grid-template-columns': this.columns
24450
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24451
+ .join(' '),
24452
+ };
24453
+ }
24454
+ handleRowClick(item) {
24455
+ this.itemClick.emit(item);
24456
+ }
24457
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24458
+ 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 }); }
24459
+ }
24460
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24461
+ type: Component,
24462
+ 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"] }]
24463
+ }], propDecorators: { columns: [{
24464
+ type: ContentChildren,
24465
+ args: [InteractiveTableColumnComponent]
24466
+ }], items: [{
24467
+ type: Input
24468
+ }], itemClick: [{
24469
+ type: Output
24470
+ }] } });
24471
+
24416
24472
  class LinkCardComponent {
24417
24473
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24418
24474
  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 }); }
@@ -24426,11 +24482,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24426
24482
 
24427
24483
  class RelatedRecordCardComponent {
24428
24484
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24429
- 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 }); }
24485
+ 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 }); }
24430
24486
  }
24431
24487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
24432
24488
  type: Component,
24433
- 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" }]
24489
+ 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" }]
24434
24490
  }], propDecorators: { record: [{
24435
24491
  type: Input
24436
24492
  }] } });
@@ -24458,11 +24514,11 @@ class MetadataContactComponent {
24458
24514
  this.organizationClick.emit(this.shownOrganization);
24459
24515
  }
24460
24516
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24461
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6 sm:mb-12\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24517
+ 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 }); }
24462
24518
  }
24463
24519
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24464
24520
  type: Component,
24465
- args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6 sm:mb-12\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24521
+ 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" }]
24466
24522
  }], propDecorators: { metadata: [{
24467
24523
  type: Input
24468
24524
  }], organizationClick: [{
@@ -24866,11 +24922,11 @@ class DropdownMultiselectComponent {
24866
24922
  this.setFocus();
24867
24923
  }
24868
24924
  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 }); }
24869
- 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 }); }
24925
+ 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 }); }
24870
24926
  }
24871
24927
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24872
24928
  type: Component,
24873
- 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" }]
24929
+ 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" }]
24874
24930
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24875
24931
  type: Input
24876
24932
  }], choices: [{
@@ -25129,11 +25185,11 @@ class AutocompleteComponent {
25129
25185
  }
25130
25186
  }
25131
25187
  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 }); }
25132
- 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 }); }
25188
+ 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 }); }
25133
25189
  }
25134
25190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25135
25191
  type: Component,
25136
- 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"] }]
25192
+ 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"] }]
25137
25193
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25138
25194
  type: Input
25139
25195
  }], action: [{
@@ -25509,11 +25565,11 @@ class CheckboxComponent {
25509
25565
  this.changed.emit(this.checked);
25510
25566
  }
25511
25567
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25512
- 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 }); }
25568
+ 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 }); }
25513
25569
  }
25514
25570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25515
25571
  type: Component,
25516
- 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"] }]
25572
+ 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"] }]
25517
25573
  }], propDecorators: { type: [{
25518
25574
  type: Input
25519
25575
  }], checked: [{
@@ -25568,6 +25624,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25568
25624
  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"] }]
25569
25625
  }] });
25570
25626
 
25627
+ class EditableLabelDirective {
25628
+ constructor(el, renderer) {
25629
+ this.el = el;
25630
+ this.renderer = renderer;
25631
+ this.editableLabelChanged = new EventEmitter();
25632
+ }
25633
+ ngAfterViewInit() {
25634
+ if (this.gnUiEditableLabel !== false) {
25635
+ const appendedInput = this.renderer.createElement('input');
25636
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25637
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25638
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25639
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25640
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25641
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25642
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25643
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25644
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25645
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25646
+ const hostContent = this.el.nativeElement.textContent || '';
25647
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25648
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25649
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25650
+ this.renderer.listen(appendedInput, 'input', (event) => {
25651
+ this.editableLabelChanged.emit(event.target.value);
25652
+ });
25653
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25654
+ }
25655
+ }
25656
+ 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 }); }
25657
+ 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 }); }
25658
+ }
25659
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25660
+ type: Directive,
25661
+ args: [{
25662
+ selector: '[gnUiEditableLabel]',
25663
+ standalone: true,
25664
+ }]
25665
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25666
+ type: Output
25667
+ }], gnUiEditableLabel: [{
25668
+ type: Input
25669
+ }] } });
25670
+
25571
25671
  class UiInputsModule {
25572
25672
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25573
25673
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
@@ -25607,7 +25707,8 @@ class UiInputsModule {
25607
25707
  MatFormFieldModule,
25608
25708
  MatInputModule,
25609
25709
  MatDatepickerModule,
25610
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25710
+ MatNativeDateModule,
25711
+ EditableLabelDirective], exports: [DropdownSelectorComponent,
25611
25712
  AutocompleteComponent,
25612
25713
  ButtonComponent,
25613
25714
  TextInputComponent,
@@ -25623,7 +25724,8 @@ class UiInputsModule {
25623
25724
  CopyTextButtonComponent,
25624
25725
  CheckboxComponent,
25625
25726
  SearchInputComponent,
25626
- DateRangePickerComponent] }); }
25727
+ DateRangePickerComponent,
25728
+ EditableLabelDirective] }); }
25627
25729
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25628
25730
  TranslateModule.forChild(),
25629
25731
  NgxDropzoneModule,
@@ -25689,6 +25791,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25689
25791
  MatInputModule,
25690
25792
  MatDatepickerModule,
25691
25793
  MatNativeDateModule,
25794
+ EditableLabelDirective,
25692
25795
  ],
25693
25796
  exports: [
25694
25797
  DropdownSelectorComponent,
@@ -25708,6 +25811,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25708
25811
  CheckboxComponent,
25709
25812
  SearchInputComponent,
25710
25813
  DateRangePickerComponent,
25814
+ EditableLabelDirective,
25711
25815
  ],
25712
25816
  }]
25713
25817
  }] });
@@ -25807,7 +25911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25807
25911
 
25808
25912
  const DEFAULT_PARAMS = {
25809
25913
  OFFSET: '',
25810
- LIMIT: '',
25914
+ LIMIT: '-1',
25811
25915
  FORMAT: 'json',
25812
25916
  };
25813
25917
  class RecordApiFormComponent {
@@ -25836,6 +25940,8 @@ class RecordApiFormComponent {
25836
25940
  }
25837
25941
  return outputUrl;
25838
25942
  }));
25943
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
25944
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25839
25945
  }
25840
25946
  set apiLink(value) {
25841
25947
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25845,10 +25951,11 @@ class RecordApiFormComponent {
25845
25951
  this.offset$.next(value);
25846
25952
  }
25847
25953
  setLimit(value) {
25848
- this.limit$.next(value);
25954
+ const newLimit = value === '' ? '-1' : value;
25955
+ this.limit$.next(newLimit);
25849
25956
  }
25850
25957
  setFormat(value) {
25851
- this.format$.next(value);
25958
+ this.format$.next(String(value));
25852
25959
  }
25853
25960
  resetUrl() {
25854
25961
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25856,15 +25963,34 @@ class RecordApiFormComponent {
25856
25963
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25857
25964
  }
25858
25965
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25859
- 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 }); }
25966
+ 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 }); }
25860
25967
  }
25861
25968
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25862
25969
  type: Component,
25863
- 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"] }]
25970
+ 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"] }]
25864
25971
  }], propDecorators: { apiLink: [{
25865
25972
  type: Input
25866
25973
  }] } });
25867
25974
 
25975
+ class ImageOverlayPreviewComponent {
25976
+ constructor() {
25977
+ this.isPlaceholderShown = new EventEmitter();
25978
+ }
25979
+ openLightbox(src) {
25980
+ basicLightbox.create(`<img src="${src}"/>`).show();
25981
+ }
25982
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25983
+ 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"] }] }); }
25984
+ }
25985
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25986
+ type: Component,
25987
+ 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" }]
25988
+ }], propDecorators: { imageUrl: [{
25989
+ type: Input
25990
+ }], isPlaceholderShown: [{
25991
+ type: Output
25992
+ }] } });
25993
+
25868
25994
  class UiElementsModule {
25869
25995
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25870
25996
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -25887,7 +26013,8 @@ class UiElementsModule {
25887
26013
  PaginationButtonsComponent,
25888
26014
  MaxLinesComponent,
25889
26015
  RecordApiFormComponent,
25890
- MarkdownParserComponent], imports: [CommonModule,
26016
+ MarkdownParserComponent,
26017
+ ImageOverlayPreviewComponent], imports: [CommonModule,
25891
26018
  MatIconModule,
25892
26019
  MatTooltipModule,
25893
26020
  UiWidgetsModule,
@@ -25912,8 +26039,10 @@ class UiElementsModule {
25912
26039
  AvatarComponent,
25913
26040
  UserPreviewComponent,
25914
26041
  PaginationButtonsComponent,
26042
+ MaxLinesComponent,
25915
26043
  RecordApiFormComponent,
25916
- MarkdownParserComponent] }); }
26044
+ MarkdownParserComponent,
26045
+ ImageOverlayPreviewComponent] }); }
25917
26046
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, imports: [CommonModule,
25918
26047
  MatIconModule,
25919
26048
  MatTooltipModule,
@@ -25963,6 +26092,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25963
26092
  MaxLinesComponent,
25964
26093
  RecordApiFormComponent,
25965
26094
  MarkdownParserComponent,
26095
+ ImageOverlayPreviewComponent,
25966
26096
  ],
25967
26097
  exports: [
25968
26098
  MetadataInfoComponent,
@@ -25982,149 +26112,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25982
26112
  AvatarComponent,
25983
26113
  UserPreviewComponent,
25984
26114
  PaginationButtonsComponent,
26115
+ MaxLinesComponent,
25985
26116
  RecordApiFormComponent,
25986
26117
  MarkdownParserComponent,
26118
+ ImageOverlayPreviewComponent,
25987
26119
  ],
25988
26120
  }]
25989
26121
  }] });
25990
26122
 
25991
- class RecordTableComponent {
25992
- constructor() {
25993
- this.selectedRecords = [];
25994
- this.records = [];
25995
- this.recordClick = new EventEmitter();
25996
- this.recordsSelect = new EventEmitter();
25997
- this.recordsDeselect = new EventEmitter();
25998
- this.sortByChange = new EventEmitter();
25999
- }
26000
- dateToString(date) {
26001
- return date?.toLocaleDateString(undefined, {
26002
- year: 'numeric',
26003
- month: 'long',
26004
- day: 'numeric',
26005
- timeZone: 'UTC',
26006
- });
26007
- }
26008
- getStatus(isPublishedToAll) {
26009
- return isPublishedToAll ? 'published' : 'not published';
26010
- }
26011
- formatUserInfo(userInfo) {
26012
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
26013
- if (infos && infos.length === 4) {
26014
- return `${infos[2]} ${infos[1]}`;
26015
- }
26016
- return undefined;
26017
- }
26018
- getRecordFormats(record) {
26019
- if (record.kind === 'service' || !('distributions' in record)) {
26020
- return [];
26021
- }
26022
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
26023
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
26024
- return formats;
26025
- }
26026
- getBadgeColor(format) {
26027
- return getBadgeColor(format);
26028
- }
26029
- getOrderForColumn(col) {
26030
- if (!this.sortBy) {
26031
- return null;
26032
- }
26033
- let order = null;
26034
- const sortedArray = Array.isArray(this.sortBy[0])
26035
- ? this.sortBy
26036
- : [this.sortBy];
26037
- sortedArray.forEach((sortedCol) => {
26038
- if (sortedCol[1] === col) {
26039
- order = sortedCol[0];
26040
- }
26041
- });
26042
- return order;
26043
- }
26044
- setSortBy(col) {
26045
- const sortOrder = this.getOrderForColumn(col);
26046
- let newOrder;
26047
- if (sortOrder) {
26048
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
26049
- }
26050
- else {
26051
- newOrder = 'asc';
26052
- }
26053
- this.sortByChange.emit([newOrder, col]);
26054
- this.sortBy = [newOrder, col];
26055
- }
26056
- isSortedBy(col, order) {
26057
- const sortOrder = this.getOrderForColumn(col);
26058
- return sortOrder === order;
26059
- }
26060
- isChecked(record) {
26061
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
26062
- return true;
26063
- }
26064
- return false;
26065
- }
26066
- handleRecordSelectedChange(selected, record) {
26067
- if (!selected) {
26068
- this.recordsDeselect.emit([record]);
26069
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
26070
- }
26071
- else {
26072
- this.recordsSelect.emit([record]);
26073
- this.selectedRecords.push(record.uniqueIdentifier);
26074
- }
26075
- }
26076
- selectAll() {
26077
- if (this.isAllSelected()) {
26078
- this.recordsDeselect.emit(this.records);
26079
- this.selectedRecords = [];
26080
- }
26081
- else {
26082
- this.recordsSelect.emit(this.records);
26083
- this.selectedRecords = this.records.map((record) => {
26084
- return record.uniqueIdentifier;
26085
- });
26086
- }
26087
- }
26088
- isAllSelected() {
26089
- if (this.selectedRecords.length === this.records.length) {
26090
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
26091
- if (allRecords.length === this.records.length) {
26092
- return true;
26093
- }
26094
- }
26095
- return false;
26096
- }
26097
- isSomeSelected() {
26098
- if (this.selectedRecords.length > 0 &&
26099
- this.selectedRecords.length < this.records.length) {
26100
- return true;
26101
- }
26102
- return false;
26103
- }
26104
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26105
- 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"] }] }); }
26106
- }
26107
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26108
- type: Component,
26109
- 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"] }]
26110
- }], propDecorators: { selectedRecords: [{
26111
- type: Input
26112
- }], records: [{
26113
- type: Input
26114
- }], totalHits: [{
26115
- type: Input
26116
- }], sortBy: [{
26117
- type: Input
26118
- }], recordClick: [{
26119
- type: Output
26120
- }], recordsSelect: [{
26121
- type: Output
26122
- }], recordsDeselect: [{
26123
- type: Output
26124
- }], sortByChange: [{
26125
- type: Output
26126
- }] } });
26127
-
26128
26123
  class UiSearchModule {
26129
26124
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26130
26125
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26137,8 +26132,7 @@ class UiSearchModule {
26137
26132
  ResultsHitsNumberComponent,
26138
26133
  ResultsListItemComponent,
26139
26134
  RecordPreviewFeedComponent,
26140
- RecordPreviewRowComponent,
26141
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26135
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26142
26136
  FacetsModule$1,
26143
26137
  FormsModule,
26144
26138
  ReactiveFormsModule,
@@ -26149,7 +26143,8 @@ class UiSearchModule {
26149
26143
  UiElementsModule,
26150
26144
  MatIconModule,
26151
26145
  MatCheckboxModule,
26152
- RouterLink], exports: [RecordPreviewListComponent,
26146
+ RouterLink,
26147
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26153
26148
  RecordPreviewCardComponent,
26154
26149
  RecordPreviewTextComponent,
26155
26150
  RecordPreviewTitleComponent,
@@ -26159,8 +26154,7 @@ class UiSearchModule {
26159
26154
  RecordPreviewComponent,
26160
26155
  ResultsHitsNumberComponent,
26161
26156
  RecordPreviewFeedComponent,
26162
- RecordPreviewRowComponent,
26163
- RecordTableComponent] }); }
26157
+ RecordPreviewRowComponent] }); }
26164
26158
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26165
26159
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26166
26160
  ], imports: [CommonModule,
@@ -26175,7 +26169,8 @@ class UiSearchModule {
26175
26169
  UiInputsModule,
26176
26170
  UiElementsModule,
26177
26171
  MatIconModule,
26178
- MatCheckboxModule, FacetsModule$1] }); }
26172
+ MatCheckboxModule,
26173
+ InteractiveTableComponent, FacetsModule$1] }); }
26179
26174
  }
26180
26175
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26181
26176
  type: NgModule,
@@ -26192,7 +26187,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26192
26187
  ResultsListItemComponent,
26193
26188
  RecordPreviewFeedComponent,
26194
26189
  RecordPreviewRowComponent,
26195
- RecordTableComponent,
26196
26190
  ],
26197
26191
  imports: [
26198
26192
  CommonModule,
@@ -26209,6 +26203,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26209
26203
  MatIconModule,
26210
26204
  MatCheckboxModule,
26211
26205
  RouterLink,
26206
+ InteractiveTableComponent,
26212
26207
  ],
26213
26208
  exports: [
26214
26209
  RecordPreviewListComponent,
@@ -26222,7 +26217,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26222
26217
  ResultsHitsNumberComponent,
26223
26218
  RecordPreviewFeedComponent,
26224
26219
  RecordPreviewRowComponent,
26225
- RecordTableComponent,
26226
26220
  ],
26227
26221
  providers: [
26228
26222
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26781,6 +26775,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26781
26775
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26782
26776
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26783
26777
 
26778
+ // this geometry will be used to filter & boost results accordingly
26779
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26780
+
26784
26781
  class SearchFacade {
26785
26782
  constructor(store, filterGeometry) {
26786
26783
  this.store = store;
@@ -26885,6 +26882,7 @@ class SearchFacade {
26885
26882
  this.store.dispatch(new SetFilters({}, this.searchId));
26886
26883
  this.store.dispatch(new SetSortBy([], this.searchId));
26887
26884
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
26885
+ return this;
26888
26886
  }
26889
26887
  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 }); }
26890
26888
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27269,8 +27267,11 @@ class FuzzySearchComponent {
27269
27267
  this.searchService.updateFilters({ any });
27270
27268
  }
27271
27269
  }
27272
- handleInputCleared() {
27273
- this.searchService.updateFilters({ any: '' });
27270
+ async handleInputCleared() {
27271
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27272
+ if (currentSearchFilters.any) {
27273
+ this.searchService.updateFilters({ any: '' });
27274
+ }
27274
27275
  }
27275
27276
  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 }); }
27276
27277
  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 }); }
@@ -27350,6 +27351,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27350
27351
  args: [RESULTS_LAYOUT_CONFIG]
27351
27352
  }] }]; } });
27352
27353
 
27354
+ // expects the replacement key ${uuid}
27355
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27356
+
27353
27357
  class FavoriteStarComponent {
27354
27358
  set record(value) {
27355
27359
  this.record_ = value;
@@ -27611,9 +27615,11 @@ class SearchEffects {
27611
27615
  // I could not get this to work (maybe a bug in rxjs?)
27612
27616
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27613
27617
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27614
- return of([state, favorites, null]);
27618
+ return of([state, favorites, undefined]);
27615
27619
  }
27616
27620
  return this.filterGeometry$.pipe(tap$2((geom) => {
27621
+ if (!geom)
27622
+ return;
27617
27623
  try {
27618
27624
  const trace = valid$1(geom, true);
27619
27625
  if (trace?.length > 0) {
@@ -27625,7 +27631,7 @@ class SearchEffects {
27625
27631
  throw new Error();
27626
27632
  }
27627
27633
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27628
- return of([state, favorites, null]);
27634
+ return of([state, favorites, undefined]);
27629
27635
  }));
27630
27636
  }), switchMap$1(([state, favorites, geometry]) => {
27631
27637
  const { currentPage, pageSize, sort } = state.params;
@@ -28062,10 +28068,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28062
28068
  type: Input
28063
28069
  }] } });
28064
28070
 
28065
- // this geometry will be used to filter & boost results accordingly
28066
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
28067
- // expects the replacement key ${uuid}
28068
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28069
28071
  class FeatureSearchModule {
28070
28072
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28071
28073
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28164,6 +28166,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28164
28166
  }]
28165
28167
  }] });
28166
28168
 
28169
+ class ResultsTableComponent {
28170
+ constructor(searchFacade, searchService, selectionService) {
28171
+ this.searchFacade = searchFacade;
28172
+ this.searchService = searchService;
28173
+ this.selectionService = selectionService;
28174
+ this.recordClick = new EventEmitter();
28175
+ this.records$ = this.searchFacade.results$;
28176
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28177
+ }
28178
+ dateToString(date) {
28179
+ return date?.toLocaleDateString(undefined, {
28180
+ year: 'numeric',
28181
+ month: 'long',
28182
+ day: 'numeric',
28183
+ timeZone: 'UTC',
28184
+ });
28185
+ }
28186
+ getStatus(isPublishedToAll) {
28187
+ return isPublishedToAll ? 'published' : 'not published';
28188
+ }
28189
+ getRecordFormats(record) {
28190
+ if (record.kind === 'service' || !('distributions' in record)) {
28191
+ return [];
28192
+ }
28193
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28194
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28195
+ return formats;
28196
+ }
28197
+ formatUserInfo(userInfo) {
28198
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28199
+ if (infos && infos.length === 4) {
28200
+ return `${infos[2]} ${infos[1]}`;
28201
+ }
28202
+ return undefined;
28203
+ }
28204
+ getBadgeColor(format) {
28205
+ return getBadgeColor(format);
28206
+ }
28207
+ handleRecordClick(item) {
28208
+ this.recordClick.emit(item);
28209
+ }
28210
+ setSortBy(col, order) {
28211
+ this.searchService.setSortBy([order, col]);
28212
+ }
28213
+ isSortedBy(col) {
28214
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28215
+ const sortArray = Array.isArray(sortOrder[0])
28216
+ ? sortOrder
28217
+ : [sortOrder];
28218
+ for (const sort of sortArray) {
28219
+ if (sort[1] === col) {
28220
+ return sort[0];
28221
+ }
28222
+ }
28223
+ return null;
28224
+ }));
28225
+ }
28226
+ isChecked(record) {
28227
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28228
+ return selectedRecords.includes(record.uniqueIdentifier);
28229
+ }));
28230
+ }
28231
+ handleRecordSelectedChange(selected, record) {
28232
+ if (!selected) {
28233
+ this.selectionService.deselectRecords([record]);
28234
+ }
28235
+ else {
28236
+ this.selectionService.selectRecords([record]);
28237
+ }
28238
+ }
28239
+ async toggleSelectAll() {
28240
+ const records = await firstValueFrom(this.records$);
28241
+ if (await firstValueFrom(this.isAllSelected())) {
28242
+ this.selectionService.deselectRecords(records);
28243
+ }
28244
+ else {
28245
+ this.selectionService.selectRecords(records);
28246
+ }
28247
+ }
28248
+ isAllSelected() {
28249
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28250
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28251
+ }));
28252
+ }
28253
+ isSomeSelected() {
28254
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28255
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28256
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28257
+ return !allSelected && someSelected;
28258
+ }));
28259
+ }
28260
+ 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 }); }
28261
+ 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"] }] }); }
28262
+ }
28263
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28264
+ type: Component,
28265
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28266
+ CommonModule,
28267
+ UiInputsModule,
28268
+ InteractiveTableComponent,
28269
+ InteractiveTableColumnComponent,
28270
+ MatIconModule,
28271
+ TranslateModule,
28272
+ ], 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" }]
28273
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28274
+ type: Output
28275
+ }] } });
28276
+
28167
28277
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28168
28278
  get mapLinks() {
28169
28279
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28198,7 +28308,7 @@ class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28198
28308
  return getLinkLabel(link);
28199
28309
  }
28200
28310
  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 }); }
28201
- 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 }); }
28311
+ 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 }); }
28202
28312
  }
28203
28313
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerRecordPreviewComponent, decorators: [{
28204
28314
  type: Component,
@@ -28293,6 +28403,157 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28293
28403
  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" }]
28294
28404
  }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28295
28405
 
28406
+ const INVALID_FILE_FORMAT_ERROR_MESSAGE = 'Invalid file format';
28407
+ class AddLayerFromFileComponent {
28408
+ constructor(mapFacade, changeDetectorRef) {
28409
+ this.mapFacade = mapFacade;
28410
+ this.changeDetectorRef = changeDetectorRef;
28411
+ this.errorMessage = null;
28412
+ this.successMessage = null;
28413
+ this.loading = false;
28414
+ this.acceptedMimeType = ['.geojson'];
28415
+ this.maxFileSize = 5000000;
28416
+ }
28417
+ async handleFileChange(file) {
28418
+ if (!file) {
28419
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28420
+ return;
28421
+ }
28422
+ if (file.size > this.maxFileSize) {
28423
+ this.displayMessage('File size exceeds the limit of 5MB', 'error');
28424
+ return;
28425
+ }
28426
+ await this.addLayer(file);
28427
+ }
28428
+ async addLayer(file) {
28429
+ this.errorMessage = null;
28430
+ this.loading = true;
28431
+ try {
28432
+ if (!this.isFileFormatValid(file)) {
28433
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28434
+ return;
28435
+ }
28436
+ const fileExtension = this.getFileExtension(file);
28437
+ switch (fileExtension) {
28438
+ case 'geojson':
28439
+ await this.addGeoJsonLayer(file);
28440
+ break;
28441
+ default:
28442
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28443
+ break;
28444
+ }
28445
+ }
28446
+ catch (error) {
28447
+ const err = error;
28448
+ this.displayMessage('Error loading file: ' + err.message, 'error');
28449
+ }
28450
+ finally {
28451
+ this.loading = false;
28452
+ }
28453
+ }
28454
+ addGeoJsonLayer(file) {
28455
+ return new Promise((resolve, reject) => {
28456
+ try {
28457
+ const reader = new FileReader();
28458
+ reader.onload = () => {
28459
+ const result = reader.result;
28460
+ const title = file.name.split('.').slice(0, -1).join('.');
28461
+ const layerToAdd = {
28462
+ type: 'geojson',
28463
+ data: result,
28464
+ };
28465
+ this.mapFacade.addLayer({ ...layerToAdd, title: title });
28466
+ this.displayMessage('File successfully added to map', 'success');
28467
+ resolve();
28468
+ };
28469
+ reader.onerror = reject;
28470
+ reader.readAsText(file);
28471
+ }
28472
+ catch (error) {
28473
+ reject(error);
28474
+ }
28475
+ });
28476
+ }
28477
+ isFileFormatValid(file) {
28478
+ const fileExtension = this.getFileExtension(file);
28479
+ return this.acceptedMimeType.includes(`.${fileExtension}`);
28480
+ }
28481
+ getFileExtension(file) {
28482
+ return file.name.split('.').pop();
28483
+ }
28484
+ displayMessage(message, type) {
28485
+ if (type === 'success') {
28486
+ this.successMessage = message;
28487
+ }
28488
+ else if (type === 'error') {
28489
+ this.errorMessage = message;
28490
+ }
28491
+ setTimeout(() => {
28492
+ this.successMessage = null;
28493
+ this.errorMessage = null;
28494
+ this.changeDetectorRef.detectChanges();
28495
+ }, 5000);
28496
+ }
28497
+ 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 }); }
28498
+ 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" }] }); }
28499
+ }
28500
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, decorators: [{
28501
+ type: Component,
28502
+ 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" }]
28503
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28504
+
28505
+ class AddLayerFromWfsComponent {
28506
+ constructor(mapFacade, changeDetectorRef) {
28507
+ this.mapFacade = mapFacade;
28508
+ this.changeDetectorRef = changeDetectorRef;
28509
+ this.wfsUrl = '';
28510
+ this.loading = false;
28511
+ this.layers = [];
28512
+ this.wfsEndpoint = null;
28513
+ this.urlChange = new Subject();
28514
+ this.errorMessage = null;
28515
+ }
28516
+ ngOnInit() {
28517
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => this.loadLayers());
28518
+ }
28519
+ async loadLayers() {
28520
+ this.errorMessage = null;
28521
+ try {
28522
+ this.loading = true;
28523
+ if (this.wfsUrl.trim() === '') {
28524
+ this.layers = [];
28525
+ return;
28526
+ }
28527
+ this.wfsEndpoint = await new WfsEndpoint(this.wfsUrl).isReady();
28528
+ this.layers = this.wfsEndpoint.getFeatureTypes();
28529
+ console.log(this.layers);
28530
+ }
28531
+ catch (error) {
28532
+ const err = error;
28533
+ this.layers = [];
28534
+ this.errorMessage = 'Error loading layers: ' + err.message;
28535
+ }
28536
+ finally {
28537
+ this.loading = false;
28538
+ this.changeDetectorRef.markForCheck();
28539
+ }
28540
+ }
28541
+ addLayer(layer) {
28542
+ const layerToAdd = {
28543
+ name: layer.name,
28544
+ url: this.wfsUrl.toString(),
28545
+ type: MapContextLayerTypeEnum.WFS,
28546
+ };
28547
+ this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
28548
+ }
28549
+ 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 }); }
28550
+ 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" }] }); }
28551
+ }
28552
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
28553
+ type: Component,
28554
+ 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" }]
28555
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28556
+
28296
28557
  class LayersPanelComponent {
28297
28558
  constructor(mapFacade) {
28298
28559
  this.mapFacade = mapFacade;
@@ -28302,11 +28563,11 @@ class LayersPanelComponent {
28302
28563
  this.mapFacade.removeLayer(index);
28303
28564
  }
28304
28565
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
28305
- 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 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: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28566
+ 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 }); }
28306
28567
  }
28307
28568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
28308
28569
  type: Component,
28309
- 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 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" }]
28570
+ 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" }]
28310
28571
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28311
28572
 
28312
28573
  class MapEffects {
@@ -28339,6 +28600,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28339
28600
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28340
28601
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28341
28602
 
28603
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28604
+ class GeocodingService {
28605
+ constructor(provider) {
28606
+ this.provider = provider;
28607
+ }
28608
+ query(text) {
28609
+ let queryObservable;
28610
+ switch (this.provider[0]) {
28611
+ case 'geoadmin':
28612
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28613
+ break;
28614
+ case 'geonames':
28615
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28616
+ break;
28617
+ case 'data-gouv-fr':
28618
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28619
+ break;
28620
+ default:
28621
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28622
+ }
28623
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28624
+ }
28625
+ 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 }); }
28626
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28627
+ }
28628
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28629
+ type: Injectable,
28630
+ args: [{
28631
+ providedIn: 'root',
28632
+ }]
28633
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28634
+ type: Inject,
28635
+ args: [GEOCODING_PROVIDER]
28636
+ }] }]; } });
28637
+
28638
+ class GeocodingComponent {
28639
+ constructor(mapManager, geocodingService) {
28640
+ this.mapManager = mapManager;
28641
+ this.geocodingService = geocodingService;
28642
+ this.searchText = '';
28643
+ this.results = [];
28644
+ this.searchTextChanged = new Subject();
28645
+ this.destroy$ = new Subject();
28646
+ this.errorMessage = null;
28647
+ this.searchTextChanged
28648
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28649
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28650
+ this.errorMessage =
28651
+ 'An error occurred while searching. Please try again.';
28652
+ console.error(error);
28653
+ return [];
28654
+ }));
28655
+ }), takeUntil(this.destroy$))
28656
+ .subscribe((results) => {
28657
+ this.results = results;
28658
+ });
28659
+ }
28660
+ ngOnDestroy() {
28661
+ this.destroy$.next();
28662
+ this.destroy$.complete();
28663
+ }
28664
+ onSearchChange(searchText) {
28665
+ if (!searchText) {
28666
+ this.clearSearch();
28667
+ return;
28668
+ }
28669
+ else {
28670
+ this.searchTextChanged.next(searchText);
28671
+ }
28672
+ }
28673
+ clearSearch() {
28674
+ this.searchText = '';
28675
+ this.results = [];
28676
+ this.errorMessage = null;
28677
+ }
28678
+ zoomToLocation(result) {
28679
+ const map = this.mapManager.map;
28680
+ const view = map.getView();
28681
+ const geometry = result.geom;
28682
+ if (geometry.type === 'Point') {
28683
+ this.zoomToPoint(geometry.coordinates, view);
28684
+ }
28685
+ else if (geometry.type === 'Polygon') {
28686
+ this.zoomToPolygon(geometry.coordinates, view);
28687
+ }
28688
+ else {
28689
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28690
+ }
28691
+ }
28692
+ zoomToPoint(pointCoords, view) {
28693
+ const transformedCoords = fromLonLat(pointCoords);
28694
+ view.setCenter(transformedCoords);
28695
+ view.setZoom(12);
28696
+ }
28697
+ zoomToPolygon(polygonCoords, view) {
28698
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28699
+ const polygon = new Polygon([transformedCoords]);
28700
+ view.fit(polygon, {
28701
+ duration: 100,
28702
+ maxZoom: 12,
28703
+ });
28704
+ }
28705
+ onEnterPress() {
28706
+ if (this.results && this.results.length > 0) {
28707
+ this.zoomToLocation(this.results[0]);
28708
+ }
28709
+ }
28710
+ 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 }); }
28711
+ 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" }] }); }
28712
+ }
28713
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28714
+ type: Component,
28715
+ 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" }]
28716
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28717
+
28342
28718
  class FeatureMapModule {
28343
28719
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28344
28720
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28347,7 +28723,10 @@ class FeatureMapModule {
28347
28723
  AddLayerFromCatalogComponent,
28348
28724
  MapContainerComponent,
28349
28725
  AddLayerRecordPreviewComponent,
28350
- AddLayerFromWmsComponent], imports: [CommonModule,
28726
+ AddLayerFromWmsComponent,
28727
+ AddLayerFromFileComponent,
28728
+ AddLayerFromWfsComponent,
28729
+ GeocodingComponent], imports: [CommonModule,
28351
28730
  UiMapModule,
28352
28731
  UiLayoutModule,
28353
28732
  MatIconModule,
@@ -28358,13 +28737,18 @@ class FeatureMapModule {
28358
28737
  MapInstanceDirective,
28359
28738
  LayersPanelComponent,
28360
28739
  AddLayerFromCatalogComponent,
28361
- MapContainerComponent] }); }
28740
+ MapContainerComponent,
28741
+ GeocodingComponent] }); }
28362
28742
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28363
28743
  {
28364
28744
  provide: FEATURE_MAP_OPTIONS,
28365
28745
  useValue: defaultMapOptions,
28366
28746
  },
28367
28747
  MapFacade,
28748
+ {
28749
+ provide: GEOCODING_PROVIDER,
28750
+ useValue: ['geonames', { maxRows: 5 }],
28751
+ },
28368
28752
  ], imports: [CommonModule,
28369
28753
  UiMapModule,
28370
28754
  UiLayoutModule,
@@ -28388,6 +28772,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28388
28772
  MapContainerComponent,
28389
28773
  AddLayerRecordPreviewComponent,
28390
28774
  AddLayerFromWmsComponent,
28775
+ AddLayerFromFileComponent,
28776
+ AddLayerFromWfsComponent,
28777
+ GeocodingComponent,
28391
28778
  ],
28392
28779
  exports: [
28393
28780
  MapContextComponent,
@@ -28395,6 +28782,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28395
28782
  LayersPanelComponent,
28396
28783
  AddLayerFromCatalogComponent,
28397
28784
  MapContainerComponent,
28785
+ GeocodingComponent,
28398
28786
  ],
28399
28787
  imports: [
28400
28788
  CommonModule,
@@ -28415,6 +28803,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28415
28803
  useValue: defaultMapOptions,
28416
28804
  },
28417
28805
  MapFacade,
28806
+ {
28807
+ provide: GEOCODING_PROVIDER,
28808
+ useValue: ['geonames', { maxRows: 5 }],
28809
+ },
28418
28810
  ],
28419
28811
  }]
28420
28812
  }] });
@@ -28509,7 +28901,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28509
28901
  ...state,
28510
28902
  chartConfig,
28511
28903
  })), on(close, (state) => {
28512
- // eslint-disable-next-line
28904
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28513
28905
  const { metadata, related, ...stateWithoutMd } = state;
28514
28906
  return stateWithoutMd;
28515
28907
  }));
@@ -29776,15 +30168,16 @@ class DataService {
29776
30168
  // Pour DL toutes les données
29777
30169
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
29778
30170
  ...wfsLink,
30171
+ type: 'download',
29779
30172
  url: new URL(urls[format]),
29780
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30173
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29781
30174
  }))));
29782
30175
  }
29783
30176
  getDownloadLinksFromEsriRest(esriRestLink) {
29784
30177
  return ['json', 'geojson'].map((format) => ({
29785
30178
  ...esriRestLink,
29786
30179
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
29787
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30180
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29788
30181
  }));
29789
30182
  }
29790
30183
  readAsGeoJson(link) {
@@ -30178,12 +30571,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30178
30571
  }] } });
30179
30572
 
30180
30573
  class MapViewComponent {
30181
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30574
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30182
30575
  this.mdViewFacade = mdViewFacade;
30183
30576
  this.mapManager = mapManager;
30184
30577
  this.mapUtils = mapUtils;
30185
30578
  this.dataService = dataService;
30186
- this.proxy = proxy;
30187
30579
  this.featureInfo = featureInfo;
30188
30580
  this.changeRef = changeRef;
30189
30581
  this.styleService = styleService;
@@ -30218,7 +30610,7 @@ class MapViewComponent {
30218
30610
  return of([]);
30219
30611
  }), finalize(() => (this.loading = false)));
30220
30612
  }));
30221
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30613
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30222
30614
  console.warn(error); // FIXME: report this to the user somehow
30223
30615
  return of(undefined);
30224
30616
  }), map$1((extent) => ({
@@ -30226,7 +30618,18 @@ class MapViewComponent {
30226
30618
  view: {
30227
30619
  extent,
30228
30620
  },
30229
- })), tap$1(() => this.resetSelection()))));
30621
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30622
+ if (context.view.extent)
30623
+ return context;
30624
+ const extent = this.mapUtils.getRecordExtent(metadata);
30625
+ return {
30626
+ ...context,
30627
+ view: {
30628
+ ...context.view,
30629
+ extent,
30630
+ },
30631
+ };
30632
+ }));
30230
30633
  }
30231
30634
  ngOnDestroy() {
30232
30635
  this.subscription.unsubscribe();
@@ -30279,13 +30682,13 @@ class MapViewComponent {
30279
30682
  selectLinkToDisplay(link) {
30280
30683
  this.selectedLinkIndex$.next(link);
30281
30684
  }
30282
- 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 }); }
30685
+ 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 }); }
30283
30686
  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 }); }
30284
30687
  }
30285
30688
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30286
30689
  type: Component,
30287
30690
  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" }]
30288
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30691
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30289
30692
 
30290
30693
  class DataViewComponent {
30291
30694
  constructor(mdViewFacade) {
@@ -30368,7 +30771,7 @@ class OrganisationPreviewComponent {
30368
30771
  this.clickedOrganisation.emit(this.organisation);
30369
30772
  }
30370
30773
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30371
- 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 }); }
30774
+ 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 }); }
30372
30775
  }
30373
30776
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationPreviewComponent, decorators: [{
30374
30777
  type: Component,
@@ -30737,13 +31140,6 @@ class MyOrgService {
30737
31140
  constructor(platformService, orgService) {
30738
31141
  this.platformService = platformService;
30739
31142
  this.orgService = orgService;
30740
- this.myOrgDataSubject = new BehaviorSubject({
30741
- orgName: '',
30742
- logoUrl: '',
30743
- recordCount: 0,
30744
- userCount: 0,
30745
- userList: [],
30746
- });
30747
31143
  this.myOrgData$ = combineLatest([
30748
31144
  this.platformService.getMe(),
30749
31145
  this.platformService.getUsers(),
@@ -30762,7 +31158,7 @@ class MyOrgService {
30762
31158
  userList,
30763
31159
  userCount,
30764
31160
  };
30765
- }));
31161
+ }), shareReplay(1));
30766
31162
  }
30767
31163
  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 }); }
30768
31164
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31455,11 +31851,11 @@ class RecordFormComponent {
31455
31851
  return field.config.model;
31456
31852
  }
31457
31853
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31458
- 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 }); }
31854
+ 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 }); }
31459
31855
  }
31460
31856
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31461
31857
  type: Component,
31462
- 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" }]
31858
+ 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" }]
31463
31859
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31464
31860
 
31465
31861
  const ROUTER_STATE_KEY = 'router';
@@ -31827,5 +32223,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31827
32223
  * Generated bundle index. Do not edit.
31828
32224
  */
31829
32225
 
31830
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, Gn4MetadataMapper, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapUtilsWMSService, MapViewComponent, MarkdownParserComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordTableComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslateTestingModule, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, extensionToFormat, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32226
+ 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 };
31831
32227
  //# sourceMappingURL=geonetwork-ui.mjs.map