geonetwork-ui 2.2.0-dev.0eef2738 → 2.2.0-dev.0f0ebdea

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 (343) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +28 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +83 -58
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +5 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +20 -17
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +52 -23
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +52 -32
  9. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  10. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  12. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  13. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  14. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  16. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  17. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  19. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  20. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  21. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  22. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  23. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  24. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  25. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  26. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  27. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  28. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +17 -3
  29. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  30. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  31. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  32. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  33. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  34. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  35. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  36. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  37. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +3 -3
  38. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  39. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  40. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  41. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  42. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  43. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  44. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  45. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  46. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  47. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  48. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  49. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  50. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  51. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  52. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  53. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -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 +35 -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/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  72. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  73. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  74. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  75. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  76. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  77. package/esm2022/translations/de.json +9 -6
  78. package/esm2022/translations/en.json +12 -9
  79. package/esm2022/translations/es.json +8 -5
  80. package/esm2022/translations/fr.json +12 -9
  81. package/esm2022/translations/it.json +11 -8
  82. package/esm2022/translations/nl.json +8 -5
  83. package/esm2022/translations/pt.json +8 -5
  84. package/fesm2022/geonetwork-ui.mjs +1000 -701
  85. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  86. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +3 -0
  87. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  88. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  89. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  90. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  91. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +3 -5
  92. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  93. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  94. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  95. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  96. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +6 -6
  97. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  98. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +4 -3
  99. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  100. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  101. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  102. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  103. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  104. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  105. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  106. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  107. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  108. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  109. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +28 -17
  110. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  111. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  112. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  113. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  114. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  115. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  116. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  117. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  118. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  119. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  120. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  121. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  122. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  123. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  124. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  125. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  126. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  127. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  128. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  129. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  130. package/libs/feature/map/src/index.d.ts +1 -0
  131. package/libs/feature/map/src/index.d.ts.map +1 -1
  132. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  133. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  134. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  135. package/libs/feature/map/src/lib/feature-map.module.d.ts +13 -12
  136. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  137. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  138. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  139. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  140. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  141. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  142. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  143. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  144. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  145. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  146. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  147. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  148. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  149. package/libs/feature/search/src/index.d.ts +3 -0
  150. package/libs/feature/search/src/index.d.ts.map +1 -1
  151. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  152. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  153. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  154. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  155. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  156. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  157. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  158. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  159. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  160. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  161. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  162. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  163. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  164. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  165. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  166. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  167. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  168. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  169. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  170. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  171. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  172. package/libs/ui/elements/src/index.d.ts +1 -0
  173. package/libs/ui/elements/src/index.d.ts.map +1 -1
  174. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +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/metadata-info/metadata-info.component.d.ts +10 -6
  178. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  179. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  180. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  181. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  182. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  183. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  184. package/libs/ui/inputs/src/index.d.ts +1 -0
  185. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  186. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  187. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  188. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  189. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  190. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  191. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  192. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -39
  193. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  194. package/libs/ui/layout/src/index.d.ts +2 -0
  195. package/libs/ui/layout/src/index.d.ts.map +1 -1
  196. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  197. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  198. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  199. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  200. package/libs/ui/search/src/index.d.ts +0 -1
  201. package/libs/ui/search/src/index.d.ts.map +1 -1
  202. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  203. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  204. package/libs/util/i18n/src/index.d.ts +0 -1
  205. package/libs/util/i18n/src/index.d.ts.map +1 -1
  206. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  207. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  208. package/package.json +4 -1
  209. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +61 -8
  210. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +55 -9
  211. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +225 -24
  212. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +32 -0
  213. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +123 -73
  214. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +4 -3
  215. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +3 -5
  216. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  217. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +24 -21
  218. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +115 -62
  219. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +169 -95
  220. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  221. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  222. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  223. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  224. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  225. package/src/libs/common/domain/src/lib/index.ts +2 -0
  226. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +33 -21
  227. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  228. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  229. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  230. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  231. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  232. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  233. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  234. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  235. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  236. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +50 -10
  237. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  238. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  239. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  240. package/src/libs/feature/map/src/index.ts +1 -0
  241. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  242. package/src/libs/feature/map/src/lib/feature-map.module.ts +8 -0
  243. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  244. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  245. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  246. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  247. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  248. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  249. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  250. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  251. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  252. package/src/libs/feature/search/src/index.ts +3 -0
  253. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  254. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  255. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  256. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  257. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  258. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  259. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  260. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  261. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  262. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  263. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  264. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  265. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  266. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  267. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  268. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  269. package/src/libs/ui/elements/src/index.ts +1 -0
  270. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  271. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
  272. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  273. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  274. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  275. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  276. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  277. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +2 -2
  278. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +51 -24
  279. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +37 -15
  280. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  281. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  282. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  283. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  284. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  285. package/src/libs/ui/inputs/src/index.ts +1 -0
  286. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  287. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  288. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -0
  289. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  290. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +2 -2
  291. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +3 -1
  292. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  293. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  294. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  295. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  296. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +5 -2
  297. package/src/libs/ui/layout/src/index.ts +2 -0
  298. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  299. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  300. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  301. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  302. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  303. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  304. package/src/libs/ui/search/src/index.ts +0 -1
  305. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  306. package/src/libs/util/i18n/src/index.ts +0 -1
  307. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  308. package/tailwind.base.config.js +3 -0
  309. package/tailwind.base.css +2 -2
  310. package/translations/de.json +9 -6
  311. package/translations/en.json +12 -9
  312. package/translations/es.json +8 -5
  313. package/translations/fr.json +12 -9
  314. package/translations/it.json +11 -8
  315. package/translations/nl.json +8 -5
  316. package/translations/pt.json +8 -5
  317. package/translations/sk.json +8 -5
  318. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  319. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  320. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  321. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  322. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  323. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  324. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  325. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  326. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  327. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  328. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  329. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  330. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  331. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  332. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  333. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  334. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  335. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  336. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  337. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  338. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  339. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  340. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  341. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  342. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  343. /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() {
@@ -827,31 +847,55 @@ function readDatasetUpdated(rootEl) {
827
847
  function readContacts(rootEl) {
828
848
  return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
829
849
  }
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()));
850
+ // from gmd:thesaurusName
851
+ function readThesaurus(rootEl) {
852
+ if (!rootEl)
853
+ return null;
854
+ const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
855
+ const id = pipe(findIdentifier, extractCharacterString())(rootEl);
856
+ const url = pipe(findIdentifier, extractUrl())(rootEl);
857
+ const name = pipe(findNestedElement('gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
858
+ return {
859
+ id,
860
+ ...(name && { name }),
861
+ ...(url && { url }),
862
+ };
832
863
  }
833
- function readKeywords(rootEl) {
834
- return readKeywordsOfType(false)(rootEl);
864
+ // from gmd:MD_Keywords
865
+ function readKeywordGroup(rootEl) {
866
+ const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
867
+ const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
868
+ return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
869
+ const label = extractCharacterString()(el);
870
+ return {
871
+ ...(thesaurus ? { thesaurus } : {}),
872
+ label,
873
+ type,
874
+ };
875
+ }))(rootEl);
835
876
  }
836
- function readThemes(rootEl) {
837
- return readKeywordsOfType(true)(rootEl);
877
+ function readKeywords(rootEl) {
878
+ return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), mapArray(readKeywordGroup), flattenArray())(rootEl);
838
879
  }
839
880
  function readStatus(rootEl) {
840
881
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
841
882
  }
842
883
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
843
- function readAccessConstraints(rootEl) {
844
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
884
+ function readLegalConstraints(rootEl) {
885
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
845
886
  }
846
- function readUseLimitations(rootEl) {
847
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
887
+ function readSecurityConstraints(rootEl) {
888
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
889
+ }
890
+ function readOtherConstraints(rootEl) {
891
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
848
892
  }
849
893
  function readLicenses(rootEl) {
850
894
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
851
895
  }
852
896
  // not used yet
853
897
  function readIsoTopics(rootEl) {
854
- return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', false), mapArray(readText()))(rootEl);
898
+ return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', true), mapArray(readText()))(rootEl);
855
899
  }
856
900
  function readSpatialRepresentation(rootEl) {
857
901
  return pipe(findIdentification(), findNestedElement('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), readAttribute('codeListValue'), map(getSpatialRepresentationFromCode))(rootEl);
@@ -1067,33 +1111,50 @@ function updateCitationDate(date, type) {
1067
1111
  function appendCitationDate(date, type) {
1068
1112
  return appendChildren(pipe(createElement('gmd:date'), createChild('gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createElement('gmd:dateType'), createChild('gmd:CI_DateTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), addAttribute('codeListValue', type)))));
1069
1113
  }
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') {
1114
+ function removeKeywords() {
1115
+ return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords')));
1116
+ }
1117
+ // returns a <gmd:thesaurusName> element
1118
+ function createThesaurus(thesaurus) {
1119
+ return pipe(createElement('gmd:thesaurusName'), createChild('gmd:CI_Citation'), appendChildren(pipe(createElement('gmd:title'), writeCharacterString(thesaurus.name || thesaurus.id)), pipe(createElement('gmd:identifier'), createChild('gmd:MD_Identifier'), appendChildren(pipe(createElement('gmd:code'), thesaurus.url
1120
+ ? writeAnchor(thesaurus.url, thesaurus.id)
1121
+ : writeCharacterString(thesaurus.id))))));
1122
+ }
1123
+ function appendKeywords(keywords) {
1124
+ const keywordsByThesaurus = keywords.reduce((acc, keyword) => {
1125
+ const thesaurusId = keyword.thesaurus?.id;
1126
+ const type = keyword.type;
1127
+ let existingGroup = acc.find((group) => group[0].thesaurus
1128
+ ? group[0].thesaurus.id === thesaurusId
1129
+ : group[0].type === type);
1130
+ if (!existingGroup) {
1131
+ existingGroup = [];
1132
+ acc.push(existingGroup);
1133
+ }
1134
+ existingGroup.push(keyword);
1135
+ return acc;
1136
+ }, []);
1137
+ return appendChildren(...keywordsByThesaurus.map((keywords) => pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', keywords[0].type))), keywords[0].thesaurus
1138
+ ? appendChildren(createThesaurus(keywords[0].thesaurus))
1139
+ : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword.label)))))));
1140
+ }
1141
+ function createConstraint(constraint, type) {
1142
+ if (type === 'security') {
1088
1143
  return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_SecurityConstraints'), appendChildren(pipe(createElement('gmd:classification'), createChild('gmd:MD_ClassificationCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode'), addAttribute('codeListValue', 'restricted')), pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1089
1144
  }
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))));
1145
+ else if (type === 'legal') {
1146
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1147
+ }
1148
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1091
1149
  }
1092
- function removeUseLimitations() {
1150
+ function removeOtherConstraints() {
1093
1151
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1094
1152
  }
1095
- function createUseLimitation(useLimitation) {
1096
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1153
+ function removeSecurityConstraints() {
1154
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1155
+ }
1156
+ function removeLegalConstraints() {
1157
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code !== 'license')))));
1097
1158
  }
1098
1159
  function removeLicenses() {
1099
1160
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.some((code) => code === 'license')))));
@@ -1192,19 +1253,22 @@ function writeContacts(record, rootEl) {
1192
1253
  pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact)))))(rootEl);
1193
1254
  }
1194
1255
  function writeKeywords(record, rootEl) {
1195
- pipe(findOrCreateIdentification(), removeKeywords(null), appendKeywords(record.keywords, null))(rootEl);
1256
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1196
1257
  }
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);
1258
+ function writeTopics(record, rootEl) {
1259
+ pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(createElement('gmd:topicCategory'), createChild('gmd:MD_TopicCategoryCode'), setTextContent(topic)))))(rootEl);
1202
1260
  }
1203
1261
  function writeLicenses(record, rootEl) {
1204
1262
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1205
1263
  }
1206
- function writeUseLimitations(record, rootEl) {
1207
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1264
+ function writeLegalConstraints(record, rootEl) {
1265
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1266
+ }
1267
+ function writeSecurityConstraints(record, rootEl) {
1268
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1269
+ }
1270
+ function writeOtherConstraints(record, rootEl) {
1271
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1208
1272
  }
1209
1273
  function writeUpdateFrequency(record, rootEl) {
1210
1274
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1301,13 +1365,12 @@ function toModel(xml) {
1301
1365
  const recordUpdated = readRecordUpdated(rootEl);
1302
1366
  const recordCreated = recordUpdated;
1303
1367
  const keywords = readKeywords(rootEl);
1304
- const themes = readThemes(rootEl);
1305
- const accessConstraints = readAccessConstraints(rootEl);
1306
- const useLimitations = readUseLimitations(rootEl);
1368
+ const topics = readIsoTopics(rootEl);
1369
+ const legalConstraints = readLegalConstraints(rootEl);
1370
+ const otherConstraints = readOtherConstraints(rootEl);
1371
+ const securityConstraints = readSecurityConstraints(rootEl);
1307
1372
  const licenses = readLicenses(rootEl);
1308
1373
  const overviews = readOverviews(rootEl);
1309
- // not used yet
1310
- const isoTopics = readIsoTopics(rootEl);
1311
1374
  if (kind === 'dataset') {
1312
1375
  const status = readStatus(rootEl);
1313
1376
  const datasetCreated = readDatasetCreated(rootEl);
@@ -1330,10 +1393,11 @@ function toModel(xml) {
1330
1393
  contacts,
1331
1394
  contactsForResource: [],
1332
1395
  keywords,
1333
- themes,
1334
- accessConstraints,
1335
- useLimitations,
1396
+ topics,
1336
1397
  licenses,
1398
+ legalConstraints,
1399
+ securityConstraints,
1400
+ otherConstraints,
1337
1401
  ...(datasetCreated && { datasetCreated }),
1338
1402
  ...(datasetUpdated && { datasetUpdated }),
1339
1403
  lineage,
@@ -1357,10 +1421,11 @@ function toModel(xml) {
1357
1421
  ownerOrganization,
1358
1422
  contacts,
1359
1423
  keywords,
1360
- themes,
1361
- accessConstraints,
1362
- useLimitations,
1424
+ topics,
1363
1425
  licenses,
1426
+ legalConstraints,
1427
+ securityConstraints,
1428
+ otherConstraints,
1364
1429
  overviews,
1365
1430
  onlineResources,
1366
1431
  };
@@ -1385,10 +1450,12 @@ function toXml(record, originalXml) {
1385
1450
  writeAbstract(record, rootEl);
1386
1451
  fieldChanged('contacts') && writeContacts(record, rootEl);
1387
1452
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1388
- fieldChanged('themes') && writeThemes(record, rootEl);
1389
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1453
+ fieldChanged('topics') && writeTopics(record, rootEl);
1454
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1455
+ fieldChanged('securityConstraints') &&
1456
+ writeSecurityConstraints(record, rootEl);
1390
1457
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1391
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1458
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1392
1459
  if (record.kind === 'dataset') {
1393
1460
  writeStatus(record, rootEl);
1394
1461
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1414,6 +1481,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1414
1481
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1415
1482
  const toDate = (field) => new Date(field);
1416
1483
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1484
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1417
1485
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1418
1486
  const getAsUrl = (field, location = window.location.toString()) => {
1419
1487
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -1454,6 +1522,31 @@ const mapContact = (sourceContact, lang3) => {
1454
1522
  ...(phone && { phone }),
1455
1523
  };
1456
1524
  };
1525
+ const mapKeywords = (thesauri, language) => {
1526
+ const keywords = [];
1527
+ for (const thesaurusId in thesauri) {
1528
+ const rawThesaurus = thesauri[thesaurusId];
1529
+ let thesaurus = null;
1530
+ if (rawThesaurus.id) {
1531
+ const thesaurusSource = { ...rawThesaurus };
1532
+ const url = getAsUrl(selectField(thesaurusSource, 'link'));
1533
+ const name = selectField(thesaurusSource, 'title');
1534
+ thesaurus = {
1535
+ id: rawThesaurus.id,
1536
+ ...(name && { name }),
1537
+ ...(url && { url }),
1538
+ };
1539
+ }
1540
+ for (const keyword of rawThesaurus.keywords) {
1541
+ keywords.push({
1542
+ label: selectTranslatedValue(keyword, language),
1543
+ type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
1544
+ ...(thesaurus && { thesaurus }),
1545
+ });
1546
+ }
1547
+ }
1548
+ return keywords;
1549
+ };
1457
1550
 
1458
1551
  /**
1459
1552
  * Custom HttpParameterCodec
@@ -16540,133 +16633,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16540
16633
  }]
16541
16634
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16542
16635
 
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
16636
  var dropFile$6 = "Datei ablegen";
16671
16637
  var next$6 = "weiter";
16672
16638
  var previous$6 = "zurück";
@@ -16689,20 +16655,21 @@ var de = {
16689
16655
  "chart.type.line": "Liniendiagramm",
16690
16656
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16691
16657
  "chart.type.pie": "Kreisdiagramm",
16658
+ "dashboard.createRecord": "",
16692
16659
  "dashboard.labels.mySpace": "Mein Bereich",
16693
16660
  "dashboard.records.all": "Katalog",
16694
16661
  "dashboard.records.myDraft": "Meine Entwürfe",
16695
16662
  "dashboard.records.myLibrary": "Meine Bibliothek",
16696
16663
  "dashboard.records.myOrg": "Meine Organisation",
16697
16664
  "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
16665
  "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16701
16666
  "dashboard.records.search": "Suche nach \"{searchText}\"",
16702
16667
  "dashboard.records.userDetail": "Name",
16703
16668
  "dashboard.records.userEmail": "E-Mail",
16704
16669
  "dashboard.records.username": "Benutzername",
16705
16670
  "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16671
+ "dashboard.results.listMetadata": "",
16672
+ "dashboard.results.listResources": "",
16706
16673
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16707
16674
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16708
16675
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16850,6 +16817,7 @@ var de = {
16850
16817
  "map.add.layer.wfs": "Aus WFS",
16851
16818
  "map.add.layer.wms": "Aus WMS",
16852
16819
  "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16820
+ "map.geocoding.placeholder": "",
16853
16821
  "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16854
16822
  "map.layer.add": "Hinzufügen",
16855
16823
  "map.layers.available": "Verfügbare Layer",
@@ -16893,16 +16861,15 @@ var de = {
16893
16861
  "record.metadata.author": "Autor",
16894
16862
  "record.metadata.catalog": "Katalog",
16895
16863
  "record.metadata.contact": "Kontakt",
16896
- "record.metadata.createdOn": "Erstellt am",
16897
16864
  "record.metadata.details": "Technische Informationen",
16898
16865
  "record.metadata.download": "Downloads",
16899
16866
  "record.metadata.formats": "Formate",
16900
- "record.metadata.isOpenData": "Open Data",
16901
16867
  "record.metadata.keywords": "Stichworte",
16902
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16868
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
16903
16869
  "record.metadata.links": "Links",
16904
16870
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16905
16871
  "record.metadata.origin": "Über die Daten",
16872
+ "record.metadata.otherConstraints": "",
16906
16873
  "record.metadata.owner": "",
16907
16874
  "record.metadata.preview": "Vorschau",
16908
16875
  "record.metadata.publications": "Veröffentlichungen",
@@ -16926,8 +16893,9 @@ var de = {
16926
16893
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16927
16894
  "record.metadata.related": "Ähnliche Datensätze",
16928
16895
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16929
- "record.metadata.themes": "Kategorien",
16896
+ "record.metadata.status": "",
16930
16897
  "record.metadata.title": "Titel",
16898
+ "record.metadata.topics": "Kategorien",
16931
16899
  "record.metadata.type": "Geographischer Datensatz",
16932
16900
  "record.metadata.uniqueId": "Eindeutige Kennung",
16933
16901
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
@@ -16963,6 +16931,7 @@ var de = {
16963
16931
  "search.filters.isSpatial": "Ist räumliche Daten",
16964
16932
  "search.filters.isSpatial.no": "nicht räumlich",
16965
16933
  "search.filters.isSpatial.yes": "räumlich",
16934
+ "search.filters.keyword": "Schlüsselwort",
16966
16935
  "search.filters.license": "Lizenz",
16967
16936
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16968
16937
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17027,20 +16996,21 @@ var en = {
17027
16996
  "chart.type.line": "line chart",
17028
16997
  "chart.type.lineSmooth": "smooth line chart",
17029
16998
  "chart.type.pie": "pie chart",
16999
+ "dashboard.createRecord": "New record",
17030
17000
  "dashboard.labels.mySpace": "My space",
17031
- "dashboard.records.all": "Catalog",
17001
+ "dashboard.records.all": "Metadata records",
17032
17002
  "dashboard.records.myDraft": "My drafts",
17033
17003
  "dashboard.records.myLibrary": "My library",
17034
17004
  "dashboard.records.myOrg": "Organization",
17035
17005
  "dashboard.records.myRecords": "My Records",
17036
- "dashboard.records.noRecord": "No record for this organization",
17037
- "dashboard.records.noUser": "No users for this organization",
17038
17006
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17039
17007
  "dashboard.records.search": "Search for \"{searchText}\"",
17040
17008
  "dashboard.records.userDetail": "Name",
17041
17009
  "dashboard.records.userEmail": "Email",
17042
17010
  "dashboard.records.username": "Username",
17043
17011
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
17012
+ "dashboard.results.listMetadata": "Show metadata",
17013
+ "dashboard.results.listResources": "Show resources",
17044
17014
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17045
17015
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17046
17016
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17188,6 +17158,7 @@ var en = {
17188
17158
  "map.add.layer.wfs": "From WFS",
17189
17159
  "map.add.layer.wms": "From WMS",
17190
17160
  "map.addFromFile.placeholder": "Click or drop a file here",
17161
+ "map.geocoding.placeholder": "Search for a place",
17191
17162
  "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17192
17163
  "map.layer.add": "Add",
17193
17164
  "map.layers.available": "Available Layers",
@@ -17231,16 +17202,15 @@ var en = {
17231
17202
  "record.metadata.author": "Author",
17232
17203
  "record.metadata.catalog": "Catalog",
17233
17204
  "record.metadata.contact": "Contact",
17234
- "record.metadata.createdOn": "Created on",
17235
17205
  "record.metadata.details": "Technical information",
17236
17206
  "record.metadata.download": "Downloads",
17237
17207
  "record.metadata.formats": "Formats",
17238
- "record.metadata.isOpenData": "Open Data",
17239
17208
  "record.metadata.keywords": "Keywords",
17240
- "record.metadata.lastUpdate": "Last updated on",
17209
+ "record.metadata.lastUpdate": "Last updated on {date}",
17241
17210
  "record.metadata.links": "Links",
17242
17211
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17243
17212
  "record.metadata.origin": "About the data",
17213
+ "record.metadata.otherConstraints": "Additional Conditions",
17244
17214
  "record.metadata.owner": "Catalog of origin",
17245
17215
  "record.metadata.preview": "Preview",
17246
17216
  "record.metadata.publications": "publications",
@@ -17264,14 +17234,15 @@ var en = {
17264
17234
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17265
17235
  "record.metadata.related": "Related records",
17266
17236
  "record.metadata.sheet": "Original metadata",
17267
- "record.metadata.themes": "Categories",
17237
+ "record.metadata.status": "Status",
17268
17238
  "record.metadata.title": "Title",
17239
+ "record.metadata.topics": "Categories",
17269
17240
  "record.metadata.type": "Geographical dataset",
17270
17241
  "record.metadata.uniqueId": "Unique Identifier",
17271
17242
  "record.metadata.updateFrequency": "Data Update Frequency",
17272
17243
  "record.metadata.updateStatus": "Data Update Status",
17273
- "record.metadata.updatedOn": "Metadata's last update",
17274
- "record.metadata.usage": "Usage & constraints",
17244
+ "record.metadata.updatedOn": "Last Data Information Update",
17245
+ "record.metadata.usage": "License and Conditions",
17275
17246
  "record.more.details": "Read more",
17276
17247
  "record.tab.chart": "Chart",
17277
17248
  "record.tab.data": "Table",
@@ -17301,6 +17272,7 @@ var en = {
17301
17272
  "search.filters.isSpatial": "Is spatial data",
17302
17273
  "search.filters.isSpatial.no": "non spatial",
17303
17274
  "search.filters.isSpatial.yes": "spatial",
17275
+ "search.filters.keyword": "Keyword",
17304
17276
  "search.filters.license": "License",
17305
17277
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17306
17278
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17365,20 +17337,21 @@ var es = {
17365
17337
  "chart.type.line": "gráfico de líneas",
17366
17338
  "chart.type.lineSmooth": "gráfico de líneas suave",
17367
17339
  "chart.type.pie": "gráfico circular",
17340
+ "dashboard.createRecord": "",
17368
17341
  "dashboard.labels.mySpace": "Mi espacio",
17369
17342
  "dashboard.records.all": "Catálogo",
17370
17343
  "dashboard.records.myDraft": "Mis borradores",
17371
17344
  "dashboard.records.myLibrary": "Mi biblioteca",
17372
17345
  "dashboard.records.myOrg": "Organización",
17373
17346
  "dashboard.records.myRecords": "Mis Registros",
17374
- "dashboard.records.noRecord": "",
17375
- "dashboard.records.noUser": "",
17376
17347
  "dashboard.records.publishedRecords": "",
17377
17348
  "dashboard.records.search": "Buscar \"{searchText}\"",
17378
17349
  "dashboard.records.userDetail": "",
17379
17350
  "dashboard.records.userEmail": "",
17380
17351
  "dashboard.records.username": "",
17381
17352
  "dashboard.records.users": "",
17353
+ "dashboard.results.listMetadata": "",
17354
+ "dashboard.results.listResources": "",
17382
17355
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17383
17356
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17384
17357
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17526,6 +17499,7 @@ var es = {
17526
17499
  "map.add.layer.wfs": "",
17527
17500
  "map.add.layer.wms": "",
17528
17501
  "map.addFromFile.placeholder": "",
17502
+ "map.geocoding.placeholder": "",
17529
17503
  "map.help.addFromFile": "",
17530
17504
  "map.layer.add": "",
17531
17505
  "map.layers.available": "",
@@ -17569,16 +17543,15 @@ var es = {
17569
17543
  "record.metadata.author": "",
17570
17544
  "record.metadata.catalog": "",
17571
17545
  "record.metadata.contact": "",
17572
- "record.metadata.createdOn": "",
17573
17546
  "record.metadata.details": "",
17574
17547
  "record.metadata.download": "",
17575
17548
  "record.metadata.formats": "",
17576
- "record.metadata.isOpenData": "",
17577
17549
  "record.metadata.keywords": "",
17578
17550
  "record.metadata.lastUpdate": "",
17579
17551
  "record.metadata.links": "",
17580
17552
  "record.metadata.noUsage": "",
17581
17553
  "record.metadata.origin": "",
17554
+ "record.metadata.otherConstraints": "",
17582
17555
  "record.metadata.owner": "",
17583
17556
  "record.metadata.preview": "",
17584
17557
  "record.metadata.publications": "",
@@ -17602,8 +17575,9 @@ var es = {
17602
17575
  "record.metadata.quality.updateFrequency.success": "",
17603
17576
  "record.metadata.related": "",
17604
17577
  "record.metadata.sheet": "",
17605
- "record.metadata.themes": "",
17578
+ "record.metadata.status": "",
17606
17579
  "record.metadata.title": "",
17580
+ "record.metadata.topics": "",
17607
17581
  "record.metadata.type": "",
17608
17582
  "record.metadata.uniqueId": "",
17609
17583
  "record.metadata.updateFrequency": "",
@@ -17639,6 +17613,7 @@ var es = {
17639
17613
  "search.filters.isSpatial": "",
17640
17614
  "search.filters.isSpatial.no": "",
17641
17615
  "search.filters.isSpatial.yes": "",
17616
+ "search.filters.keyword": "",
17642
17617
  "search.filters.license": "",
17643
17618
  "search.filters.license.cc-by": "",
17644
17619
  "search.filters.license.cc-by-sa": "",
@@ -17703,20 +17678,21 @@ var fr = {
17703
17678
  "chart.type.line": "ligne",
17704
17679
  "chart.type.lineSmooth": "ligne lisse",
17705
17680
  "chart.type.pie": "camembert",
17681
+ "dashboard.createRecord": "",
17706
17682
  "dashboard.labels.mySpace": "Mon espace",
17707
17683
  "dashboard.records.all": "Catalogue",
17708
17684
  "dashboard.records.myDraft": "Mes brouillons",
17709
17685
  "dashboard.records.myLibrary": "Ma bibliothèque",
17710
17686
  "dashboard.records.myOrg": "Mon organisation",
17711
17687
  "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
17688
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17715
17689
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17716
17690
  "dashboard.records.userDetail": "Nom",
17717
17691
  "dashboard.records.userEmail": "Email",
17718
17692
  "dashboard.records.username": "Nom d'utilisateur",
17719
17693
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17694
+ "dashboard.results.listMetadata": "",
17695
+ "dashboard.results.listResources": "",
17720
17696
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17721
17697
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17722
17698
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17798,7 +17774,7 @@ var fr = {
17798
17774
  "datahub.header.popularRecords": "Les plus appréciées",
17799
17775
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17800
17776
  "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>",
17777
+ "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont pour vous répondre.</p>",
17802
17778
  "datahub.news.contact.title": "Un besoin spécifique ?",
17803
17779
  "datahub.news.feed": "Fil d'activité",
17804
17780
  "datahub.news.figures": "Quelques chiffres",
@@ -17864,6 +17840,7 @@ var fr = {
17864
17840
  "map.add.layer.wfs": "",
17865
17841
  "map.add.layer.wms": "",
17866
17842
  "map.addFromFile.placeholder": "",
17843
+ "map.geocoding.placeholder": "",
17867
17844
  "map.help.addFromFile": "",
17868
17845
  "map.layer.add": "",
17869
17846
  "map.layers.available": "",
@@ -17907,16 +17884,15 @@ var fr = {
17907
17884
  "record.metadata.author": "Auteur",
17908
17885
  "record.metadata.catalog": "Catalogue",
17909
17886
  "record.metadata.contact": "Contact",
17910
- "record.metadata.createdOn": "Créé le",
17911
17887
  "record.metadata.details": "Informations techniques",
17912
17888
  "record.metadata.download": "Téléchargements",
17913
17889
  "record.metadata.formats": "Formats",
17914
- "record.metadata.isOpenData": "Donnée Ouverte",
17915
17890
  "record.metadata.keywords": "Mots clés",
17916
- "record.metadata.lastUpdate": "Mis à jour le",
17891
+ "record.metadata.lastUpdate": "Mis à jour le {date}",
17917
17892
  "record.metadata.links": "Liens",
17918
17893
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17919
17894
  "record.metadata.origin": "À propos des données",
17895
+ "record.metadata.otherConstraints": "Limitations d'usage",
17920
17896
  "record.metadata.owner": "Catalogue d'origine",
17921
17897
  "record.metadata.preview": "Aperçu",
17922
17898
  "record.metadata.publications": "données",
@@ -17940,14 +17916,15 @@ var fr = {
17940
17916
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17941
17917
  "record.metadata.related": "Voir aussi",
17942
17918
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17943
- "record.metadata.themes": "Catégories",
17919
+ "record.metadata.status": "",
17944
17920
  "record.metadata.title": "Titre",
17921
+ "record.metadata.topics": "Catégories",
17945
17922
  "record.metadata.type": "Donnée géographique",
17946
17923
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17947
17924
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17948
17925
  "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",
17926
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17927
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17951
17928
  "record.more.details": "Détails",
17952
17929
  "record.tab.chart": "Graphique",
17953
17930
  "record.tab.data": "Tableau",
@@ -17977,6 +17954,7 @@ var fr = {
17977
17954
  "search.filters.isSpatial": "Données spatiales",
17978
17955
  "search.filters.isSpatial.no": "non-géolocalisées",
17979
17956
  "search.filters.isSpatial.yes": "géolocalisées",
17957
+ "search.filters.keyword": "Mot-clé",
17980
17958
  "search.filters.license": "Licence",
17981
17959
  "search.filters.license.cc-by": "cc-by",
17982
17960
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18041,20 +18019,21 @@ var it = {
18041
18019
  "chart.type.line": "grafico a linee",
18042
18020
  "chart.type.lineSmooth": "grafico a linea liscia",
18043
18021
  "chart.type.pie": "grafico a torta",
18022
+ "dashboard.createRecord": "",
18044
18023
  "dashboard.labels.mySpace": "Il mio spazio",
18045
18024
  "dashboard.records.all": "Catalogo",
18046
18025
  "dashboard.records.myDraft": "Le mie bozze",
18047
18026
  "dashboard.records.myLibrary": "La mia biblioteca",
18048
18027
  "dashboard.records.myOrg": "La mia organizzazione",
18049
18028
  "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
18029
  "dashboard.records.publishedRecords": "dati pubblicati",
18053
18030
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18054
18031
  "dashboard.records.userDetail": "Nome",
18055
18032
  "dashboard.records.userEmail": "Email",
18056
18033
  "dashboard.records.username": "Nome utente",
18057
18034
  "dashboard.records.users": "utenti",
18035
+ "dashboard.results.listMetadata": "",
18036
+ "dashboard.results.listResources": "",
18058
18037
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18059
18038
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18060
18039
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18202,6 +18181,7 @@ var it = {
18202
18181
  "map.add.layer.wfs": "Da un WFS",
18203
18182
  "map.add.layer.wms": "Da un WMS",
18204
18183
  "map.addFromFile.placeholder": "",
18184
+ "map.geocoding.placeholder": "",
18205
18185
  "map.help.addFromFile": "",
18206
18186
  "map.layer.add": "",
18207
18187
  "map.layers.available": "",
@@ -18245,16 +18225,15 @@ var it = {
18245
18225
  "record.metadata.author": "Autore",
18246
18226
  "record.metadata.catalog": "Catalogo",
18247
18227
  "record.metadata.contact": "Contatto",
18248
- "record.metadata.createdOn": "Creato il",
18249
18228
  "record.metadata.details": "Informazioni tecniche",
18250
18229
  "record.metadata.download": "Download",
18251
18230
  "record.metadata.formats": "Formati",
18252
- "record.metadata.isOpenData": "Data aperta",
18253
18231
  "record.metadata.keywords": "Parole chiave",
18254
- "record.metadata.lastUpdate": "Ultimo aggiornamento",
18232
+ "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
18255
18233
  "record.metadata.links": "Collegamenti",
18256
18234
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18257
18235
  "record.metadata.origin": "Informazioni sui dati",
18236
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18258
18237
  "record.metadata.owner": "Catalogo originale",
18259
18238
  "record.metadata.preview": "Anteprima",
18260
18239
  "record.metadata.publications": "pubblicazioni",
@@ -18278,14 +18257,15 @@ var it = {
18278
18257
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18279
18258
  "record.metadata.related": "Vedi anche",
18280
18259
  "record.metadata.sheet": "Origine del metadata",
18281
- "record.metadata.themes": "Categorie",
18260
+ "record.metadata.status": "",
18282
18261
  "record.metadata.title": "Titolo",
18262
+ "record.metadata.topics": "Categorie",
18283
18263
  "record.metadata.type": "Dati geografici",
18284
18264
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18285
18265
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18286
18266
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18287
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18288
- "record.metadata.usage": "Condizioni d'uso",
18267
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18268
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18289
18269
  "record.more.details": "Dettagli",
18290
18270
  "record.tab.chart": "Grafico",
18291
18271
  "record.tab.data": "Tabella",
@@ -18315,6 +18295,7 @@ var it = {
18315
18295
  "search.filters.isSpatial": "Dati spaziali",
18316
18296
  "search.filters.isSpatial.no": "Non geolocalizzati",
18317
18297
  "search.filters.isSpatial.yes": "Geolocalizzati",
18298
+ "search.filters.keyword": "Parola chiave",
18318
18299
  "search.filters.license": "Licenza",
18319
18300
  "search.filters.license.cc-by": "cc-by",
18320
18301
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18379,20 +18360,21 @@ var nl = {
18379
18360
  "chart.type.line": "lijndiagram",
18380
18361
  "chart.type.lineSmooth": "glad lijndiagram",
18381
18362
  "chart.type.pie": "cirkeldiagram",
18363
+ "dashboard.createRecord": "",
18382
18364
  "dashboard.labels.mySpace": "Mijn ruimte",
18383
18365
  "dashboard.records.all": "Catalogus",
18384
18366
  "dashboard.records.myDraft": "Mijn concepten",
18385
18367
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18386
18368
  "dashboard.records.myOrg": "Organisatie",
18387
18369
  "dashboard.records.myRecords": "Mijn Records",
18388
- "dashboard.records.noRecord": "",
18389
- "dashboard.records.noUser": "",
18390
18370
  "dashboard.records.publishedRecords": "",
18391
18371
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18392
18372
  "dashboard.records.userDetail": "",
18393
18373
  "dashboard.records.userEmail": "",
18394
18374
  "dashboard.records.username": "",
18395
18375
  "dashboard.records.users": "",
18376
+ "dashboard.results.listMetadata": "",
18377
+ "dashboard.results.listResources": "",
18396
18378
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18397
18379
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18398
18380
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18540,6 +18522,7 @@ var nl = {
18540
18522
  "map.add.layer.wfs": "",
18541
18523
  "map.add.layer.wms": "",
18542
18524
  "map.addFromFile.placeholder": "",
18525
+ "map.geocoding.placeholder": "",
18543
18526
  "map.help.addFromFile": "",
18544
18527
  "map.layer.add": "",
18545
18528
  "map.layers.available": "",
@@ -18583,16 +18566,15 @@ var nl = {
18583
18566
  "record.metadata.author": "",
18584
18567
  "record.metadata.catalog": "",
18585
18568
  "record.metadata.contact": "",
18586
- "record.metadata.createdOn": "",
18587
18569
  "record.metadata.details": "",
18588
18570
  "record.metadata.download": "",
18589
18571
  "record.metadata.formats": "",
18590
- "record.metadata.isOpenData": "",
18591
18572
  "record.metadata.keywords": "",
18592
18573
  "record.metadata.lastUpdate": "",
18593
18574
  "record.metadata.links": "",
18594
18575
  "record.metadata.noUsage": "",
18595
18576
  "record.metadata.origin": "",
18577
+ "record.metadata.otherConstraints": "",
18596
18578
  "record.metadata.owner": "",
18597
18579
  "record.metadata.preview": "",
18598
18580
  "record.metadata.publications": "",
@@ -18616,8 +18598,9 @@ var nl = {
18616
18598
  "record.metadata.quality.updateFrequency.success": "",
18617
18599
  "record.metadata.related": "",
18618
18600
  "record.metadata.sheet": "",
18619
- "record.metadata.themes": "",
18601
+ "record.metadata.status": "",
18620
18602
  "record.metadata.title": "",
18603
+ "record.metadata.topics": "",
18621
18604
  "record.metadata.type": "",
18622
18605
  "record.metadata.uniqueId": "",
18623
18606
  "record.metadata.updateFrequency": "",
@@ -18653,6 +18636,7 @@ var nl = {
18653
18636
  "search.filters.isSpatial": "",
18654
18637
  "search.filters.isSpatial.no": "",
18655
18638
  "search.filters.isSpatial.yes": "",
18639
+ "search.filters.keyword": "",
18656
18640
  "search.filters.license": "",
18657
18641
  "search.filters.license.cc-by": "",
18658
18642
  "search.filters.license.cc-by-sa": "",
@@ -18717,20 +18701,21 @@ var pt = {
18717
18701
  "chart.type.line": "gráfico de linha",
18718
18702
  "chart.type.lineSmooth": "gráfico de linha suave",
18719
18703
  "chart.type.pie": "gráfico de pizza",
18704
+ "dashboard.createRecord": "",
18720
18705
  "dashboard.labels.mySpace": "Meu espaço",
18721
18706
  "dashboard.records.all": "Catálogo",
18722
18707
  "dashboard.records.myDraft": "Meus rascunhos",
18723
18708
  "dashboard.records.myLibrary": "Minha biblioteca",
18724
18709
  "dashboard.records.myOrg": "Organização",
18725
18710
  "dashboard.records.myRecords": "Meus Registros",
18726
- "dashboard.records.noRecord": "",
18727
- "dashboard.records.noUser": "",
18728
18711
  "dashboard.records.publishedRecords": "",
18729
18712
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18730
18713
  "dashboard.records.userDetail": "",
18731
18714
  "dashboard.records.userEmail": "",
18732
18715
  "dashboard.records.username": "",
18733
18716
  "dashboard.records.users": "",
18717
+ "dashboard.results.listMetadata": "",
18718
+ "dashboard.results.listResources": "",
18734
18719
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18735
18720
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18736
18721
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18878,6 +18863,7 @@ var pt = {
18878
18863
  "map.add.layer.wfs": "",
18879
18864
  "map.add.layer.wms": "",
18880
18865
  "map.addFromFile.placeholder": "",
18866
+ "map.geocoding.placeholder": "",
18881
18867
  "map.help.addFromFile": "",
18882
18868
  "map.layer.add": "",
18883
18869
  "map.layers.available": "",
@@ -18921,16 +18907,15 @@ var pt = {
18921
18907
  "record.metadata.author": "",
18922
18908
  "record.metadata.catalog": "",
18923
18909
  "record.metadata.contact": "",
18924
- "record.metadata.createdOn": "",
18925
18910
  "record.metadata.details": "",
18926
18911
  "record.metadata.download": "",
18927
18912
  "record.metadata.formats": "",
18928
- "record.metadata.isOpenData": "",
18929
18913
  "record.metadata.keywords": "",
18930
18914
  "record.metadata.lastUpdate": "",
18931
18915
  "record.metadata.links": "",
18932
18916
  "record.metadata.noUsage": "",
18933
18917
  "record.metadata.origin": "",
18918
+ "record.metadata.otherConstraints": "",
18934
18919
  "record.metadata.owner": "",
18935
18920
  "record.metadata.preview": "",
18936
18921
  "record.metadata.publications": "",
@@ -18954,8 +18939,9 @@ var pt = {
18954
18939
  "record.metadata.quality.updateFrequency.success": "",
18955
18940
  "record.metadata.related": "",
18956
18941
  "record.metadata.sheet": "",
18957
- "record.metadata.themes": "",
18942
+ "record.metadata.status": "",
18958
18943
  "record.metadata.title": "",
18944
+ "record.metadata.topics": "",
18959
18945
  "record.metadata.type": "",
18960
18946
  "record.metadata.uniqueId": "",
18961
18947
  "record.metadata.updateFrequency": "",
@@ -18991,6 +18977,7 @@ var pt = {
18991
18977
  "search.filters.isSpatial": "",
18992
18978
  "search.filters.isSpatial.no": "",
18993
18979
  "search.filters.isSpatial.yes": "",
18980
+ "search.filters.keyword": "",
18994
18981
  "search.filters.license": "",
18995
18982
  "search.filters.license.cc-by": "",
18996
18983
  "search.filters.license.cc-by-sa": "",
@@ -19099,8 +19086,8 @@ class Gn4FieldMapper {
19099
19086
  },
19100
19087
  cl_topic: (output, source) => ({
19101
19088
  ...output,
19102
- themes: [
19103
- ...(output.themes || []),
19089
+ topics: [
19090
+ ...(output.topics || []),
19104
19091
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
19105
19092
  ],
19106
19093
  }),
@@ -19155,31 +19142,22 @@ class Gn4FieldMapper {
19155
19142
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19156
19143
  }, output);
19157
19144
  },
19158
- tag: (output, source) => ({
19145
+ allKeywords: (output, source) => ({
19159
19146
  ...output,
19160
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19147
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19161
19148
  }),
19162
19149
  inspireTheme: (output, source) => ({
19163
19150
  ...output,
19164
- themes: [
19165
- ...(output.themes || []),
19151
+ topics: [
19152
+ ...(output.topics || []),
19166
19153
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19167
19154
  ],
19168
19155
  }),
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
- }),
19156
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19157
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19158
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19159
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19160
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19183
19161
  lineageObject: (output, source) => ({
19184
19162
  ...output,
19185
19163
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19205,33 +19183,78 @@ class Gn4FieldMapper {
19205
19183
  kind,
19206
19184
  };
19207
19185
  },
19186
+ geom: (output, source) => {
19187
+ const geoms = getAsArray(selectField(source, 'geom'));
19188
+ const shapes = getAsArray(selectField(source, 'shape'));
19189
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19190
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19191
+ return {
19192
+ ...output,
19193
+ spatialExtents: [
19194
+ ...spatialExtents,
19195
+ ...geoms.map((geom, index) => {
19196
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19197
+ const geometry = shapes[index] ?? geom;
19198
+ return {
19199
+ ...(description !== null ? { description } : null),
19200
+ geometry,
19201
+ };
19202
+ }),
19203
+ ],
19204
+ };
19205
+ },
19206
+ resourceTemporalDateRange: (output, source) => {
19207
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19208
+ return {
19209
+ ...output,
19210
+ temporalExtents: ranges.map((range) => {
19211
+ const start = selectField(range, 'gte');
19212
+ const end = selectField(range, 'lte');
19213
+ return {
19214
+ ...(start !== null ? { start: toDate(start) } : null),
19215
+ ...(end !== null ? { end: toDate(end) } : null),
19216
+ };
19217
+ }),
19218
+ };
19219
+ },
19208
19220
  };
19209
19221
  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
- });
19222
+ this.constraintField = (type, output, constraintArray) => {
19223
+ let outputField;
19224
+ switch (type) {
19225
+ case 'license':
19226
+ outputField = 'licenses';
19227
+ break;
19228
+ case 'legal':
19229
+ outputField = 'legalConstraints';
19230
+ break;
19231
+ case 'security':
19232
+ outputField = 'securityConstraints';
19233
+ break;
19234
+ case 'other':
19235
+ outputField = 'otherConstraints';
19236
+ break;
19237
+ }
19238
+ const outputArray = outputField in output ? output[outputField] : [];
19239
+ outputArray.push(...constraintArray.map((item) => {
19240
+ const text = selectTranslatedValue(item, this.lang3);
19241
+ const url = getAsUrl(selectField(item, 'link'));
19242
+ return {
19243
+ text,
19244
+ ...(url ? { url } : {}),
19245
+ };
19246
+ }));
19247
+ const result = {
19248
+ ...output,
19249
+ [outputField]: outputArray,
19250
+ };
19251
+ // avoid legal constraints being duplicates of licenses
19252
+ if ('legalConstraints' in result &&
19253
+ (type === 'legal' || type === 'license')) {
19254
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19255
+ }
19256
+ return result;
19257
+ };
19235
19258
  this.mapLink = (sourceLink) => {
19236
19259
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19237
19260
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19279,17 +19302,6 @@ class Gn4FieldMapper {
19279
19302
  extras: { ...(output.extras || {}), ...value },
19280
19303
  });
19281
19304
  }
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
19305
  getMappingFn(fieldName) {
19294
19306
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19295
19307
  }
@@ -19351,12 +19363,13 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19351
19363
  recordUpdated: null,
19352
19364
  ownerOrganization: null,
19353
19365
  licenses: [],
19366
+ legalConstraints: [],
19367
+ securityConstraints: [],
19368
+ otherConstraints: [],
19354
19369
  contacts: [],
19355
19370
  contactsForResource: [],
19356
- accessConstraints: [],
19357
19371
  keywords: [],
19358
- themes: [],
19359
- useLimitations: [],
19372
+ topics: [],
19360
19373
  spatialExtents: [],
19361
19374
  temporalExtents: [],
19362
19375
  overviews: [],
@@ -20124,11 +20137,18 @@ class OrganizationsFromMetadataService {
20124
20137
  if (!allContactOrgs.length)
20125
20138
  return of(record);
20126
20139
  const ownerOrganization = allContactOrgs[0];
20127
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20140
+ // read the owner group as well to have a fallback logo
20141
+ const groupId = selectField(source, 'groupOwner');
20142
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20143
+ return group.id === Number(groupId);
20144
+ })));
20145
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20128
20146
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20147
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20129
20148
  return {
20130
20149
  ...record,
20131
20150
  ownerOrganization: {
20151
+ logoUrl,
20132
20152
  ...ownerOrganization,
20133
20153
  ...recordOrganisation,
20134
20154
  },
@@ -20393,36 +20413,23 @@ class SelectionService {
20393
20413
  this.selectedRecordsIdentifiers$.next(filtered);
20394
20414
  }
20395
20415
  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(() => {
20416
+ const newIds = records.map((record) => record.uniqueIdentifier);
20417
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20402
20418
  this.addIdsToSelected(newIds);
20403
- }), map$2(() => undefined));
20419
+ });
20404
20420
  }
20405
20421
  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(() => {
20422
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20423
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20412
20424
  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
20425
  });
20421
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20422
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20423
- return apiResponse.pipe(tap$2(() => {
20426
+ }
20427
+ async clearSelection() {
20428
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20429
+ const currentSelection = Array.from(response);
20430
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20424
20431
  this.removeIdsFromSelected(currentSelection);
20425
- }), map$2(() => undefined));
20432
+ });
20426
20433
  }
20427
20434
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20428
20435
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20452,12 +20459,21 @@ class Gn4PlatformMapper {
20452
20459
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20453
20460
  return { ...apiUser, id: id.toString() };
20454
20461
  }
20455
- thesaurusFromApi(thesaurus) {
20462
+ thesaurusFromApi(thesaurus, lang3) {
20456
20463
  return thesaurus.map((keyword) => {
20457
- const { uri, value } = keyword;
20464
+ let key = keyword.uri;
20465
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20466
+ if (key.indexOf('@@@') > -1) {
20467
+ key = key.split('@@@')[1];
20468
+ }
20469
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20470
+ const description = lang3 && lang3 in keyword.definitions
20471
+ ? keyword.definitions[lang3]
20472
+ : keyword.definition;
20458
20473
  return {
20459
- key: uri,
20460
- label: value,
20474
+ key,
20475
+ label,
20476
+ description,
20461
20477
  };
20462
20478
  });
20463
20479
  }
@@ -20470,13 +20486,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20470
20486
 
20471
20487
  const minApiVersion = '4.2.2';
20472
20488
  class Gn4PlatformService {
20473
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20489
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20474
20490
  this.siteApiService = siteApiService;
20475
20491
  this.meApi = meApi;
20476
20492
  this.usersApi = usersApi;
20477
20493
  this.mapper = mapper;
20478
20494
  this.toolsApiService = toolsApiService;
20479
20495
  this.registriesApiService = registriesApiService;
20496
+ this.langService = langService;
20480
20497
  this.type = 'GeoNetwork';
20481
20498
  this.keyTranslations$ = this.toolsApiService
20482
20499
  .getTranslationsPackage1('gnui')
@@ -20490,6 +20507,11 @@ class Gn4PlatformService {
20490
20507
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20491
20508
  }
20492
20509
  }), shareReplay(1));
20510
+ /**
20511
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20512
+ * @private
20513
+ */
20514
+ this.thesauri = {};
20493
20515
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20494
20516
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20495
20517
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20516,19 +20538,36 @@ class Gn4PlatformService {
20516
20538
  return this.users$;
20517
20539
  }
20518
20540
  translateKey(key) {
20541
+ // if the key is a URI, use the registries API to look for the translation
20542
+ if (key.match(/^https?:\/\//)) {
20543
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20544
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20545
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20546
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20547
+ for (const item of thesaurus) {
20548
+ if (item.key === key)
20549
+ return item.label;
20550
+ }
20551
+ return key;
20552
+ }));
20553
+ }
20519
20554
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20520
20555
  }
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)));
20556
+ getThesaurusByUri(uri) {
20557
+ if (this.thesauri[uri]) {
20558
+ return this.thesauri[uri];
20559
+ }
20560
+ this.thesauri[uri] = this.registriesApiService
20561
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20562
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20563
+ return this.thesauri[uri];
20525
20564
  }
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 }); }
20565
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20527
20566
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20528
20567
  }
20529
20568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20530
20569
  type: Injectable
20531
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20570
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20532
20571
 
20533
20572
  function provideGn4() {
20534
20573
  return [
@@ -20740,6 +20779,8 @@ const defaultMapOptions = {
20740
20779
  };
20741
20780
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20742
20781
 
20782
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20783
+
20743
20784
  var MapContextLayerTypeEnum;
20744
20785
  (function (MapContextLayerTypeEnum) {
20745
20786
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21115,9 +21156,15 @@ const FORMATS = {
21115
21156
  color: '#328556',
21116
21157
  mimeTypes: ['x-gis/x-shapefile'],
21117
21158
  },
21159
+ gml: {
21160
+ extensions: ['gml'],
21161
+ priority: 5,
21162
+ color: '#c92bce',
21163
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21164
+ },
21118
21165
  kml: {
21119
21166
  extensions: ['kml', 'kmz'],
21120
- priority: 5,
21167
+ priority: 6,
21121
21168
  color: '#348009',
21122
21169
  mimeTypes: [
21123
21170
  'application/vnd.google-earth.kml+xml',
@@ -21126,34 +21173,40 @@ const FORMATS = {
21126
21173
  },
21127
21174
  gpkg: {
21128
21175
  extensions: ['gpkg', 'geopackage'],
21129
- priority: 6,
21176
+ priority: 7,
21130
21177
  color: '#ea79ba',
21131
21178
  mimeTypes: ['application/geopackage+sqlite3'],
21132
21179
  },
21133
21180
  zip: {
21134
21181
  extensions: ['zip', 'tar.gz'],
21135
- priority: 7,
21182
+ priority: 8,
21136
21183
  color: '#f2bb3a',
21137
21184
  mimeTypes: ['application/zip', 'application/x-zip'],
21138
21185
  },
21139
21186
  pdf: {
21140
21187
  extensions: ['pdf'],
21141
- priority: 8,
21188
+ priority: 9,
21142
21189
  color: '#db544a',
21143
21190
  mimeTypes: ['application/pdf'],
21144
21191
  },
21145
21192
  jpg: {
21146
21193
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21147
- priority: 8,
21194
+ priority: 9,
21148
21195
  color: '#673ab7',
21149
21196
  mimeTypes: ['image/jpg'],
21150
21197
  },
21151
21198
  svg: {
21152
21199
  extensions: ['svg'],
21153
- priority: 9,
21200
+ priority: 10,
21154
21201
  color: '#d98294',
21155
21202
  mimeTypes: ['image/svg+xml'],
21156
21203
  },
21204
+ dxf: {
21205
+ extensions: ['dxf'],
21206
+ priority: 11,
21207
+ color: '#de630b',
21208
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21209
+ },
21157
21210
  };
21158
21211
  function getFormatPriority(linkFormat) {
21159
21212
  for (const format in FORMATS) {
@@ -21170,14 +21223,18 @@ function getFormatPriority(linkFormat) {
21170
21223
  function getLinkPriority(link) {
21171
21224
  return getFormatPriority(getFileFormat(link));
21172
21225
  }
21173
- function extensionToFormat(extension) {
21174
- for (const format in FORMATS) {
21175
- for (const alias of FORMATS[format].extensions) {
21176
- if (alias === extension.toLowerCase())
21177
- return format;
21226
+ function getFileFormatFromServiceOutput(serviceOutput) {
21227
+ function formatMatcher(format) {
21228
+ const output = serviceOutput.toLowerCase();
21229
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21230
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21231
+ }
21232
+ for (const formatName in FORMATS) {
21233
+ if (formatMatcher(FORMATS[formatName])) {
21234
+ return formatName;
21178
21235
  }
21179
21236
  }
21180
- return undefined;
21237
+ return null;
21181
21238
  }
21182
21239
  function getFileFormat(link) {
21183
21240
  if ('mimeType' in link) {
@@ -21318,72 +21375,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21318
21375
  }]
21319
21376
  }] });
21320
21377
 
21321
- const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
21322
-
21323
- class MapUtilsWMSService {
21324
- constructor(proxy) {
21325
- this.proxy = proxy;
21326
- }
21327
- getCapabilities(layer) {
21328
- return from(new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady());
21329
- }
21330
- getLayerFull(layer) {
21331
- return this.getCapabilities(layer).pipe(map$1((endpoint) => endpoint.getLayerByName(layer.name)));
21332
- }
21333
- getLayerLonLatBBox(layer) {
21334
- return this.getLayerFull(layer).pipe(switchMap$1((wmsLayerFull) => from(this.getLonLatBBox(wmsLayerFull))));
21335
- }
21336
- async getLonLatBBox(wmsLayerFull) {
21337
- const { boundingBoxes } = wmsLayerFull;
21338
- const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21339
- if (lonLatCRS) {
21340
- return boundingBoxes[lonLatCRS];
21341
- }
21342
- else {
21343
- const availableEPSGCode = Object.keys(boundingBoxes)[0];
21344
- register(proj4);
21345
- const proj = await fromEPSGCode(availableEPSGCode);
21346
- proj4.defs(availableEPSGCode, proj);
21347
- const bboxWithFiniteNumbers = [
21348
- parseFloat(boundingBoxes[availableEPSGCode][0]),
21349
- parseFloat(boundingBoxes[availableEPSGCode][1]),
21350
- parseFloat(boundingBoxes[availableEPSGCode][2]),
21351
- parseFloat(boundingBoxes[availableEPSGCode][3]),
21352
- ];
21353
- const extent = transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21354
- return extent;
21355
- }
21356
- }
21357
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21358
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, providedIn: 'root' }); }
21359
- }
21360
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, decorators: [{
21361
- type: Injectable,
21362
- args: [{
21363
- providedIn: 'root',
21364
- }]
21365
- }], ctorParameters: function () { return [{ type: ProxyService }]; } });
21366
-
21367
21378
  const FEATURE_PROJECTION = 'EPSG:3857';
21368
21379
  const DATA_PROJECTION = 'EPSG:4326';
21380
+ const GEOJSON = new GeoJSON();
21369
21381
  class MapUtilsService {
21370
- constructor(http, wmsUtils) {
21382
+ constructor(http, proxy) {
21371
21383
  this.http = http;
21372
- this.wmsUtils = wmsUtils;
21384
+ this.proxy = proxy;
21373
21385
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21374
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21386
+ return GEOJSON.readFeatures(featureCollection, {
21375
21387
  featureProjection,
21376
21388
  dataProjection,
21377
21389
  });
21378
- return olFeatures;
21379
21390
  };
21380
21391
  }
21381
21392
  createEmptyMap() {
21382
- const map = new Map$1({
21393
+ return new Map$1({
21383
21394
  controls: [],
21384
21395
  pixelRatio: 1,
21385
21396
  });
21386
- return map;
21387
21397
  }
21388
21398
  isWMSLayer(layer) {
21389
21399
  return (layer.getSource() instanceof TileWMS ||
@@ -21398,8 +21408,7 @@ class MapUtilsService {
21398
21408
  ...source.getParams(),
21399
21409
  INFO_FORMAT: 'application/json',
21400
21410
  };
21401
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21402
- return url;
21411
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21403
21412
  }
21404
21413
  getVectorFeaturesFromClick(olMap, event) {
21405
21414
  const features = [];
@@ -21427,38 +21436,56 @@ class MapUtilsService {
21427
21436
  /**
21428
21437
  * Will emit `null` if no extent could be computed
21429
21438
  */
21430
- getLayerExtent(layer) {
21431
- let geographicExtent;
21439
+ async getLayerExtent(layer) {
21440
+ let latLonExtent;
21432
21441
  if (layer &&
21433
21442
  layer.type === 'geojson' &&
21434
21443
  'data' in layer &&
21435
21444
  typeof layer.data === 'object' &&
21436
21445
  layer.data.features[0] &&
21437
21446
  layer.data.features[0].geometry) {
21438
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21439
- .readFeatures(layerData)
21447
+ latLonExtent = new GeoJSON()
21448
+ .readFeatures(layer.data)
21440
21449
  .map((feature) => feature.getGeometry())
21441
21450
  .filter((geom) => !!geom)
21442
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21451
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21443
21452
  }
21444
21453
  else if (layer && layer.type === 'wms') {
21445
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21454
+ latLonExtent = await this.getWmsLayerExtent(layer);
21446
21455
  }
21447
21456
  else if (layer && layer.type === 'wmts') {
21448
21457
  if (layer.extent) {
21449
- geographicExtent = of(layer.extent);
21458
+ latLonExtent = layer.extent;
21450
21459
  }
21451
21460
  else {
21452
- return of(layer.options.tileGrid.getExtent());
21461
+ return layer.options.tileGrid.getExtent();
21453
21462
  }
21454
21463
  }
21455
21464
  else {
21456
- return of(null);
21465
+ return null;
21466
+ }
21467
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21468
+ return null;
21469
+ }
21470
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21471
+ }
21472
+ async getWmsLayerExtent(layer) {
21473
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21474
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21475
+ if (!Object.keys(boundingBoxes).length) {
21476
+ return null;
21477
+ }
21478
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21479
+ if (lonLatCRS) {
21480
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21481
+ }
21482
+ else {
21483
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21484
+ register(proj4);
21485
+ const proj = await fromEPSGCode(availableEPSGCode);
21486
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21487
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21457
21488
  }
21458
- return geographicExtent.pipe(map$1((extent) => [
21459
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
21460
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
21461
- ]), map$1((extent) => (isEmpty(extent) ? null : extent)));
21462
21489
  }
21463
21490
  getWmtsLayerFromCapabilities(link) {
21464
21491
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21514,7 +21541,18 @@ ${e.stack || e.message || e}`);
21514
21541
  ])
21515
21542
  .getArray());
21516
21543
  }
21517
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, deps: [{ token: i1.HttpClient }, { token: MapUtilsWMSService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21544
+ getRecordExtent(record) {
21545
+ if (!('spatialExtents' in record)) {
21546
+ return null;
21547
+ }
21548
+ // transform an array of geojson geometries into a bbox
21549
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21550
+ const geom = GEOJSON.readGeometry(curr.geometry);
21551
+ return extend(prev, geom.getExtent());
21552
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21553
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21554
+ }
21555
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, deps: [{ token: i1.HttpClient }, { token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21518
21556
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21519
21557
  }
21520
21558
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21522,7 +21560,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21522
21560
  args: [{
21523
21561
  providedIn: 'root',
21524
21562
  }]
21525
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21563
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21526
21564
  function dragPanCondition(event) {
21527
21565
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21528
21566
  if (!dragPanCondition) {
@@ -22607,6 +22645,9 @@ class MapContextService {
22607
22645
  if (mapConfig) {
22608
22646
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22609
22647
  }
22648
+ else {
22649
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22650
+ }
22610
22651
  if (!mapContext.view?.extent &&
22611
22652
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22612
22653
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22717,6 +22758,11 @@ class MapContextService {
22717
22758
  }
22718
22759
  return view;
22719
22760
  }
22761
+ addDefaultBaselayerContext(layers) {
22762
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22763
+ ? layers
22764
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22765
+ }
22720
22766
  mergeMapConfigWithContext(mapContext, mapConfig) {
22721
22767
  return {
22722
22768
  ...mapContext,
@@ -23263,11 +23309,11 @@ class ThumbnailComponent {
23263
23309
  }
23264
23310
  }
23265
23311
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, deps: [{ token: THUMBNAIL_PLACEHOLDER, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
23266
- 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 }); }
23312
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23267
23313
  }
23268
23314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23269
23315
  type: Component,
23270
- args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23316
+ args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23271
23317
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23272
23318
  type: Optional
23273
23319
  }, {
@@ -23395,8 +23441,7 @@ class MetadataQualityComponent {
23395
23441
  : this.calculatedQualityScore;
23396
23442
  }
23397
23443
  get calculatedQualityScore() {
23398
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23399
- this.items.length);
23444
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23400
23445
  }
23401
23446
  showMenu() {
23402
23447
  this.isMenuShown = true;
@@ -23414,7 +23459,7 @@ class MetadataQualityComponent {
23414
23459
  this.items = [];
23415
23460
  this.add('title', !!this.metadata?.title);
23416
23461
  this.add('description', !!this.metadata?.abstract);
23417
- this.add('topic', this.metadata?.themes?.length > 0);
23462
+ this.add('topic', this.metadata?.topics?.length > 0);
23418
23463
  this.add('keywords', this.metadata?.keywords?.length > 0);
23419
23464
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23420
23465
  this.add('organisation', !!contact?.organization);
@@ -23862,6 +23907,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23862
23907
  type: Input
23863
23908
  }] } });
23864
23909
 
23910
+ class MarkdownParserComponent {
23911
+ get parsedMarkdown() {
23912
+ return marked.parse(this.textContent);
23913
+ }
23914
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23915
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23916
+ }
23917
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23918
+ type: Component,
23919
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
23920
+ }], propDecorators: { textContent: [{
23921
+ type: Input
23922
+ }] } });
23923
+
23865
23924
  class ContentGhostComponent {
23866
23925
  constructor() {
23867
23926
  this.ghostClass = '';
@@ -24016,36 +24075,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24016
24075
  args: ['container']
24017
24076
  }] } });
24018
24077
 
24019
- class MarkdownParserComponent {
24020
- get parsedMarkdown() {
24021
- return marked.parse(this.textContent);
24022
- }
24023
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24024
- 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 }); }
24025
- }
24026
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24027
- type: Component,
24028
- 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"] }]
24029
- }], propDecorators: { textContent: [{
24030
- type: Input
24031
- }] } });
24032
-
24033
24078
  class MetadataInfoComponent {
24034
24079
  constructor() {
24035
24080
  this.keyword = new EventEmitter();
24036
24081
  }
24037
24082
  get hasUsage() {
24038
24083
  return (this.metadata.extras?.isOpenData === true ||
24039
- this.metadata.useLimitations?.length ||
24040
- this.metadata.accessConstraints?.length);
24084
+ (this.metadata.legalConstraints?.length > 0 &&
24085
+ this.legalConstraints.length > 0) ||
24086
+ (this.metadata.otherConstraints?.length > 0 &&
24087
+ this.otherConstraints.length > 0) ||
24088
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24089
+ }
24090
+ get legalConstraints() {
24091
+ let array = [];
24092
+ if (this.metadata.legalConstraints?.length) {
24093
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24094
+ }
24095
+ return array;
24041
24096
  }
24042
- get usages() {
24097
+ get otherConstraints() {
24043
24098
  let array = [];
24044
- if (this.metadata.useLimitations?.length) {
24045
- array = array.concat(this.metadata.useLimitations);
24099
+ if (this.metadata.otherConstraints?.length) {
24100
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24046
24101
  }
24047
- if (this.metadata.accessConstraints?.length) {
24048
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24102
+ return array;
24103
+ }
24104
+ get licenses() {
24105
+ let array = [];
24106
+ if (this.metadata.licenses?.length) {
24107
+ array = array.concat(this.metadata.licenses
24108
+ .filter((c) => c.text)
24109
+ .map((c) => ({ text: c.text, url: c.url })));
24049
24110
  }
24050
24111
  return array;
24051
24112
  }
@@ -24067,16 +24128,12 @@ class MetadataInfoComponent {
24067
24128
  onKeywordClick(keyword) {
24068
24129
  this.keyword.emit(keyword);
24069
24130
  }
24070
- copyText() {
24071
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24072
- event.target.blur();
24073
- }
24074
24131
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24075
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24132
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24076
24133
  }
24077
24134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24078
24135
  type: Component,
24079
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24136
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24080
24137
  }], propDecorators: { metadata: [{
24081
24138
  type: Input
24082
24139
  }], incomplete: [{
@@ -24145,11 +24202,11 @@ class ButtonComponent {
24145
24202
  propagateToDocumentOnly(event);
24146
24203
  }
24147
24204
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24148
- 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 }); }
24205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, isStandalone: true, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24149
24206
  }
24150
24207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24151
24208
  type: Component,
24152
- 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"] }]
24209
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24153
24210
  }], propDecorators: { type: [{
24154
24211
  type: Input
24155
24212
  }], disabled: [{
@@ -24224,11 +24281,11 @@ class DownloadsListComponent {
24224
24281
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24225
24282
  }
24226
24283
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
24227
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\">\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24284
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24228
24285
  }
24229
24286
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24230
24287
  type: Component,
24231
- args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\">\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
24288
+ args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
24232
24289
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24233
24290
  type: Input
24234
24291
  }] } });
@@ -24477,11 +24534,74 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24477
24534
  }]
24478
24535
  }] });
24479
24536
 
24480
- class LinkCardComponent {
24481
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24482
- 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 }); }
24483
- }
24484
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, decorators: [{
24537
+ class InteractiveTableColumnComponent {
24538
+ constructor() {
24539
+ this.grow = false;
24540
+ this.sortable = false;
24541
+ this.activeSort = null;
24542
+ this.sortChange = new EventEmitter();
24543
+ }
24544
+ handleSortChange() {
24545
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24546
+ this.sortChange.emit(this.activeSort);
24547
+ }
24548
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24549
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: InteractiveTableColumnComponent, isStandalone: true, selector: "gn-ui-interactive-table-column", inputs: { grow: "grow", sortable: "sortable", activeSort: "activeSort" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "cell", first: true, predicate: ["cell"], descendants: true }], ngImport: i0, template: "<span>empty</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24550
+ }
24551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24552
+ type: Component,
24553
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24554
+ }], propDecorators: { header: [{
24555
+ type: ContentChild,
24556
+ args: ['header']
24557
+ }], cell: [{
24558
+ type: ContentChild,
24559
+ args: ['cell']
24560
+ }], grow: [{
24561
+ type: Input
24562
+ }], sortable: [{
24563
+ type: Input
24564
+ }], activeSort: [{
24565
+ type: Input
24566
+ }], sortChange: [{
24567
+ type: Output
24568
+ }] } });
24569
+
24570
+ class InteractiveTableComponent {
24571
+ constructor() {
24572
+ this.items = [];
24573
+ this.itemClick = new EventEmitter();
24574
+ }
24575
+ get gridStyle() {
24576
+ return {
24577
+ 'grid-template-columns': this.columns
24578
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24579
+ .join(' '),
24580
+ };
24581
+ }
24582
+ handleRowClick(item) {
24583
+ this.itemClick.emit(item);
24584
+ }
24585
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24586
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items" }, outputs: { itemClick: "itemClick" }, queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24587
+ }
24588
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24589
+ type: Component,
24590
+ args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, InteractiveTableColumnComponent, MatIconModule], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"] }]
24591
+ }], propDecorators: { columns: [{
24592
+ type: ContentChildren,
24593
+ args: [InteractiveTableColumnComponent]
24594
+ }], items: [{
24595
+ type: Input
24596
+ }], itemClick: [{
24597
+ type: Output
24598
+ }] } });
24599
+
24600
+ class LinkCardComponent {
24601
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24602
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, selector: "gn-ui-link-card", inputs: { link: "link" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24603
+ }
24604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, decorators: [{
24485
24605
  type: Component,
24486
24606
  args: [{ selector: 'gn-ui-link-card', changeDetection: ChangeDetectionStrategy.OnPush, 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" }]
24487
24607
  }], propDecorators: { link: [{
@@ -24522,11 +24642,11 @@ class MetadataContactComponent {
24522
24642
  this.organizationClick.emit(this.shownOrganization);
24523
24643
  }
24524
24644
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24525
- 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 }); }
24645
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 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 }); }
24526
24646
  }
24527
24647
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24528
24648
  type: Component,
24529
- args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6 sm:mb-12\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24649
+ args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 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" }]
24530
24650
  }], propDecorators: { metadata: [{
24531
24651
  type: Input
24532
24652
  }], organizationClick: [{
@@ -24750,11 +24870,11 @@ class DropdownSelectorComponent {
24750
24870
  }
24751
24871
  }
24752
24872
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24753
- 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 }); }
24873
+ 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 }); }
24754
24874
  }
24755
24875
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24756
24876
  type: Component,
24757
- 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" }]
24877
+ 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" }]
24758
24878
  }], propDecorators: { title: [{
24759
24879
  type: Input
24760
24880
  }], showTitle: [{
@@ -24930,11 +25050,11 @@ class DropdownMultiselectComponent {
24930
25050
  this.setFocus();
24931
25051
  }
24932
25052
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$6.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
24933
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, $event.target.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25053
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"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 }); }
24934
25054
  }
24935
25055
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24936
25056
  type: Component,
24937
- args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, $event.target.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
25057
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"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" }]
24938
25058
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24939
25059
  type: Input
24940
25060
  }], choices: [{
@@ -25088,11 +25208,11 @@ class TextAreaComponent {
25088
25208
  this.rawChange.next(value);
25089
25209
  }
25090
25210
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25091
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25211
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25092
25212
  }
25093
25213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25094
25214
  type: Component,
25095
- args: [{ selector: 'gn-ui-text-area', template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25215
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25096
25216
  }], propDecorators: { value: [{
25097
25217
  type: Input
25098
25218
  }], placeholder: [{
@@ -25193,11 +25313,11 @@ class AutocompleteComponent {
25193
25313
  }
25194
25314
  }
25195
25315
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25196
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter($event.target.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25316
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25197
25317
  }
25198
25318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25199
25319
  type: Component,
25200
- args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter($event.target.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
25320
+ args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
25201
25321
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25202
25322
  type: Input
25203
25323
  }], action: [{
@@ -25362,11 +25482,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25362
25482
 
25363
25483
  class NavigationButtonComponent {
25364
25484
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25365
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25485
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25366
25486
  }
25367
25487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25368
25488
  type: Component,
25369
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n" }]
25489
+ args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
25370
25490
  }], propDecorators: { label: [{
25371
25491
  type: Input
25372
25492
  }], icon: [{
@@ -25573,11 +25693,11 @@ class CheckboxComponent {
25573
25693
  this.changed.emit(this.checked);
25574
25694
  }
25575
25695
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25576
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n type=\"checkbox\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25696
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25577
25697
  }
25578
25698
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25579
25699
  type: Component,
25580
- args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n type=\"checkbox\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25700
+ args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25581
25701
  }], propDecorators: { type: [{
25582
25702
  type: Input
25583
25703
  }], checked: [{
@@ -25632,14 +25752,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25632
25752
  args: [{ selector: 'gn-ui-date-range-picker', template: "<div\n class=\"flex items-center justify-center w-64 h-11 rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"w-48 flex justify-between\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matStartDate\n placeholder=\"Start date\"\n (dateInput)=\"startDateSelected($event)\"\n />\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matEndDate\n placeholder=\"End date\"\n (dateInput)=\"endDateSelected($event)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n</div>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"] }]
25633
25753
  }] });
25634
25754
 
25755
+ class EditableLabelDirective {
25756
+ constructor(el, renderer) {
25757
+ this.el = el;
25758
+ this.renderer = renderer;
25759
+ this.editableLabelChanged = new EventEmitter();
25760
+ }
25761
+ ngAfterViewInit() {
25762
+ if (this.gnUiEditableLabel !== false) {
25763
+ const appendedInput = this.renderer.createElement('input');
25764
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25765
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25766
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25767
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25768
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25769
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25770
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25771
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25772
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25773
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25774
+ const hostContent = this.el.nativeElement.textContent || '';
25775
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25776
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25777
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25778
+ this.renderer.listen(appendedInput, 'input', (event) => {
25779
+ this.editableLabelChanged.emit(event.target.value);
25780
+ });
25781
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25782
+ }
25783
+ }
25784
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
25785
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: EditableLabelDirective, isStandalone: true, selector: "[gnUiEditableLabel]", inputs: { gnUiEditableLabel: "gnUiEditableLabel" }, outputs: { editableLabelChanged: "editableLabelChanged" }, ngImport: i0 }); }
25786
+ }
25787
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25788
+ type: Directive,
25789
+ args: [{
25790
+ selector: '[gnUiEditableLabel]',
25791
+ standalone: true,
25792
+ }]
25793
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25794
+ type: Output
25795
+ }], gnUiEditableLabel: [{
25796
+ type: Input
25797
+ }] } });
25798
+
25635
25799
  class UiInputsModule {
25636
25800
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25637
25801
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25638
25802
  AutocompleteComponent,
25639
- ButtonComponent,
25640
25803
  TextInputComponent,
25641
25804
  DragAndDropFileInputComponent,
25642
- TextAreaComponent,
25643
25805
  ChipsInputComponent,
25644
25806
  NavigationButtonComponent,
25645
25807
  StarToggleComponent,
@@ -25671,7 +25833,10 @@ class UiInputsModule {
25671
25833
  MatFormFieldModule,
25672
25834
  MatInputModule,
25673
25835
  MatDatepickerModule,
25674
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25836
+ MatNativeDateModule,
25837
+ EditableLabelDirective,
25838
+ TextAreaComponent,
25839
+ ButtonComponent], exports: [DropdownSelectorComponent,
25675
25840
  AutocompleteComponent,
25676
25841
  ButtonComponent,
25677
25842
  TextInputComponent,
@@ -25687,7 +25852,8 @@ class UiInputsModule {
25687
25852
  CopyTextButtonComponent,
25688
25853
  CheckboxComponent,
25689
25854
  SearchInputComponent,
25690
- DateRangePickerComponent] }); }
25855
+ DateRangePickerComponent,
25856
+ EditableLabelDirective] }); }
25691
25857
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25692
25858
  TranslateModule.forChild(),
25693
25859
  NgxDropzoneModule,
@@ -25712,10 +25878,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25712
25878
  declarations: [
25713
25879
  DropdownSelectorComponent,
25714
25880
  AutocompleteComponent,
25715
- ButtonComponent,
25716
25881
  TextInputComponent,
25717
25882
  DragAndDropFileInputComponent,
25718
- TextAreaComponent,
25719
25883
  ChipsInputComponent,
25720
25884
  NavigationButtonComponent,
25721
25885
  StarToggleComponent,
@@ -25753,6 +25917,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25753
25917
  MatInputModule,
25754
25918
  MatDatepickerModule,
25755
25919
  MatNativeDateModule,
25920
+ EditableLabelDirective,
25921
+ TextAreaComponent,
25922
+ ButtonComponent,
25756
25923
  ],
25757
25924
  exports: [
25758
25925
  DropdownSelectorComponent,
@@ -25772,6 +25939,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25772
25939
  CheckboxComponent,
25773
25940
  SearchInputComponent,
25774
25941
  DateRangePickerComponent,
25942
+ EditableLabelDirective,
25775
25943
  ],
25776
25944
  }]
25777
25945
  }] });
@@ -25871,7 +26039,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25871
26039
 
25872
26040
  const DEFAULT_PARAMS = {
25873
26041
  OFFSET: '',
25874
- LIMIT: '',
26042
+ LIMIT: '-1',
25875
26043
  FORMAT: 'json',
25876
26044
  };
25877
26045
  class RecordApiFormComponent {
@@ -25900,6 +26068,8 @@ class RecordApiFormComponent {
25900
26068
  }
25901
26069
  return outputUrl;
25902
26070
  }));
26071
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26072
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25903
26073
  }
25904
26074
  set apiLink(value) {
25905
26075
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25909,10 +26079,11 @@ class RecordApiFormComponent {
25909
26079
  this.offset$.next(value);
25910
26080
  }
25911
26081
  setLimit(value) {
25912
- this.limit$.next(value);
26082
+ const newLimit = value === '' ? '-1' : value;
26083
+ this.limit$.next(newLimit);
25913
26084
  }
25914
26085
  setFormat(value) {
25915
- this.format$.next(value);
26086
+ this.format$.next(String(value));
25916
26087
  }
25917
26088
  resetUrl() {
25918
26089
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25920,11 +26091,11 @@ class RecordApiFormComponent {
25920
26091
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25921
26092
  }
25922
26093
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25923
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26094
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25924
26095
  }
25925
26096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25926
26097
  type: Component,
25927
- args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
26098
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
25928
26099
  }], propDecorators: { apiLink: [{
25929
26100
  type: Input
25930
26101
  }] } });
@@ -25937,11 +26108,11 @@ class ImageOverlayPreviewComponent {
25937
26108
  basicLightbox.create(`<img src="${src}"/>`).show();
25938
26109
  }
25939
26110
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25940
- 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"] }] }); }
26111
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: { imageUrl: "imageUrl" }, outputs: { isPlaceholderShown: "isPlaceholderShown" }, ngImport: i0, template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
25941
26112
  }
25942
26113
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25943
26114
  type: Component,
25944
- 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" }]
26115
+ args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n" }]
25945
26116
  }], propDecorators: { imageUrl: [{
25946
26117
  type: Input
25947
26118
  }], isPlaceholderShown: [{
@@ -25970,7 +26141,6 @@ class UiElementsModule {
25970
26141
  PaginationButtonsComponent,
25971
26142
  MaxLinesComponent,
25972
26143
  RecordApiFormComponent,
25973
- MarkdownParserComponent,
25974
26144
  ImageOverlayPreviewComponent], imports: [CommonModule,
25975
26145
  MatIconModule,
25976
26146
  MatTooltipModule,
@@ -25979,7 +26149,8 @@ class UiElementsModule {
25979
26149
  RouterModule,
25980
26150
  UiInputsModule,
25981
26151
  FormsModule,
25982
- NgOptimizedImage], exports: [MetadataInfoComponent,
26152
+ NgOptimizedImage,
26153
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
25983
26154
  ContentGhostComponent,
25984
26155
  DownloadItemComponent,
25985
26156
  DownloadsListComponent,
@@ -25996,6 +26167,7 @@ class UiElementsModule {
25996
26167
  AvatarComponent,
25997
26168
  UserPreviewComponent,
25998
26169
  PaginationButtonsComponent,
26170
+ MaxLinesComponent,
25999
26171
  RecordApiFormComponent,
26000
26172
  MarkdownParserComponent,
26001
26173
  ImageOverlayPreviewComponent] }); }
@@ -26025,6 +26197,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26025
26197
  UiInputsModule,
26026
26198
  FormsModule,
26027
26199
  NgOptimizedImage,
26200
+ MarkdownParserComponent,
26028
26201
  ],
26029
26202
  declarations: [
26030
26203
  MetadataInfoComponent,
@@ -26047,7 +26220,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26047
26220
  PaginationButtonsComponent,
26048
26221
  MaxLinesComponent,
26049
26222
  RecordApiFormComponent,
26050
- MarkdownParserComponent,
26051
26223
  ImageOverlayPreviewComponent,
26052
26224
  ],
26053
26225
  exports: [
@@ -26068,6 +26240,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26068
26240
  AvatarComponent,
26069
26241
  UserPreviewComponent,
26070
26242
  PaginationButtonsComponent,
26243
+ MaxLinesComponent,
26071
26244
  RecordApiFormComponent,
26072
26245
  MarkdownParserComponent,
26073
26246
  ImageOverlayPreviewComponent,
@@ -26075,143 +26248,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26075
26248
  }]
26076
26249
  }] });
26077
26250
 
26078
- class RecordTableComponent {
26079
- constructor() {
26080
- this.selectedRecords = [];
26081
- this.records = [];
26082
- this.recordClick = new EventEmitter();
26083
- this.recordsSelect = new EventEmitter();
26084
- this.recordsDeselect = new EventEmitter();
26085
- this.sortByChange = new EventEmitter();
26086
- }
26087
- dateToString(date) {
26088
- return date?.toLocaleDateString(undefined, {
26089
- year: 'numeric',
26090
- month: 'long',
26091
- day: 'numeric',
26092
- timeZone: 'UTC',
26093
- });
26094
- }
26095
- getStatus(isPublishedToAll) {
26096
- return isPublishedToAll ? 'published' : 'not published';
26097
- }
26098
- formatUserInfo(userInfo) {
26099
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
26100
- if (infos && infos.length === 4) {
26101
- return `${infos[2]} ${infos[1]}`;
26102
- }
26103
- return undefined;
26104
- }
26105
- getRecordFormats(record) {
26106
- if (record.kind === 'service' || !('distributions' in record)) {
26107
- return [];
26108
- }
26109
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
26110
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
26111
- return formats;
26112
- }
26113
- getBadgeColor(format) {
26114
- return getBadgeColor(format);
26115
- }
26116
- getOrderForColumn(col) {
26117
- if (!this.sortBy) {
26118
- return null;
26119
- }
26120
- let order = null;
26121
- const sortedArray = Array.isArray(this.sortBy[0])
26122
- ? this.sortBy
26123
- : [this.sortBy];
26124
- sortedArray.forEach((sortedCol) => {
26125
- if (sortedCol[1] === col) {
26126
- order = sortedCol[0];
26127
- }
26128
- });
26129
- return order;
26130
- }
26131
- setSortBy(col) {
26132
- const sortOrder = this.getOrderForColumn(col);
26133
- let newOrder;
26134
- if (sortOrder) {
26135
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
26136
- }
26137
- else {
26138
- newOrder = 'asc';
26139
- }
26140
- this.sortByChange.emit([newOrder, col]);
26141
- this.sortBy = [newOrder, col];
26142
- }
26143
- isSortedBy(col, order) {
26144
- const sortOrder = this.getOrderForColumn(col);
26145
- return sortOrder === order;
26146
- }
26147
- isChecked(record) {
26148
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
26149
- return true;
26150
- }
26151
- return false;
26152
- }
26153
- handleRecordSelectedChange(selected, record) {
26154
- if (!selected) {
26155
- this.recordsDeselect.emit([record]);
26156
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
26157
- }
26158
- else {
26159
- this.recordsSelect.emit([record]);
26160
- this.selectedRecords.push(record.uniqueIdentifier);
26161
- }
26162
- }
26163
- selectAll() {
26164
- if (this.isAllSelected()) {
26165
- this.recordsDeselect.emit(this.records);
26166
- this.selectedRecords = [];
26167
- }
26168
- else {
26169
- this.recordsSelect.emit(this.records);
26170
- this.selectedRecords = this.records.map((record) => {
26171
- return record.uniqueIdentifier;
26172
- });
26173
- }
26174
- }
26175
- isAllSelected() {
26176
- if (this.selectedRecords.length === this.records.length) {
26177
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
26178
- if (allRecords.length === this.records.length) {
26179
- return true;
26180
- }
26181
- }
26182
- return false;
26183
- }
26184
- isSomeSelected() {
26185
- if (this.selectedRecords.length > 0 &&
26186
- this.selectedRecords.length < this.records.length) {
26187
- return true;
26188
- }
26189
- return false;
26190
- }
26191
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26192
- 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"] }] }); }
26193
- }
26194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26195
- type: Component,
26196
- 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"] }]
26197
- }], propDecorators: { selectedRecords: [{
26198
- type: Input
26199
- }], records: [{
26200
- type: Input
26201
- }], totalHits: [{
26202
- type: Input
26203
- }], sortBy: [{
26204
- type: Input
26205
- }], recordClick: [{
26206
- type: Output
26207
- }], recordsSelect: [{
26208
- type: Output
26209
- }], recordsDeselect: [{
26210
- type: Output
26211
- }], sortByChange: [{
26212
- type: Output
26213
- }] } });
26214
-
26215
26251
  class UiSearchModule {
26216
26252
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26217
26253
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26224,8 +26260,7 @@ class UiSearchModule {
26224
26260
  ResultsHitsNumberComponent,
26225
26261
  ResultsListItemComponent,
26226
26262
  RecordPreviewFeedComponent,
26227
- RecordPreviewRowComponent,
26228
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26263
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26229
26264
  FacetsModule$1,
26230
26265
  FormsModule,
26231
26266
  ReactiveFormsModule,
@@ -26236,7 +26271,8 @@ class UiSearchModule {
26236
26271
  UiElementsModule,
26237
26272
  MatIconModule,
26238
26273
  MatCheckboxModule,
26239
- RouterLink], exports: [RecordPreviewListComponent,
26274
+ RouterLink,
26275
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26240
26276
  RecordPreviewCardComponent,
26241
26277
  RecordPreviewTextComponent,
26242
26278
  RecordPreviewTitleComponent,
@@ -26246,8 +26282,7 @@ class UiSearchModule {
26246
26282
  RecordPreviewComponent,
26247
26283
  ResultsHitsNumberComponent,
26248
26284
  RecordPreviewFeedComponent,
26249
- RecordPreviewRowComponent,
26250
- RecordTableComponent] }); }
26285
+ RecordPreviewRowComponent] }); }
26251
26286
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26252
26287
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26253
26288
  ], imports: [CommonModule,
@@ -26262,7 +26297,8 @@ class UiSearchModule {
26262
26297
  UiInputsModule,
26263
26298
  UiElementsModule,
26264
26299
  MatIconModule,
26265
- MatCheckboxModule, FacetsModule$1] }); }
26300
+ MatCheckboxModule,
26301
+ InteractiveTableComponent, FacetsModule$1] }); }
26266
26302
  }
26267
26303
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26268
26304
  type: NgModule,
@@ -26279,7 +26315,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26279
26315
  ResultsListItemComponent,
26280
26316
  RecordPreviewFeedComponent,
26281
26317
  RecordPreviewRowComponent,
26282
- RecordTableComponent,
26283
26318
  ],
26284
26319
  imports: [
26285
26320
  CommonModule,
@@ -26296,6 +26331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26296
26331
  MatIconModule,
26297
26332
  MatCheckboxModule,
26298
26333
  RouterLink,
26334
+ InteractiveTableComponent,
26299
26335
  ],
26300
26336
  exports: [
26301
26337
  RecordPreviewListComponent,
@@ -26309,7 +26345,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26309
26345
  ResultsHitsNumberComponent,
26310
26346
  RecordPreviewFeedComponent,
26311
26347
  RecordPreviewRowComponent,
26312
- RecordTableComponent,
26313
26348
  ],
26314
26349
  providers: [
26315
26350
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26868,6 +26903,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26868
26903
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26869
26904
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26870
26905
 
26906
+ // this geometry will be used to filter & boost results accordingly
26907
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26908
+
26871
26909
  class SearchFacade {
26872
26910
  constructor(store, filterGeometry) {
26873
26911
  this.store = store;
@@ -26972,6 +27010,7 @@ class SearchFacade {
26972
27010
  this.store.dispatch(new SetFilters({}, this.searchId));
26973
27011
  this.store.dispatch(new SetSortBy([], this.searchId));
26974
27012
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
27013
+ return this;
26975
27014
  }
26976
27015
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade, deps: [{ token: i1$2.Store }, { token: FILTER_GEOMETRY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
26977
27016
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27356,8 +27395,11 @@ class FuzzySearchComponent {
27356
27395
  this.searchService.updateFilters({ any });
27357
27396
  }
27358
27397
  }
27359
- handleInputCleared() {
27360
- this.searchService.updateFilters({ any: '' });
27398
+ async handleInputCleared() {
27399
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27400
+ if (currentSearchFilters.any) {
27401
+ this.searchService.updateFilters({ any: '' });
27402
+ }
27361
27403
  }
27362
27404
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FuzzySearchComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
27363
27405
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n [value]=\"searchInputValue$ | async\"\n [clearOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "autoFocus", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -27437,6 +27479,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27437
27479
  args: [RESULTS_LAYOUT_CONFIG]
27438
27480
  }] }]; } });
27439
27481
 
27482
+ // expects the replacement key ${uuid}
27483
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27484
+
27440
27485
  class FavoriteStarComponent {
27441
27486
  set record(value) {
27442
27487
  this.record_ = value;
@@ -27520,11 +27565,11 @@ class FavoriteStarComponent {
27520
27565
  });
27521
27566
  }
27522
27567
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, deps: [{ token: FavoritesService }, { token: PlatformServiceInterface }, { token: i0.ChangeDetectorRef }, { token: AuthService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
27523
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27568
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27524
27569
  }
27525
27570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27526
27571
  type: Component,
27527
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27572
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27528
27573
  }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27529
27574
  type: Input
27530
27575
  }], record: [{
@@ -27698,9 +27743,11 @@ class SearchEffects {
27698
27743
  // I could not get this to work (maybe a bug in rxjs?)
27699
27744
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27700
27745
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27701
- return of([state, favorites, null]);
27746
+ return of([state, favorites, undefined]);
27702
27747
  }
27703
27748
  return this.filterGeometry$.pipe(tap$2((geom) => {
27749
+ if (!geom)
27750
+ return;
27704
27751
  try {
27705
27752
  const trace = valid$1(geom, true);
27706
27753
  if (trace?.length > 0) {
@@ -27712,7 +27759,7 @@ class SearchEffects {
27712
27759
  throw new Error();
27713
27760
  }
27714
27761
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27715
- return of([state, favorites, null]);
27762
+ return of([state, favorites, undefined]);
27716
27763
  }));
27717
27764
  }), switchMap$1(([state, favorites, geometry]) => {
27718
27765
  const { currentPage, pageSize, sort } = state.params;
@@ -27811,10 +27858,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27811
27858
  class AbstractSearchField {
27812
27859
  }
27813
27860
  class SimpleSearchField {
27814
- constructor(esFieldName, order = 'asc', injector) {
27861
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27815
27862
  this.esFieldName = esFieldName;
27816
- this.order = order;
27817
27863
  this.injector = injector;
27864
+ this.order = order;
27865
+ this.orderType = orderType;
27818
27866
  this.repository = this.injector.get(RecordsRepositoryInterface);
27819
27867
  // FIXME: this is required to register runtime fields; abstract this as well
27820
27868
  this.esService = this.injector.get(ElasticsearchService);
@@ -27825,12 +27873,12 @@ class SimpleSearchField {
27825
27873
  type: 'terms',
27826
27874
  field: this.esFieldName,
27827
27875
  limit: 1000,
27828
- sort: [this.order, 'key'],
27876
+ sort: [this.order, this.orderType],
27829
27877
  },
27830
27878
  };
27831
27879
  }
27832
27880
  async getBucketLabel(bucket) {
27833
- return bucket.term;
27881
+ return bucket.term.toString();
27834
27882
  }
27835
27883
  getAvailableValues() {
27836
27884
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27858,9 +27906,13 @@ class SimpleSearchField {
27858
27906
  return of(values);
27859
27907
  }
27860
27908
  }
27861
- class KeySearchField extends SimpleSearchField {
27862
- constructor() {
27863
- super(...arguments);
27909
+ class TranslatedSearchField extends SimpleSearchField {
27910
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27911
+ super(esFieldName, injector, order, orderType);
27912
+ this.esFieldName = esFieldName;
27913
+ this.injector = injector;
27914
+ this.order = order;
27915
+ this.orderType = orderType;
27864
27916
  this.platformService = this.injector.get(PlatformServiceInterface);
27865
27917
  }
27866
27918
  async getTranslation(key) {
@@ -27870,26 +27922,36 @@ class KeySearchField extends SimpleSearchField {
27870
27922
  return (await this.getTranslation(bucket.term)) || bucket.term;
27871
27923
  }
27872
27924
  getAvailableValues() {
27925
+ if (this.orderType === 'count')
27926
+ return super.getAvailableValues();
27873
27927
  // sort values by alphabetical order
27874
27928
  return super
27875
27929
  .getAvailableValues()
27876
27930
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27877
27931
  }
27878
27932
  }
27879
- class ThesaurusField extends KeySearchField {
27880
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27881
- super(esFieldName, order, injector);
27882
- this.thesaurusName = thesaurusName;
27933
+ /**
27934
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
27935
+ * to the defined METADATA_LANGUAGE token
27936
+ * The provided ES field name should not include any prefix such as `.langeng`
27937
+ */
27938
+ class MultilingualSearchField extends SimpleSearchField {
27939
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27940
+ super(esFieldName, injector, order, orderType);
27941
+ this.esFieldName = esFieldName;
27942
+ this.injector = injector;
27943
+ this.order = order;
27944
+ this.orderType = orderType;
27883
27945
  this.langService = this.injector.get(LangService);
27884
- this.thesaurus$ = this.platformService
27885
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27886
- .pipe(catchError(() => {
27887
- console.warn('Error while loading thesaurus language package');
27888
- return of([]);
27889
- }), shareReplay(1));
27890
- }
27891
- async getTranslation(key) {
27892
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
27946
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
27947
+ // note: we're excluding the metadata language "current" value because that would produce
27948
+ // permalinks that might not work for different users
27949
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
27950
+ this.esFieldName += `.lang${this.searchLanguage}`;
27951
+ }
27952
+ else {
27953
+ this.esFieldName += '.default';
27954
+ }
27893
27955
  }
27894
27956
  }
27895
27957
  class FullTextSearchField {
@@ -27909,7 +27971,7 @@ marker('search.filters.isSpatial.yes');
27909
27971
  marker('search.filters.isSpatial.no');
27910
27972
  class IsSpatialSearchField extends SimpleSearchField {
27911
27973
  constructor(injector) {
27912
- super('isSpatial', 'asc', injector);
27974
+ super('isSpatial', injector, 'asc');
27913
27975
  this.translateService = this.injector.get(TranslateService);
27914
27976
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27915
27977
  String formats = doc.format.join('|').toLowerCase();
@@ -27959,7 +28021,7 @@ marker('search.filters.license.unknown');
27959
28021
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27960
28022
  class LicenseSearchField extends SimpleSearchField {
27961
28023
  constructor(injector) {
27962
- super('license', 'asc', injector);
28024
+ super('license', injector, 'asc');
27963
28025
  this.translateService = this.injector.get(TranslateService);
27964
28026
  this.esService.registerRuntimeField('license', `String raw = '';
27965
28027
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -28043,7 +28105,7 @@ class OrganizationSearchField {
28043
28105
  }
28044
28106
  class OwnerSearchField extends SimpleSearchField {
28045
28107
  constructor(injector) {
28046
- super('owner', 'asc', injector);
28108
+ super('owner', injector, 'asc');
28047
28109
  }
28048
28110
  getAvailableValues() {
28049
28111
  return of([]);
@@ -28052,6 +28114,7 @@ class OwnerSearchField extends SimpleSearchField {
28052
28114
 
28053
28115
  marker('search.filters.format');
28054
28116
  marker('search.filters.inspireKeyword');
28117
+ marker('search.filters.keyword');
28055
28118
  marker('search.filters.isSpatial');
28056
28119
  marker('search.filters.license');
28057
28120
  marker('search.filters.publicationYear');
@@ -28069,13 +28132,14 @@ class FieldsService {
28069
28132
  this.injector = injector;
28070
28133
  this.fields = {
28071
28134
  publisher: new OrganizationSearchField(this.injector),
28072
- format: new SimpleSearchField('format', 'asc', this.injector),
28073
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
28074
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
28075
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
28076
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
28077
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
28078
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28135
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28136
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28137
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28138
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28139
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28140
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28141
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28142
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
28079
28143
  isSpatial: new IsSpatialSearchField(this.injector),
28080
28144
  q: new FullTextSearchField(),
28081
28145
  license: new LicenseSearchField(this.injector),
@@ -28149,10 +28213,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28149
28213
  type: Input
28150
28214
  }] } });
28151
28215
 
28152
- // this geometry will be used to filter & boost results accordingly
28153
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
28154
- // expects the replacement key ${uuid}
28155
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28156
28216
  class FeatureSearchModule {
28157
28217
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28158
28218
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28251,6 +28311,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28251
28311
  }]
28252
28312
  }] });
28253
28313
 
28314
+ class ResultsTableComponent {
28315
+ constructor(searchFacade, searchService, selectionService) {
28316
+ this.searchFacade = searchFacade;
28317
+ this.searchService = searchService;
28318
+ this.selectionService = selectionService;
28319
+ this.recordClick = new EventEmitter();
28320
+ this.records$ = this.searchFacade.results$;
28321
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28322
+ }
28323
+ dateToString(date) {
28324
+ return date?.toLocaleDateString(undefined, {
28325
+ year: 'numeric',
28326
+ month: 'long',
28327
+ day: 'numeric',
28328
+ timeZone: 'UTC',
28329
+ });
28330
+ }
28331
+ getStatus(isPublishedToAll) {
28332
+ return isPublishedToAll ? 'published' : 'not published';
28333
+ }
28334
+ getRecordFormats(record) {
28335
+ if (record.kind === 'service' || !('distributions' in record)) {
28336
+ return [];
28337
+ }
28338
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28339
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28340
+ return formats;
28341
+ }
28342
+ formatUserInfo(userInfo) {
28343
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28344
+ if (infos && infos.length === 4) {
28345
+ return `${infos[2]} ${infos[1]}`;
28346
+ }
28347
+ return undefined;
28348
+ }
28349
+ getBadgeColor(format) {
28350
+ return getBadgeColor(format);
28351
+ }
28352
+ handleRecordClick(item) {
28353
+ this.recordClick.emit(item);
28354
+ }
28355
+ setSortBy(col, order) {
28356
+ this.searchService.setSortBy([order, col]);
28357
+ }
28358
+ isSortedBy(col) {
28359
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28360
+ const sortArray = Array.isArray(sortOrder[0])
28361
+ ? sortOrder
28362
+ : [sortOrder];
28363
+ for (const sort of sortArray) {
28364
+ if (sort[1] === col) {
28365
+ return sort[0];
28366
+ }
28367
+ }
28368
+ return null;
28369
+ }));
28370
+ }
28371
+ isChecked(record) {
28372
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28373
+ return selectedRecords.includes(record.uniqueIdentifier);
28374
+ }));
28375
+ }
28376
+ handleRecordSelectedChange(selected, record) {
28377
+ if (!selected) {
28378
+ this.selectionService.deselectRecords([record]);
28379
+ }
28380
+ else {
28381
+ this.selectionService.selectRecords([record]);
28382
+ }
28383
+ }
28384
+ async toggleSelectAll() {
28385
+ const records = await firstValueFrom(this.records$);
28386
+ if (await firstValueFrom(this.isAllSelected())) {
28387
+ this.selectionService.deselectRecords(records);
28388
+ }
28389
+ else {
28390
+ this.selectionService.selectRecords(records);
28391
+ }
28392
+ }
28393
+ isAllSelected() {
28394
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28395
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28396
+ }));
28397
+ }
28398
+ isSomeSelected() {
28399
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28400
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28401
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28402
+ return !allSelected && someSelected;
28403
+ }));
28404
+ }
28405
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: SelectionService }], target: i0.ɵɵFactoryTarget.Component }); }
28406
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", outputs: { recordClick: "recordClick" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
28407
+ }
28408
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28409
+ type: Component,
28410
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28411
+ CommonModule,
28412
+ UiInputsModule,
28413
+ InteractiveTableComponent,
28414
+ InteractiveTableColumnComponent,
28415
+ MatIconModule,
28416
+ TranslateModule,
28417
+ ], template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
28418
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28419
+ type: Output
28420
+ }] } });
28421
+
28254
28422
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28255
28423
  get mapLinks() {
28256
28424
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28577,6 +28745,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28577
28745
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28578
28746
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28579
28747
 
28748
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28749
+ class GeocodingService {
28750
+ constructor(provider) {
28751
+ this.provider = provider;
28752
+ }
28753
+ query(text) {
28754
+ let queryObservable;
28755
+ switch (this.provider[0]) {
28756
+ case 'geoadmin':
28757
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28758
+ break;
28759
+ case 'geonames':
28760
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28761
+ break;
28762
+ case 'data-gouv-fr':
28763
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28764
+ break;
28765
+ default:
28766
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28767
+ }
28768
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28769
+ }
28770
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, deps: [{ token: GEOCODING_PROVIDER }], target: i0.ɵɵFactoryTarget.Injectable }); }
28771
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28772
+ }
28773
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28774
+ type: Injectable,
28775
+ args: [{
28776
+ providedIn: 'root',
28777
+ }]
28778
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28779
+ type: Inject,
28780
+ args: [GEOCODING_PROVIDER]
28781
+ }] }]; } });
28782
+
28783
+ class GeocodingComponent {
28784
+ constructor(mapManager, geocodingService) {
28785
+ this.mapManager = mapManager;
28786
+ this.geocodingService = geocodingService;
28787
+ this.searchText = '';
28788
+ this.results = [];
28789
+ this.searchTextChanged = new Subject();
28790
+ this.destroy$ = new Subject();
28791
+ this.errorMessage = null;
28792
+ this.searchTextChanged
28793
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28794
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28795
+ this.errorMessage =
28796
+ 'An error occurred while searching. Please try again.';
28797
+ console.error(error);
28798
+ return [];
28799
+ }));
28800
+ }), takeUntil(this.destroy$))
28801
+ .subscribe((results) => {
28802
+ this.results = results;
28803
+ });
28804
+ }
28805
+ ngOnDestroy() {
28806
+ this.destroy$.next();
28807
+ this.destroy$.complete();
28808
+ }
28809
+ onSearchChange(searchText) {
28810
+ if (!searchText) {
28811
+ this.clearSearch();
28812
+ return;
28813
+ }
28814
+ else {
28815
+ this.searchTextChanged.next(searchText);
28816
+ }
28817
+ }
28818
+ clearSearch() {
28819
+ this.searchText = '';
28820
+ this.results = [];
28821
+ this.errorMessage = null;
28822
+ }
28823
+ zoomToLocation(result) {
28824
+ const map = this.mapManager.map;
28825
+ const view = map.getView();
28826
+ const geometry = result.geom;
28827
+ if (geometry.type === 'Point') {
28828
+ this.zoomToPoint(geometry.coordinates, view);
28829
+ }
28830
+ else if (geometry.type === 'Polygon') {
28831
+ this.zoomToPolygon(geometry.coordinates, view);
28832
+ }
28833
+ else {
28834
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28835
+ }
28836
+ }
28837
+ zoomToPoint(pointCoords, view) {
28838
+ const transformedCoords = fromLonLat(pointCoords);
28839
+ view.setCenter(transformedCoords);
28840
+ view.setZoom(12);
28841
+ }
28842
+ zoomToPolygon(polygonCoords, view) {
28843
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28844
+ const polygon = new Polygon([transformedCoords]);
28845
+ view.fit(polygon, {
28846
+ duration: 100,
28847
+ maxZoom: 12,
28848
+ });
28849
+ }
28850
+ onEnterPress() {
28851
+ if (this.results && this.results.length > 0) {
28852
+ this.zoomToLocation(this.results[0]);
28853
+ }
28854
+ }
28855
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, deps: [{ token: MapManagerService }, { token: GeocodingService }], target: i0.ɵɵFactoryTarget.Component }); }
28856
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: GeocodingComponent, selector: "gn-ui-geocoding", ngImport: i0, template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n<ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n *ngIf=\"results && results.length\"\n>\n <li\n *ngFor=\"let result of results\"\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n</ul>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: SearchInputComponent, selector: "gn-ui-search-input", inputs: ["value", "placeholder"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28857
+ }
28858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28859
+ type: Component,
28860
+ args: [{ selector: 'gn-ui-geocoding', template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n<ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n *ngIf=\"results && results.length\"\n>\n <li\n *ngFor=\"let result of results\"\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n</ul>\n" }]
28861
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28862
+
28580
28863
  class FeatureMapModule {
28581
28864
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28582
28865
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28587,7 +28870,8 @@ class FeatureMapModule {
28587
28870
  AddLayerRecordPreviewComponent,
28588
28871
  AddLayerFromWmsComponent,
28589
28872
  AddLayerFromFileComponent,
28590
- AddLayerFromWfsComponent], imports: [CommonModule,
28873
+ AddLayerFromWfsComponent,
28874
+ GeocodingComponent], imports: [CommonModule,
28591
28875
  UiMapModule,
28592
28876
  UiLayoutModule,
28593
28877
  MatIconModule,
@@ -28598,13 +28882,18 @@ class FeatureMapModule {
28598
28882
  MapInstanceDirective,
28599
28883
  LayersPanelComponent,
28600
28884
  AddLayerFromCatalogComponent,
28601
- MapContainerComponent] }); }
28885
+ MapContainerComponent,
28886
+ GeocodingComponent] }); }
28602
28887
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28603
28888
  {
28604
28889
  provide: FEATURE_MAP_OPTIONS,
28605
28890
  useValue: defaultMapOptions,
28606
28891
  },
28607
28892
  MapFacade,
28893
+ {
28894
+ provide: GEOCODING_PROVIDER,
28895
+ useValue: ['geonames', { maxRows: 5 }],
28896
+ },
28608
28897
  ], imports: [CommonModule,
28609
28898
  UiMapModule,
28610
28899
  UiLayoutModule,
@@ -28630,6 +28919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28630
28919
  AddLayerFromWmsComponent,
28631
28920
  AddLayerFromFileComponent,
28632
28921
  AddLayerFromWfsComponent,
28922
+ GeocodingComponent,
28633
28923
  ],
28634
28924
  exports: [
28635
28925
  MapContextComponent,
@@ -28637,6 +28927,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28637
28927
  LayersPanelComponent,
28638
28928
  AddLayerFromCatalogComponent,
28639
28929
  MapContainerComponent,
28930
+ GeocodingComponent,
28640
28931
  ],
28641
28932
  imports: [
28642
28933
  CommonModule,
@@ -28657,6 +28948,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28657
28948
  useValue: defaultMapOptions,
28658
28949
  },
28659
28950
  MapFacade,
28951
+ {
28952
+ provide: GEOCODING_PROVIDER,
28953
+ useValue: ['geonames', { maxRows: 5 }],
28954
+ },
28660
28955
  ],
28661
28956
  }]
28662
28957
  }] });
@@ -28751,7 +29046,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28751
29046
  ...state,
28752
29047
  chartConfig,
28753
29048
  })), on(close, (state) => {
28754
- // eslint-disable-next-line
29049
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28755
29050
  const { metadata, related, ...stateWithoutMd } = state;
28756
29051
  return stateWithoutMd;
28757
29052
  }));
@@ -30018,15 +30313,16 @@ class DataService {
30018
30313
  // Pour DL toutes les données
30019
30314
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
30020
30315
  ...wfsLink,
30316
+ type: 'download',
30021
30317
  url: new URL(urls[format]),
30022
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30318
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
30023
30319
  }))));
30024
30320
  }
30025
30321
  getDownloadLinksFromEsriRest(esriRestLink) {
30026
30322
  return ['json', 'geojson'].map((format) => ({
30027
30323
  ...esriRestLink,
30028
30324
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
30029
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30325
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
30030
30326
  }));
30031
30327
  }
30032
30328
  readAsGeoJson(link) {
@@ -30420,12 +30716,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30420
30716
  }] } });
30421
30717
 
30422
30718
  class MapViewComponent {
30423
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30719
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30424
30720
  this.mdViewFacade = mdViewFacade;
30425
30721
  this.mapManager = mapManager;
30426
30722
  this.mapUtils = mapUtils;
30427
30723
  this.dataService = dataService;
30428
- this.proxy = proxy;
30429
30724
  this.featureInfo = featureInfo;
30430
30725
  this.changeRef = changeRef;
30431
30726
  this.styleService = styleService;
@@ -30460,7 +30755,7 @@ class MapViewComponent {
30460
30755
  return of([]);
30461
30756
  }), finalize(() => (this.loading = false)));
30462
30757
  }));
30463
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30758
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30464
30759
  console.warn(error); // FIXME: report this to the user somehow
30465
30760
  return of(undefined);
30466
30761
  }), map$1((extent) => ({
@@ -30468,7 +30763,18 @@ class MapViewComponent {
30468
30763
  view: {
30469
30764
  extent,
30470
30765
  },
30471
- })), tap$1(() => this.resetSelection()))));
30766
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30767
+ if (context.view.extent)
30768
+ return context;
30769
+ const extent = this.mapUtils.getRecordExtent(metadata);
30770
+ return {
30771
+ ...context,
30772
+ view: {
30773
+ ...context.view,
30774
+ extent,
30775
+ },
30776
+ };
30777
+ }));
30472
30778
  }
30473
30779
  ngOnDestroy() {
30474
30780
  this.subscription.unsubscribe();
@@ -30521,13 +30827,13 @@ class MapViewComponent {
30521
30827
  selectLinkToDisplay(link) {
30522
30828
  this.selectedLinkIndex$.next(link);
30523
30829
  }
30524
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapManagerService }, { token: MapUtilsService }, { token: DataService }, { token: ProxyService }, { token: FeatureInfoService }, { token: i0.ChangeDetectorRef }, { token: MapStyleService }], target: i0.ɵɵFactoryTarget.Component }); }
30830
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapManagerService }, { token: MapUtilsService }, { token: DataService }, { token: FeatureInfoService }, { token: i0.ChangeDetectorRef }, { token: MapStyleService }], target: i0.ɵɵFactoryTarget.Component }); }
30525
30831
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MapViewComponent, selector: "gn-ui-map-view", ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MapContextComponent, selector: "gn-ui-map-context", inputs: ["context", "mapConfig"], outputs: ["featureClicked"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mapConfig"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30526
30832
  }
30527
30833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30528
30834
  type: Component,
30529
30835
  args: [{ selector: 'gn-ui-map-view', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n" }]
30530
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30836
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30531
30837
 
30532
30838
  class DataViewComponent {
30533
30839
  constructor(mdViewFacade) {
@@ -30694,11 +31000,11 @@ class LanguageSwitcherComponent {
30694
31000
  this.translate.use(value);
30695
31001
  }
30696
31002
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30697
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
31003
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"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"] }] }); }
30698
31004
  }
30699
31005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30700
31006
  type: Component,
30701
- args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
31007
+ args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n" }]
30702
31008
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30703
31009
  type: Optional
30704
31010
  }, {
@@ -30979,13 +31285,6 @@ class MyOrgService {
30979
31285
  constructor(platformService, orgService) {
30980
31286
  this.platformService = platformService;
30981
31287
  this.orgService = orgService;
30982
- this.myOrgDataSubject = new BehaviorSubject({
30983
- orgName: '',
30984
- logoUrl: '',
30985
- recordCount: 0,
30986
- userCount: 0,
30987
- userList: [],
30988
- });
30989
31288
  this.myOrgData$ = combineLatest([
30990
31289
  this.platformService.getMe(),
30991
31290
  this.platformService.getUsers(),
@@ -31004,7 +31303,7 @@ class MyOrgService {
31004
31303
  userList,
31005
31304
  userCount,
31006
31305
  };
31007
- }));
31306
+ }), shareReplay(1));
31008
31307
  }
31009
31308
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, deps: [{ token: PlatformServiceInterface }, { token: OrganizationsServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
31010
31309
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31697,11 +31996,11 @@ class RecordFormComponent {
31697
31996
  return field.config.model;
31698
31997
  }
31699
31998
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31700
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31999
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31701
32000
  }
31702
32001
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31703
32002
  type: Component,
31704
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n" }]
32003
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n" }]
31705
32004
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31706
32005
 
31707
32006
  const ROUTER_STATE_KEY = 'router';
@@ -32069,5 +32368,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32069
32368
  * Generated bundle index. Do not edit.
32070
32369
  */
32071
32370
 
32072
- 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, extensionToFormat, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32371
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32073
32372
  //# sourceMappingURL=geonetwork-ui.mjs.map