geonetwork-ui 2.2.0-dev.aecf1900 → 2.2.0-dev.b0f82edc

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 (351) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +28 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +96 -59
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +7 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +25 -17
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +55 -23
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +52 -32
  9. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  10. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  12. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  13. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  14. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  16. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  17. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  19. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  20. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  21. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  22. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  23. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  24. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  25. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  26. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  27. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +17 -3
  28. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  29. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  30. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  31. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  32. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  33. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  34. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  35. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  36. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +3 -3
  37. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  38. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  39. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  40. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  41. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  42. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  43. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  44. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  45. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  46. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  47. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  48. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  49. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  50. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  51. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  52. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -3
  53. package/esm2022/libs/ui/elements/src/lib/max-lines/max-lines.component.mjs +5 -3
  54. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  55. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +47 -22
  56. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -4
  57. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  58. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +3 -3
  59. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +6 -4
  60. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  61. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  62. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +3 -3
  63. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  64. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  65. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +3 -3
  66. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  67. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  68. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  69. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +12 -7
  70. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  71. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  72. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  73. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  74. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  75. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  76. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  77. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +18 -1
  78. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  79. package/esm2022/libs/util/shared/src/lib/utils/temporal-extent-union.mjs +32 -0
  80. package/esm2022/translations/de.json +35 -25
  81. package/esm2022/translations/en.json +36 -26
  82. package/esm2022/translations/es.json +30 -20
  83. package/esm2022/translations/fr.json +49 -39
  84. package/esm2022/translations/it.json +42 -32
  85. package/esm2022/translations/nl.json +31 -21
  86. package/esm2022/translations/pt.json +30 -20
  87. package/fesm2022/geonetwork-ui.mjs +1251 -837
  88. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  89. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +3 -0
  90. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  91. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  92. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  93. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  94. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +4 -5
  95. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  96. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  97. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  98. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  99. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +7 -6
  100. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  101. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +4 -3
  102. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  103. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  104. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  105. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  106. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  107. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  108. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  109. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  110. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  111. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  112. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +30 -17
  113. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  114. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  115. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  116. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  117. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  118. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  119. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  120. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  121. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  122. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  123. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  124. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  125. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  126. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  127. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  128. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  129. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  130. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  131. package/libs/feature/map/src/index.d.ts +1 -0
  132. package/libs/feature/map/src/index.d.ts.map +1 -1
  133. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  134. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  135. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  136. package/libs/feature/map/src/lib/feature-map.module.d.ts +13 -12
  137. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  138. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  139. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  140. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  141. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  142. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  143. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  144. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  145. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  146. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  147. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  148. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  149. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  150. package/libs/feature/search/src/index.d.ts +3 -0
  151. package/libs/feature/search/src/index.d.ts.map +1 -1
  152. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  153. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  154. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  155. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  156. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  157. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  158. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  159. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  160. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  161. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  162. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  163. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  164. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  165. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  166. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  167. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  168. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  169. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  170. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  171. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  172. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  173. package/libs/ui/elements/src/index.d.ts +1 -0
  174. package/libs/ui/elements/src/index.d.ts.map +1 -1
  175. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  176. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  177. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +1 -1
  178. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +16 -6
  179. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  180. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  181. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  182. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  183. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  184. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  185. package/libs/ui/inputs/src/index.d.ts +1 -0
  186. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  187. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  188. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  189. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  190. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  191. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  192. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  193. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -39
  194. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  195. package/libs/ui/layout/src/index.d.ts +2 -0
  196. package/libs/ui/layout/src/index.d.ts.map +1 -1
  197. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  198. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  199. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  200. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  201. package/libs/ui/search/src/index.d.ts +0 -1
  202. package/libs/ui/search/src/index.d.ts.map +1 -1
  203. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  204. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  205. package/libs/util/i18n/src/index.d.ts +0 -1
  206. package/libs/util/i18n/src/index.d.ts.map +1 -1
  207. package/libs/util/i18n/src/lib/i18n.constants.d.ts +17 -0
  208. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  209. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  210. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  211. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +5 -0
  212. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -0
  213. package/package.json +4 -1
  214. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +63 -8
  215. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +57 -9
  216. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +229 -24
  217. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +32 -0
  218. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +140 -74
  219. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +6 -3
  220. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +4 -5
  221. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  222. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +30 -21
  223. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +120 -63
  224. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +177 -97
  225. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  226. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  227. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  228. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  229. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  230. package/src/libs/common/domain/src/lib/index.ts +2 -0
  231. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +36 -21
  232. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  233. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  234. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  235. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  236. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  237. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  238. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  239. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  240. package/src/libs/common/fixtures/src/lib/elasticsearch/full-response.ts +1 -1
  241. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  242. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +52 -10
  243. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  244. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  245. package/src/libs/feature/map/src/index.ts +1 -0
  246. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  247. package/src/libs/feature/map/src/lib/feature-map.module.ts +8 -0
  248. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  249. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  250. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  251. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  252. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  253. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  254. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  255. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  256. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  257. package/src/libs/feature/search/src/index.ts +3 -0
  258. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  259. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  260. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  261. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  262. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  263. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  264. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  265. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  266. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  267. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  268. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  269. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  270. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  271. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  272. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  273. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  274. package/src/libs/ui/elements/src/index.ts +1 -0
  275. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  276. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
  277. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  278. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  279. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  280. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  281. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  282. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.html +5 -1
  283. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.ts +1 -0
  284. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +2 -2
  285. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +157 -42
  286. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +51 -15
  287. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  288. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  289. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  290. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  291. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  292. package/src/libs/ui/inputs/src/index.ts +1 -0
  293. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  294. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -0
  295. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  296. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +2 -2
  297. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +3 -1
  298. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  299. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  300. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  301. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  302. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +5 -2
  303. package/src/libs/ui/layout/src/index.ts +2 -0
  304. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -0
  305. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  306. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  307. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  308. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  309. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  310. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  311. package/src/libs/ui/search/src/index.ts +0 -1
  312. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  313. package/src/libs/util/i18n/src/index.ts +0 -1
  314. package/src/libs/util/i18n/src/lib/i18n.constants.ts +18 -0
  315. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  316. package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +32 -0
  317. package/tailwind.base.css +2 -2
  318. package/translations/de.json +35 -25
  319. package/translations/en.json +36 -26
  320. package/translations/es.json +30 -20
  321. package/translations/fr.json +49 -39
  322. package/translations/it.json +42 -32
  323. package/translations/nl.json +31 -21
  324. package/translations/pt.json +30 -20
  325. package/translations/sk.json +31 -21
  326. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  327. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  328. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  329. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  330. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  331. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  332. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  333. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  334. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  335. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  336. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  337. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  338. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  339. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  340. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  341. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  342. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  343. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  344. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  345. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  346. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  347. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  348. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  349. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  350. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  351. /package/src/libs/feature/map/src/lib/{utils → constant}/projections.ts +0 -0
@@ -1,18 +1,18 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
2
  import format from 'date-fns/format';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ElementRef, ViewChildren } from '@angular/core';
4
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, ElementRef, ViewChildren } from '@angular/core';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
7
  import * as i1$1 from '@ngx-translate/core';
8
- import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService, TranslateFakeCompiler, TranslateDefaultParser, FakeMissingTranslationHandler } from '@ngx-translate/core';
8
+ import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
10
10
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
11
- import { map as map$1, shareReplay, filter, tap as tap$1, startWith, switchMap as switchMap$1, catchError, take, withLatestFrom, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
11
+ import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestFrom, switchMap as switchMap$1, catchError, take, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, tap as tap$2, fromEvent, timer, from, Subscription, animationFrameScheduler, firstValueFrom, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, EMPTY, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, from, Subscription, animationFrameScheduler, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
18
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
@@ -32,8 +32,8 @@ import WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';
32
32
  import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
33
33
  import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
34
34
  import WMTSCapabilities from 'ol/format/WMTSCapabilities';
35
- import { WmsEndpoint, WfsEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
36
35
  import chroma from 'chroma-js';
36
+ import { WmsEndpoint, WfsEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
37
37
  import { register, fromEPSGCode } from 'ol/proj/proj4';
38
38
  import proj4 from 'proj4/dist/proj4';
39
39
  import * as TOML from '@ltd/j-toml';
@@ -78,6 +78,8 @@ import * as i1$8 from '@ngrx/effects';
78
78
  import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
79
79
  import tippy from 'tippy.js';
80
80
  import { valid as valid$1 } from 'geojson-validation';
81
+ import { Polygon } from 'ol/geom';
82
+ import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
81
83
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
82
84
  import * as i4$1 from '@angular/cdk/scrolling';
83
85
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -585,6 +587,20 @@ function matchMimeType(format) {
585
587
  return format || null;
586
588
  }
587
589
 
590
+ function getKeywordTypeFromKeywordTypeCode(typeCode) {
591
+ if (!typeCode)
592
+ return 'other';
593
+ switch (typeCode) {
594
+ case 'theme':
595
+ case 'place':
596
+ case 'temporal':
597
+ case 'other':
598
+ return typeCode;
599
+ default:
600
+ return 'other';
601
+ }
602
+ }
603
+
588
604
  function extractCharacterString() {
589
605
  return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
590
606
  }
@@ -647,28 +663,32 @@ function extractStatus() {
647
663
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
648
664
  }
649
665
  // from gmd:resourceConstraints
650
- function extractAccessConstraints() {
651
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
652
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
666
+ function extractLegalConstraints() {
667
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
653
669
  text,
654
- type: 'other',
655
670
  })));
656
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
671
+ }
672
+ // from gmd:resourceConstraints
673
+ function extractSecurityConstraints() {
674
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
675
+ ...(url && { url }),
657
676
  text,
658
- type: 'security',
659
677
  })));
660
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
661
678
  }
662
679
  // from gmd:resourceConstraints
663
- function extractUseLimitations() {
664
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
680
+ function extractOtherConstraints() {
681
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
682
+ ...(url && { url }),
683
+ text,
684
+ })));
665
685
  }
666
686
  // from gmd:resourceConstraints
667
687
  function extractLicenses() {
668
- return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(pipe(findChildElement('gmd:otherConstraints'), combine(extractCharacterString(), extractUrl()), map(([text, url]) => ({
688
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
669
689
  ...(url && { url }),
670
690
  text,
671
- })))));
691
+ })));
672
692
  }
673
693
  // from gmd:MD_Distribution
674
694
  function extractDatasetDistributions() {
@@ -812,6 +832,9 @@ function readOwnerOrganization(rootEl) {
812
832
  function readRecordUpdated(rootEl) {
813
833
  return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
814
834
  }
835
+ function readRecordPublished(rootEl) {
836
+ return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
837
+ }
815
838
  function readTitle(rootEl) {
816
839
  return pipe(findIdentification(), findNestedElement('gmd:citation', 'gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
817
840
  }
@@ -827,31 +850,55 @@ function readDatasetUpdated(rootEl) {
827
850
  function readContacts(rootEl) {
828
851
  return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
829
852
  }
830
- function readKeywordsOfType(isTheme) {
831
- return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), filterArray(pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => isTheme === values.indexOf('theme') > -1))), mapArray(findChildrenElement('gmd:keyword')), flattenArray(), mapArray(extractCharacterString()));
853
+ // from gmd:thesaurusName
854
+ function readThesaurus(rootEl) {
855
+ if (!rootEl)
856
+ return null;
857
+ const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
858
+ const id = pipe(findIdentifier, extractCharacterString())(rootEl);
859
+ const url = pipe(findIdentifier, extractUrl())(rootEl);
860
+ const name = pipe(findNestedElement('gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
861
+ return {
862
+ id,
863
+ ...(name && { name }),
864
+ ...(url && { url }),
865
+ };
832
866
  }
833
- function readKeywords(rootEl) {
834
- return readKeywordsOfType(false)(rootEl);
867
+ // from gmd:MD_Keywords
868
+ function readKeywordGroup(rootEl) {
869
+ const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
870
+ const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
871
+ return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
872
+ const label = extractCharacterString()(el);
873
+ return {
874
+ ...(thesaurus ? { thesaurus } : {}),
875
+ label,
876
+ type,
877
+ };
878
+ }))(rootEl);
835
879
  }
836
- function readThemes(rootEl) {
837
- return readKeywordsOfType(true)(rootEl);
880
+ function readKeywords(rootEl) {
881
+ return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), mapArray(readKeywordGroup), flattenArray())(rootEl);
838
882
  }
839
883
  function readStatus(rootEl) {
840
884
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
841
885
  }
842
886
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
843
- function readAccessConstraints(rootEl) {
844
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
887
+ function readLegalConstraints(rootEl) {
888
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
845
889
  }
846
- function readUseLimitations(rootEl) {
847
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
890
+ function readSecurityConstraints(rootEl) {
891
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
892
+ }
893
+ function readOtherConstraints(rootEl) {
894
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
848
895
  }
849
896
  function readLicenses(rootEl) {
850
897
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
851
898
  }
852
899
  // not used yet
853
900
  function readIsoTopics(rootEl) {
854
- return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', false), mapArray(readText()))(rootEl);
901
+ return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', true), mapArray(readText()))(rootEl);
855
902
  }
856
903
  function readSpatialRepresentation(rootEl) {
857
904
  return pipe(findIdentification(), findNestedElement('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), readAttribute('codeListValue'), map(getSpatialRepresentationFromCode))(rootEl);
@@ -1067,33 +1114,50 @@ function updateCitationDate(date, type) {
1067
1114
  function appendCitationDate(date, type) {
1068
1115
  return appendChildren(pipe(createElement('gmd:date'), createChild('gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createElement('gmd:dateType'), createChild('gmd:CI_DateTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), addAttribute('codeListValue', type)))));
1069
1116
  }
1070
- function removeKeywords(type) {
1071
- return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords'), filterArray(pipe(findNestedElement('gmd:MD_Keywords', 'gmd:type', 'gmd:MD_KeywordTypeCode'), readAttribute('codeListValue'),
1072
- // if a specific type is targeted, compare with it; otherwise remove keywords if they have no type defined
1073
- map((typeValue) => (type !== null ? type === typeValue : true))))));
1074
- }
1075
- function appendKeywords(keywords, type) {
1076
- return appendChildren(pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), type !== null
1077
- ? 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)))
1078
- : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1079
- }
1080
- function removeAccessConstraints() {
1081
- const securityConstraintsFilter = pipe(findChildrenElement('gmd:MD_SecurityConstraints'), (array) => array.length > 0);
1082
- // remove legal constraints that *only* have 'otherRestrictions'
1083
- const otherConstraintsFilter = pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code === 'otherRestrictions'));
1084
- return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray((el) => securityConstraintsFilter(el) || otherConstraintsFilter(el))));
1085
- }
1086
- function createAccessConstraint(constraint) {
1087
- if (constraint.type === 'security') {
1117
+ function removeKeywords() {
1118
+ return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords')));
1119
+ }
1120
+ // returns a <gmd:thesaurusName> element
1121
+ function createThesaurus(thesaurus) {
1122
+ return pipe(createElement('gmd:thesaurusName'), createChild('gmd:CI_Citation'), appendChildren(pipe(createElement('gmd:title'), writeCharacterString(thesaurus.name || thesaurus.id)), pipe(createElement('gmd:identifier'), createChild('gmd:MD_Identifier'), appendChildren(pipe(createElement('gmd:code'), thesaurus.url
1123
+ ? writeAnchor(thesaurus.url, thesaurus.id)
1124
+ : writeCharacterString(thesaurus.id))))));
1125
+ }
1126
+ function appendKeywords(keywords) {
1127
+ const keywordsByThesaurus = keywords.reduce((acc, keyword) => {
1128
+ const thesaurusId = keyword.thesaurus?.id;
1129
+ const type = keyword.type;
1130
+ let existingGroup = acc.find((group) => group[0].thesaurus
1131
+ ? group[0].thesaurus.id === thesaurusId
1132
+ : group[0].type === type);
1133
+ if (!existingGroup) {
1134
+ existingGroup = [];
1135
+ acc.push(existingGroup);
1136
+ }
1137
+ existingGroup.push(keyword);
1138
+ return acc;
1139
+ }, []);
1140
+ return appendChildren(...keywordsByThesaurus.map((keywords) => pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', keywords[0].type))), keywords[0].thesaurus
1141
+ ? appendChildren(createThesaurus(keywords[0].thesaurus))
1142
+ : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword.label)))))));
1143
+ }
1144
+ function createConstraint(constraint, type) {
1145
+ if (type === 'security') {
1088
1146
  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))));
1089
1147
  }
1090
- 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))));
1148
+ else if (type === 'legal') {
1149
+ 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))));
1150
+ }
1151
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1091
1152
  }
1092
- function removeUseLimitations() {
1153
+ function removeOtherConstraints() {
1093
1154
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1094
1155
  }
1095
- function createUseLimitation(useLimitation) {
1096
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1156
+ function removeSecurityConstraints() {
1157
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1158
+ }
1159
+ function removeLegalConstraints() {
1160
+ 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')))));
1097
1161
  }
1098
1162
  function removeLicenses() {
1099
1163
  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')))));
@@ -1192,19 +1256,22 @@ function writeContacts(record, rootEl) {
1192
1256
  pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact)))))(rootEl);
1193
1257
  }
1194
1258
  function writeKeywords(record, rootEl) {
1195
- pipe(findOrCreateIdentification(), removeKeywords(null), appendKeywords(record.keywords, null))(rootEl);
1259
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1196
1260
  }
1197
- function writeThemes(record, rootEl) {
1198
- pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1199
- }
1200
- function writeAccessConstraints(record, rootEl) {
1201
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1261
+ function writeTopics(record, rootEl) {
1262
+ pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(createElement('gmd:topicCategory'), createChild('gmd:MD_TopicCategoryCode'), setTextContent(topic)))))(rootEl);
1202
1263
  }
1203
1264
  function writeLicenses(record, rootEl) {
1204
1265
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1205
1266
  }
1206
- function writeUseLimitations(record, rootEl) {
1207
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1267
+ function writeLegalConstraints(record, rootEl) {
1268
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1269
+ }
1270
+ function writeSecurityConstraints(record, rootEl) {
1271
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1272
+ }
1273
+ function writeOtherConstraints(record, rootEl) {
1274
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1208
1275
  }
1209
1276
  function writeUpdateFrequency(record, rootEl) {
1210
1277
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1300,14 +1367,14 @@ function toModel(xml) {
1300
1367
  const contacts = readContacts(rootEl);
1301
1368
  const recordUpdated = readRecordUpdated(rootEl);
1302
1369
  const recordCreated = recordUpdated;
1370
+ const recordPublished = readRecordPublished(rootEl);
1303
1371
  const keywords = readKeywords(rootEl);
1304
- const themes = readThemes(rootEl);
1305
- const accessConstraints = readAccessConstraints(rootEl);
1306
- const useLimitations = readUseLimitations(rootEl);
1372
+ const topics = readIsoTopics(rootEl);
1373
+ const legalConstraints = readLegalConstraints(rootEl);
1374
+ const otherConstraints = readOtherConstraints(rootEl);
1375
+ const securityConstraints = readSecurityConstraints(rootEl);
1307
1376
  const licenses = readLicenses(rootEl);
1308
1377
  const overviews = readOverviews(rootEl);
1309
- // not used yet
1310
- const isoTopics = readIsoTopics(rootEl);
1311
1378
  if (kind === 'dataset') {
1312
1379
  const status = readStatus(rootEl);
1313
1380
  const datasetCreated = readDatasetCreated(rootEl);
@@ -1321,8 +1388,10 @@ function toModel(xml) {
1321
1388
  return {
1322
1389
  uniqueIdentifier,
1323
1390
  kind,
1391
+ languages: [],
1324
1392
  recordCreated,
1325
1393
  recordUpdated,
1394
+ recordPublished,
1326
1395
  status,
1327
1396
  title,
1328
1397
  abstract,
@@ -1330,10 +1399,11 @@ function toModel(xml) {
1330
1399
  contacts,
1331
1400
  contactsForResource: [],
1332
1401
  keywords,
1333
- themes,
1334
- accessConstraints,
1335
- useLimitations,
1402
+ topics,
1336
1403
  licenses,
1404
+ legalConstraints,
1405
+ securityConstraints,
1406
+ otherConstraints,
1337
1407
  ...(datasetCreated && { datasetCreated }),
1338
1408
  ...(datasetUpdated && { datasetUpdated }),
1339
1409
  lineage,
@@ -1350,17 +1420,20 @@ function toModel(xml) {
1350
1420
  return {
1351
1421
  uniqueIdentifier,
1352
1422
  kind,
1423
+ languages: [],
1353
1424
  recordCreated,
1354
1425
  recordUpdated,
1426
+ recordPublished,
1355
1427
  title,
1356
1428
  abstract,
1357
1429
  ownerOrganization,
1358
1430
  contacts,
1359
1431
  keywords,
1360
- themes,
1361
- accessConstraints,
1362
- useLimitations,
1432
+ topics,
1363
1433
  licenses,
1434
+ legalConstraints,
1435
+ securityConstraints,
1436
+ otherConstraints,
1364
1437
  overviews,
1365
1438
  onlineResources,
1366
1439
  };
@@ -1385,10 +1458,12 @@ function toXml(record, originalXml) {
1385
1458
  writeAbstract(record, rootEl);
1386
1459
  fieldChanged('contacts') && writeContacts(record, rootEl);
1387
1460
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1388
- fieldChanged('themes') && writeThemes(record, rootEl);
1389
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1461
+ fieldChanged('topics') && writeTopics(record, rootEl);
1462
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1463
+ fieldChanged('securityConstraints') &&
1464
+ writeSecurityConstraints(record, rootEl);
1390
1465
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1391
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1466
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1392
1467
  if (record.kind === 'dataset') {
1393
1468
  writeStatus(record, rootEl);
1394
1469
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1414,6 +1489,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1414
1489
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1415
1490
  const toDate = (field) => new Date(field);
1416
1491
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1492
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1417
1493
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1418
1494
  const getAsUrl = (field, location = window.location.toString()) => {
1419
1495
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -1454,6 +1530,31 @@ const mapContact = (sourceContact, lang3) => {
1454
1530
  ...(phone && { phone }),
1455
1531
  };
1456
1532
  };
1533
+ const mapKeywords = (thesauri, language) => {
1534
+ const keywords = [];
1535
+ for (const thesaurusId in thesauri) {
1536
+ const rawThesaurus = thesauri[thesaurusId];
1537
+ let thesaurus = null;
1538
+ if (rawThesaurus.id) {
1539
+ const thesaurusSource = { ...rawThesaurus };
1540
+ const url = getAsUrl(selectField(thesaurusSource, 'link'));
1541
+ const name = selectField(thesaurusSource, 'title');
1542
+ thesaurus = {
1543
+ id: rawThesaurus.id,
1544
+ ...(name && { name }),
1545
+ ...(url && { url }),
1546
+ };
1547
+ }
1548
+ for (const keyword of rawThesaurus.keywords) {
1549
+ keywords.push({
1550
+ label: selectTranslatedValue(keyword, language),
1551
+ type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
1552
+ ...(thesaurus && { thesaurus }),
1553
+ });
1554
+ }
1555
+ }
1556
+ return keywords;
1557
+ };
1457
1558
 
1458
1559
  /**
1459
1560
  * Custom HttpParameterCodec
@@ -16440,6 +16541,23 @@ const LANG_3_TO_2_MAPPER = {
16440
16541
  chi: 'zh',
16441
16542
  slo: 'sk',
16442
16543
  };
16544
+ const LANGUAGE_NAMES = {
16545
+ en: 'English',
16546
+ nl: 'Nederlands',
16547
+ fr: 'Français',
16548
+ de: 'Deutsch',
16549
+ ko: '한국어',
16550
+ es: 'Español',
16551
+ cs: 'Čeština',
16552
+ ca: 'Català',
16553
+ fi: 'Suomi',
16554
+ is: 'Íslenska',
16555
+ it: 'Italiano',
16556
+ pt: 'Português',
16557
+ ru: 'Русский',
16558
+ zh: '中文',
16559
+ sk: 'Slovenčina',
16560
+ };
16443
16561
  // Caution: changing this can break language selection from third parties!
16444
16562
  const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language';
16445
16563
  const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce((mapperObject, langEntry) => {
@@ -16540,133 +16658,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16540
16658
  }]
16541
16659
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16542
16660
 
16543
- // IMPORTANT:
16544
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/test-translate-loader.service.ts
16545
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16546
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16547
- class TestTranslateLoader extends TranslateLoader {
16548
- constructor(_translations = {}) {
16549
- super();
16550
- this._translations = _translations;
16551
- }
16552
- /**
16553
- * Returns an {Observable} of translations for the specified language. If the
16554
- * language is not recognized, an empty translations object will be returned.
16555
- *
16556
- * @param language the language for which the translations should be retrieved.
16557
- * @returns the translations for the specified
16558
- * language or an empty set of translations if the language is not recognized.
16559
- */
16560
- getTranslation(language) {
16561
- return of(this._translations[language] || {});
16562
- }
16563
- }
16564
-
16565
- // IMPORTANT:
16566
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/testing.module.ts
16567
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16568
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16569
- /**
16570
- * The TranslateTestingModule provides the {TranslateModule} as well as a
16571
- * {TranslateService} configured to return translations specific for the
16572
- * test environment.
16573
- *
16574
- * @export
16575
- */
16576
- class TranslateTestingModule {
16577
- constructor() {
16578
- this._translations = {};
16579
- }
16580
- static withTranslations(languageOrTranslations, translations) {
16581
- const translateTestingModule = new TranslateTestingModule();
16582
- if (typeof languageOrTranslations === 'string') {
16583
- return translateTestingModule.withTranslations(languageOrTranslations, translations);
16584
- }
16585
- return translateTestingModule.withTranslations(languageOrTranslations);
16586
- }
16587
- get ngModule() {
16588
- return TranslateTestingModule;
16589
- }
16590
- get providers() {
16591
- const translateService = new TranslateService(null, new TestTranslateLoader(this._translations), this._compiler || new TranslateFakeCompiler(), new TranslateDefaultParser(), new FakeMissingTranslationHandler(), true, true, false, this._defaultLanguage);
16592
- return [
16593
- {
16594
- provide: TranslateService,
16595
- useValue: translateService,
16596
- },
16597
- ];
16598
- }
16599
- withTranslations(languageOrTranslations, translations) {
16600
- if (typeof languageOrTranslations === 'string' && translations) {
16601
- this.addTranslations(languageOrTranslations, translations);
16602
- this._defaultLanguage = languageOrTranslations;
16603
- }
16604
- else if (languageOrTranslations) {
16605
- Object.keys(languageOrTranslations).forEach((language) => this.addTranslations(language, languageOrTranslations[language]));
16606
- }
16607
- return this;
16608
- }
16609
- /**
16610
- * Updates the {TranslationTestingModule} to provide a {TranslateService} that will
16611
- * use the provided {TranslateCompiler} to translate the test translations.
16612
- *
16613
- * @example
16614
- *
16615
- * TranslateTestingModule.withTranslations('en', {people: '{gender, select, male{He is} female{She is} other{They are}} {how})'})
16616
- * .withCompiler(new TranslateMessageFormatCompiler());
16617
- *
16618
- * @param compiler the compiler to use to compile the test translations.
16619
- * @returns the instance that can be used to chain additional configuration.
16620
- * @memberof TranslateTestingModule
16621
- */
16622
- withCompiler(compiler) {
16623
- this._compiler = compiler;
16624
- return this;
16625
- }
16626
- /**
16627
- * Updates the {TranslateTestingModule} to use the provided language as the default language.
16628
- * By default, the default language will be set to the first language provided.
16629
- *
16630
- * @example
16631
- *
16632
- * TranslateTestingModule.withTranslations('es', SPANISH_TRANSLATIONS)
16633
- * .withTranslations('en', ENGLISH_TRANSLATIONS)
16634
- * .withDefaultLanguage('en');
16635
- *
16636
- * @param language the new default language for translations.
16637
- * @returns the instance that can be used to chain additional configuration.
16638
- * @memberof TranslateTestingModule
16639
- */
16640
- withDefaultLanguage(language) {
16641
- this._defaultLanguage = language || this._defaultLanguage;
16642
- return this;
16643
- }
16644
- addTranslations(language, translations) {
16645
- if (!this._defaultLanguage) {
16646
- this._defaultLanguage = language;
16647
- }
16648
- if (this._translations[language]) {
16649
- this._translations[language] = {
16650
- ...this._translations[language],
16651
- ...translations,
16652
- };
16653
- }
16654
- else {
16655
- this._translations[language] = translations;
16656
- }
16657
- }
16658
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16659
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule], exports: [TranslateModule] }); }
16660
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule, TranslateModule] }); }
16661
- }
16662
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, decorators: [{
16663
- type: NgModule,
16664
- args: [{
16665
- imports: [TranslateModule],
16666
- exports: [TranslateModule],
16667
- }]
16668
- }] });
16669
-
16670
16661
  var dropFile$6 = "Datei ablegen";
16671
16662
  var next$6 = "weiter";
16672
16663
  var previous$6 = "zurück";
@@ -16689,20 +16680,21 @@ var de = {
16689
16680
  "chart.type.line": "Liniendiagramm",
16690
16681
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16691
16682
  "chart.type.pie": "Kreisdiagramm",
16683
+ "dashboard.createRecord": "Neuer Eintrag",
16692
16684
  "dashboard.labels.mySpace": "Mein Bereich",
16693
16685
  "dashboard.records.all": "Katalog",
16694
16686
  "dashboard.records.myDraft": "Meine Entwürfe",
16695
16687
  "dashboard.records.myLibrary": "Meine Bibliothek",
16696
16688
  "dashboard.records.myOrg": "Meine Organisation",
16697
16689
  "dashboard.records.myRecords": "Meine Datensätze",
16698
- "dashboard.records.noRecord": "Kein Datensatz für diese Organisation",
16699
- "dashboard.records.noUser": "Keine Benutzer für diese Organisation",
16700
16690
  "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16701
16691
  "dashboard.records.search": "Suche nach \"{searchText}\"",
16702
16692
  "dashboard.records.userDetail": "Name",
16703
16693
  "dashboard.records.userEmail": "E-Mail",
16704
16694
  "dashboard.records.username": "Benutzername",
16705
16695
  "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16696
+ "dashboard.results.listMetadata": "Metadaten anzeigen",
16697
+ "dashboard.results.listResources": "Ressourcen anzeigen",
16706
16698
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16707
16699
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16708
16700
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16829,27 +16821,28 @@ var de = {
16829
16821
  "facets.block.title.tag.default": "Stichwort",
16830
16822
  "facets.block.title.th_regions_tree.default": "Regionen",
16831
16823
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Anmelden</a>, um auf diese Funktion zuzugreifen</div>",
16832
- "language.ca": "Català",
16833
- "language.cs": "Čeština",
16824
+ "language.ca": "Katalanisch",
16825
+ "language.cs": "Tschechisch",
16834
16826
  "language.de": "Deutsch",
16835
- "language.en": "English",
16836
- "language.es": "Español",
16837
- "language.fi": "Suomi",
16838
- "language.fr": "Français",
16839
- "language.is": "Íslenska",
16840
- "language.it": "Italiano",
16841
- "language.ko": "한국어",
16842
- "language.nl": "Nederlands",
16843
- "language.pt": "Português",
16844
- "language.ru": "Русский",
16845
- "language.sk": "Slovenčina",
16846
- "language.zh": "中文",
16827
+ "language.en": "Englisch",
16828
+ "language.es": "Spanisch",
16829
+ "language.fi": "Finnisch",
16830
+ "language.fr": "Französisch",
16831
+ "language.is": "Isländisch",
16832
+ "language.it": "Italienisch",
16833
+ "language.ko": "Koreanisch",
16834
+ "language.nl": "Niederländisch",
16835
+ "language.pt": "Portugiesisch",
16836
+ "language.ru": "Russisch",
16837
+ "language.sk": "Slowakisch",
16838
+ "language.zh": "Chinesisch",
16847
16839
  "map.add.layer": "Eine Ebene hinzufügen",
16848
16840
  "map.add.layer.catalog": "Aus dem Katalog",
16849
16841
  "map.add.layer.file": "Aus einer Datei",
16850
16842
  "map.add.layer.wfs": "Aus WFS",
16851
16843
  "map.add.layer.wms": "Aus WMS",
16852
16844
  "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16845
+ "map.geocoding.placeholder": "Nach einem Ort suchen",
16853
16846
  "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16854
16847
  "map.layer.add": "Hinzufügen",
16855
16848
  "map.layers.available": "Verfügbare Layer",
@@ -16893,18 +16886,20 @@ var de = {
16893
16886
  "record.metadata.author": "Autor",
16894
16887
  "record.metadata.catalog": "Katalog",
16895
16888
  "record.metadata.contact": "Kontakt",
16896
- "record.metadata.createdOn": "Erstellt am",
16897
- "record.metadata.details": "Technische Informationen",
16889
+ "record.metadata.creation": "Erstellungsdatum",
16890
+ "record.metadata.details": "Über die Daten",
16898
16891
  "record.metadata.download": "Downloads",
16899
16892
  "record.metadata.formats": "Formate",
16900
- "record.metadata.isOpenData": "Open Data",
16901
16893
  "record.metadata.keywords": "Stichworte",
16902
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16894
+ "record.metadata.languages": "Sprachen",
16895
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
16903
16896
  "record.metadata.links": "Links",
16904
16897
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16905
- "record.metadata.origin": "Über die Daten",
16906
- "record.metadata.owner": "",
16898
+ "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
16899
+ "record.metadata.owner": "Herkunftskatalog",
16907
16900
  "record.metadata.preview": "Vorschau",
16901
+ "record.metadata.producer": "Datenproduzent",
16902
+ "record.metadata.publication": "Veröffentlichungsdatum",
16908
16903
  "record.metadata.publications": "Veröffentlichungen",
16909
16904
  "record.metadata.quality": "Metadatenqualität",
16910
16905
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
@@ -16926,12 +16921,17 @@ var de = {
16926
16921
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16927
16922
  "record.metadata.related": "Ähnliche Datensätze",
16928
16923
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16929
- "record.metadata.themes": "Kategorien",
16924
+ "record.metadata.status": "Status",
16925
+ "record.metadata.technical": "Technische Informationen",
16926
+ "record.metadata.temporalExtent": "Zeitlicher Umfang",
16927
+ "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
16928
+ "record.metadata.temporalExtent.sinceDate": "Seit {start}",
16929
+ "record.metadata.temporalExtent.untilDate": "Bis {end}",
16930
16930
  "record.metadata.title": "Titel",
16931
+ "record.metadata.topics": "Kategorien",
16931
16932
  "record.metadata.type": "Geographischer Datensatz",
16932
16933
  "record.metadata.uniqueId": "Eindeutige Kennung",
16933
16934
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16934
- "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16935
16935
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
16936
16936
  "record.metadata.usage": "Nutzung und Einschränkungen",
16937
16937
  "record.more.details": "Weitere Details",
@@ -16963,6 +16963,7 @@ var de = {
16963
16963
  "search.filters.isSpatial": "Ist räumliche Daten",
16964
16964
  "search.filters.isSpatial.no": "nicht räumlich",
16965
16965
  "search.filters.isSpatial.yes": "räumlich",
16966
+ "search.filters.keyword": "Schlüsselwort",
16966
16967
  "search.filters.license": "Lizenz",
16967
16968
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16968
16969
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16993,7 +16994,7 @@ var de = {
16993
16994
  "table.object.count": "Objekte in diesem Datensatz",
16994
16995
  "table.select.data": "Datenquelle",
16995
16996
  "tooltip.html.copy": "HTML kopieren",
16996
- "tooltip.id.copy": "",
16997
+ "tooltip.id.copy": "Eindeutige Kennung kopieren",
16997
16998
  "tooltip.url.copy": "URL kopieren",
16998
16999
  "tooltip.url.open": "URL öffnen",
16999
17000
  "ui.readLess": "Weniger lesen",
@@ -17027,20 +17028,21 @@ var en = {
17027
17028
  "chart.type.line": "line chart",
17028
17029
  "chart.type.lineSmooth": "smooth line chart",
17029
17030
  "chart.type.pie": "pie chart",
17031
+ "dashboard.createRecord": "New record",
17030
17032
  "dashboard.labels.mySpace": "My space",
17031
- "dashboard.records.all": "Catalog",
17033
+ "dashboard.records.all": "Metadata records",
17032
17034
  "dashboard.records.myDraft": "My drafts",
17033
17035
  "dashboard.records.myLibrary": "My library",
17034
17036
  "dashboard.records.myOrg": "Organization",
17035
17037
  "dashboard.records.myRecords": "My Records",
17036
- "dashboard.records.noRecord": "No record for this organization",
17037
- "dashboard.records.noUser": "No users for this organization",
17038
17038
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17039
17039
  "dashboard.records.search": "Search for \"{searchText}\"",
17040
17040
  "dashboard.records.userDetail": "Name",
17041
17041
  "dashboard.records.userEmail": "Email",
17042
17042
  "dashboard.records.username": "Username",
17043
17043
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
17044
+ "dashboard.results.listMetadata": "Show metadata",
17045
+ "dashboard.results.listResources": "Show resources",
17044
17046
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17045
17047
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17046
17048
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17167,27 +17169,28 @@ var en = {
17167
17169
  "facets.block.title.tag.default": "Tag",
17168
17170
  "facets.block.title.th_regions_tree.default": "Regions",
17169
17171
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
17170
- "language.ca": "Català",
17171
- "language.cs": "Čeština",
17172
- "language.de": "Deutsch",
17172
+ "language.ca": "Catalan",
17173
+ "language.cs": "Czech",
17174
+ "language.de": "German",
17173
17175
  "language.en": "English",
17174
- "language.es": "Español",
17175
- "language.fi": "Suomi",
17176
- "language.fr": "Français",
17177
- "language.is": "Íslenska",
17178
- "language.it": "Italiano",
17179
- "language.ko": "한국어",
17180
- "language.nl": "Nederlands",
17181
- "language.pt": "Português",
17182
- "language.ru": "Русский",
17183
- "language.sk": "Slovenčina",
17184
- "language.zh": "中文",
17176
+ "language.es": "Spanish",
17177
+ "language.fi": "Finnish",
17178
+ "language.fr": "French",
17179
+ "language.is": "Icelandic",
17180
+ "language.it": "Italian",
17181
+ "language.ko": "Korean",
17182
+ "language.nl": "Dutch",
17183
+ "language.pt": "Portuguese",
17184
+ "language.ru": "Russian",
17185
+ "language.sk": "Slovak",
17186
+ "language.zh": "Chinese",
17185
17187
  "map.add.layer": "Add a layer",
17186
17188
  "map.add.layer.catalog": "From the catalog",
17187
17189
  "map.add.layer.file": "From a file",
17188
17190
  "map.add.layer.wfs": "From WFS",
17189
17191
  "map.add.layer.wms": "From WMS",
17190
17192
  "map.addFromFile.placeholder": "Click or drop a file here",
17193
+ "map.geocoding.placeholder": "Search for a place",
17191
17194
  "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17192
17195
  "map.layer.add": "Add",
17193
17196
  "map.layers.available": "Available Layers",
@@ -17231,18 +17234,20 @@ var en = {
17231
17234
  "record.metadata.author": "Author",
17232
17235
  "record.metadata.catalog": "Catalog",
17233
17236
  "record.metadata.contact": "Contact",
17234
- "record.metadata.createdOn": "Created on",
17235
- "record.metadata.details": "Technical information",
17237
+ "record.metadata.creation": "Date of creation",
17238
+ "record.metadata.details": "About the data",
17236
17239
  "record.metadata.download": "Downloads",
17237
17240
  "record.metadata.formats": "Formats",
17238
- "record.metadata.isOpenData": "Open Data",
17239
17241
  "record.metadata.keywords": "Keywords",
17240
- "record.metadata.lastUpdate": "Last updated on",
17242
+ "record.metadata.languages": "Languages",
17243
+ "record.metadata.lastUpdate": "Last updated on {date}",
17241
17244
  "record.metadata.links": "Links",
17242
17245
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17243
- "record.metadata.origin": "About the data",
17246
+ "record.metadata.otherConstraints": "Additional Conditions",
17244
17247
  "record.metadata.owner": "Catalog of origin",
17245
17248
  "record.metadata.preview": "Preview",
17249
+ "record.metadata.producer": "Data producer",
17250
+ "record.metadata.publication": "Date of publication",
17246
17251
  "record.metadata.publications": "publications",
17247
17252
  "record.metadata.quality": "Metadata Quality",
17248
17253
  "record.metadata.quality.contact.failed": "Contact is not specified",
@@ -17264,14 +17269,19 @@ var en = {
17264
17269
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17265
17270
  "record.metadata.related": "Related records",
17266
17271
  "record.metadata.sheet": "Original metadata",
17267
- "record.metadata.themes": "Categories",
17272
+ "record.metadata.status": "Status",
17273
+ "record.metadata.technical": "Technical information",
17274
+ "record.metadata.temporalExtent": "Temporal extent",
17275
+ "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
17276
+ "record.metadata.temporalExtent.sinceDate": "Since { start }",
17277
+ "record.metadata.temporalExtent.untilDate": "Until { end }",
17268
17278
  "record.metadata.title": "Title",
17279
+ "record.metadata.topics": "Categories",
17269
17280
  "record.metadata.type": "Geographical dataset",
17270
17281
  "record.metadata.uniqueId": "Unique Identifier",
17271
17282
  "record.metadata.updateFrequency": "Data Update Frequency",
17272
- "record.metadata.updateStatus": "Data Update Status",
17273
- "record.metadata.updatedOn": "Metadata's last update",
17274
- "record.metadata.usage": "Usage & constraints",
17283
+ "record.metadata.updatedOn": "Last Data Information Update",
17284
+ "record.metadata.usage": "License and Conditions",
17275
17285
  "record.more.details": "Read more",
17276
17286
  "record.tab.chart": "Chart",
17277
17287
  "record.tab.data": "Table",
@@ -17301,6 +17311,7 @@ var en = {
17301
17311
  "search.filters.isSpatial": "Is spatial data",
17302
17312
  "search.filters.isSpatial.no": "non spatial",
17303
17313
  "search.filters.isSpatial.yes": "spatial",
17314
+ "search.filters.keyword": "Keyword",
17304
17315
  "search.filters.license": "License",
17305
17316
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17306
17317
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17365,20 +17376,21 @@ var es = {
17365
17376
  "chart.type.line": "gráfico de líneas",
17366
17377
  "chart.type.lineSmooth": "gráfico de líneas suave",
17367
17378
  "chart.type.pie": "gráfico circular",
17379
+ "dashboard.createRecord": "",
17368
17380
  "dashboard.labels.mySpace": "Mi espacio",
17369
17381
  "dashboard.records.all": "Catálogo",
17370
17382
  "dashboard.records.myDraft": "Mis borradores",
17371
17383
  "dashboard.records.myLibrary": "Mi biblioteca",
17372
17384
  "dashboard.records.myOrg": "Organización",
17373
17385
  "dashboard.records.myRecords": "Mis Registros",
17374
- "dashboard.records.noRecord": "",
17375
- "dashboard.records.noUser": "",
17376
17386
  "dashboard.records.publishedRecords": "",
17377
17387
  "dashboard.records.search": "Buscar \"{searchText}\"",
17378
17388
  "dashboard.records.userDetail": "",
17379
17389
  "dashboard.records.userEmail": "",
17380
17390
  "dashboard.records.username": "",
17381
17391
  "dashboard.records.users": "",
17392
+ "dashboard.results.listMetadata": "",
17393
+ "dashboard.results.listResources": "",
17382
17394
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17383
17395
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17384
17396
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17505,27 +17517,28 @@ var es = {
17505
17517
  "facets.block.title.tag.default": "",
17506
17518
  "facets.block.title.th_regions_tree.default": "",
17507
17519
  "favorite.not.authenticated.tooltip": "",
17508
- "language.ca": "Català",
17509
- "language.cs": "Čeština",
17510
- "language.de": "Deutsch",
17511
- "language.en": "English",
17520
+ "language.ca": "Catalán",
17521
+ "language.cs": "Checo",
17522
+ "language.de": "Alemán",
17523
+ "language.en": "Inglés",
17512
17524
  "language.es": "Español",
17513
- "language.fi": "Suomi",
17514
- "language.fr": "Français",
17515
- "language.is": "Íslenska",
17525
+ "language.fi": "Finlandés",
17526
+ "language.fr": "Francés",
17527
+ "language.is": "Islandés",
17516
17528
  "language.it": "Italiano",
17517
- "language.ko": "한국어",
17518
- "language.nl": "Nederlands",
17519
- "language.pt": "Português",
17520
- "language.ru": "Русский",
17521
- "language.sk": "Slovenčina",
17522
- "language.zh": "中文",
17529
+ "language.ko": "Coreano",
17530
+ "language.nl": "Neerlandés",
17531
+ "language.pt": "Portugués",
17532
+ "language.ru": "Ruso",
17533
+ "language.sk": "Eslovaco",
17534
+ "language.zh": "Chino",
17523
17535
  "map.add.layer": "",
17524
17536
  "map.add.layer.catalog": "",
17525
17537
  "map.add.layer.file": "",
17526
17538
  "map.add.layer.wfs": "",
17527
17539
  "map.add.layer.wms": "",
17528
17540
  "map.addFromFile.placeholder": "",
17541
+ "map.geocoding.placeholder": "",
17529
17542
  "map.help.addFromFile": "",
17530
17543
  "map.layer.add": "",
17531
17544
  "map.layers.available": "",
@@ -17569,18 +17582,20 @@ var es = {
17569
17582
  "record.metadata.author": "",
17570
17583
  "record.metadata.catalog": "",
17571
17584
  "record.metadata.contact": "",
17572
- "record.metadata.createdOn": "",
17585
+ "record.metadata.creation": "",
17573
17586
  "record.metadata.details": "",
17574
17587
  "record.metadata.download": "",
17575
17588
  "record.metadata.formats": "",
17576
- "record.metadata.isOpenData": "",
17577
17589
  "record.metadata.keywords": "",
17590
+ "record.metadata.languages": "",
17578
17591
  "record.metadata.lastUpdate": "",
17579
17592
  "record.metadata.links": "",
17580
17593
  "record.metadata.noUsage": "",
17581
- "record.metadata.origin": "",
17594
+ "record.metadata.otherConstraints": "",
17582
17595
  "record.metadata.owner": "",
17583
17596
  "record.metadata.preview": "",
17597
+ "record.metadata.producer": "",
17598
+ "record.metadata.publication": "",
17584
17599
  "record.metadata.publications": "",
17585
17600
  "record.metadata.quality": "",
17586
17601
  "record.metadata.quality.contact.failed": "",
@@ -17602,12 +17617,17 @@ var es = {
17602
17617
  "record.metadata.quality.updateFrequency.success": "",
17603
17618
  "record.metadata.related": "",
17604
17619
  "record.metadata.sheet": "",
17605
- "record.metadata.themes": "",
17620
+ "record.metadata.status": "",
17621
+ "record.metadata.technical": "",
17622
+ "record.metadata.temporalExtent": "",
17623
+ "record.metadata.temporalExtent.fromDateToDate": "",
17624
+ "record.metadata.temporalExtent.sinceDate": "",
17625
+ "record.metadata.temporalExtent.untilDate": "",
17606
17626
  "record.metadata.title": "",
17627
+ "record.metadata.topics": "",
17607
17628
  "record.metadata.type": "",
17608
17629
  "record.metadata.uniqueId": "",
17609
17630
  "record.metadata.updateFrequency": "",
17610
- "record.metadata.updateStatus": "",
17611
17631
  "record.metadata.updatedOn": "",
17612
17632
  "record.metadata.usage": "",
17613
17633
  "record.more.details": "",
@@ -17639,6 +17659,7 @@ var es = {
17639
17659
  "search.filters.isSpatial": "",
17640
17660
  "search.filters.isSpatial.no": "",
17641
17661
  "search.filters.isSpatial.yes": "",
17662
+ "search.filters.keyword": "",
17642
17663
  "search.filters.license": "",
17643
17664
  "search.filters.license.cc-by": "",
17644
17665
  "search.filters.license.cc-by-sa": "",
@@ -17703,20 +17724,21 @@ var fr = {
17703
17724
  "chart.type.line": "ligne",
17704
17725
  "chart.type.lineSmooth": "ligne lisse",
17705
17726
  "chart.type.pie": "camembert",
17727
+ "dashboard.createRecord": "Nouvel enregistrement",
17706
17728
  "dashboard.labels.mySpace": "Mon espace",
17707
17729
  "dashboard.records.all": "Catalogue",
17708
17730
  "dashboard.records.myDraft": "Mes brouillons",
17709
17731
  "dashboard.records.myLibrary": "Ma bibliothèque",
17710
17732
  "dashboard.records.myOrg": "Mon organisation",
17711
17733
  "dashboard.records.myRecords": "Mes fiches publiées",
17712
- "dashboard.records.noRecord": "Aucun jeu de données pour cette organisation",
17713
- "dashboard.records.noUser": "Aucun utilisateur pour cette organisation",
17714
17734
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17715
17735
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17716
17736
  "dashboard.records.userDetail": "Nom",
17717
17737
  "dashboard.records.userEmail": "Email",
17718
17738
  "dashboard.records.username": "Nom d'utilisateur",
17719
17739
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17740
+ "dashboard.results.listMetadata": "Afficher les métadonnées",
17741
+ "dashboard.results.listResources": "Afficher les ressources",
17720
17742
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17721
17743
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17722
17744
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17798,7 +17820,7 @@ var fr = {
17798
17820
  "datahub.header.popularRecords": "Les plus appréciées",
17799
17821
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17800
17822
  "datahub.news.contact.contactus": "Contactez-nous",
17801
- "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>",
17823
+ "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>",
17802
17824
  "datahub.news.contact.title": "Un besoin spécifique ?",
17803
17825
  "datahub.news.feed": "Fil d'activité",
17804
17826
  "datahub.news.figures": "Quelques chiffres",
@@ -17843,37 +17865,38 @@ var fr = {
17843
17865
  "facets.block.title.tag.default": "Tag",
17844
17866
  "facets.block.title.th_regions_tree.default": "Régions",
17845
17867
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
17846
- "language.ca": "Català",
17847
- "language.cs": "Čeština",
17848
- "language.de": "Deutsch",
17849
- "language.en": "English",
17850
- "language.es": "Español",
17851
- "language.fi": "Suomi",
17868
+ "language.ca": "Catalan",
17869
+ "language.cs": "Tchèque",
17870
+ "language.de": "Allemand",
17871
+ "language.en": "Anglais",
17872
+ "language.es": "Espagnol",
17873
+ "language.fi": "Finnois",
17852
17874
  "language.fr": "Français",
17853
- "language.is": "Íslenska",
17854
- "language.it": "Italiano",
17855
- "language.ko": "한국어",
17856
- "language.nl": "Nederlands",
17857
- "language.pt": "Português",
17858
- "language.ru": "Русский",
17859
- "language.sk": "Slovenčina",
17860
- "language.zh": "中文",
17861
- "map.add.layer": "",
17862
- "map.add.layer.catalog": "",
17863
- "map.add.layer.file": "",
17864
- "map.add.layer.wfs": "",
17865
- "map.add.layer.wms": "",
17866
- "map.addFromFile.placeholder": "",
17867
- "map.help.addFromFile": "",
17868
- "map.layer.add": "",
17869
- "map.layers.available": "",
17870
- "map.layers.list": "",
17875
+ "language.is": "Islandais",
17876
+ "language.it": "Italien",
17877
+ "language.ko": "Coréen",
17878
+ "language.nl": "Néerlandais",
17879
+ "language.pt": "Portugais",
17880
+ "language.ru": "Russe",
17881
+ "language.sk": "Slovaque",
17882
+ "language.zh": "Chinois",
17883
+ "map.add.layer": "Ajouter une couche",
17884
+ "map.add.layer.catalog": "Du catalogue",
17885
+ "map.add.layer.file": "À partir d'un fichier",
17886
+ "map.add.layer.wfs": "Depuis un service WFS",
17887
+ "map.add.layer.wms": "Depuis un service WMS",
17888
+ "map.addFromFile.placeholder": "Cliquez ou déposez un fichier ici",
17889
+ "map.geocoding.placeholder": "Rechercher un lieu",
17890
+ "map.help.addFromFile": "Cliquez ou glissez-déposez un fichier pour l'ajouter à la carte (supporte actuellement uniquement le format GeoJSON).",
17891
+ "map.layer.add": "Ajouter",
17892
+ "map.layers.available": "Couches disponibles",
17893
+ "map.layers.list": "Couches",
17871
17894
  "map.loading.data": "Chargement des données...",
17872
- "map.loading.service": "",
17895
+ "map.loading.service": "Chargement du service...",
17873
17896
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17874
17897
  "map.select.layer": "Source de données",
17875
- "map.wfs.urlInput.hint": "",
17876
- "map.wms.urlInput.hint": "",
17898
+ "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
17899
+ "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
17877
17900
  "multiselect.filter.placeholder": "Rechercher",
17878
17901
  "nav.back": "Retour",
17879
17902
  next: next$3,
@@ -17907,18 +17930,20 @@ var fr = {
17907
17930
  "record.metadata.author": "Auteur",
17908
17931
  "record.metadata.catalog": "Catalogue",
17909
17932
  "record.metadata.contact": "Contact",
17910
- "record.metadata.createdOn": "Créé le",
17911
- "record.metadata.details": "Informations techniques",
17933
+ "record.metadata.creation": "Date de création",
17934
+ "record.metadata.details": "A propos de la donnée",
17912
17935
  "record.metadata.download": "Téléchargements",
17913
17936
  "record.metadata.formats": "Formats",
17914
- "record.metadata.isOpenData": "Donnée Ouverte",
17915
17937
  "record.metadata.keywords": "Mots clés",
17916
- "record.metadata.lastUpdate": "Mis à jour le",
17938
+ "record.metadata.languages": "Langues",
17939
+ "record.metadata.lastUpdate": "Mis à jour le {date}",
17917
17940
  "record.metadata.links": "Liens",
17918
17941
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17919
- "record.metadata.origin": "À propos des données",
17942
+ "record.metadata.otherConstraints": "Limitations d'usage",
17920
17943
  "record.metadata.owner": "Catalogue d'origine",
17921
17944
  "record.metadata.preview": "Aperçu",
17945
+ "record.metadata.producer": "Producteur de la donnée",
17946
+ "record.metadata.publication": "Date de publication",
17922
17947
  "record.metadata.publications": "données",
17923
17948
  "record.metadata.quality": "Qualité des métadonnées",
17924
17949
  "record.metadata.quality.contact.failed": "Contact n'est pas renseigné",
@@ -17940,14 +17965,19 @@ var fr = {
17940
17965
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17941
17966
  "record.metadata.related": "Voir aussi",
17942
17967
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17943
- "record.metadata.themes": "Catégories",
17968
+ "record.metadata.status": "Statut",
17969
+ "record.metadata.technical": "Informations techniques",
17970
+ "record.metadata.temporalExtent": "Etendue temporelle",
17971
+ "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
17972
+ "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
17973
+ "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
17944
17974
  "record.metadata.title": "Titre",
17975
+ "record.metadata.topics": "Catégories",
17945
17976
  "record.metadata.type": "Donnée géographique",
17946
17977
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17947
17978
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17948
- "record.metadata.updateStatus": "Statut de mise à jour des données",
17949
- "record.metadata.updatedOn": "Mise à jour de la fiche de métadonnée",
17950
- "record.metadata.usage": "Conditions d'utilisation",
17979
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17980
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17951
17981
  "record.more.details": "Détails",
17952
17982
  "record.tab.chart": "Graphique",
17953
17983
  "record.tab.data": "Tableau",
@@ -17977,6 +18007,7 @@ var fr = {
17977
18007
  "search.filters.isSpatial": "Données spatiales",
17978
18008
  "search.filters.isSpatial.no": "non-géolocalisées",
17979
18009
  "search.filters.isSpatial.yes": "géolocalisées",
18010
+ "search.filters.keyword": "Mot-clé",
17980
18011
  "search.filters.license": "Licence",
17981
18012
  "search.filters.license.cc-by": "cc-by",
17982
18013
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18041,20 +18072,21 @@ var it = {
18041
18072
  "chart.type.line": "grafico a linee",
18042
18073
  "chart.type.lineSmooth": "grafico a linea liscia",
18043
18074
  "chart.type.pie": "grafico a torta",
18075
+ "dashboard.createRecord": "Crea un record",
18044
18076
  "dashboard.labels.mySpace": "Il mio spazio",
18045
18077
  "dashboard.records.all": "Catalogo",
18046
18078
  "dashboard.records.myDraft": "Le mie bozze",
18047
18079
  "dashboard.records.myLibrary": "La mia biblioteca",
18048
18080
  "dashboard.records.myOrg": "La mia organizzazione",
18049
18081
  "dashboard.records.myRecords": "I miei dati",
18050
- "dashboard.records.noRecord": "Nessun dati per questa organizzazione",
18051
- "dashboard.records.noUser": "Nessun utente per questa organizzazione",
18052
18082
  "dashboard.records.publishedRecords": "dati pubblicati",
18053
18083
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18054
18084
  "dashboard.records.userDetail": "Nome",
18055
18085
  "dashboard.records.userEmail": "Email",
18056
18086
  "dashboard.records.username": "Nome utente",
18057
18087
  "dashboard.records.users": "utenti",
18088
+ "dashboard.results.listMetadata": "Elenco dei metadati",
18089
+ "dashboard.results.listResources": "Elenco delle risorse",
18058
18090
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18059
18091
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18060
18092
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18181,37 +18213,38 @@ var it = {
18181
18213
  "facets.block.title.tag.default": "Tag",
18182
18214
  "facets.block.title.th_regions_tree.default": "Regioni",
18183
18215
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> per accedere a questa funzionalità</div>",
18184
- "language.ca": "Català",
18185
- "language.cs": "Čeština",
18186
- "language.de": "Deutsch",
18187
- "language.en": "English",
18188
- "language.es": "Español",
18189
- "language.fi": "Suomi",
18190
- "language.fr": "Français",
18191
- "language.is": "Íslenska",
18216
+ "language.ca": "Catalano",
18217
+ "language.cs": "Ceco",
18218
+ "language.de": "Tedesco",
18219
+ "language.en": "Inglese",
18220
+ "language.es": "Spagnolo",
18221
+ "language.fi": "Finlandese",
18222
+ "language.fr": "Francese",
18223
+ "language.is": "Islandese",
18192
18224
  "language.it": "Italiano",
18193
- "language.ko": "한국어",
18194
- "language.nl": "Nederlands",
18195
- "language.pt": "Português",
18196
- "language.ru": "Русский",
18197
- "language.sk": "Slovenčina",
18198
- "language.zh": "中文",
18225
+ "language.ko": "Coreano",
18226
+ "language.nl": "Olandese",
18227
+ "language.pt": "Portoghese",
18228
+ "language.ru": "Russo",
18229
+ "language.sk": "Slovacco",
18230
+ "language.zh": "Cinese",
18199
18231
  "map.add.layer": "Aggiungere un layer",
18200
18232
  "map.add.layer.catalog": "Dal catalogo",
18201
18233
  "map.add.layer.file": "Da un file",
18202
18234
  "map.add.layer.wfs": "Da un WFS",
18203
18235
  "map.add.layer.wms": "Da un WMS",
18204
- "map.addFromFile.placeholder": "",
18205
- "map.help.addFromFile": "",
18206
- "map.layer.add": "",
18207
- "map.layers.available": "",
18236
+ "map.addFromFile.placeholder": "Clicca o trascina un file qui",
18237
+ "map.geocoding.placeholder": "Cerca un luogo",
18238
+ "map.help.addFromFile": "Clicca o trascina un file per aggiungerlo alla mappa (attualmente supporta solo il formato GeoJSON)",
18239
+ "map.layer.add": "Aggiungi",
18240
+ "map.layers.available": "Layer disponibili",
18208
18241
  "map.layers.list": "Layers",
18209
18242
  "map.loading.data": "Caricamento dati...",
18210
- "map.loading.service": "",
18243
+ "map.loading.service": "Caricamento del servizio...",
18211
18244
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18212
18245
  "map.select.layer": "Sorgente dati",
18213
- "map.wfs.urlInput.hint": "",
18214
- "map.wms.urlInput.hint": "",
18246
+ "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
18247
+ "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
18215
18248
  "multiselect.filter.placeholder": "Cerca",
18216
18249
  "nav.back": "Indietro",
18217
18250
  next: next$2,
@@ -18245,18 +18278,20 @@ var it = {
18245
18278
  "record.metadata.author": "Autore",
18246
18279
  "record.metadata.catalog": "Catalogo",
18247
18280
  "record.metadata.contact": "Contatto",
18248
- "record.metadata.createdOn": "Creato il",
18249
- "record.metadata.details": "Informazioni tecniche",
18281
+ "record.metadata.creation": "Data di creazione",
18282
+ "record.metadata.details": "A proposito del dati",
18250
18283
  "record.metadata.download": "Download",
18251
18284
  "record.metadata.formats": "Formati",
18252
- "record.metadata.isOpenData": "Data aperta",
18253
18285
  "record.metadata.keywords": "Parole chiave",
18254
- "record.metadata.lastUpdate": "Ultimo aggiornamento",
18286
+ "record.metadata.languages": "Lingue",
18287
+ "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
18255
18288
  "record.metadata.links": "Collegamenti",
18256
18289
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18257
- "record.metadata.origin": "Informazioni sui dati",
18290
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18258
18291
  "record.metadata.owner": "Catalogo originale",
18259
18292
  "record.metadata.preview": "Anteprima",
18293
+ "record.metadata.producer": "Produttore dei dati",
18294
+ "record.metadata.publication": "Data di pubblicazione",
18260
18295
  "record.metadata.publications": "pubblicazioni",
18261
18296
  "record.metadata.quality": "Qualità dei metadati",
18262
18297
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
@@ -18278,14 +18313,19 @@ var it = {
18278
18313
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18279
18314
  "record.metadata.related": "Vedi anche",
18280
18315
  "record.metadata.sheet": "Origine del metadata",
18281
- "record.metadata.themes": "Categorie",
18316
+ "record.metadata.status": "Stato",
18317
+ "record.metadata.technical": "Informazioni tecniche",
18318
+ "record.metadata.temporalExtent": "Periodo di tempo",
18319
+ "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
18320
+ "record.metadata.temporalExtent.sinceDate": "Dal {start}",
18321
+ "record.metadata.temporalExtent.untilDate": "Fino a {end}",
18282
18322
  "record.metadata.title": "Titolo",
18323
+ "record.metadata.topics": "Categorie",
18283
18324
  "record.metadata.type": "Dati geografici",
18284
18325
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18285
18326
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18286
- "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18287
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18288
- "record.metadata.usage": "Condizioni d'uso",
18327
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18328
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18289
18329
  "record.more.details": "Dettagli",
18290
18330
  "record.tab.chart": "Grafico",
18291
18331
  "record.tab.data": "Tabella",
@@ -18315,6 +18355,7 @@ var it = {
18315
18355
  "search.filters.isSpatial": "Dati spaziali",
18316
18356
  "search.filters.isSpatial.no": "Non geolocalizzati",
18317
18357
  "search.filters.isSpatial.yes": "Geolocalizzati",
18358
+ "search.filters.keyword": "Parola chiave",
18318
18359
  "search.filters.license": "Licenza",
18319
18360
  "search.filters.license.cc-by": "cc-by",
18320
18361
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18379,20 +18420,21 @@ var nl = {
18379
18420
  "chart.type.line": "lijndiagram",
18380
18421
  "chart.type.lineSmooth": "glad lijndiagram",
18381
18422
  "chart.type.pie": "cirkeldiagram",
18423
+ "dashboard.createRecord": "",
18382
18424
  "dashboard.labels.mySpace": "Mijn ruimte",
18383
18425
  "dashboard.records.all": "Catalogus",
18384
18426
  "dashboard.records.myDraft": "Mijn concepten",
18385
18427
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18386
18428
  "dashboard.records.myOrg": "Organisatie",
18387
18429
  "dashboard.records.myRecords": "Mijn Records",
18388
- "dashboard.records.noRecord": "",
18389
- "dashboard.records.noUser": "",
18390
18430
  "dashboard.records.publishedRecords": "",
18391
18431
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18392
18432
  "dashboard.records.userDetail": "",
18393
18433
  "dashboard.records.userEmail": "",
18394
18434
  "dashboard.records.username": "",
18395
18435
  "dashboard.records.users": "",
18436
+ "dashboard.results.listMetadata": "",
18437
+ "dashboard.results.listResources": "",
18396
18438
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18397
18439
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18398
18440
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18519,27 +18561,28 @@ var nl = {
18519
18561
  "facets.block.title.tag.default": "",
18520
18562
  "facets.block.title.th_regions_tree.default": "",
18521
18563
  "favorite.not.authenticated.tooltip": "",
18522
- "language.ca": "Català",
18523
- "language.cs": "Čeština",
18524
- "language.de": "Deutsch",
18525
- "language.en": "English",
18526
- "language.es": "Español",
18527
- "language.fi": "Suomi",
18528
- "language.fr": "Français",
18529
- "language.is": "Íslenska",
18530
- "language.it": "Italiano",
18531
- "language.ko": "한국어",
18564
+ "language.ca": "Catalaans",
18565
+ "language.cs": "Tsjechisch",
18566
+ "language.de": "Duits",
18567
+ "language.en": "Engels",
18568
+ "language.es": "Spaans",
18569
+ "language.fi": "Fins",
18570
+ "language.fr": "Frans",
18571
+ "language.is": "IJslands",
18572
+ "language.it": "Italiaans",
18573
+ "language.ko": "Koreaans",
18532
18574
  "language.nl": "Nederlands",
18533
- "language.pt": "Português",
18534
- "language.ru": "Русский",
18535
- "language.sk": "Slovenčina",
18536
- "language.zh": "中文",
18575
+ "language.pt": "Portugees",
18576
+ "language.ru": "Russisch",
18577
+ "language.sk": "Slowaaks",
18578
+ "language.zh": "Chinees",
18537
18579
  "map.add.layer": "",
18538
18580
  "map.add.layer.catalog": "",
18539
18581
  "map.add.layer.file": "",
18540
18582
  "map.add.layer.wfs": "",
18541
18583
  "map.add.layer.wms": "",
18542
18584
  "map.addFromFile.placeholder": "",
18585
+ "map.geocoding.placeholder": "",
18543
18586
  "map.help.addFromFile": "",
18544
18587
  "map.layer.add": "",
18545
18588
  "map.layers.available": "",
@@ -18583,18 +18626,20 @@ var nl = {
18583
18626
  "record.metadata.author": "",
18584
18627
  "record.metadata.catalog": "",
18585
18628
  "record.metadata.contact": "",
18586
- "record.metadata.createdOn": "",
18629
+ "record.metadata.creation": "",
18587
18630
  "record.metadata.details": "",
18588
18631
  "record.metadata.download": "",
18589
18632
  "record.metadata.formats": "",
18590
- "record.metadata.isOpenData": "",
18591
18633
  "record.metadata.keywords": "",
18634
+ "record.metadata.languages": "",
18592
18635
  "record.metadata.lastUpdate": "",
18593
18636
  "record.metadata.links": "",
18594
18637
  "record.metadata.noUsage": "",
18595
- "record.metadata.origin": "",
18638
+ "record.metadata.otherConstraints": "",
18596
18639
  "record.metadata.owner": "",
18597
18640
  "record.metadata.preview": "",
18641
+ "record.metadata.producer": "",
18642
+ "record.metadata.publication": "",
18598
18643
  "record.metadata.publications": "",
18599
18644
  "record.metadata.quality": "",
18600
18645
  "record.metadata.quality.contact.failed": "",
@@ -18616,12 +18661,17 @@ var nl = {
18616
18661
  "record.metadata.quality.updateFrequency.success": "",
18617
18662
  "record.metadata.related": "",
18618
18663
  "record.metadata.sheet": "",
18619
- "record.metadata.themes": "",
18664
+ "record.metadata.status": "",
18665
+ "record.metadata.technical": "",
18666
+ "record.metadata.temporalExtent": "",
18667
+ "record.metadata.temporalExtent.fromDateToDate": "",
18668
+ "record.metadata.temporalExtent.sinceDate": "",
18669
+ "record.metadata.temporalExtent.untilDate": "",
18620
18670
  "record.metadata.title": "",
18671
+ "record.metadata.topics": "",
18621
18672
  "record.metadata.type": "",
18622
18673
  "record.metadata.uniqueId": "",
18623
18674
  "record.metadata.updateFrequency": "",
18624
- "record.metadata.updateStatus": "",
18625
18675
  "record.metadata.updatedOn": "",
18626
18676
  "record.metadata.usage": "",
18627
18677
  "record.more.details": "",
@@ -18653,6 +18703,7 @@ var nl = {
18653
18703
  "search.filters.isSpatial": "",
18654
18704
  "search.filters.isSpatial.no": "",
18655
18705
  "search.filters.isSpatial.yes": "",
18706
+ "search.filters.keyword": "",
18656
18707
  "search.filters.license": "",
18657
18708
  "search.filters.license.cc-by": "",
18658
18709
  "search.filters.license.cc-by-sa": "",
@@ -18717,20 +18768,21 @@ var pt = {
18717
18768
  "chart.type.line": "gráfico de linha",
18718
18769
  "chart.type.lineSmooth": "gráfico de linha suave",
18719
18770
  "chart.type.pie": "gráfico de pizza",
18771
+ "dashboard.createRecord": "",
18720
18772
  "dashboard.labels.mySpace": "Meu espaço",
18721
18773
  "dashboard.records.all": "Catálogo",
18722
18774
  "dashboard.records.myDraft": "Meus rascunhos",
18723
18775
  "dashboard.records.myLibrary": "Minha biblioteca",
18724
18776
  "dashboard.records.myOrg": "Organização",
18725
18777
  "dashboard.records.myRecords": "Meus Registros",
18726
- "dashboard.records.noRecord": "",
18727
- "dashboard.records.noUser": "",
18728
18778
  "dashboard.records.publishedRecords": "",
18729
18779
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18730
18780
  "dashboard.records.userDetail": "",
18731
18781
  "dashboard.records.userEmail": "",
18732
18782
  "dashboard.records.username": "",
18733
18783
  "dashboard.records.users": "",
18784
+ "dashboard.results.listMetadata": "",
18785
+ "dashboard.results.listResources": "",
18734
18786
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18735
18787
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18736
18788
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18857,27 +18909,28 @@ var pt = {
18857
18909
  "facets.block.title.tag.default": "",
18858
18910
  "facets.block.title.th_regions_tree.default": "",
18859
18911
  "favorite.not.authenticated.tooltip": "",
18860
- "language.ca": "Català",
18861
- "language.cs": "Čeština",
18862
- "language.de": "Deutsch",
18863
- "language.en": "English",
18864
- "language.es": "Español",
18865
- "language.fi": "Suomi",
18866
- "language.fr": "Français",
18867
- "language.is": "Íslenska",
18912
+ "language.ca": "Catalão",
18913
+ "language.cs": "Tcheco",
18914
+ "language.de": "Alemão",
18915
+ "language.en": "Inglês",
18916
+ "language.es": "Espanhol",
18917
+ "language.fi": "Finlandês",
18918
+ "language.fr": "Francês",
18919
+ "language.is": "Islandês",
18868
18920
  "language.it": "Italiano",
18869
- "language.ko": "한국어",
18870
- "language.nl": "Nederlands",
18921
+ "language.ko": "Coreano",
18922
+ "language.nl": "Holandês",
18871
18923
  "language.pt": "Português",
18872
- "language.ru": "Русский",
18873
- "language.sk": "Slovenčina",
18874
- "language.zh": "中文",
18924
+ "language.ru": "Russo",
18925
+ "language.sk": "Eslovaco",
18926
+ "language.zh": "Chinês",
18875
18927
  "map.add.layer": "",
18876
18928
  "map.add.layer.catalog": "",
18877
18929
  "map.add.layer.file": "",
18878
18930
  "map.add.layer.wfs": "",
18879
18931
  "map.add.layer.wms": "",
18880
18932
  "map.addFromFile.placeholder": "",
18933
+ "map.geocoding.placeholder": "",
18881
18934
  "map.help.addFromFile": "",
18882
18935
  "map.layer.add": "",
18883
18936
  "map.layers.available": "",
@@ -18921,18 +18974,20 @@ var pt = {
18921
18974
  "record.metadata.author": "",
18922
18975
  "record.metadata.catalog": "",
18923
18976
  "record.metadata.contact": "",
18924
- "record.metadata.createdOn": "",
18977
+ "record.metadata.creation": "",
18925
18978
  "record.metadata.details": "",
18926
18979
  "record.metadata.download": "",
18927
18980
  "record.metadata.formats": "",
18928
- "record.metadata.isOpenData": "",
18929
18981
  "record.metadata.keywords": "",
18982
+ "record.metadata.languages": "",
18930
18983
  "record.metadata.lastUpdate": "",
18931
18984
  "record.metadata.links": "",
18932
18985
  "record.metadata.noUsage": "",
18933
- "record.metadata.origin": "",
18986
+ "record.metadata.otherConstraints": "",
18934
18987
  "record.metadata.owner": "",
18935
18988
  "record.metadata.preview": "",
18989
+ "record.metadata.producer": "",
18990
+ "record.metadata.publication": "",
18936
18991
  "record.metadata.publications": "",
18937
18992
  "record.metadata.quality": "",
18938
18993
  "record.metadata.quality.contact.failed": "",
@@ -18954,12 +19009,17 @@ var pt = {
18954
19009
  "record.metadata.quality.updateFrequency.success": "",
18955
19010
  "record.metadata.related": "",
18956
19011
  "record.metadata.sheet": "",
18957
- "record.metadata.themes": "",
19012
+ "record.metadata.status": "",
19013
+ "record.metadata.technical": "",
19014
+ "record.metadata.temporalExtent": "",
19015
+ "record.metadata.temporalExtent.fromDateToDate": "",
19016
+ "record.metadata.temporalExtent.sinceDate": "",
19017
+ "record.metadata.temporalExtent.untilDate": "",
18958
19018
  "record.metadata.title": "",
19019
+ "record.metadata.topics": "",
18959
19020
  "record.metadata.type": "",
18960
19021
  "record.metadata.uniqueId": "",
18961
19022
  "record.metadata.updateFrequency": "",
18962
- "record.metadata.updateStatus": "",
18963
19023
  "record.metadata.updatedOn": "",
18964
19024
  "record.metadata.usage": "",
18965
19025
  "record.more.details": "",
@@ -18991,6 +19051,7 @@ var pt = {
18991
19051
  "search.filters.isSpatial": "",
18992
19052
  "search.filters.isSpatial.no": "",
18993
19053
  "search.filters.isSpatial.yes": "",
19054
+ "search.filters.keyword": "",
18994
19055
  "search.filters.license": "",
18995
19056
  "search.filters.license.cc-by": "",
18996
19057
  "search.filters.license.cc-by-sa": "",
@@ -19099,8 +19160,8 @@ class Gn4FieldMapper {
19099
19160
  },
19100
19161
  cl_topic: (output, source) => ({
19101
19162
  ...output,
19102
- themes: [
19103
- ...(output.themes || []),
19163
+ topics: [
19164
+ ...(output.topics || []),
19104
19165
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
19105
19166
  ],
19106
19167
  }),
@@ -19124,6 +19185,18 @@ class Gn4FieldMapper {
19124
19185
  ...output,
19125
19186
  recordUpdated: toDate(selectField(source, 'changeDate')),
19126
19187
  }),
19188
+ publicationDateForResource: (output, source) => ({
19189
+ ...output,
19190
+ recordPublished: toDate(selectField(source, 'publicationDateForResource')),
19191
+ }),
19192
+ resourceLanguage: (output, source) => {
19193
+ const langList = getAsArray(selectField(source, 'resourceLanguage'));
19194
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
19195
+ return {
19196
+ ...output,
19197
+ languages,
19198
+ };
19199
+ },
19127
19200
  link: (output, source) => {
19128
19201
  const rawLinks = getAsArray(selectField(source, 'link'));
19129
19202
  const distributions = rawLinks
@@ -19155,31 +19228,22 @@ class Gn4FieldMapper {
19155
19228
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19156
19229
  }, output);
19157
19230
  },
19158
- tag: (output, source) => ({
19231
+ allKeywords: (output, source) => ({
19159
19232
  ...output,
19160
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19233
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19161
19234
  }),
19162
19235
  inspireTheme: (output, source) => ({
19163
19236
  ...output,
19164
- themes: [
19165
- ...(output.themes || []),
19237
+ topics: [
19238
+ ...(output.topics || []),
19166
19239
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19167
19240
  ],
19168
19241
  }),
19169
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19170
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19171
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19172
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19173
- licenseObject: (output, source) => ({
19174
- ...output,
19175
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19176
- const link = getAsUrl(selectField(license, 'link'));
19177
- return {
19178
- text: selectTranslatedValue(license, this.lang3),
19179
- ...(link ? { link } : {}),
19180
- };
19181
- }),
19182
- }),
19242
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19243
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19244
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19245
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19246
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19183
19247
  lineageObject: (output, source) => ({
19184
19248
  ...output,
19185
19249
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19205,33 +19269,78 @@ class Gn4FieldMapper {
19205
19269
  kind,
19206
19270
  };
19207
19271
  },
19272
+ geom: (output, source) => {
19273
+ const geoms = getAsArray(selectField(source, 'geom'));
19274
+ const shapes = getAsArray(selectField(source, 'shape'));
19275
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19276
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19277
+ return {
19278
+ ...output,
19279
+ spatialExtents: [
19280
+ ...spatialExtents,
19281
+ ...geoms.map((geom, index) => {
19282
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19283
+ const geometry = shapes[index] ?? geom;
19284
+ return {
19285
+ ...(description !== null ? { description } : null),
19286
+ geometry,
19287
+ };
19288
+ }),
19289
+ ],
19290
+ };
19291
+ },
19292
+ resourceTemporalExtentDateRange: (output, source) => {
19293
+ const ranges = getAsArray(selectField(source, 'resourceTemporalExtentDateRange'));
19294
+ return {
19295
+ ...output,
19296
+ temporalExtents: ranges.map((range) => {
19297
+ const start = selectField(range, 'gte');
19298
+ const end = selectField(range, 'lte');
19299
+ return {
19300
+ ...(start !== null ? { start: toDate(start) } : null),
19301
+ ...(end !== null ? { end: toDate(end) } : null),
19302
+ };
19303
+ }),
19304
+ };
19305
+ },
19208
19306
  };
19209
19307
  this.genericField = (output) => output;
19210
- this.constraintField = (fieldName, output, source) => ({
19211
- ...output,
19212
- ...(fieldName.endsWith('UseLimitationObject')
19213
- ? {
19214
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19215
- ? [
19216
- ...(output.legalConstraints || []),
19217
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19218
- ]
19219
- : output.legalConstraints || [],
19220
- useLimitations: [
19221
- ...(output.useLimitations || []),
19222
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19223
- ],
19224
- }
19225
- : {
19226
- accessConstraints: [
19227
- ...(output.accessConstraints || []),
19228
- ...selectField(source, fieldName).map((field) => ({
19229
- text: selectTranslatedValue(field, this.lang3),
19230
- type: this.getConstraintsType(fieldName),
19231
- })),
19232
- ],
19233
- }),
19234
- });
19308
+ this.constraintField = (type, output, constraintArray) => {
19309
+ let outputField;
19310
+ switch (type) {
19311
+ case 'license':
19312
+ outputField = 'licenses';
19313
+ break;
19314
+ case 'legal':
19315
+ outputField = 'legalConstraints';
19316
+ break;
19317
+ case 'security':
19318
+ outputField = 'securityConstraints';
19319
+ break;
19320
+ case 'other':
19321
+ outputField = 'otherConstraints';
19322
+ break;
19323
+ }
19324
+ const outputArray = outputField in output ? output[outputField] : [];
19325
+ outputArray.push(...constraintArray.map((item) => {
19326
+ const text = selectTranslatedValue(item, this.lang3);
19327
+ const url = getAsUrl(selectField(item, 'link'));
19328
+ return {
19329
+ text,
19330
+ ...(url ? { url } : {}),
19331
+ };
19332
+ }));
19333
+ const result = {
19334
+ ...output,
19335
+ [outputField]: outputArray,
19336
+ };
19337
+ // avoid legal constraints being duplicates of licenses
19338
+ if ('legalConstraints' in result &&
19339
+ (type === 'legal' || type === 'license')) {
19340
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19341
+ }
19342
+ return result;
19343
+ };
19235
19344
  this.mapLink = (sourceLink) => {
19236
19345
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19237
19346
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19279,17 +19388,6 @@ class Gn4FieldMapper {
19279
19388
  extras: { ...(output.extras || {}), ...value },
19280
19389
  });
19281
19390
  }
19282
- getConstraintsType(indexField) {
19283
- switch (indexField) {
19284
- case 'MD_LegalConstraintsUseLimitationObject':
19285
- return 'legal';
19286
- case 'MD_SecurityConstraintsUseLimitationObject':
19287
- return 'security';
19288
- case 'MD_ConstraintsUseLimitationObject':
19289
- default:
19290
- return 'other';
19291
- }
19292
- }
19293
19391
  getMappingFn(fieldName) {
19294
19392
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19295
19393
  }
@@ -19349,17 +19447,20 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19349
19447
  status: null,
19350
19448
  lineage: null,
19351
19449
  recordUpdated: null,
19450
+ recordPublished: null,
19352
19451
  ownerOrganization: null,
19353
19452
  licenses: [],
19453
+ legalConstraints: [],
19454
+ securityConstraints: [],
19455
+ otherConstraints: [],
19354
19456
  contacts: [],
19355
19457
  contactsForResource: [],
19356
- accessConstraints: [],
19357
19458
  keywords: [],
19358
- themes: [],
19359
- useLimitations: [],
19459
+ topics: [],
19360
19460
  spatialExtents: [],
19361
19461
  temporalExtents: [],
19362
19462
  overviews: [],
19463
+ languages: [],
19363
19464
  };
19364
19465
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19365
19466
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -20124,11 +20225,18 @@ class OrganizationsFromMetadataService {
20124
20225
  if (!allContactOrgs.length)
20125
20226
  return of(record);
20126
20227
  const ownerOrganization = allContactOrgs[0];
20127
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20228
+ // read the owner group as well to have a fallback logo
20229
+ const groupId = selectField(source, 'groupOwner');
20230
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20231
+ return group.id === Number(groupId);
20232
+ })));
20233
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20128
20234
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20235
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20129
20236
  return {
20130
20237
  ...record,
20131
20238
  ownerOrganization: {
20239
+ logoUrl,
20132
20240
  ...ownerOrganization,
20133
20241
  ...recordOrganisation,
20134
20242
  },
@@ -20393,36 +20501,23 @@ class SelectionService {
20393
20501
  this.selectedRecordsIdentifiers$.next(filtered);
20394
20502
  }
20395
20503
  selectRecords(records) {
20396
- const newIds = [];
20397
- records.map((record) => {
20398
- newIds.push(record.uniqueIdentifier);
20399
- });
20400
- const apiResponse = this.selectionsApi.add(BUCKET_ID, newIds);
20401
- return apiResponse.pipe(tap$2(() => {
20504
+ const newIds = records.map((record) => record.uniqueIdentifier);
20505
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20402
20506
  this.addIdsToSelected(newIds);
20403
- }), map$2(() => undefined));
20507
+ });
20404
20508
  }
20405
20509
  deselectRecords(records) {
20406
- const idsToBeRemoved = [];
20407
- records.map((record) => {
20408
- idsToBeRemoved.push(record.uniqueIdentifier);
20409
- });
20410
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved);
20411
- return apiResponse.pipe(tap$2(() => {
20510
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20511
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20412
20512
  this.removeIdsFromSelected(idsToBeRemoved);
20413
- }), map$2(() => undefined));
20414
- }
20415
- clearSelection() {
20416
- const currentSelectedResponse = this.selectionsApi.get(BUCKET_ID);
20417
- let currentSelection;
20418
- this.subscription = currentSelectedResponse.subscribe((value) => {
20419
- currentSelection = [...value];
20420
20513
  });
20421
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20422
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20423
- return apiResponse.pipe(tap$2(() => {
20514
+ }
20515
+ async clearSelection() {
20516
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20517
+ const currentSelection = Array.from(response);
20518
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20424
20519
  this.removeIdsFromSelected(currentSelection);
20425
- }), map$2(() => undefined));
20520
+ });
20426
20521
  }
20427
20522
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20428
20523
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20452,12 +20547,21 @@ class Gn4PlatformMapper {
20452
20547
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20453
20548
  return { ...apiUser, id: id.toString() };
20454
20549
  }
20455
- thesaurusFromApi(thesaurus) {
20550
+ thesaurusFromApi(thesaurus, lang3) {
20456
20551
  return thesaurus.map((keyword) => {
20457
- const { uri, value } = keyword;
20552
+ let key = keyword.uri;
20553
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20554
+ if (key.indexOf('@@@') > -1) {
20555
+ key = key.split('@@@')[1];
20556
+ }
20557
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20558
+ const description = lang3 && lang3 in keyword.definitions
20559
+ ? keyword.definitions[lang3]
20560
+ : keyword.definition;
20458
20561
  return {
20459
- key: uri,
20460
- label: value,
20562
+ key,
20563
+ label,
20564
+ description,
20461
20565
  };
20462
20566
  });
20463
20567
  }
@@ -20470,13 +20574,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20470
20574
 
20471
20575
  const minApiVersion = '4.2.2';
20472
20576
  class Gn4PlatformService {
20473
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20577
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20474
20578
  this.siteApiService = siteApiService;
20475
20579
  this.meApi = meApi;
20476
20580
  this.usersApi = usersApi;
20477
20581
  this.mapper = mapper;
20478
20582
  this.toolsApiService = toolsApiService;
20479
20583
  this.registriesApiService = registriesApiService;
20584
+ this.langService = langService;
20480
20585
  this.type = 'GeoNetwork';
20481
20586
  this.keyTranslations$ = this.toolsApiService
20482
20587
  .getTranslationsPackage1('gnui')
@@ -20490,6 +20595,11 @@ class Gn4PlatformService {
20490
20595
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20491
20596
  }
20492
20597
  }), shareReplay(1));
20598
+ /**
20599
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20600
+ * @private
20601
+ */
20602
+ this.thesauri = {};
20493
20603
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20494
20604
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20495
20605
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20516,19 +20626,36 @@ class Gn4PlatformService {
20516
20626
  return this.users$;
20517
20627
  }
20518
20628
  translateKey(key) {
20629
+ // if the key is a URI, use the registries API to look for the translation
20630
+ if (key.match(/^https?:\/\//)) {
20631
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20632
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20633
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20634
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20635
+ for (const item of thesaurus) {
20636
+ if (item.key === key)
20637
+ return item.label;
20638
+ }
20639
+ return key;
20640
+ }));
20641
+ }
20519
20642
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20520
20643
  }
20521
- getThesaurusByLang(thesaurusName, lang) {
20522
- return this.registriesApiService
20523
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20524
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20644
+ getThesaurusByUri(uri) {
20645
+ if (this.thesauri[uri]) {
20646
+ return this.thesauri[uri];
20647
+ }
20648
+ this.thesauri[uri] = this.registriesApiService
20649
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20650
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20651
+ return this.thesauri[uri];
20525
20652
  }
20526
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20653
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20527
20654
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20528
20655
  }
20529
20656
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20530
20657
  type: Injectable
20531
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20658
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20532
20659
 
20533
20660
  function provideGn4() {
20534
20661
  return [
@@ -20740,6 +20867,8 @@ const defaultMapOptions = {
20740
20867
  };
20741
20868
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20742
20869
 
20870
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20871
+
20743
20872
  var MapContextLayerTypeEnum;
20744
20873
  (function (MapContextLayerTypeEnum) {
20745
20874
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21074,6 +21203,38 @@ function createFuzzyFilter(pattern) {
21074
21203
  };
21075
21204
  }
21076
21205
 
21206
+ function getTemporalRangeUnion(ranges) {
21207
+ let earliestStartDate = Infinity;
21208
+ let latestEndDate = -Infinity;
21209
+ if (ranges.length) {
21210
+ for (let i = 0; i < ranges.length; i++) {
21211
+ const rangeStart = ranges[i].start
21212
+ ? new Date(ranges[i].start).getTime()
21213
+ : -Infinity;
21214
+ const rangeEnd = ranges[i].end
21215
+ ? new Date(ranges[i].end).getTime()
21216
+ : Infinity;
21217
+ if (rangeStart < earliestStartDate) {
21218
+ earliestStartDate = rangeStart;
21219
+ }
21220
+ if (rangeEnd > latestEndDate) {
21221
+ latestEndDate = rangeEnd;
21222
+ }
21223
+ }
21224
+ return {
21225
+ start: earliestStartDate !== -Infinity
21226
+ ? new Date(earliestStartDate).toLocaleDateString()
21227
+ : undefined,
21228
+ end: latestEndDate !== Infinity
21229
+ ? new Date(latestEndDate).toLocaleDateString()
21230
+ : undefined,
21231
+ };
21232
+ }
21233
+ else {
21234
+ return undefined;
21235
+ }
21236
+ }
21237
+
21077
21238
  marker('downloads.wfs.featuretype.not.found');
21078
21239
  const FORMATS = {
21079
21240
  csv: {
@@ -21334,76 +21495,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21334
21495
  }]
21335
21496
  }] });
21336
21497
 
21337
- const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
21338
-
21339
- class MapUtilsWMSService {
21340
- constructor(proxy) {
21498
+ const FEATURE_PROJECTION = 'EPSG:3857';
21499
+ const DATA_PROJECTION = 'EPSG:4326';
21500
+ const GEOJSON = new GeoJSON();
21501
+ class MapUtilsService {
21502
+ constructor(http, proxy) {
21503
+ this.http = http;
21341
21504
  this.proxy = proxy;
21505
+ this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21506
+ return GEOJSON.readFeatures(featureCollection, {
21507
+ featureProjection,
21508
+ dataProjection,
21509
+ });
21510
+ };
21342
21511
  }
21343
- getCapabilities(layer) {
21344
- return from(new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady());
21345
- }
21346
- getLayerFull(layer) {
21347
- return this.getCapabilities(layer).pipe(map$1((endpoint) => endpoint.getLayerByName(layer.name)));
21512
+ createEmptyMap() {
21513
+ return new Map$1({
21514
+ controls: [],
21515
+ pixelRatio: 1,
21516
+ });
21348
21517
  }
21349
- getLayerLonLatBBox(layer) {
21350
- return this.getLayerFull(layer).pipe(switchMap$1((wmsLayerFull) => from(this.getLonLatBBox(wmsLayerFull))));
21351
- }
21352
- async getLonLatBBox(wmsLayerFull) {
21353
- const { boundingBoxes } = wmsLayerFull;
21354
- const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21355
- if (lonLatCRS) {
21356
- return boundingBoxes[lonLatCRS];
21357
- }
21358
- else {
21359
- const availableEPSGCode = Object.keys(boundingBoxes)[0];
21360
- register(proj4);
21361
- const proj = await fromEPSGCode(availableEPSGCode);
21362
- proj4.defs(availableEPSGCode, proj);
21363
- const bboxWithFiniteNumbers = [
21364
- parseFloat(boundingBoxes[availableEPSGCode][0]),
21365
- parseFloat(boundingBoxes[availableEPSGCode][1]),
21366
- parseFloat(boundingBoxes[availableEPSGCode][2]),
21367
- parseFloat(boundingBoxes[availableEPSGCode][3]),
21368
- ];
21369
- const extent = transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21370
- return extent;
21371
- }
21372
- }
21373
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21374
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, providedIn: 'root' }); }
21375
- }
21376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, decorators: [{
21377
- type: Injectable,
21378
- args: [{
21379
- providedIn: 'root',
21380
- }]
21381
- }], ctorParameters: function () { return [{ type: ProxyService }]; } });
21382
-
21383
- const FEATURE_PROJECTION = 'EPSG:3857';
21384
- const DATA_PROJECTION = 'EPSG:4326';
21385
- class MapUtilsService {
21386
- constructor(http, wmsUtils) {
21387
- this.http = http;
21388
- this.wmsUtils = wmsUtils;
21389
- this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21390
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21391
- featureProjection,
21392
- dataProjection,
21393
- });
21394
- return olFeatures;
21395
- };
21396
- }
21397
- createEmptyMap() {
21398
- const map = new Map$1({
21399
- controls: [],
21400
- pixelRatio: 1,
21401
- });
21402
- return map;
21403
- }
21404
- isWMSLayer(layer) {
21405
- return (layer.getSource() instanceof TileWMS ||
21406
- layer.getSource() instanceof ImageWMS);
21518
+ isWMSLayer(layer) {
21519
+ return (layer.getSource() instanceof TileWMS ||
21520
+ layer.getSource() instanceof ImageWMS);
21407
21521
  }
21408
21522
  getGFIUrl(layer, map, coordinate) {
21409
21523
  const view = map.getView();
@@ -21414,8 +21528,7 @@ class MapUtilsService {
21414
21528
  ...source.getParams(),
21415
21529
  INFO_FORMAT: 'application/json',
21416
21530
  };
21417
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21418
- return url;
21531
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21419
21532
  }
21420
21533
  getVectorFeaturesFromClick(olMap, event) {
21421
21534
  const features = [];
@@ -21443,38 +21556,56 @@ class MapUtilsService {
21443
21556
  /**
21444
21557
  * Will emit `null` if no extent could be computed
21445
21558
  */
21446
- getLayerExtent(layer) {
21447
- let geographicExtent;
21559
+ async getLayerExtent(layer) {
21560
+ let latLonExtent;
21448
21561
  if (layer &&
21449
21562
  layer.type === 'geojson' &&
21450
21563
  'data' in layer &&
21451
21564
  typeof layer.data === 'object' &&
21452
21565
  layer.data.features[0] &&
21453
21566
  layer.data.features[0].geometry) {
21454
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21455
- .readFeatures(layerData)
21567
+ latLonExtent = new GeoJSON()
21568
+ .readFeatures(layer.data)
21456
21569
  .map((feature) => feature.getGeometry())
21457
21570
  .filter((geom) => !!geom)
21458
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21571
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21459
21572
  }
21460
21573
  else if (layer && layer.type === 'wms') {
21461
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21574
+ latLonExtent = await this.getWmsLayerExtent(layer);
21462
21575
  }
21463
21576
  else if (layer && layer.type === 'wmts') {
21464
21577
  if (layer.extent) {
21465
- geographicExtent = of(layer.extent);
21578
+ latLonExtent = layer.extent;
21466
21579
  }
21467
21580
  else {
21468
- return of(layer.options.tileGrid.getExtent());
21581
+ return layer.options.tileGrid.getExtent();
21469
21582
  }
21470
21583
  }
21471
21584
  else {
21472
- return of(null);
21585
+ return null;
21586
+ }
21587
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21588
+ return null;
21589
+ }
21590
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21591
+ }
21592
+ async getWmsLayerExtent(layer) {
21593
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21594
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21595
+ if (!Object.keys(boundingBoxes).length) {
21596
+ return null;
21597
+ }
21598
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21599
+ if (lonLatCRS) {
21600
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21601
+ }
21602
+ else {
21603
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21604
+ register(proj4);
21605
+ const proj = await fromEPSGCode(availableEPSGCode);
21606
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21607
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21473
21608
  }
21474
- return geographicExtent.pipe(map$1((extent) => [
21475
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
21476
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
21477
- ]), map$1((extent) => (isEmpty(extent) ? null : extent)));
21478
21609
  }
21479
21610
  getWmtsLayerFromCapabilities(link) {
21480
21611
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21530,7 +21661,18 @@ ${e.stack || e.message || e}`);
21530
21661
  ])
21531
21662
  .getArray());
21532
21663
  }
21533
- 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 }); }
21664
+ getRecordExtent(record) {
21665
+ if (!('spatialExtents' in record)) {
21666
+ return null;
21667
+ }
21668
+ // transform an array of geojson geometries into a bbox
21669
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21670
+ const geom = GEOJSON.readGeometry(curr.geometry);
21671
+ return extend(prev, geom.getExtent());
21672
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21673
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21674
+ }
21675
+ 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 }); }
21534
21676
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21535
21677
  }
21536
21678
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21538,7 +21680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21538
21680
  args: [{
21539
21681
  providedIn: 'root',
21540
21682
  }]
21541
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21683
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21542
21684
  function dragPanCondition(event) {
21543
21685
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21544
21686
  if (!dragPanCondition) {
@@ -22623,6 +22765,9 @@ class MapContextService {
22623
22765
  if (mapConfig) {
22624
22766
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22625
22767
  }
22768
+ else {
22769
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22770
+ }
22626
22771
  if (!mapContext.view?.extent &&
22627
22772
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22628
22773
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22733,6 +22878,11 @@ class MapContextService {
22733
22878
  }
22734
22879
  return view;
22735
22880
  }
22881
+ addDefaultBaselayerContext(layers) {
22882
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22883
+ ? layers
22884
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22885
+ }
22736
22886
  mergeMapConfigWithContext(mapContext, mapConfig) {
22737
22887
  return {
22738
22888
  ...mapContext,
@@ -23279,11 +23429,11 @@ class ThumbnailComponent {
23279
23429
  }
23280
23430
  }
23281
23431
  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 }); }
23282
- 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 }); }
23432
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23283
23433
  }
23284
23434
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23285
23435
  type: Component,
23286
- args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23436
+ args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23287
23437
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23288
23438
  type: Optional
23289
23439
  }, {
@@ -23411,8 +23561,7 @@ class MetadataQualityComponent {
23411
23561
  : this.calculatedQualityScore;
23412
23562
  }
23413
23563
  get calculatedQualityScore() {
23414
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23415
- this.items.length);
23564
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23416
23565
  }
23417
23566
  showMenu() {
23418
23567
  this.isMenuShown = true;
@@ -23430,7 +23579,7 @@ class MetadataQualityComponent {
23430
23579
  this.items = [];
23431
23580
  this.add('title', !!this.metadata?.title);
23432
23581
  this.add('description', !!this.metadata?.abstract);
23433
- this.add('topic', this.metadata?.themes?.length > 0);
23582
+ this.add('topic', this.metadata?.topics?.length > 0);
23434
23583
  this.add('keywords', this.metadata?.keywords?.length > 0);
23435
23584
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23436
23585
  this.add('organisation', !!contact?.organization);
@@ -23878,6 +24027,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23878
24027
  type: Input
23879
24028
  }] } });
23880
24029
 
24030
+ class MarkdownParserComponent {
24031
+ get parsedMarkdown() {
24032
+ return marked.parse(this.textContent);
24033
+ }
24034
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24035
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24036
+ }
24037
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24038
+ type: Component,
24039
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
24040
+ }], propDecorators: { textContent: [{
24041
+ type: Input
24042
+ }] } });
24043
+
23881
24044
  class ContentGhostComponent {
23882
24045
  constructor() {
23883
24046
  this.ghostClass = '';
@@ -24017,14 +24180,16 @@ class MaxLinesComponent {
24017
24180
  return result;
24018
24181
  }
24019
24182
  ngOnDestroy() {
24183
+ if (!this.observer)
24184
+ return;
24020
24185
  this.observer.unobserve(this.container.nativeElement.children[0]);
24021
24186
  }
24022
24187
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24023
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\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: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24188
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\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: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24024
24189
  }
24025
24190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, decorators: [{
24026
24191
  type: Component,
24027
- args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
24192
+ args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
24028
24193
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
24029
24194
  type: Input
24030
24195
  }], container: [{
@@ -24032,36 +24197,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24032
24197
  args: ['container']
24033
24198
  }] } });
24034
24199
 
24035
- class MarkdownParserComponent {
24036
- get parsedMarkdown() {
24037
- return marked.parse(this.textContent);
24038
- }
24039
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24040
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24041
- }
24042
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24043
- type: Component,
24044
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
24045
- }], propDecorators: { textContent: [{
24046
- type: Input
24047
- }] } });
24048
-
24049
24200
  class MetadataInfoComponent {
24050
24201
  constructor() {
24051
24202
  this.keyword = new EventEmitter();
24052
24203
  }
24053
24204
  get hasUsage() {
24054
24205
  return (this.metadata.extras?.isOpenData === true ||
24055
- this.metadata.useLimitations?.length ||
24056
- this.metadata.accessConstraints?.length);
24206
+ (this.metadata.legalConstraints?.length > 0 &&
24207
+ this.legalConstraints.length > 0) ||
24208
+ (this.metadata.otherConstraints?.length > 0 &&
24209
+ this.otherConstraints.length > 0) ||
24210
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24057
24211
  }
24058
- get usages() {
24212
+ get legalConstraints() {
24059
24213
  let array = [];
24060
- if (this.metadata.useLimitations?.length) {
24061
- array = array.concat(this.metadata.useLimitations);
24214
+ if (this.metadata.legalConstraints?.length) {
24215
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24062
24216
  }
24063
- if (this.metadata.accessConstraints?.length) {
24064
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24217
+ return array;
24218
+ }
24219
+ get otherConstraints() {
24220
+ let array = [];
24221
+ if (this.metadata.otherConstraints?.length) {
24222
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24223
+ }
24224
+ return array;
24225
+ }
24226
+ get licenses() {
24227
+ let array = [];
24228
+ if (this.metadata.licenses?.length) {
24229
+ array = array.concat(this.metadata.licenses
24230
+ .filter((c) => c.text)
24231
+ .map((c) => ({ text: c.text, url: c.url })));
24065
24232
  }
24066
24233
  return array;
24067
24234
  }
@@ -24077,22 +24244,28 @@ class MetadataInfoComponent {
24077
24244
  return undefined;
24078
24245
  }
24079
24246
  }
24247
+ get temporalExtent() {
24248
+ const temporalExtents = this.metadata.temporalExtents;
24249
+ return getTemporalRangeUnion(temporalExtents);
24250
+ }
24251
+ get shownOrganization() {
24252
+ return this.metadata.ownerOrganization;
24253
+ }
24254
+ get resourceContact() {
24255
+ return this.metadata.contactsForResource?.[0];
24256
+ }
24080
24257
  fieldReady(propName) {
24081
24258
  return !this.incomplete || propName in this.metadata;
24082
24259
  }
24083
24260
  onKeywordClick(keyword) {
24084
24261
  this.keyword.emit(keyword);
24085
24262
  }
24086
- copyText() {
24087
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24088
- event.target.blur();
24089
- }
24090
24263
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24091
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24264
+ 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 *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.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]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.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 class=\"mt-4\" *ngIf=\"resourceContact.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=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\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.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24092
24265
  }
24093
24266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24094
24267
  type: Component,
24095
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24268
+ 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 *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.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]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.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 class=\"mt-4\" *ngIf=\"resourceContact.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=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\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.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24096
24269
  }], propDecorators: { metadata: [{
24097
24270
  type: Input
24098
24271
  }], incomplete: [{
@@ -24161,11 +24334,11 @@ class ButtonComponent {
24161
24334
  propagateToDocumentOnly(event);
24162
24335
  }
24163
24336
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24164
- 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 }); }
24337
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, isStandalone: true, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24165
24338
  }
24166
24339
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24167
24340
  type: Component,
24168
- 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"] }]
24341
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24169
24342
  }], propDecorators: { type: [{
24170
24343
  type: Input
24171
24344
  }], disabled: [{
@@ -24240,11 +24413,11 @@ class DownloadsListComponent {
24240
24413
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24241
24414
  }
24242
24415
  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 }); }
24243
- 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 }); }
24416
+ 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 }); }
24244
24417
  }
24245
24418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24246
24419
  type: Component,
24247
- 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" }]
24420
+ 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" }]
24248
24421
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24249
24422
  type: Input
24250
24423
  }] } });
@@ -24445,11 +24618,11 @@ class CarouselComponent {
24445
24618
  this.emblaApi.scrollTo(stepIndex);
24446
24619
  }
24447
24620
  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 }); }
24448
- 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 }); }
24621
+ 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 *ngIf=\"steps.length > 1\"\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"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24449
24622
  }
24450
24623
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24451
24624
  type: Component,
24452
- 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"] }]
24625
+ 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 *ngIf=\"steps.length > 1\"\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"] }]
24453
24626
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24454
24627
  type: Input
24455
24628
  }], stepsContainerClass: [{
@@ -24493,6 +24666,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24493
24666
  }]
24494
24667
  }] });
24495
24668
 
24669
+ class InteractiveTableColumnComponent {
24670
+ constructor() {
24671
+ this.grow = false;
24672
+ this.sortable = false;
24673
+ this.activeSort = null;
24674
+ this.sortChange = new EventEmitter();
24675
+ }
24676
+ handleSortChange() {
24677
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24678
+ this.sortChange.emit(this.activeSort);
24679
+ }
24680
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24681
+ 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 }); }
24682
+ }
24683
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24684
+ type: Component,
24685
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24686
+ }], propDecorators: { header: [{
24687
+ type: ContentChild,
24688
+ args: ['header']
24689
+ }], cell: [{
24690
+ type: ContentChild,
24691
+ args: ['cell']
24692
+ }], grow: [{
24693
+ type: Input
24694
+ }], sortable: [{
24695
+ type: Input
24696
+ }], activeSort: [{
24697
+ type: Input
24698
+ }], sortChange: [{
24699
+ type: Output
24700
+ }] } });
24701
+
24702
+ class InteractiveTableComponent {
24703
+ constructor() {
24704
+ this.items = [];
24705
+ this.itemClick = new EventEmitter();
24706
+ }
24707
+ get gridStyle() {
24708
+ return {
24709
+ 'grid-template-columns': this.columns
24710
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24711
+ .join(' '),
24712
+ };
24713
+ }
24714
+ handleRowClick(item) {
24715
+ this.itemClick.emit(item);
24716
+ }
24717
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24718
+ 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 }); }
24719
+ }
24720
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24721
+ type: Component,
24722
+ 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"] }]
24723
+ }], propDecorators: { columns: [{
24724
+ type: ContentChildren,
24725
+ args: [InteractiveTableColumnComponent]
24726
+ }], items: [{
24727
+ type: Input
24728
+ }], itemClick: [{
24729
+ type: Output
24730
+ }] } });
24731
+
24496
24732
  class LinkCardComponent {
24497
24733
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24498
24734
  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 }); }
@@ -24538,11 +24774,11 @@ class MetadataContactComponent {
24538
24774
  this.organizationClick.emit(this.shownOrganization);
24539
24775
  }
24540
24776
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24541
- 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"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24777
+ 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 overflow-hidden\">\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 }); }
24542
24778
  }
24543
24779
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24544
24780
  type: Component,
24545
- 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" }]
24781
+ 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 overflow-hidden\">\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" }]
24546
24782
  }], propDecorators: { metadata: [{
24547
24783
  type: Input
24548
24784
  }], organizationClick: [{
@@ -24766,11 +25002,11 @@ class DropdownSelectorComponent {
24766
25002
  }
24767
25003
  }
24768
25004
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24769
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"!p-[8px] !pl-[16px] flex flex-row w-full {{ extraBtnClass }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\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</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\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.min-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 >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], 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"] }, { 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$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 }); }
25005
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\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</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\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.min-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 >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], 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"] }, { 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$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 }); }
24770
25006
  }
24771
25007
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24772
25008
  type: Component,
24773
- args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"!p-[8px] !pl-[16px] flex flex-row w-full {{ extraBtnClass }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\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</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\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.min-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 >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
25009
+ args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\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</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\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.min-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 >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
24774
25010
  }], propDecorators: { title: [{
24775
25011
  type: Input
24776
25012
  }], showTitle: [{
@@ -24946,11 +25182,11 @@ class DropdownMultiselectComponent {
24946
25182
  this.setFocus();
24947
25183
  }
24948
25184
  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 }); }
24949
- 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 }); }
25185
+ 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=\"bg-background 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 }); }
24950
25186
  }
24951
25187
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24952
25188
  type: Component,
24953
- 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" }]
25189
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background 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" }]
24954
25190
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24955
25191
  type: Input
24956
25192
  }], choices: [{
@@ -25104,11 +25340,11 @@ class TextAreaComponent {
25104
25340
  this.rawChange.next(value);
25105
25341
  }
25106
25342
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25107
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25343
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25108
25344
  }
25109
25345
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25110
25346
  type: Component,
25111
- args: [{ selector: 'gn-ui-text-area', template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25347
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25112
25348
  }], propDecorators: { value: [{
25113
25349
  type: Input
25114
25350
  }], placeholder: [{
@@ -25209,11 +25445,11 @@ class AutocompleteComponent {
25209
25445
  }
25210
25446
  }
25211
25447
  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 }); }
25212
- 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 }); }
25448
+ 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 }); }
25213
25449
  }
25214
25450
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25215
25451
  type: Component,
25216
- 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"] }]
25452
+ 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"] }]
25217
25453
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25218
25454
  type: Input
25219
25455
  }], action: [{
@@ -25378,11 +25614,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25378
25614
 
25379
25615
  class NavigationButtonComponent {
25380
25616
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25381
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25617
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25382
25618
  }
25383
25619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25384
25620
  type: Component,
25385
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n" }]
25621
+ args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
25386
25622
  }], propDecorators: { label: [{
25387
25623
  type: Input
25388
25624
  }], icon: [{
@@ -25589,11 +25825,11 @@ class CheckboxComponent {
25589
25825
  this.changed.emit(this.checked);
25590
25826
  }
25591
25827
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25592
- 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 }); }
25828
+ 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 }); }
25593
25829
  }
25594
25830
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25595
25831
  type: Component,
25596
- 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"] }]
25832
+ 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"] }]
25597
25833
  }], propDecorators: { type: [{
25598
25834
  type: Input
25599
25835
  }], checked: [{
@@ -25648,14 +25884,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25648
25884
  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"] }]
25649
25885
  }] });
25650
25886
 
25887
+ class EditableLabelDirective {
25888
+ constructor(el, renderer) {
25889
+ this.el = el;
25890
+ this.renderer = renderer;
25891
+ this.editableLabelChanged = new EventEmitter();
25892
+ }
25893
+ ngAfterViewInit() {
25894
+ if (this.gnUiEditableLabel !== false) {
25895
+ const appendedInput = this.renderer.createElement('input');
25896
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25897
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25898
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25899
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25900
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25901
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25902
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25903
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25904
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25905
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25906
+ const hostContent = this.el.nativeElement.textContent || '';
25907
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25908
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25909
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25910
+ this.renderer.listen(appendedInput, 'input', (event) => {
25911
+ this.editableLabelChanged.emit(event.target.value);
25912
+ });
25913
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25914
+ }
25915
+ }
25916
+ 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 }); }
25917
+ 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 }); }
25918
+ }
25919
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25920
+ type: Directive,
25921
+ args: [{
25922
+ selector: '[gnUiEditableLabel]',
25923
+ standalone: true,
25924
+ }]
25925
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25926
+ type: Output
25927
+ }], gnUiEditableLabel: [{
25928
+ type: Input
25929
+ }] } });
25930
+
25651
25931
  class UiInputsModule {
25652
25932
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25653
25933
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25654
25934
  AutocompleteComponent,
25655
- ButtonComponent,
25656
25935
  TextInputComponent,
25657
25936
  DragAndDropFileInputComponent,
25658
- TextAreaComponent,
25659
25937
  ChipsInputComponent,
25660
25938
  NavigationButtonComponent,
25661
25939
  StarToggleComponent,
@@ -25687,7 +25965,10 @@ class UiInputsModule {
25687
25965
  MatFormFieldModule,
25688
25966
  MatInputModule,
25689
25967
  MatDatepickerModule,
25690
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25968
+ MatNativeDateModule,
25969
+ EditableLabelDirective,
25970
+ TextAreaComponent,
25971
+ ButtonComponent], exports: [DropdownSelectorComponent,
25691
25972
  AutocompleteComponent,
25692
25973
  ButtonComponent,
25693
25974
  TextInputComponent,
@@ -25703,7 +25984,8 @@ class UiInputsModule {
25703
25984
  CopyTextButtonComponent,
25704
25985
  CheckboxComponent,
25705
25986
  SearchInputComponent,
25706
- DateRangePickerComponent] }); }
25987
+ DateRangePickerComponent,
25988
+ EditableLabelDirective] }); }
25707
25989
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25708
25990
  TranslateModule.forChild(),
25709
25991
  NgxDropzoneModule,
@@ -25728,10 +26010,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25728
26010
  declarations: [
25729
26011
  DropdownSelectorComponent,
25730
26012
  AutocompleteComponent,
25731
- ButtonComponent,
25732
26013
  TextInputComponent,
25733
26014
  DragAndDropFileInputComponent,
25734
- TextAreaComponent,
25735
26015
  ChipsInputComponent,
25736
26016
  NavigationButtonComponent,
25737
26017
  StarToggleComponent,
@@ -25769,6 +26049,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25769
26049
  MatInputModule,
25770
26050
  MatDatepickerModule,
25771
26051
  MatNativeDateModule,
26052
+ EditableLabelDirective,
26053
+ TextAreaComponent,
26054
+ ButtonComponent,
25772
26055
  ],
25773
26056
  exports: [
25774
26057
  DropdownSelectorComponent,
@@ -25788,6 +26071,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25788
26071
  CheckboxComponent,
25789
26072
  SearchInputComponent,
25790
26073
  DateRangePickerComponent,
26074
+ EditableLabelDirective,
25791
26075
  ],
25792
26076
  }]
25793
26077
  }] });
@@ -25887,7 +26171,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25887
26171
 
25888
26172
  const DEFAULT_PARAMS = {
25889
26173
  OFFSET: '',
25890
- LIMIT: '',
26174
+ LIMIT: '-1',
25891
26175
  FORMAT: 'json',
25892
26176
  };
25893
26177
  class RecordApiFormComponent {
@@ -25916,6 +26200,8 @@ class RecordApiFormComponent {
25916
26200
  }
25917
26201
  return outputUrl;
25918
26202
  }));
26203
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26204
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25919
26205
  }
25920
26206
  set apiLink(value) {
25921
26207
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25925,10 +26211,11 @@ class RecordApiFormComponent {
25925
26211
  this.offset$.next(value);
25926
26212
  }
25927
26213
  setLimit(value) {
25928
- this.limit$.next(value);
26214
+ const newLimit = value === '' ? '-1' : value;
26215
+ this.limit$.next(newLimit);
25929
26216
  }
25930
26217
  setFormat(value) {
25931
- this.format$.next(value);
26218
+ this.format$.next(String(value));
25932
26219
  }
25933
26220
  resetUrl() {
25934
26221
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25936,11 +26223,11 @@ class RecordApiFormComponent {
25936
26223
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25937
26224
  }
25938
26225
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25939
- 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 }); }
26226
+ 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 }); }
25940
26227
  }
25941
26228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25942
26229
  type: Component,
25943
- 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"] }]
26230
+ 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"] }]
25944
26231
  }], propDecorators: { apiLink: [{
25945
26232
  type: Input
25946
26233
  }] } });
@@ -25953,11 +26240,11 @@ class ImageOverlayPreviewComponent {
25953
26240
  basicLightbox.create(`<img src="${src}"/>`).show();
25954
26241
  }
25955
26242
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25956
- 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-36 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36 group-hover:shadow-xl group-hover:border-0 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"] }] }); }
26243
+ 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"] }] }); }
25957
26244
  }
25958
26245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25959
26246
  type: Component,
25960
- args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-36 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36 group-hover:shadow-xl group-hover:border-0 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" }]
26247
+ 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" }]
25961
26248
  }], propDecorators: { imageUrl: [{
25962
26249
  type: Input
25963
26250
  }], isPlaceholderShown: [{
@@ -25986,7 +26273,6 @@ class UiElementsModule {
25986
26273
  PaginationButtonsComponent,
25987
26274
  MaxLinesComponent,
25988
26275
  RecordApiFormComponent,
25989
- MarkdownParserComponent,
25990
26276
  ImageOverlayPreviewComponent], imports: [CommonModule,
25991
26277
  MatIconModule,
25992
26278
  MatTooltipModule,
@@ -25995,7 +26281,8 @@ class UiElementsModule {
25995
26281
  RouterModule,
25996
26282
  UiInputsModule,
25997
26283
  FormsModule,
25998
- NgOptimizedImage], exports: [MetadataInfoComponent,
26284
+ NgOptimizedImage,
26285
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
25999
26286
  ContentGhostComponent,
26000
26287
  DownloadItemComponent,
26001
26288
  DownloadsListComponent,
@@ -26012,6 +26299,7 @@ class UiElementsModule {
26012
26299
  AvatarComponent,
26013
26300
  UserPreviewComponent,
26014
26301
  PaginationButtonsComponent,
26302
+ MaxLinesComponent,
26015
26303
  RecordApiFormComponent,
26016
26304
  MarkdownParserComponent,
26017
26305
  ImageOverlayPreviewComponent] }); }
@@ -26041,6 +26329,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26041
26329
  UiInputsModule,
26042
26330
  FormsModule,
26043
26331
  NgOptimizedImage,
26332
+ MarkdownParserComponent,
26044
26333
  ],
26045
26334
  declarations: [
26046
26335
  MetadataInfoComponent,
@@ -26063,7 +26352,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26063
26352
  PaginationButtonsComponent,
26064
26353
  MaxLinesComponent,
26065
26354
  RecordApiFormComponent,
26066
- MarkdownParserComponent,
26067
26355
  ImageOverlayPreviewComponent,
26068
26356
  ],
26069
26357
  exports: [
@@ -26084,6 +26372,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26084
26372
  AvatarComponent,
26085
26373
  UserPreviewComponent,
26086
26374
  PaginationButtonsComponent,
26375
+ MaxLinesComponent,
26087
26376
  RecordApiFormComponent,
26088
26377
  MarkdownParserComponent,
26089
26378
  ImageOverlayPreviewComponent,
@@ -26091,143 +26380,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26091
26380
  }]
26092
26381
  }] });
26093
26382
 
26094
- class RecordTableComponent {
26095
- constructor() {
26096
- this.selectedRecords = [];
26097
- this.records = [];
26098
- this.recordClick = new EventEmitter();
26099
- this.recordsSelect = new EventEmitter();
26100
- this.recordsDeselect = new EventEmitter();
26101
- this.sortByChange = new EventEmitter();
26102
- }
26103
- dateToString(date) {
26104
- return date?.toLocaleDateString(undefined, {
26105
- year: 'numeric',
26106
- month: 'long',
26107
- day: 'numeric',
26108
- timeZone: 'UTC',
26109
- });
26110
- }
26111
- getStatus(isPublishedToAll) {
26112
- return isPublishedToAll ? 'published' : 'not published';
26113
- }
26114
- formatUserInfo(userInfo) {
26115
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
26116
- if (infos && infos.length === 4) {
26117
- return `${infos[2]} ${infos[1]}`;
26118
- }
26119
- return undefined;
26120
- }
26121
- getRecordFormats(record) {
26122
- if (record.kind === 'service' || !('distributions' in record)) {
26123
- return [];
26124
- }
26125
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
26126
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
26127
- return formats;
26128
- }
26129
- getBadgeColor(format) {
26130
- return getBadgeColor(format);
26131
- }
26132
- getOrderForColumn(col) {
26133
- if (!this.sortBy) {
26134
- return null;
26135
- }
26136
- let order = null;
26137
- const sortedArray = Array.isArray(this.sortBy[0])
26138
- ? this.sortBy
26139
- : [this.sortBy];
26140
- sortedArray.forEach((sortedCol) => {
26141
- if (sortedCol[1] === col) {
26142
- order = sortedCol[0];
26143
- }
26144
- });
26145
- return order;
26146
- }
26147
- setSortBy(col) {
26148
- const sortOrder = this.getOrderForColumn(col);
26149
- let newOrder;
26150
- if (sortOrder) {
26151
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
26152
- }
26153
- else {
26154
- newOrder = 'asc';
26155
- }
26156
- this.sortByChange.emit([newOrder, col]);
26157
- this.sortBy = [newOrder, col];
26158
- }
26159
- isSortedBy(col, order) {
26160
- const sortOrder = this.getOrderForColumn(col);
26161
- return sortOrder === order;
26162
- }
26163
- isChecked(record) {
26164
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
26165
- return true;
26166
- }
26167
- return false;
26168
- }
26169
- handleRecordSelectedChange(selected, record) {
26170
- if (!selected) {
26171
- this.recordsDeselect.emit([record]);
26172
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
26173
- }
26174
- else {
26175
- this.recordsSelect.emit([record]);
26176
- this.selectedRecords.push(record.uniqueIdentifier);
26177
- }
26178
- }
26179
- selectAll() {
26180
- if (this.isAllSelected()) {
26181
- this.recordsDeselect.emit(this.records);
26182
- this.selectedRecords = [];
26183
- }
26184
- else {
26185
- this.recordsSelect.emit(this.records);
26186
- this.selectedRecords = this.records.map((record) => {
26187
- return record.uniqueIdentifier;
26188
- });
26189
- }
26190
- }
26191
- isAllSelected() {
26192
- if (this.selectedRecords.length === this.records.length) {
26193
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
26194
- if (allRecords.length === this.records.length) {
26195
- return true;
26196
- }
26197
- }
26198
- return false;
26199
- }
26200
- isSomeSelected() {
26201
- if (this.selectedRecords.length > 0 &&
26202
- this.selectedRecords.length < this.records.length) {
26203
- return true;
26204
- }
26205
- return false;
26206
- }
26207
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26208
- 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"] }] }); }
26209
- }
26210
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26211
- type: Component,
26212
- 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"] }]
26213
- }], propDecorators: { selectedRecords: [{
26214
- type: Input
26215
- }], records: [{
26216
- type: Input
26217
- }], totalHits: [{
26218
- type: Input
26219
- }], sortBy: [{
26220
- type: Input
26221
- }], recordClick: [{
26222
- type: Output
26223
- }], recordsSelect: [{
26224
- type: Output
26225
- }], recordsDeselect: [{
26226
- type: Output
26227
- }], sortByChange: [{
26228
- type: Output
26229
- }] } });
26230
-
26231
26383
  class UiSearchModule {
26232
26384
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26233
26385
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26240,8 +26392,7 @@ class UiSearchModule {
26240
26392
  ResultsHitsNumberComponent,
26241
26393
  ResultsListItemComponent,
26242
26394
  RecordPreviewFeedComponent,
26243
- RecordPreviewRowComponent,
26244
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26395
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26245
26396
  FacetsModule$1,
26246
26397
  FormsModule,
26247
26398
  ReactiveFormsModule,
@@ -26252,7 +26403,8 @@ class UiSearchModule {
26252
26403
  UiElementsModule,
26253
26404
  MatIconModule,
26254
26405
  MatCheckboxModule,
26255
- RouterLink], exports: [RecordPreviewListComponent,
26406
+ RouterLink,
26407
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26256
26408
  RecordPreviewCardComponent,
26257
26409
  RecordPreviewTextComponent,
26258
26410
  RecordPreviewTitleComponent,
@@ -26262,8 +26414,7 @@ class UiSearchModule {
26262
26414
  RecordPreviewComponent,
26263
26415
  ResultsHitsNumberComponent,
26264
26416
  RecordPreviewFeedComponent,
26265
- RecordPreviewRowComponent,
26266
- RecordTableComponent] }); }
26417
+ RecordPreviewRowComponent] }); }
26267
26418
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26268
26419
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26269
26420
  ], imports: [CommonModule,
@@ -26278,7 +26429,8 @@ class UiSearchModule {
26278
26429
  UiInputsModule,
26279
26430
  UiElementsModule,
26280
26431
  MatIconModule,
26281
- MatCheckboxModule, FacetsModule$1] }); }
26432
+ MatCheckboxModule,
26433
+ InteractiveTableComponent, FacetsModule$1] }); }
26282
26434
  }
26283
26435
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26284
26436
  type: NgModule,
@@ -26295,7 +26447,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26295
26447
  ResultsListItemComponent,
26296
26448
  RecordPreviewFeedComponent,
26297
26449
  RecordPreviewRowComponent,
26298
- RecordTableComponent,
26299
26450
  ],
26300
26451
  imports: [
26301
26452
  CommonModule,
@@ -26312,6 +26463,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26312
26463
  MatIconModule,
26313
26464
  MatCheckboxModule,
26314
26465
  RouterLink,
26466
+ InteractiveTableComponent,
26315
26467
  ],
26316
26468
  exports: [
26317
26469
  RecordPreviewListComponent,
@@ -26325,7 +26477,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26325
26477
  ResultsHitsNumberComponent,
26326
26478
  RecordPreviewFeedComponent,
26327
26479
  RecordPreviewRowComponent,
26328
- RecordTableComponent,
26329
26480
  ],
26330
26481
  providers: [
26331
26482
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26884,6 +27035,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26884
27035
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26885
27036
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26886
27037
 
27038
+ // this geometry will be used to filter & boost results accordingly
27039
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
27040
+
26887
27041
  class SearchFacade {
26888
27042
  constructor(store, filterGeometry) {
26889
27043
  this.store = store;
@@ -26988,6 +27142,7 @@ class SearchFacade {
26988
27142
  this.store.dispatch(new SetFilters({}, this.searchId));
26989
27143
  this.store.dispatch(new SetSortBy([], this.searchId));
26990
27144
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
27145
+ return this;
26991
27146
  }
26992
27147
  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 }); }
26993
27148
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27372,8 +27527,11 @@ class FuzzySearchComponent {
27372
27527
  this.searchService.updateFilters({ any });
27373
27528
  }
27374
27529
  }
27375
- handleInputCleared() {
27376
- this.searchService.updateFilters({ any: '' });
27530
+ async handleInputCleared() {
27531
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27532
+ if (currentSearchFilters.any) {
27533
+ this.searchService.updateFilters({ any: '' });
27534
+ }
27377
27535
  }
27378
27536
  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 }); }
27379
27537
  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 }); }
@@ -27453,6 +27611,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27453
27611
  args: [RESULTS_LAYOUT_CONFIG]
27454
27612
  }] }]; } });
27455
27613
 
27614
+ // expects the replacement key ${uuid}
27615
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27616
+
27456
27617
  class FavoriteStarComponent {
27457
27618
  set record(value) {
27458
27619
  this.record_ = value;
@@ -27536,11 +27697,11 @@ class FavoriteStarComponent {
27536
27697
  });
27537
27698
  }
27538
27699
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, deps: [{ token: FavoritesService }, { token: PlatformServiceInterface }, { token: i0.ChangeDetectorRef }, { token: AuthService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
27539
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27700
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27540
27701
  }
27541
27702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27542
27703
  type: Component,
27543
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27704
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27544
27705
  }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27545
27706
  type: Input
27546
27707
  }], record: [{
@@ -27714,9 +27875,11 @@ class SearchEffects {
27714
27875
  // I could not get this to work (maybe a bug in rxjs?)
27715
27876
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27716
27877
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27717
- return of([state, favorites, null]);
27878
+ return of([state, favorites, undefined]);
27718
27879
  }
27719
27880
  return this.filterGeometry$.pipe(tap$2((geom) => {
27881
+ if (!geom)
27882
+ return;
27720
27883
  try {
27721
27884
  const trace = valid$1(geom, true);
27722
27885
  if (trace?.length > 0) {
@@ -27728,7 +27891,7 @@ class SearchEffects {
27728
27891
  throw new Error();
27729
27892
  }
27730
27893
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27731
- return of([state, favorites, null]);
27894
+ return of([state, favorites, undefined]);
27732
27895
  }));
27733
27896
  }), switchMap$1(([state, favorites, geometry]) => {
27734
27897
  const { currentPage, pageSize, sort } = state.params;
@@ -27827,10 +27990,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27827
27990
  class AbstractSearchField {
27828
27991
  }
27829
27992
  class SimpleSearchField {
27830
- constructor(esFieldName, order = 'asc', injector) {
27993
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27831
27994
  this.esFieldName = esFieldName;
27832
- this.order = order;
27833
27995
  this.injector = injector;
27996
+ this.order = order;
27997
+ this.orderType = orderType;
27834
27998
  this.repository = this.injector.get(RecordsRepositoryInterface);
27835
27999
  // FIXME: this is required to register runtime fields; abstract this as well
27836
28000
  this.esService = this.injector.get(ElasticsearchService);
@@ -27841,12 +28005,12 @@ class SimpleSearchField {
27841
28005
  type: 'terms',
27842
28006
  field: this.esFieldName,
27843
28007
  limit: 1000,
27844
- sort: [this.order, 'key'],
28008
+ sort: [this.order, this.orderType],
27845
28009
  },
27846
28010
  };
27847
28011
  }
27848
28012
  async getBucketLabel(bucket) {
27849
- return bucket.term;
28013
+ return bucket.term.toString();
27850
28014
  }
27851
28015
  getAvailableValues() {
27852
28016
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27874,9 +28038,13 @@ class SimpleSearchField {
27874
28038
  return of(values);
27875
28039
  }
27876
28040
  }
27877
- class KeySearchField extends SimpleSearchField {
27878
- constructor() {
27879
- super(...arguments);
28041
+ class TranslatedSearchField extends SimpleSearchField {
28042
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28043
+ super(esFieldName, injector, order, orderType);
28044
+ this.esFieldName = esFieldName;
28045
+ this.injector = injector;
28046
+ this.order = order;
28047
+ this.orderType = orderType;
27880
28048
  this.platformService = this.injector.get(PlatformServiceInterface);
27881
28049
  }
27882
28050
  async getTranslation(key) {
@@ -27886,26 +28054,36 @@ class KeySearchField extends SimpleSearchField {
27886
28054
  return (await this.getTranslation(bucket.term)) || bucket.term;
27887
28055
  }
27888
28056
  getAvailableValues() {
28057
+ if (this.orderType === 'count')
28058
+ return super.getAvailableValues();
27889
28059
  // sort values by alphabetical order
27890
28060
  return super
27891
28061
  .getAvailableValues()
27892
28062
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27893
28063
  }
27894
28064
  }
27895
- class ThesaurusField extends KeySearchField {
27896
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27897
- super(esFieldName, order, injector);
27898
- this.thesaurusName = thesaurusName;
28065
+ /**
28066
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
28067
+ * to the defined METADATA_LANGUAGE token
28068
+ * The provided ES field name should not include any prefix such as `.langeng`
28069
+ */
28070
+ class MultilingualSearchField extends SimpleSearchField {
28071
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28072
+ super(esFieldName, injector, order, orderType);
28073
+ this.esFieldName = esFieldName;
28074
+ this.injector = injector;
28075
+ this.order = order;
28076
+ this.orderType = orderType;
27899
28077
  this.langService = this.injector.get(LangService);
27900
- this.thesaurus$ = this.platformService
27901
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27902
- .pipe(catchError(() => {
27903
- console.warn('Error while loading thesaurus language package');
27904
- return of([]);
27905
- }), shareReplay(1));
27906
- }
27907
- async getTranslation(key) {
27908
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
28078
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
28079
+ // note: we're excluding the metadata language "current" value because that would produce
28080
+ // permalinks that might not work for different users
28081
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
28082
+ this.esFieldName += `.lang${this.searchLanguage}`;
28083
+ }
28084
+ else {
28085
+ this.esFieldName += '.default';
28086
+ }
27909
28087
  }
27910
28088
  }
27911
28089
  class FullTextSearchField {
@@ -27925,7 +28103,7 @@ marker('search.filters.isSpatial.yes');
27925
28103
  marker('search.filters.isSpatial.no');
27926
28104
  class IsSpatialSearchField extends SimpleSearchField {
27927
28105
  constructor(injector) {
27928
- super('isSpatial', 'asc', injector);
28106
+ super('isSpatial', injector, 'asc');
27929
28107
  this.translateService = this.injector.get(TranslateService);
27930
28108
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27931
28109
  String formats = doc.format.join('|').toLowerCase();
@@ -27975,7 +28153,7 @@ marker('search.filters.license.unknown');
27975
28153
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27976
28154
  class LicenseSearchField extends SimpleSearchField {
27977
28155
  constructor(injector) {
27978
- super('license', 'asc', injector);
28156
+ super('license', injector, 'asc');
27979
28157
  this.translateService = this.injector.get(TranslateService);
27980
28158
  this.esService.registerRuntimeField('license', `String raw = '';
27981
28159
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -28059,7 +28237,7 @@ class OrganizationSearchField {
28059
28237
  }
28060
28238
  class OwnerSearchField extends SimpleSearchField {
28061
28239
  constructor(injector) {
28062
- super('owner', 'asc', injector);
28240
+ super('owner', injector, 'asc');
28063
28241
  }
28064
28242
  getAvailableValues() {
28065
28243
  return of([]);
@@ -28068,6 +28246,7 @@ class OwnerSearchField extends SimpleSearchField {
28068
28246
 
28069
28247
  marker('search.filters.format');
28070
28248
  marker('search.filters.inspireKeyword');
28249
+ marker('search.filters.keyword');
28071
28250
  marker('search.filters.isSpatial');
28072
28251
  marker('search.filters.license');
28073
28252
  marker('search.filters.publicationYear');
@@ -28085,13 +28264,14 @@ class FieldsService {
28085
28264
  this.injector = injector;
28086
28265
  this.fields = {
28087
28266
  publisher: new OrganizationSearchField(this.injector),
28088
- format: new SimpleSearchField('format', 'asc', this.injector),
28089
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
28090
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
28091
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
28092
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
28093
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
28094
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28267
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28268
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28269
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28270
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28271
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28272
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28273
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28274
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
28095
28275
  isSpatial: new IsSpatialSearchField(this.injector),
28096
28276
  q: new FullTextSearchField(),
28097
28277
  license: new LicenseSearchField(this.injector),
@@ -28165,10 +28345,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28165
28345
  type: Input
28166
28346
  }] } });
28167
28347
 
28168
- // this geometry will be used to filter & boost results accordingly
28169
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
28170
- // expects the replacement key ${uuid}
28171
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28172
28348
  class FeatureSearchModule {
28173
28349
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28174
28350
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28267,6 +28443,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28267
28443
  }]
28268
28444
  }] });
28269
28445
 
28446
+ class ResultsTableComponent {
28447
+ constructor(searchFacade, searchService, selectionService) {
28448
+ this.searchFacade = searchFacade;
28449
+ this.searchService = searchService;
28450
+ this.selectionService = selectionService;
28451
+ this.recordClick = new EventEmitter();
28452
+ this.records$ = this.searchFacade.results$;
28453
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28454
+ }
28455
+ dateToString(date) {
28456
+ return date?.toLocaleDateString(undefined, {
28457
+ year: 'numeric',
28458
+ month: 'long',
28459
+ day: 'numeric',
28460
+ timeZone: 'UTC',
28461
+ });
28462
+ }
28463
+ getStatus(isPublishedToAll) {
28464
+ return isPublishedToAll ? 'published' : 'not published';
28465
+ }
28466
+ getRecordFormats(record) {
28467
+ if (record.kind === 'service' || !('distributions' in record)) {
28468
+ return [];
28469
+ }
28470
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28471
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28472
+ return formats;
28473
+ }
28474
+ formatUserInfo(userInfo) {
28475
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28476
+ if (infos && infos.length === 4) {
28477
+ return `${infos[2]} ${infos[1]}`;
28478
+ }
28479
+ return undefined;
28480
+ }
28481
+ getBadgeColor(format) {
28482
+ return getBadgeColor(format);
28483
+ }
28484
+ handleRecordClick(item) {
28485
+ this.recordClick.emit(item);
28486
+ }
28487
+ setSortBy(col, order) {
28488
+ this.searchService.setSortBy([order, col]);
28489
+ }
28490
+ isSortedBy(col) {
28491
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28492
+ const sortArray = Array.isArray(sortOrder[0])
28493
+ ? sortOrder
28494
+ : [sortOrder];
28495
+ for (const sort of sortArray) {
28496
+ if (sort[1] === col) {
28497
+ return sort[0];
28498
+ }
28499
+ }
28500
+ return null;
28501
+ }));
28502
+ }
28503
+ isChecked(record) {
28504
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28505
+ return selectedRecords.includes(record.uniqueIdentifier);
28506
+ }));
28507
+ }
28508
+ handleRecordSelectedChange(selected, record) {
28509
+ if (!selected) {
28510
+ this.selectionService.deselectRecords([record]);
28511
+ }
28512
+ else {
28513
+ this.selectionService.selectRecords([record]);
28514
+ }
28515
+ }
28516
+ async toggleSelectAll() {
28517
+ const records = await firstValueFrom(this.records$);
28518
+ if (await firstValueFrom(this.isAllSelected())) {
28519
+ this.selectionService.deselectRecords(records);
28520
+ }
28521
+ else {
28522
+ this.selectionService.selectRecords(records);
28523
+ }
28524
+ }
28525
+ isAllSelected() {
28526
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28527
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28528
+ }));
28529
+ }
28530
+ isSomeSelected() {
28531
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28532
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28533
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28534
+ return !allSelected && someSelected;
28535
+ }));
28536
+ }
28537
+ 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 }); }
28538
+ 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"] }] }); }
28539
+ }
28540
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28541
+ type: Component,
28542
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28543
+ CommonModule,
28544
+ UiInputsModule,
28545
+ InteractiveTableComponent,
28546
+ InteractiveTableColumnComponent,
28547
+ MatIconModule,
28548
+ TranslateModule,
28549
+ ], 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" }]
28550
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28551
+ type: Output
28552
+ }] } });
28553
+
28270
28554
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28271
28555
  get mapLinks() {
28272
28556
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28593,6 +28877,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28593
28877
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28594
28878
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28595
28879
 
28880
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28881
+ class GeocodingService {
28882
+ constructor(provider) {
28883
+ this.provider = provider;
28884
+ }
28885
+ query(text) {
28886
+ let queryObservable;
28887
+ switch (this.provider[0]) {
28888
+ case 'geoadmin':
28889
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28890
+ break;
28891
+ case 'geonames':
28892
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28893
+ break;
28894
+ case 'data-gouv-fr':
28895
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28896
+ break;
28897
+ default:
28898
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28899
+ }
28900
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28901
+ }
28902
+ 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 }); }
28903
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28904
+ }
28905
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28906
+ type: Injectable,
28907
+ args: [{
28908
+ providedIn: 'root',
28909
+ }]
28910
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28911
+ type: Inject,
28912
+ args: [GEOCODING_PROVIDER]
28913
+ }] }]; } });
28914
+
28915
+ class GeocodingComponent {
28916
+ constructor(mapManager, geocodingService) {
28917
+ this.mapManager = mapManager;
28918
+ this.geocodingService = geocodingService;
28919
+ this.searchText = '';
28920
+ this.results = [];
28921
+ this.searchTextChanged = new Subject();
28922
+ this.destroy$ = new Subject();
28923
+ this.errorMessage = null;
28924
+ this.searchTextChanged
28925
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28926
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28927
+ this.errorMessage =
28928
+ 'An error occurred while searching. Please try again.';
28929
+ console.error(error);
28930
+ return [];
28931
+ }));
28932
+ }), takeUntil(this.destroy$))
28933
+ .subscribe((results) => {
28934
+ this.results = results;
28935
+ });
28936
+ }
28937
+ ngOnDestroy() {
28938
+ this.destroy$.next();
28939
+ this.destroy$.complete();
28940
+ }
28941
+ onSearchChange(searchText) {
28942
+ if (!searchText) {
28943
+ this.clearSearch();
28944
+ return;
28945
+ }
28946
+ else {
28947
+ this.searchTextChanged.next(searchText);
28948
+ }
28949
+ }
28950
+ clearSearch() {
28951
+ this.searchText = '';
28952
+ this.results = [];
28953
+ this.errorMessage = null;
28954
+ }
28955
+ zoomToLocation(result) {
28956
+ const map = this.mapManager.map;
28957
+ const view = map.getView();
28958
+ const geometry = result.geom;
28959
+ if (geometry.type === 'Point') {
28960
+ this.zoomToPoint(geometry.coordinates, view);
28961
+ }
28962
+ else if (geometry.type === 'Polygon') {
28963
+ this.zoomToPolygon(geometry.coordinates, view);
28964
+ }
28965
+ else {
28966
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28967
+ }
28968
+ }
28969
+ zoomToPoint(pointCoords, view) {
28970
+ const transformedCoords = fromLonLat(pointCoords);
28971
+ view.setCenter(transformedCoords);
28972
+ view.setZoom(12);
28973
+ }
28974
+ zoomToPolygon(polygonCoords, view) {
28975
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28976
+ const polygon = new Polygon([transformedCoords]);
28977
+ view.fit(polygon, {
28978
+ duration: 100,
28979
+ maxZoom: 12,
28980
+ });
28981
+ }
28982
+ onEnterPress() {
28983
+ if (this.results && this.results.length > 0) {
28984
+ this.zoomToLocation(this.results[0]);
28985
+ }
28986
+ }
28987
+ 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 }); }
28988
+ 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" }] }); }
28989
+ }
28990
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28991
+ type: Component,
28992
+ 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" }]
28993
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28994
+
28596
28995
  class FeatureMapModule {
28597
28996
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28598
28997
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28603,7 +29002,8 @@ class FeatureMapModule {
28603
29002
  AddLayerRecordPreviewComponent,
28604
29003
  AddLayerFromWmsComponent,
28605
29004
  AddLayerFromFileComponent,
28606
- AddLayerFromWfsComponent], imports: [CommonModule,
29005
+ AddLayerFromWfsComponent,
29006
+ GeocodingComponent], imports: [CommonModule,
28607
29007
  UiMapModule,
28608
29008
  UiLayoutModule,
28609
29009
  MatIconModule,
@@ -28614,13 +29014,18 @@ class FeatureMapModule {
28614
29014
  MapInstanceDirective,
28615
29015
  LayersPanelComponent,
28616
29016
  AddLayerFromCatalogComponent,
28617
- MapContainerComponent] }); }
29017
+ MapContainerComponent,
29018
+ GeocodingComponent] }); }
28618
29019
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28619
29020
  {
28620
29021
  provide: FEATURE_MAP_OPTIONS,
28621
29022
  useValue: defaultMapOptions,
28622
29023
  },
28623
29024
  MapFacade,
29025
+ {
29026
+ provide: GEOCODING_PROVIDER,
29027
+ useValue: ['geonames', { maxRows: 5 }],
29028
+ },
28624
29029
  ], imports: [CommonModule,
28625
29030
  UiMapModule,
28626
29031
  UiLayoutModule,
@@ -28646,6 +29051,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28646
29051
  AddLayerFromWmsComponent,
28647
29052
  AddLayerFromFileComponent,
28648
29053
  AddLayerFromWfsComponent,
29054
+ GeocodingComponent,
28649
29055
  ],
28650
29056
  exports: [
28651
29057
  MapContextComponent,
@@ -28653,6 +29059,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28653
29059
  LayersPanelComponent,
28654
29060
  AddLayerFromCatalogComponent,
28655
29061
  MapContainerComponent,
29062
+ GeocodingComponent,
28656
29063
  ],
28657
29064
  imports: [
28658
29065
  CommonModule,
@@ -28673,6 +29080,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28673
29080
  useValue: defaultMapOptions,
28674
29081
  },
28675
29082
  MapFacade,
29083
+ {
29084
+ provide: GEOCODING_PROVIDER,
29085
+ useValue: ['geonames', { maxRows: 5 }],
29086
+ },
28676
29087
  ],
28677
29088
  }]
28678
29089
  }] });
@@ -28767,7 +29178,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28767
29178
  ...state,
28768
29179
  chartConfig,
28769
29180
  })), on(close, (state) => {
28770
- // eslint-disable-next-line
29181
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28771
29182
  const { metadata, related, ...stateWithoutMd } = state;
28772
29183
  return stateWithoutMd;
28773
29184
  }));
@@ -30437,12 +30848,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30437
30848
  }] } });
30438
30849
 
30439
30850
  class MapViewComponent {
30440
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30851
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30441
30852
  this.mdViewFacade = mdViewFacade;
30442
30853
  this.mapManager = mapManager;
30443
30854
  this.mapUtils = mapUtils;
30444
30855
  this.dataService = dataService;
30445
- this.proxy = proxy;
30446
30856
  this.featureInfo = featureInfo;
30447
30857
  this.changeRef = changeRef;
30448
30858
  this.styleService = styleService;
@@ -30477,7 +30887,7 @@ class MapViewComponent {
30477
30887
  return of([]);
30478
30888
  }), finalize(() => (this.loading = false)));
30479
30889
  }));
30480
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30890
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30481
30891
  console.warn(error); // FIXME: report this to the user somehow
30482
30892
  return of(undefined);
30483
30893
  }), map$1((extent) => ({
@@ -30485,7 +30895,18 @@ class MapViewComponent {
30485
30895
  view: {
30486
30896
  extent,
30487
30897
  },
30488
- })), tap$1(() => this.resetSelection()))));
30898
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30899
+ if (context.view.extent)
30900
+ return context;
30901
+ const extent = this.mapUtils.getRecordExtent(metadata);
30902
+ return {
30903
+ ...context,
30904
+ view: {
30905
+ ...context.view,
30906
+ extent,
30907
+ },
30908
+ };
30909
+ }));
30489
30910
  }
30490
30911
  ngOnDestroy() {
30491
30912
  this.subscription.unsubscribe();
@@ -30538,13 +30959,13 @@ class MapViewComponent {
30538
30959
  selectLinkToDisplay(link) {
30539
30960
  this.selectedLinkIndex$.next(link);
30540
30961
  }
30541
- 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 }); }
30962
+ 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 }); }
30542
30963
  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 }); }
30543
30964
  }
30544
30965
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30545
30966
  type: Component,
30546
30967
  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" }]
30547
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30968
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30548
30969
 
30549
30970
  class DataViewComponent {
30550
30971
  constructor(mdViewFacade) {
@@ -30711,11 +31132,11 @@ class LanguageSwitcherComponent {
30711
31132
  this.translate.use(value);
30712
31133
  }
30713
31134
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30714
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
31135
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
30715
31136
  }
30716
31137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30717
31138
  type: Component,
30718
- args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
31139
+ args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n" }]
30719
31140
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30720
31141
  type: Optional
30721
31142
  }, {
@@ -30996,13 +31417,6 @@ class MyOrgService {
30996
31417
  constructor(platformService, orgService) {
30997
31418
  this.platformService = platformService;
30998
31419
  this.orgService = orgService;
30999
- this.myOrgDataSubject = new BehaviorSubject({
31000
- orgName: '',
31001
- logoUrl: '',
31002
- recordCount: 0,
31003
- userCount: 0,
31004
- userList: [],
31005
- });
31006
31420
  this.myOrgData$ = combineLatest([
31007
31421
  this.platformService.getMe(),
31008
31422
  this.platformService.getUsers(),
@@ -31021,7 +31435,7 @@ class MyOrgService {
31021
31435
  userList,
31022
31436
  userCount,
31023
31437
  };
31024
- }));
31438
+ }), shareReplay(1));
31025
31439
  }
31026
31440
  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 }); }
31027
31441
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31714,11 +32128,11 @@ class RecordFormComponent {
31714
32128
  return field.config.model;
31715
32129
  }
31716
32130
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31717
- 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 }); }
32131
+ 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 }); }
31718
32132
  }
31719
32133
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31720
32134
  type: Component,
31721
- 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" }]
32135
+ 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" }]
31722
32136
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31723
32137
 
31724
32138
  const ROUTER_STATE_KEY = 'router';
@@ -32086,5 +32500,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32086
32500
  * Generated bundle index. Do not edit.
32087
32501
  */
32088
32502
 
32089
- 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, ImageOverlayPreviewComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapUtilsWMSService, MapViewComponent, MarkdownParserComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordTableComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslateTestingModule, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, 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 };
32503
+ 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_NAMES, 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, getTemporalRangeUnion, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32090
32504
  //# sourceMappingURL=geonetwork-ui.mjs.map