geonetwork-ui 2.2.0-dev.0eef2738 → 2.2.0-dev.1189d390

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 (302) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +77 -52
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +4 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +16 -11
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -16
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +21 -18
  7. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  10. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  11. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  12. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  14. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  16. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  17. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  19. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  20. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  21. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  22. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  23. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  24. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  25. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +17 -3
  26. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  27. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  28. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  29. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  30. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  31. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  32. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  33. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +1 -1
  34. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  35. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  36. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  37. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  38. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  39. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  40. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  41. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  42. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  43. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  44. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  45. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  46. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  47. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  48. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  49. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  50. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -22
  51. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +2 -3
  52. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  53. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +3 -1
  54. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  55. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  56. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  57. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  58. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  59. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  60. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +8 -3
  61. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  62. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  63. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  64. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  65. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  66. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  67. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  68. package/esm2022/translations/de.json +7 -4
  69. package/esm2022/translations/en.json +10 -7
  70. package/esm2022/translations/es.json +7 -4
  71. package/esm2022/translations/fr.json +10 -7
  72. package/esm2022/translations/it.json +9 -6
  73. package/esm2022/translations/nl.json +7 -4
  74. package/esm2022/translations/pt.json +7 -4
  75. package/fesm2022/geonetwork-ui.mjs +827 -618
  76. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  77. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  78. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  79. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  80. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  81. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  82. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  83. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
  84. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  85. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  86. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  87. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  88. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  89. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  90. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  91. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  92. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  93. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  94. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  95. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +15 -15
  96. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  97. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  98. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  99. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  100. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  101. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  102. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  103. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  104. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  105. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  106. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  107. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  108. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  109. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  110. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  111. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  112. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  113. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  114. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  115. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  116. package/libs/feature/map/src/index.d.ts +1 -0
  117. package/libs/feature/map/src/index.d.ts.map +1 -1
  118. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  119. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  120. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  121. package/libs/feature/map/src/lib/feature-map.module.d.ts +13 -12
  122. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  123. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  124. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  125. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  126. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  127. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  128. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  129. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  130. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  131. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  132. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  133. package/libs/feature/search/src/index.d.ts +3 -0
  134. package/libs/feature/search/src/index.d.ts.map +1 -1
  135. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  136. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  137. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  138. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  139. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  140. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  141. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  142. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  143. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  144. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  145. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  146. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  147. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  148. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  149. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  150. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  151. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  152. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  153. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  154. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  155. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  156. package/libs/ui/elements/src/index.d.ts +1 -0
  157. package/libs/ui/elements/src/index.d.ts.map +1 -1
  158. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  159. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +7 -3
  160. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  161. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  162. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  163. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  164. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +1 -1
  165. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  166. package/libs/ui/inputs/src/index.d.ts +1 -0
  167. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  168. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  169. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  170. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  171. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  172. package/libs/ui/layout/src/index.d.ts +2 -0
  173. package/libs/ui/layout/src/index.d.ts.map +1 -1
  174. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  175. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  176. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  177. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  178. package/libs/ui/search/src/index.d.ts +0 -1
  179. package/libs/ui/search/src/index.d.ts.map +1 -1
  180. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  181. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  182. package/libs/util/i18n/src/index.d.ts +0 -1
  183. package/libs/util/i18n/src/index.d.ts.map +1 -1
  184. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  185. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  186. package/package.json +4 -1
  187. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
  188. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
  189. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
  190. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  191. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +112 -65
  192. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +3 -2
  193. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
  194. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
  195. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
  196. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  197. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  198. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  199. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  200. package/src/libs/common/domain/src/lib/index.ts +2 -0
  201. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +17 -18
  202. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  203. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  204. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  205. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  206. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  207. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  208. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  209. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  210. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -2
  211. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  212. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  213. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  214. package/src/libs/feature/map/src/index.ts +1 -0
  215. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  216. package/src/libs/feature/map/src/lib/feature-map.module.ts +8 -0
  217. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  218. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  219. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  220. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  221. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  222. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  223. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  224. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  225. package/src/libs/feature/search/src/index.ts +3 -0
  226. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  227. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  228. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  229. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  230. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  231. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  232. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  233. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  234. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  235. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  236. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  237. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  238. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  239. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  240. package/src/libs/ui/elements/src/index.ts +1 -0
  241. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  242. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
  243. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  244. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  245. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +45 -18
  246. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +31 -12
  247. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +1 -2
  248. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  249. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  250. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -0
  251. package/src/libs/ui/inputs/src/index.ts +1 -0
  252. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  253. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  254. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  255. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  256. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  257. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  258. package/src/libs/ui/layout/src/index.ts +2 -0
  259. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  260. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  261. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  262. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  263. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  264. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  265. package/src/libs/ui/search/src/index.ts +0 -1
  266. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  267. package/src/libs/util/i18n/src/index.ts +0 -1
  268. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  269. package/translations/de.json +7 -4
  270. package/translations/en.json +10 -7
  271. package/translations/es.json +7 -4
  272. package/translations/fr.json +10 -7
  273. package/translations/it.json +9 -6
  274. package/translations/nl.json +7 -4
  275. package/translations/pt.json +7 -4
  276. package/translations/sk.json +7 -4
  277. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  278. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  279. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  280. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  281. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  282. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  283. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  284. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  285. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  286. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  287. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  288. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  289. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  290. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  291. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  292. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  293. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  294. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  295. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  296. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  297. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  298. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  299. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  300. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  301. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  302. /package/src/libs/feature/map/src/lib/{utils → constant}/projections.ts +0 -0
@@ -1,18 +1,18 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
2
  import format from 'date-fns/format';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ElementRef, ViewChildren } from '@angular/core';
4
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, ElementRef, ViewChildren } from '@angular/core';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
7
  import * as i1$1 from '@ngx-translate/core';
8
- import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService, TranslateFakeCompiler, TranslateDefaultParser, FakeMissingTranslationHandler } from '@ngx-translate/core';
8
+ import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
10
10
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
11
11
  import { map as map$1, shareReplay, filter, tap as tap$1, startWith, switchMap as switchMap$1, catchError, take, withLatestFrom, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, tap as tap$2, fromEvent, timer, from, Subscription, animationFrameScheduler, firstValueFrom, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, EMPTY, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, from, Subscription, animationFrameScheduler, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
18
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
@@ -32,8 +32,8 @@ import WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';
32
32
  import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
33
33
  import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
34
34
  import WMTSCapabilities from 'ol/format/WMTSCapabilities';
35
- import { WmsEndpoint, 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';
@@ -647,28 +649,32 @@ function extractStatus() {
647
649
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
648
650
  }
649
651
  // 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) => ({
652
+ function extractLegalConstraints() {
653
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
654
+ ...(url && { url }),
653
655
  text,
654
- type: 'other',
655
656
  })));
656
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
657
+ }
658
+ // from gmd:resourceConstraints
659
+ function extractSecurityConstraints() {
660
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
661
+ ...(url && { url }),
657
662
  text,
658
- type: 'security',
659
663
  })));
660
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
661
664
  }
662
665
  // 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()));
666
+ function extractOtherConstraints() {
667
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
669
+ text,
670
+ })));
665
671
  }
666
672
  // from gmd:resourceConstraints
667
673
  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]) => ({
674
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
669
675
  ...(url && { url }),
670
676
  text,
671
- })))));
677
+ })));
672
678
  }
673
679
  // from gmd:MD_Distribution
674
680
  function extractDatasetDistributions() {
@@ -840,11 +846,14 @@ function readStatus(rootEl) {
840
846
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
841
847
  }
842
848
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
843
- function readAccessConstraints(rootEl) {
844
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
849
+ function readLegalConstraints(rootEl) {
850
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
845
851
  }
846
- function readUseLimitations(rootEl) {
847
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
852
+ function readSecurityConstraints(rootEl) {
853
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
854
+ }
855
+ function readOtherConstraints(rootEl) {
856
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
848
857
  }
849
858
  function readLicenses(rootEl) {
850
859
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
@@ -1077,23 +1086,23 @@ function appendKeywords(keywords, type) {
1077
1086
  ? appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', type)))
1078
1087
  : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1079
1088
  }
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') {
1089
+ function createConstraint(constraint, type) {
1090
+ if (type === 'security') {
1088
1091
  return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_SecurityConstraints'), appendChildren(pipe(createElement('gmd:classification'), createChild('gmd:MD_ClassificationCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode'), addAttribute('codeListValue', 'restricted')), pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1089
1092
  }
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))));
1093
+ else if (type === 'legal') {
1094
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1095
+ }
1096
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1091
1097
  }
1092
- function removeUseLimitations() {
1098
+ function removeOtherConstraints() {
1093
1099
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1094
1100
  }
1095
- function createUseLimitation(useLimitation) {
1096
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1101
+ function removeSecurityConstraints() {
1102
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1103
+ }
1104
+ function removeLegalConstraints() {
1105
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code !== 'license')))));
1097
1106
  }
1098
1107
  function removeLicenses() {
1099
1108
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.some((code) => code === 'license')))));
@@ -1197,14 +1206,17 @@ function writeKeywords(record, rootEl) {
1197
1206
  function writeThemes(record, rootEl) {
1198
1207
  pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1199
1208
  }
1200
- function writeAccessConstraints(record, rootEl) {
1201
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1202
- }
1203
1209
  function writeLicenses(record, rootEl) {
1204
1210
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1205
1211
  }
1206
- function writeUseLimitations(record, rootEl) {
1207
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1212
+ function writeLegalConstraints(record, rootEl) {
1213
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1214
+ }
1215
+ function writeSecurityConstraints(record, rootEl) {
1216
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1217
+ }
1218
+ function writeOtherConstraints(record, rootEl) {
1219
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1208
1220
  }
1209
1221
  function writeUpdateFrequency(record, rootEl) {
1210
1222
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1302,8 +1314,9 @@ function toModel(xml) {
1302
1314
  const recordCreated = recordUpdated;
1303
1315
  const keywords = readKeywords(rootEl);
1304
1316
  const themes = readThemes(rootEl);
1305
- const accessConstraints = readAccessConstraints(rootEl);
1306
- const useLimitations = readUseLimitations(rootEl);
1317
+ const legalConstraints = readLegalConstraints(rootEl);
1318
+ const otherConstraints = readOtherConstraints(rootEl);
1319
+ const securityConstraints = readSecurityConstraints(rootEl);
1307
1320
  const licenses = readLicenses(rootEl);
1308
1321
  const overviews = readOverviews(rootEl);
1309
1322
  // not used yet
@@ -1331,9 +1344,10 @@ function toModel(xml) {
1331
1344
  contactsForResource: [],
1332
1345
  keywords,
1333
1346
  themes,
1334
- accessConstraints,
1335
- useLimitations,
1336
1347
  licenses,
1348
+ legalConstraints,
1349
+ securityConstraints,
1350
+ otherConstraints,
1337
1351
  ...(datasetCreated && { datasetCreated }),
1338
1352
  ...(datasetUpdated && { datasetUpdated }),
1339
1353
  lineage,
@@ -1358,9 +1372,10 @@ function toModel(xml) {
1358
1372
  contacts,
1359
1373
  keywords,
1360
1374
  themes,
1361
- accessConstraints,
1362
- useLimitations,
1363
1375
  licenses,
1376
+ legalConstraints,
1377
+ securityConstraints,
1378
+ otherConstraints,
1364
1379
  overviews,
1365
1380
  onlineResources,
1366
1381
  };
@@ -1386,9 +1401,11 @@ function toXml(record, originalXml) {
1386
1401
  fieldChanged('contacts') && writeContacts(record, rootEl);
1387
1402
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1388
1403
  fieldChanged('themes') && writeThemes(record, rootEl);
1389
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1404
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1405
+ fieldChanged('securityConstraints') &&
1406
+ writeSecurityConstraints(record, rootEl);
1390
1407
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1391
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1408
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1392
1409
  if (record.kind === 'dataset') {
1393
1410
  writeStatus(record, rootEl);
1394
1411
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1414,6 +1431,7 @@ const selectTranslatedValue = (source, lang3) => selectFallback(selectField(sour
1414
1431
  const selectTranslatedField = (source, fieldName, lang3) => selectTranslatedValue(selectField(source, fieldName), lang3);
1415
1432
  const toDate = (field) => new Date(field);
1416
1433
  const getFirstValue = (field) => Array.isArray(field) ? field[0] : field;
1434
+ const getArrayItem = (field, index) => Array.isArray(field) && field[index] !== undefined ? field[index] : null;
1417
1435
  const getAsArray = (field) => Array.isArray(field) ? field : field !== null ? [field] : [];
1418
1436
  const getAsUrl = (field, location = window.location.toString()) => {
1419
1437
  // an empty string is not a valid url, even though it could be considered an empty path to the root
@@ -16540,133 +16558,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16540
16558
  }]
16541
16559
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16542
16560
 
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
16561
  var dropFile$6 = "Datei ablegen";
16671
16562
  var next$6 = "weiter";
16672
16563
  var previous$6 = "zurück";
@@ -16689,20 +16580,21 @@ var de = {
16689
16580
  "chart.type.line": "Liniendiagramm",
16690
16581
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16691
16582
  "chart.type.pie": "Kreisdiagramm",
16583
+ "dashboard.createRecord": "",
16692
16584
  "dashboard.labels.mySpace": "Mein Bereich",
16693
16585
  "dashboard.records.all": "Katalog",
16694
16586
  "dashboard.records.myDraft": "Meine Entwürfe",
16695
16587
  "dashboard.records.myLibrary": "Meine Bibliothek",
16696
16588
  "dashboard.records.myOrg": "Meine Organisation",
16697
16589
  "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
16590
  "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16701
16591
  "dashboard.records.search": "Suche nach \"{searchText}\"",
16702
16592
  "dashboard.records.userDetail": "Name",
16703
16593
  "dashboard.records.userEmail": "E-Mail",
16704
16594
  "dashboard.records.username": "Benutzername",
16705
16595
  "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16596
+ "dashboard.results.listMetadata": "",
16597
+ "dashboard.results.listResources": "",
16706
16598
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16707
16599
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16708
16600
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16850,6 +16742,7 @@ var de = {
16850
16742
  "map.add.layer.wfs": "Aus WFS",
16851
16743
  "map.add.layer.wms": "Aus WMS",
16852
16744
  "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16745
+ "map.geocoding.placeholder": "",
16853
16746
  "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16854
16747
  "map.layer.add": "Hinzufügen",
16855
16748
  "map.layers.available": "Verfügbare Layer",
@@ -16893,16 +16786,15 @@ var de = {
16893
16786
  "record.metadata.author": "Autor",
16894
16787
  "record.metadata.catalog": "Katalog",
16895
16788
  "record.metadata.contact": "Kontakt",
16896
- "record.metadata.createdOn": "Erstellt am",
16897
16789
  "record.metadata.details": "Technische Informationen",
16898
16790
  "record.metadata.download": "Downloads",
16899
16791
  "record.metadata.formats": "Formate",
16900
- "record.metadata.isOpenData": "Open Data",
16901
16792
  "record.metadata.keywords": "Stichworte",
16902
16793
  "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16903
16794
  "record.metadata.links": "Links",
16904
16795
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16905
16796
  "record.metadata.origin": "Über die Daten",
16797
+ "record.metadata.otherConstraints": "",
16906
16798
  "record.metadata.owner": "",
16907
16799
  "record.metadata.preview": "Vorschau",
16908
16800
  "record.metadata.publications": "Veröffentlichungen",
@@ -16926,6 +16818,7 @@ var de = {
16926
16818
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16927
16819
  "record.metadata.related": "Ähnliche Datensätze",
16928
16820
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16821
+ "record.metadata.status": "",
16929
16822
  "record.metadata.themes": "Kategorien",
16930
16823
  "record.metadata.title": "Titel",
16931
16824
  "record.metadata.type": "Geographischer Datensatz",
@@ -16963,6 +16856,7 @@ var de = {
16963
16856
  "search.filters.isSpatial": "Ist räumliche Daten",
16964
16857
  "search.filters.isSpatial.no": "nicht räumlich",
16965
16858
  "search.filters.isSpatial.yes": "räumlich",
16859
+ "search.filters.keyword": "Schlüsselwort",
16966
16860
  "search.filters.license": "Lizenz",
16967
16861
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16968
16862
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17027,20 +16921,21 @@ var en = {
17027
16921
  "chart.type.line": "line chart",
17028
16922
  "chart.type.lineSmooth": "smooth line chart",
17029
16923
  "chart.type.pie": "pie chart",
16924
+ "dashboard.createRecord": "New record",
17030
16925
  "dashboard.labels.mySpace": "My space",
17031
- "dashboard.records.all": "Catalog",
16926
+ "dashboard.records.all": "Metadata records",
17032
16927
  "dashboard.records.myDraft": "My drafts",
17033
16928
  "dashboard.records.myLibrary": "My library",
17034
16929
  "dashboard.records.myOrg": "Organization",
17035
16930
  "dashboard.records.myRecords": "My Records",
17036
- "dashboard.records.noRecord": "No record for this organization",
17037
- "dashboard.records.noUser": "No users for this organization",
17038
16931
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17039
16932
  "dashboard.records.search": "Search for \"{searchText}\"",
17040
16933
  "dashboard.records.userDetail": "Name",
17041
16934
  "dashboard.records.userEmail": "Email",
17042
16935
  "dashboard.records.username": "Username",
17043
16936
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
16937
+ "dashboard.results.listMetadata": "Show metadata",
16938
+ "dashboard.results.listResources": "Show resources",
17044
16939
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17045
16940
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17046
16941
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17188,6 +17083,7 @@ var en = {
17188
17083
  "map.add.layer.wfs": "From WFS",
17189
17084
  "map.add.layer.wms": "From WMS",
17190
17085
  "map.addFromFile.placeholder": "Click or drop a file here",
17086
+ "map.geocoding.placeholder": "Search for a place",
17191
17087
  "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17192
17088
  "map.layer.add": "Add",
17193
17089
  "map.layers.available": "Available Layers",
@@ -17231,16 +17127,15 @@ var en = {
17231
17127
  "record.metadata.author": "Author",
17232
17128
  "record.metadata.catalog": "Catalog",
17233
17129
  "record.metadata.contact": "Contact",
17234
- "record.metadata.createdOn": "Created on",
17235
17130
  "record.metadata.details": "Technical information",
17236
17131
  "record.metadata.download": "Downloads",
17237
17132
  "record.metadata.formats": "Formats",
17238
- "record.metadata.isOpenData": "Open Data",
17239
17133
  "record.metadata.keywords": "Keywords",
17240
17134
  "record.metadata.lastUpdate": "Last updated on",
17241
17135
  "record.metadata.links": "Links",
17242
17136
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17243
17137
  "record.metadata.origin": "About the data",
17138
+ "record.metadata.otherConstraints": "Additional Conditions",
17244
17139
  "record.metadata.owner": "Catalog of origin",
17245
17140
  "record.metadata.preview": "Preview",
17246
17141
  "record.metadata.publications": "publications",
@@ -17264,14 +17159,15 @@ var en = {
17264
17159
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17265
17160
  "record.metadata.related": "Related records",
17266
17161
  "record.metadata.sheet": "Original metadata",
17162
+ "record.metadata.status": "Status",
17267
17163
  "record.metadata.themes": "Categories",
17268
17164
  "record.metadata.title": "Title",
17269
17165
  "record.metadata.type": "Geographical dataset",
17270
17166
  "record.metadata.uniqueId": "Unique Identifier",
17271
17167
  "record.metadata.updateFrequency": "Data Update Frequency",
17272
17168
  "record.metadata.updateStatus": "Data Update Status",
17273
- "record.metadata.updatedOn": "Metadata's last update",
17274
- "record.metadata.usage": "Usage & constraints",
17169
+ "record.metadata.updatedOn": "Last Data Information Update",
17170
+ "record.metadata.usage": "License and Conditions",
17275
17171
  "record.more.details": "Read more",
17276
17172
  "record.tab.chart": "Chart",
17277
17173
  "record.tab.data": "Table",
@@ -17301,6 +17197,7 @@ var en = {
17301
17197
  "search.filters.isSpatial": "Is spatial data",
17302
17198
  "search.filters.isSpatial.no": "non spatial",
17303
17199
  "search.filters.isSpatial.yes": "spatial",
17200
+ "search.filters.keyword": "Keyword",
17304
17201
  "search.filters.license": "License",
17305
17202
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17306
17203
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17365,20 +17262,21 @@ var es = {
17365
17262
  "chart.type.line": "gráfico de líneas",
17366
17263
  "chart.type.lineSmooth": "gráfico de líneas suave",
17367
17264
  "chart.type.pie": "gráfico circular",
17265
+ "dashboard.createRecord": "",
17368
17266
  "dashboard.labels.mySpace": "Mi espacio",
17369
17267
  "dashboard.records.all": "Catálogo",
17370
17268
  "dashboard.records.myDraft": "Mis borradores",
17371
17269
  "dashboard.records.myLibrary": "Mi biblioteca",
17372
17270
  "dashboard.records.myOrg": "Organización",
17373
17271
  "dashboard.records.myRecords": "Mis Registros",
17374
- "dashboard.records.noRecord": "",
17375
- "dashboard.records.noUser": "",
17376
17272
  "dashboard.records.publishedRecords": "",
17377
17273
  "dashboard.records.search": "Buscar \"{searchText}\"",
17378
17274
  "dashboard.records.userDetail": "",
17379
17275
  "dashboard.records.userEmail": "",
17380
17276
  "dashboard.records.username": "",
17381
17277
  "dashboard.records.users": "",
17278
+ "dashboard.results.listMetadata": "",
17279
+ "dashboard.results.listResources": "",
17382
17280
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17383
17281
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17384
17282
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17526,6 +17424,7 @@ var es = {
17526
17424
  "map.add.layer.wfs": "",
17527
17425
  "map.add.layer.wms": "",
17528
17426
  "map.addFromFile.placeholder": "",
17427
+ "map.geocoding.placeholder": "",
17529
17428
  "map.help.addFromFile": "",
17530
17429
  "map.layer.add": "",
17531
17430
  "map.layers.available": "",
@@ -17569,16 +17468,15 @@ var es = {
17569
17468
  "record.metadata.author": "",
17570
17469
  "record.metadata.catalog": "",
17571
17470
  "record.metadata.contact": "",
17572
- "record.metadata.createdOn": "",
17573
17471
  "record.metadata.details": "",
17574
17472
  "record.metadata.download": "",
17575
17473
  "record.metadata.formats": "",
17576
- "record.metadata.isOpenData": "",
17577
17474
  "record.metadata.keywords": "",
17578
17475
  "record.metadata.lastUpdate": "",
17579
17476
  "record.metadata.links": "",
17580
17477
  "record.metadata.noUsage": "",
17581
17478
  "record.metadata.origin": "",
17479
+ "record.metadata.otherConstraints": "",
17582
17480
  "record.metadata.owner": "",
17583
17481
  "record.metadata.preview": "",
17584
17482
  "record.metadata.publications": "",
@@ -17602,6 +17500,7 @@ var es = {
17602
17500
  "record.metadata.quality.updateFrequency.success": "",
17603
17501
  "record.metadata.related": "",
17604
17502
  "record.metadata.sheet": "",
17503
+ "record.metadata.status": "",
17605
17504
  "record.metadata.themes": "",
17606
17505
  "record.metadata.title": "",
17607
17506
  "record.metadata.type": "",
@@ -17639,6 +17538,7 @@ var es = {
17639
17538
  "search.filters.isSpatial": "",
17640
17539
  "search.filters.isSpatial.no": "",
17641
17540
  "search.filters.isSpatial.yes": "",
17541
+ "search.filters.keyword": "",
17642
17542
  "search.filters.license": "",
17643
17543
  "search.filters.license.cc-by": "",
17644
17544
  "search.filters.license.cc-by-sa": "",
@@ -17703,20 +17603,21 @@ var fr = {
17703
17603
  "chart.type.line": "ligne",
17704
17604
  "chart.type.lineSmooth": "ligne lisse",
17705
17605
  "chart.type.pie": "camembert",
17606
+ "dashboard.createRecord": "",
17706
17607
  "dashboard.labels.mySpace": "Mon espace",
17707
17608
  "dashboard.records.all": "Catalogue",
17708
17609
  "dashboard.records.myDraft": "Mes brouillons",
17709
17610
  "dashboard.records.myLibrary": "Ma bibliothèque",
17710
17611
  "dashboard.records.myOrg": "Mon organisation",
17711
17612
  "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
17613
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17715
17614
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17716
17615
  "dashboard.records.userDetail": "Nom",
17717
17616
  "dashboard.records.userEmail": "Email",
17718
17617
  "dashboard.records.username": "Nom d'utilisateur",
17719
17618
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17619
+ "dashboard.results.listMetadata": "",
17620
+ "dashboard.results.listResources": "",
17720
17621
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17721
17622
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17722
17623
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17798,7 +17699,7 @@ var fr = {
17798
17699
  "datahub.header.popularRecords": "Les plus appréciées",
17799
17700
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17800
17701
  "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>",
17702
+ "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
17703
  "datahub.news.contact.title": "Un besoin spécifique ?",
17803
17704
  "datahub.news.feed": "Fil d'activité",
17804
17705
  "datahub.news.figures": "Quelques chiffres",
@@ -17864,6 +17765,7 @@ var fr = {
17864
17765
  "map.add.layer.wfs": "",
17865
17766
  "map.add.layer.wms": "",
17866
17767
  "map.addFromFile.placeholder": "",
17768
+ "map.geocoding.placeholder": "",
17867
17769
  "map.help.addFromFile": "",
17868
17770
  "map.layer.add": "",
17869
17771
  "map.layers.available": "",
@@ -17907,16 +17809,15 @@ var fr = {
17907
17809
  "record.metadata.author": "Auteur",
17908
17810
  "record.metadata.catalog": "Catalogue",
17909
17811
  "record.metadata.contact": "Contact",
17910
- "record.metadata.createdOn": "Créé le",
17911
17812
  "record.metadata.details": "Informations techniques",
17912
17813
  "record.metadata.download": "Téléchargements",
17913
17814
  "record.metadata.formats": "Formats",
17914
- "record.metadata.isOpenData": "Donnée Ouverte",
17915
17815
  "record.metadata.keywords": "Mots clés",
17916
17816
  "record.metadata.lastUpdate": "Mis à jour le",
17917
17817
  "record.metadata.links": "Liens",
17918
17818
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17919
17819
  "record.metadata.origin": "À propos des données",
17820
+ "record.metadata.otherConstraints": "Limitations d'usage",
17920
17821
  "record.metadata.owner": "Catalogue d'origine",
17921
17822
  "record.metadata.preview": "Aperçu",
17922
17823
  "record.metadata.publications": "données",
@@ -17940,14 +17841,15 @@ var fr = {
17940
17841
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17941
17842
  "record.metadata.related": "Voir aussi",
17942
17843
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17844
+ "record.metadata.status": "",
17943
17845
  "record.metadata.themes": "Catégories",
17944
17846
  "record.metadata.title": "Titre",
17945
17847
  "record.metadata.type": "Donnée géographique",
17946
17848
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17947
17849
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17948
17850
  "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",
17851
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17852
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17951
17853
  "record.more.details": "Détails",
17952
17854
  "record.tab.chart": "Graphique",
17953
17855
  "record.tab.data": "Tableau",
@@ -17977,6 +17879,7 @@ var fr = {
17977
17879
  "search.filters.isSpatial": "Données spatiales",
17978
17880
  "search.filters.isSpatial.no": "non-géolocalisées",
17979
17881
  "search.filters.isSpatial.yes": "géolocalisées",
17882
+ "search.filters.keyword": "Mot-clé",
17980
17883
  "search.filters.license": "Licence",
17981
17884
  "search.filters.license.cc-by": "cc-by",
17982
17885
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18041,20 +17944,21 @@ var it = {
18041
17944
  "chart.type.line": "grafico a linee",
18042
17945
  "chart.type.lineSmooth": "grafico a linea liscia",
18043
17946
  "chart.type.pie": "grafico a torta",
17947
+ "dashboard.createRecord": "",
18044
17948
  "dashboard.labels.mySpace": "Il mio spazio",
18045
17949
  "dashboard.records.all": "Catalogo",
18046
17950
  "dashboard.records.myDraft": "Le mie bozze",
18047
17951
  "dashboard.records.myLibrary": "La mia biblioteca",
18048
17952
  "dashboard.records.myOrg": "La mia organizzazione",
18049
17953
  "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
17954
  "dashboard.records.publishedRecords": "dati pubblicati",
18053
17955
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18054
17956
  "dashboard.records.userDetail": "Nome",
18055
17957
  "dashboard.records.userEmail": "Email",
18056
17958
  "dashboard.records.username": "Nome utente",
18057
17959
  "dashboard.records.users": "utenti",
17960
+ "dashboard.results.listMetadata": "",
17961
+ "dashboard.results.listResources": "",
18058
17962
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18059
17963
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18060
17964
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18202,6 +18106,7 @@ var it = {
18202
18106
  "map.add.layer.wfs": "Da un WFS",
18203
18107
  "map.add.layer.wms": "Da un WMS",
18204
18108
  "map.addFromFile.placeholder": "",
18109
+ "map.geocoding.placeholder": "",
18205
18110
  "map.help.addFromFile": "",
18206
18111
  "map.layer.add": "",
18207
18112
  "map.layers.available": "",
@@ -18245,16 +18150,15 @@ var it = {
18245
18150
  "record.metadata.author": "Autore",
18246
18151
  "record.metadata.catalog": "Catalogo",
18247
18152
  "record.metadata.contact": "Contatto",
18248
- "record.metadata.createdOn": "Creato il",
18249
18153
  "record.metadata.details": "Informazioni tecniche",
18250
18154
  "record.metadata.download": "Download",
18251
18155
  "record.metadata.formats": "Formati",
18252
- "record.metadata.isOpenData": "Data aperta",
18253
18156
  "record.metadata.keywords": "Parole chiave",
18254
18157
  "record.metadata.lastUpdate": "Ultimo aggiornamento",
18255
18158
  "record.metadata.links": "Collegamenti",
18256
18159
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18257
18160
  "record.metadata.origin": "Informazioni sui dati",
18161
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18258
18162
  "record.metadata.owner": "Catalogo originale",
18259
18163
  "record.metadata.preview": "Anteprima",
18260
18164
  "record.metadata.publications": "pubblicazioni",
@@ -18278,14 +18182,15 @@ var it = {
18278
18182
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18279
18183
  "record.metadata.related": "Vedi anche",
18280
18184
  "record.metadata.sheet": "Origine del metadata",
18185
+ "record.metadata.status": "",
18281
18186
  "record.metadata.themes": "Categorie",
18282
18187
  "record.metadata.title": "Titolo",
18283
18188
  "record.metadata.type": "Dati geografici",
18284
18189
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18285
18190
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18286
18191
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18287
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18288
- "record.metadata.usage": "Condizioni d'uso",
18192
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18193
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18289
18194
  "record.more.details": "Dettagli",
18290
18195
  "record.tab.chart": "Grafico",
18291
18196
  "record.tab.data": "Tabella",
@@ -18315,6 +18220,7 @@ var it = {
18315
18220
  "search.filters.isSpatial": "Dati spaziali",
18316
18221
  "search.filters.isSpatial.no": "Non geolocalizzati",
18317
18222
  "search.filters.isSpatial.yes": "Geolocalizzati",
18223
+ "search.filters.keyword": "Parola chiave",
18318
18224
  "search.filters.license": "Licenza",
18319
18225
  "search.filters.license.cc-by": "cc-by",
18320
18226
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18379,20 +18285,21 @@ var nl = {
18379
18285
  "chart.type.line": "lijndiagram",
18380
18286
  "chart.type.lineSmooth": "glad lijndiagram",
18381
18287
  "chart.type.pie": "cirkeldiagram",
18288
+ "dashboard.createRecord": "",
18382
18289
  "dashboard.labels.mySpace": "Mijn ruimte",
18383
18290
  "dashboard.records.all": "Catalogus",
18384
18291
  "dashboard.records.myDraft": "Mijn concepten",
18385
18292
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18386
18293
  "dashboard.records.myOrg": "Organisatie",
18387
18294
  "dashboard.records.myRecords": "Mijn Records",
18388
- "dashboard.records.noRecord": "",
18389
- "dashboard.records.noUser": "",
18390
18295
  "dashboard.records.publishedRecords": "",
18391
18296
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18392
18297
  "dashboard.records.userDetail": "",
18393
18298
  "dashboard.records.userEmail": "",
18394
18299
  "dashboard.records.username": "",
18395
18300
  "dashboard.records.users": "",
18301
+ "dashboard.results.listMetadata": "",
18302
+ "dashboard.results.listResources": "",
18396
18303
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18397
18304
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18398
18305
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18540,6 +18447,7 @@ var nl = {
18540
18447
  "map.add.layer.wfs": "",
18541
18448
  "map.add.layer.wms": "",
18542
18449
  "map.addFromFile.placeholder": "",
18450
+ "map.geocoding.placeholder": "",
18543
18451
  "map.help.addFromFile": "",
18544
18452
  "map.layer.add": "",
18545
18453
  "map.layers.available": "",
@@ -18583,16 +18491,15 @@ var nl = {
18583
18491
  "record.metadata.author": "",
18584
18492
  "record.metadata.catalog": "",
18585
18493
  "record.metadata.contact": "",
18586
- "record.metadata.createdOn": "",
18587
18494
  "record.metadata.details": "",
18588
18495
  "record.metadata.download": "",
18589
18496
  "record.metadata.formats": "",
18590
- "record.metadata.isOpenData": "",
18591
18497
  "record.metadata.keywords": "",
18592
18498
  "record.metadata.lastUpdate": "",
18593
18499
  "record.metadata.links": "",
18594
18500
  "record.metadata.noUsage": "",
18595
18501
  "record.metadata.origin": "",
18502
+ "record.metadata.otherConstraints": "",
18596
18503
  "record.metadata.owner": "",
18597
18504
  "record.metadata.preview": "",
18598
18505
  "record.metadata.publications": "",
@@ -18616,6 +18523,7 @@ var nl = {
18616
18523
  "record.metadata.quality.updateFrequency.success": "",
18617
18524
  "record.metadata.related": "",
18618
18525
  "record.metadata.sheet": "",
18526
+ "record.metadata.status": "",
18619
18527
  "record.metadata.themes": "",
18620
18528
  "record.metadata.title": "",
18621
18529
  "record.metadata.type": "",
@@ -18653,6 +18561,7 @@ var nl = {
18653
18561
  "search.filters.isSpatial": "",
18654
18562
  "search.filters.isSpatial.no": "",
18655
18563
  "search.filters.isSpatial.yes": "",
18564
+ "search.filters.keyword": "",
18656
18565
  "search.filters.license": "",
18657
18566
  "search.filters.license.cc-by": "",
18658
18567
  "search.filters.license.cc-by-sa": "",
@@ -18717,20 +18626,21 @@ var pt = {
18717
18626
  "chart.type.line": "gráfico de linha",
18718
18627
  "chart.type.lineSmooth": "gráfico de linha suave",
18719
18628
  "chart.type.pie": "gráfico de pizza",
18629
+ "dashboard.createRecord": "",
18720
18630
  "dashboard.labels.mySpace": "Meu espaço",
18721
18631
  "dashboard.records.all": "Catálogo",
18722
18632
  "dashboard.records.myDraft": "Meus rascunhos",
18723
18633
  "dashboard.records.myLibrary": "Minha biblioteca",
18724
18634
  "dashboard.records.myOrg": "Organização",
18725
18635
  "dashboard.records.myRecords": "Meus Registros",
18726
- "dashboard.records.noRecord": "",
18727
- "dashboard.records.noUser": "",
18728
18636
  "dashboard.records.publishedRecords": "",
18729
18637
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18730
18638
  "dashboard.records.userDetail": "",
18731
18639
  "dashboard.records.userEmail": "",
18732
18640
  "dashboard.records.username": "",
18733
18641
  "dashboard.records.users": "",
18642
+ "dashboard.results.listMetadata": "",
18643
+ "dashboard.results.listResources": "",
18734
18644
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18735
18645
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18736
18646
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18878,6 +18788,7 @@ var pt = {
18878
18788
  "map.add.layer.wfs": "",
18879
18789
  "map.add.layer.wms": "",
18880
18790
  "map.addFromFile.placeholder": "",
18791
+ "map.geocoding.placeholder": "",
18881
18792
  "map.help.addFromFile": "",
18882
18793
  "map.layer.add": "",
18883
18794
  "map.layers.available": "",
@@ -18921,16 +18832,15 @@ var pt = {
18921
18832
  "record.metadata.author": "",
18922
18833
  "record.metadata.catalog": "",
18923
18834
  "record.metadata.contact": "",
18924
- "record.metadata.createdOn": "",
18925
18835
  "record.metadata.details": "",
18926
18836
  "record.metadata.download": "",
18927
18837
  "record.metadata.formats": "",
18928
- "record.metadata.isOpenData": "",
18929
18838
  "record.metadata.keywords": "",
18930
18839
  "record.metadata.lastUpdate": "",
18931
18840
  "record.metadata.links": "",
18932
18841
  "record.metadata.noUsage": "",
18933
18842
  "record.metadata.origin": "",
18843
+ "record.metadata.otherConstraints": "",
18934
18844
  "record.metadata.owner": "",
18935
18845
  "record.metadata.preview": "",
18936
18846
  "record.metadata.publications": "",
@@ -18954,6 +18864,7 @@ var pt = {
18954
18864
  "record.metadata.quality.updateFrequency.success": "",
18955
18865
  "record.metadata.related": "",
18956
18866
  "record.metadata.sheet": "",
18867
+ "record.metadata.status": "",
18957
18868
  "record.metadata.themes": "",
18958
18869
  "record.metadata.title": "",
18959
18870
  "record.metadata.type": "",
@@ -18991,6 +18902,7 @@ var pt = {
18991
18902
  "search.filters.isSpatial": "",
18992
18903
  "search.filters.isSpatial.no": "",
18993
18904
  "search.filters.isSpatial.yes": "",
18905
+ "search.filters.keyword": "",
18994
18906
  "search.filters.license": "",
18995
18907
  "search.filters.license.cc-by": "",
18996
18908
  "search.filters.license.cc-by-sa": "",
@@ -19166,20 +19078,11 @@ class Gn4FieldMapper {
19166
19078
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19167
19079
  ],
19168
19080
  }),
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
- }),
19081
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19082
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19083
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19084
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19085
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19183
19086
  lineageObject: (output, source) => ({
19184
19087
  ...output,
19185
19088
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19205,33 +19108,78 @@ class Gn4FieldMapper {
19205
19108
  kind,
19206
19109
  };
19207
19110
  },
19111
+ geom: (output, source) => {
19112
+ const geoms = getAsArray(selectField(source, 'geom'));
19113
+ const shapes = getAsArray(selectField(source, 'shape'));
19114
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19115
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19116
+ return {
19117
+ ...output,
19118
+ spatialExtents: [
19119
+ ...spatialExtents,
19120
+ ...geoms.map((geom, index) => {
19121
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19122
+ const geometry = shapes[index] ?? geom;
19123
+ return {
19124
+ ...(description !== null ? { description } : null),
19125
+ geometry,
19126
+ };
19127
+ }),
19128
+ ],
19129
+ };
19130
+ },
19131
+ resourceTemporalDateRange: (output, source) => {
19132
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19133
+ return {
19134
+ ...output,
19135
+ temporalExtents: ranges.map((range) => {
19136
+ const start = selectField(range, 'gte');
19137
+ const end = selectField(range, 'lte');
19138
+ return {
19139
+ ...(start !== null ? { start: toDate(start) } : null),
19140
+ ...(end !== null ? { end: toDate(end) } : null),
19141
+ };
19142
+ }),
19143
+ };
19144
+ },
19208
19145
  };
19209
19146
  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
- });
19147
+ this.constraintField = (type, output, constraintArray) => {
19148
+ let outputField;
19149
+ switch (type) {
19150
+ case 'license':
19151
+ outputField = 'licenses';
19152
+ break;
19153
+ case 'legal':
19154
+ outputField = 'legalConstraints';
19155
+ break;
19156
+ case 'security':
19157
+ outputField = 'securityConstraints';
19158
+ break;
19159
+ case 'other':
19160
+ outputField = 'otherConstraints';
19161
+ break;
19162
+ }
19163
+ const outputArray = outputField in output ? output[outputField] : [];
19164
+ outputArray.push(...constraintArray.map((item) => {
19165
+ const text = selectTranslatedValue(item, this.lang3);
19166
+ const url = getAsUrl(selectField(item, 'link'));
19167
+ return {
19168
+ text,
19169
+ ...(url ? { url } : {}),
19170
+ };
19171
+ }));
19172
+ const result = {
19173
+ ...output,
19174
+ [outputField]: outputArray,
19175
+ };
19176
+ // avoid legal constraints being duplicates of licenses
19177
+ if ('legalConstraints' in result &&
19178
+ (type === 'legal' || type === 'license')) {
19179
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19180
+ }
19181
+ return result;
19182
+ };
19235
19183
  this.mapLink = (sourceLink) => {
19236
19184
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19237
19185
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19279,17 +19227,6 @@ class Gn4FieldMapper {
19279
19227
  extras: { ...(output.extras || {}), ...value },
19280
19228
  });
19281
19229
  }
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
19230
  getMappingFn(fieldName) {
19294
19231
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19295
19232
  }
@@ -19351,12 +19288,13 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19351
19288
  recordUpdated: null,
19352
19289
  ownerOrganization: null,
19353
19290
  licenses: [],
19291
+ legalConstraints: [],
19292
+ securityConstraints: [],
19293
+ otherConstraints: [],
19354
19294
  contacts: [],
19355
19295
  contactsForResource: [],
19356
- accessConstraints: [],
19357
19296
  keywords: [],
19358
19297
  themes: [],
19359
- useLimitations: [],
19360
19298
  spatialExtents: [],
19361
19299
  temporalExtents: [],
19362
19300
  overviews: [],
@@ -20393,36 +20331,23 @@ class SelectionService {
20393
20331
  this.selectedRecordsIdentifiers$.next(filtered);
20394
20332
  }
20395
20333
  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(() => {
20334
+ const newIds = records.map((record) => record.uniqueIdentifier);
20335
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20402
20336
  this.addIdsToSelected(newIds);
20403
- }), map$2(() => undefined));
20337
+ });
20404
20338
  }
20405
20339
  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(() => {
20340
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20341
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20412
20342
  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
20343
  });
20421
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20422
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20423
- return apiResponse.pipe(tap$2(() => {
20344
+ }
20345
+ async clearSelection() {
20346
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20347
+ const currentSelection = Array.from(response);
20348
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20424
20349
  this.removeIdsFromSelected(currentSelection);
20425
- }), map$2(() => undefined));
20350
+ });
20426
20351
  }
20427
20352
  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
20353
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20452,12 +20377,21 @@ class Gn4PlatformMapper {
20452
20377
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20453
20378
  return { ...apiUser, id: id.toString() };
20454
20379
  }
20455
- thesaurusFromApi(thesaurus) {
20380
+ thesaurusFromApi(thesaurus, lang3) {
20456
20381
  return thesaurus.map((keyword) => {
20457
- const { uri, value } = keyword;
20382
+ let key = keyword.uri;
20383
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20384
+ if (key.indexOf('@@@') > -1) {
20385
+ key = key.split('@@@')[1];
20386
+ }
20387
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20388
+ const description = lang3 && lang3 in keyword.definitions
20389
+ ? keyword.definitions[lang3]
20390
+ : keyword.definition;
20458
20391
  return {
20459
- key: uri,
20460
- label: value,
20392
+ key,
20393
+ label,
20394
+ description,
20461
20395
  };
20462
20396
  });
20463
20397
  }
@@ -20470,13 +20404,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20470
20404
 
20471
20405
  const minApiVersion = '4.2.2';
20472
20406
  class Gn4PlatformService {
20473
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20407
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20474
20408
  this.siteApiService = siteApiService;
20475
20409
  this.meApi = meApi;
20476
20410
  this.usersApi = usersApi;
20477
20411
  this.mapper = mapper;
20478
20412
  this.toolsApiService = toolsApiService;
20479
20413
  this.registriesApiService = registriesApiService;
20414
+ this.langService = langService;
20480
20415
  this.type = 'GeoNetwork';
20481
20416
  this.keyTranslations$ = this.toolsApiService
20482
20417
  .getTranslationsPackage1('gnui')
@@ -20490,6 +20425,11 @@ class Gn4PlatformService {
20490
20425
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20491
20426
  }
20492
20427
  }), shareReplay(1));
20428
+ /**
20429
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20430
+ * @private
20431
+ */
20432
+ this.thesauri = {};
20493
20433
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20494
20434
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20495
20435
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20516,19 +20456,36 @@ class Gn4PlatformService {
20516
20456
  return this.users$;
20517
20457
  }
20518
20458
  translateKey(key) {
20459
+ // if the key is a URI, use the registries API to look for the translation
20460
+ if (key.match(/^https?:\/\//)) {
20461
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20462
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20463
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20464
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20465
+ for (const item of thesaurus) {
20466
+ if (item.key === key)
20467
+ return item.label;
20468
+ }
20469
+ return key;
20470
+ }));
20471
+ }
20519
20472
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20520
20473
  }
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)));
20474
+ getThesaurusByUri(uri) {
20475
+ if (this.thesauri[uri]) {
20476
+ return this.thesauri[uri];
20477
+ }
20478
+ this.thesauri[uri] = this.registriesApiService
20479
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20480
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20481
+ return this.thesauri[uri];
20525
20482
  }
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 }); }
20483
+ 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
20484
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20528
20485
  }
20529
20486
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20530
20487
  type: Injectable
20531
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20488
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20532
20489
 
20533
20490
  function provideGn4() {
20534
20491
  return [
@@ -20740,6 +20697,8 @@ const defaultMapOptions = {
20740
20697
  };
20741
20698
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20742
20699
 
20700
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20701
+
20743
20702
  var MapContextLayerTypeEnum;
20744
20703
  (function (MapContextLayerTypeEnum) {
20745
20704
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21115,9 +21074,15 @@ const FORMATS = {
21115
21074
  color: '#328556',
21116
21075
  mimeTypes: ['x-gis/x-shapefile'],
21117
21076
  },
21077
+ gml: {
21078
+ extensions: ['gml'],
21079
+ priority: 5,
21080
+ color: '#c92bce',
21081
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21082
+ },
21118
21083
  kml: {
21119
21084
  extensions: ['kml', 'kmz'],
21120
- priority: 5,
21085
+ priority: 6,
21121
21086
  color: '#348009',
21122
21087
  mimeTypes: [
21123
21088
  'application/vnd.google-earth.kml+xml',
@@ -21126,34 +21091,40 @@ const FORMATS = {
21126
21091
  },
21127
21092
  gpkg: {
21128
21093
  extensions: ['gpkg', 'geopackage'],
21129
- priority: 6,
21094
+ priority: 7,
21130
21095
  color: '#ea79ba',
21131
21096
  mimeTypes: ['application/geopackage+sqlite3'],
21132
21097
  },
21133
21098
  zip: {
21134
21099
  extensions: ['zip', 'tar.gz'],
21135
- priority: 7,
21100
+ priority: 8,
21136
21101
  color: '#f2bb3a',
21137
21102
  mimeTypes: ['application/zip', 'application/x-zip'],
21138
21103
  },
21139
21104
  pdf: {
21140
21105
  extensions: ['pdf'],
21141
- priority: 8,
21106
+ priority: 9,
21142
21107
  color: '#db544a',
21143
21108
  mimeTypes: ['application/pdf'],
21144
21109
  },
21145
21110
  jpg: {
21146
21111
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21147
- priority: 8,
21112
+ priority: 9,
21148
21113
  color: '#673ab7',
21149
21114
  mimeTypes: ['image/jpg'],
21150
21115
  },
21151
21116
  svg: {
21152
21117
  extensions: ['svg'],
21153
- priority: 9,
21118
+ priority: 10,
21154
21119
  color: '#d98294',
21155
21120
  mimeTypes: ['image/svg+xml'],
21156
21121
  },
21122
+ dxf: {
21123
+ extensions: ['dxf'],
21124
+ priority: 11,
21125
+ color: '#de630b',
21126
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21127
+ },
21157
21128
  };
21158
21129
  function getFormatPriority(linkFormat) {
21159
21130
  for (const format in FORMATS) {
@@ -21170,14 +21141,18 @@ function getFormatPriority(linkFormat) {
21170
21141
  function getLinkPriority(link) {
21171
21142
  return getFormatPriority(getFileFormat(link));
21172
21143
  }
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;
21144
+ function getFileFormatFromServiceOutput(serviceOutput) {
21145
+ function formatMatcher(format) {
21146
+ const output = serviceOutput.toLowerCase();
21147
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21148
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21149
+ }
21150
+ for (const formatName in FORMATS) {
21151
+ if (formatMatcher(FORMATS[formatName])) {
21152
+ return formatName;
21178
21153
  }
21179
21154
  }
21180
- return undefined;
21155
+ return null;
21181
21156
  }
21182
21157
  function getFileFormat(link) {
21183
21158
  if ('mimeType' in link) {
@@ -21318,72 +21293,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21318
21293
  }]
21319
21294
  }] });
21320
21295
 
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
21296
  const FEATURE_PROJECTION = 'EPSG:3857';
21368
21297
  const DATA_PROJECTION = 'EPSG:4326';
21298
+ const GEOJSON = new GeoJSON();
21369
21299
  class MapUtilsService {
21370
- constructor(http, wmsUtils) {
21300
+ constructor(http, proxy) {
21371
21301
  this.http = http;
21372
- this.wmsUtils = wmsUtils;
21302
+ this.proxy = proxy;
21373
21303
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21374
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21304
+ return GEOJSON.readFeatures(featureCollection, {
21375
21305
  featureProjection,
21376
21306
  dataProjection,
21377
21307
  });
21378
- return olFeatures;
21379
21308
  };
21380
21309
  }
21381
21310
  createEmptyMap() {
21382
- const map = new Map$1({
21311
+ return new Map$1({
21383
21312
  controls: [],
21384
21313
  pixelRatio: 1,
21385
21314
  });
21386
- return map;
21387
21315
  }
21388
21316
  isWMSLayer(layer) {
21389
21317
  return (layer.getSource() instanceof TileWMS ||
@@ -21398,8 +21326,7 @@ class MapUtilsService {
21398
21326
  ...source.getParams(),
21399
21327
  INFO_FORMAT: 'application/json',
21400
21328
  };
21401
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21402
- return url;
21329
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21403
21330
  }
21404
21331
  getVectorFeaturesFromClick(olMap, event) {
21405
21332
  const features = [];
@@ -21427,38 +21354,56 @@ class MapUtilsService {
21427
21354
  /**
21428
21355
  * Will emit `null` if no extent could be computed
21429
21356
  */
21430
- getLayerExtent(layer) {
21431
- let geographicExtent;
21357
+ async getLayerExtent(layer) {
21358
+ let latLonExtent;
21432
21359
  if (layer &&
21433
21360
  layer.type === 'geojson' &&
21434
21361
  'data' in layer &&
21435
21362
  typeof layer.data === 'object' &&
21436
21363
  layer.data.features[0] &&
21437
21364
  layer.data.features[0].geometry) {
21438
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21439
- .readFeatures(layerData)
21365
+ latLonExtent = new GeoJSON()
21366
+ .readFeatures(layer.data)
21440
21367
  .map((feature) => feature.getGeometry())
21441
21368
  .filter((geom) => !!geom)
21442
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21369
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21443
21370
  }
21444
21371
  else if (layer && layer.type === 'wms') {
21445
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21372
+ latLonExtent = await this.getWmsLayerExtent(layer);
21446
21373
  }
21447
21374
  else if (layer && layer.type === 'wmts') {
21448
21375
  if (layer.extent) {
21449
- geographicExtent = of(layer.extent);
21376
+ latLonExtent = layer.extent;
21450
21377
  }
21451
21378
  else {
21452
- return of(layer.options.tileGrid.getExtent());
21379
+ return layer.options.tileGrid.getExtent();
21453
21380
  }
21454
21381
  }
21455
21382
  else {
21456
- return of(null);
21383
+ return null;
21384
+ }
21385
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21386
+ return null;
21387
+ }
21388
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21389
+ }
21390
+ async getWmsLayerExtent(layer) {
21391
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21392
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21393
+ if (!Object.keys(boundingBoxes).length) {
21394
+ return null;
21395
+ }
21396
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21397
+ if (lonLatCRS) {
21398
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21399
+ }
21400
+ else {
21401
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21402
+ register(proj4);
21403
+ const proj = await fromEPSGCode(availableEPSGCode);
21404
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21405
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21457
21406
  }
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
21407
  }
21463
21408
  getWmtsLayerFromCapabilities(link) {
21464
21409
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21514,7 +21459,18 @@ ${e.stack || e.message || e}`);
21514
21459
  ])
21515
21460
  .getArray());
21516
21461
  }
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 }); }
21462
+ getRecordExtent(record) {
21463
+ if (!('spatialExtents' in record)) {
21464
+ return null;
21465
+ }
21466
+ // transform an array of geojson geometries into a bbox
21467
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21468
+ const geom = GEOJSON.readGeometry(curr.geometry);
21469
+ return extend(prev, geom.getExtent());
21470
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21471
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21472
+ }
21473
+ 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
21474
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21519
21475
  }
21520
21476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21522,7 +21478,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21522
21478
  args: [{
21523
21479
  providedIn: 'root',
21524
21480
  }]
21525
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21481
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21526
21482
  function dragPanCondition(event) {
21527
21483
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21528
21484
  if (!dragPanCondition) {
@@ -23395,8 +23351,7 @@ class MetadataQualityComponent {
23395
23351
  : this.calculatedQualityScore;
23396
23352
  }
23397
23353
  get calculatedQualityScore() {
23398
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23399
- this.items.length);
23354
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23400
23355
  }
23401
23356
  showMenu() {
23402
23357
  this.isMenuShown = true;
@@ -24021,11 +23976,11 @@ class MarkdownParserComponent {
24021
23976
  return marked.parse(this.textContent);
24022
23977
  }
24023
23978
  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 }); }
23979
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24025
23980
  }
24026
23981
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24027
23982
  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"] }]
23983
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
24029
23984
  }], propDecorators: { textContent: [{
24030
23985
  type: Input
24031
23986
  }] } });
@@ -24036,16 +23991,32 @@ class MetadataInfoComponent {
24036
23991
  }
24037
23992
  get hasUsage() {
24038
23993
  return (this.metadata.extras?.isOpenData === true ||
24039
- this.metadata.useLimitations?.length ||
24040
- this.metadata.accessConstraints?.length);
23994
+ (this.metadata.legalConstraints?.length > 0 &&
23995
+ this.legalConstraints.length > 0) ||
23996
+ (this.metadata.otherConstraints?.length > 0 &&
23997
+ this.otherConstraints.length > 0) ||
23998
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24041
23999
  }
24042
- get usages() {
24000
+ get legalConstraints() {
24043
24001
  let array = [];
24044
- if (this.metadata.useLimitations?.length) {
24045
- array = array.concat(this.metadata.useLimitations);
24002
+ if (this.metadata.legalConstraints?.length) {
24003
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24046
24004
  }
24047
- if (this.metadata.accessConstraints?.length) {
24048
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24005
+ return array;
24006
+ }
24007
+ get otherConstraints() {
24008
+ let array = [];
24009
+ if (this.metadata.otherConstraints?.length) {
24010
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24011
+ }
24012
+ return array;
24013
+ }
24014
+ get licenses() {
24015
+ let array = [];
24016
+ if (this.metadata.licenses?.length) {
24017
+ array = array.concat(this.metadata.licenses
24018
+ .filter((c) => c.text)
24019
+ .map((c) => ({ text: c.text, url: c.url })));
24049
24020
  }
24050
24021
  return array;
24051
24022
  }
@@ -24067,16 +24038,12 @@ class MetadataInfoComponent {
24067
24038
  onKeywordClick(keyword) {
24068
24039
  this.keyword.emit(keyword);
24069
24040
  }
24070
- copyText() {
24071
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24072
- event.target.blur();
24073
- }
24074
24041
  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 }); }
24042
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24076
24043
  }
24077
24044
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24078
24045
  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"] }]
24046
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24080
24047
  }], propDecorators: { metadata: [{
24081
24048
  type: Input
24082
24049
  }], incomplete: [{
@@ -24145,11 +24112,11 @@ class ButtonComponent {
24145
24112
  propagateToDocumentOnly(event);
24146
24113
  }
24147
24114
  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 }); }
24115
+ 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 }); }
24149
24116
  }
24150
24117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24151
24118
  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"] }]
24119
+ 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"] }]
24153
24120
  }], propDecorators: { type: [{
24154
24121
  type: Input
24155
24122
  }], disabled: [{
@@ -24224,11 +24191,11 @@ class DownloadsListComponent {
24224
24191
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24225
24192
  }
24226
24193
  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 }); }
24194
+ 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
24195
  }
24229
24196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24230
24197
  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" }]
24198
+ 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
24199
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24233
24200
  type: Input
24234
24201
  }] } });
@@ -24477,6 +24444,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24477
24444
  }]
24478
24445
  }] });
24479
24446
 
24447
+ class InteractiveTableColumnComponent {
24448
+ constructor() {
24449
+ this.grow = false;
24450
+ this.sortable = false;
24451
+ this.activeSort = null;
24452
+ this.sortChange = new EventEmitter();
24453
+ }
24454
+ handleSortChange() {
24455
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24456
+ this.sortChange.emit(this.activeSort);
24457
+ }
24458
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24459
+ 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 }); }
24460
+ }
24461
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24462
+ type: Component,
24463
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24464
+ }], propDecorators: { header: [{
24465
+ type: ContentChild,
24466
+ args: ['header']
24467
+ }], cell: [{
24468
+ type: ContentChild,
24469
+ args: ['cell']
24470
+ }], grow: [{
24471
+ type: Input
24472
+ }], sortable: [{
24473
+ type: Input
24474
+ }], activeSort: [{
24475
+ type: Input
24476
+ }], sortChange: [{
24477
+ type: Output
24478
+ }] } });
24479
+
24480
+ class InteractiveTableComponent {
24481
+ constructor() {
24482
+ this.items = [];
24483
+ this.itemClick = new EventEmitter();
24484
+ }
24485
+ get gridStyle() {
24486
+ return {
24487
+ 'grid-template-columns': this.columns
24488
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24489
+ .join(' '),
24490
+ };
24491
+ }
24492
+ handleRowClick(item) {
24493
+ this.itemClick.emit(item);
24494
+ }
24495
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24496
+ 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 }); }
24497
+ }
24498
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24499
+ type: Component,
24500
+ 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"] }]
24501
+ }], propDecorators: { columns: [{
24502
+ type: ContentChildren,
24503
+ args: [InteractiveTableColumnComponent]
24504
+ }], items: [{
24505
+ type: Input
24506
+ }], itemClick: [{
24507
+ type: Output
24508
+ }] } });
24509
+
24480
24510
  class LinkCardComponent {
24481
24511
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24482
24512
  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 }); }
@@ -24522,11 +24552,11 @@ class MetadataContactComponent {
24522
24552
  this.organizationClick.emit(this.shownOrganization);
24523
24553
  }
24524
24554
  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 }); }
24555
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24526
24556
  }
24527
24557
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24528
24558
  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" }]
24559
+ args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24530
24560
  }], propDecorators: { metadata: [{
24531
24561
  type: Input
24532
24562
  }], organizationClick: [{
@@ -24930,11 +24960,11 @@ class DropdownMultiselectComponent {
24930
24960
  this.setFocus();
24931
24961
  }
24932
24962
  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 }); }
24963
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24934
24964
  }
24935
24965
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24936
24966
  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" }]
24967
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
24938
24968
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24939
24969
  type: Input
24940
24970
  }], choices: [{
@@ -25193,11 +25223,11 @@ class AutocompleteComponent {
25193
25223
  }
25194
25224
  }
25195
25225
  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 }); }
25226
+ 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
25227
  }
25198
25228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25199
25229
  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"] }]
25230
+ 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
25231
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25202
25232
  type: Input
25203
25233
  }], action: [{
@@ -25573,11 +25603,11 @@ class CheckboxComponent {
25573
25603
  this.changed.emit(this.checked);
25574
25604
  }
25575
25605
  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 }); }
25606
+ 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
25607
  }
25578
25608
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25579
25609
  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"] }]
25610
+ 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
25611
  }], propDecorators: { type: [{
25582
25612
  type: Input
25583
25613
  }], checked: [{
@@ -25632,6 +25662,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25632
25662
  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
25663
  }] });
25634
25664
 
25665
+ class EditableLabelDirective {
25666
+ constructor(el, renderer) {
25667
+ this.el = el;
25668
+ this.renderer = renderer;
25669
+ this.editableLabelChanged = new EventEmitter();
25670
+ }
25671
+ ngAfterViewInit() {
25672
+ if (this.gnUiEditableLabel !== false) {
25673
+ const appendedInput = this.renderer.createElement('input');
25674
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25675
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25676
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25677
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25678
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25679
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25680
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25681
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25682
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25683
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25684
+ const hostContent = this.el.nativeElement.textContent || '';
25685
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25686
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25687
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25688
+ this.renderer.listen(appendedInput, 'input', (event) => {
25689
+ this.editableLabelChanged.emit(event.target.value);
25690
+ });
25691
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25692
+ }
25693
+ }
25694
+ 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 }); }
25695
+ 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 }); }
25696
+ }
25697
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25698
+ type: Directive,
25699
+ args: [{
25700
+ selector: '[gnUiEditableLabel]',
25701
+ standalone: true,
25702
+ }]
25703
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25704
+ type: Output
25705
+ }], gnUiEditableLabel: [{
25706
+ type: Input
25707
+ }] } });
25708
+
25635
25709
  class UiInputsModule {
25636
25710
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25637
25711
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
@@ -25671,7 +25745,8 @@ class UiInputsModule {
25671
25745
  MatFormFieldModule,
25672
25746
  MatInputModule,
25673
25747
  MatDatepickerModule,
25674
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25748
+ MatNativeDateModule,
25749
+ EditableLabelDirective], exports: [DropdownSelectorComponent,
25675
25750
  AutocompleteComponent,
25676
25751
  ButtonComponent,
25677
25752
  TextInputComponent,
@@ -25687,7 +25762,8 @@ class UiInputsModule {
25687
25762
  CopyTextButtonComponent,
25688
25763
  CheckboxComponent,
25689
25764
  SearchInputComponent,
25690
- DateRangePickerComponent] }); }
25765
+ DateRangePickerComponent,
25766
+ EditableLabelDirective] }); }
25691
25767
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25692
25768
  TranslateModule.forChild(),
25693
25769
  NgxDropzoneModule,
@@ -25753,6 +25829,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25753
25829
  MatInputModule,
25754
25830
  MatDatepickerModule,
25755
25831
  MatNativeDateModule,
25832
+ EditableLabelDirective,
25756
25833
  ],
25757
25834
  exports: [
25758
25835
  DropdownSelectorComponent,
@@ -25772,6 +25849,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25772
25849
  CheckboxComponent,
25773
25850
  SearchInputComponent,
25774
25851
  DateRangePickerComponent,
25852
+ EditableLabelDirective,
25775
25853
  ],
25776
25854
  }]
25777
25855
  }] });
@@ -25871,7 +25949,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25871
25949
 
25872
25950
  const DEFAULT_PARAMS = {
25873
25951
  OFFSET: '',
25874
- LIMIT: '',
25952
+ LIMIT: '-1',
25875
25953
  FORMAT: 'json',
25876
25954
  };
25877
25955
  class RecordApiFormComponent {
@@ -25900,6 +25978,8 @@ class RecordApiFormComponent {
25900
25978
  }
25901
25979
  return outputUrl;
25902
25980
  }));
25981
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
25982
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25903
25983
  }
25904
25984
  set apiLink(value) {
25905
25985
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25909,10 +25989,11 @@ class RecordApiFormComponent {
25909
25989
  this.offset$.next(value);
25910
25990
  }
25911
25991
  setLimit(value) {
25912
- this.limit$.next(value);
25992
+ const newLimit = value === '' ? '-1' : value;
25993
+ this.limit$.next(newLimit);
25913
25994
  }
25914
25995
  setFormat(value) {
25915
- this.format$.next(value);
25996
+ this.format$.next(String(value));
25916
25997
  }
25917
25998
  resetUrl() {
25918
25999
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25920,11 +26001,11 @@ class RecordApiFormComponent {
25920
26001
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25921
26002
  }
25922
26003
  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 }); }
26004
+ 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
26005
  }
25925
26006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25926
26007
  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"] }]
26008
+ 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
26009
  }], propDecorators: { apiLink: [{
25929
26010
  type: Input
25930
26011
  }] } });
@@ -25937,11 +26018,11 @@ class ImageOverlayPreviewComponent {
25937
26018
  basicLightbox.create(`<img src="${src}"/>`).show();
25938
26019
  }
25939
26020
  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"] }] }); }
26021
+ 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
26022
  }
25942
26023
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25943
26024
  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" }]
26025
+ 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
26026
  }], propDecorators: { imageUrl: [{
25946
26027
  type: Input
25947
26028
  }], isPlaceholderShown: [{
@@ -25996,6 +26077,7 @@ class UiElementsModule {
25996
26077
  AvatarComponent,
25997
26078
  UserPreviewComponent,
25998
26079
  PaginationButtonsComponent,
26080
+ MaxLinesComponent,
25999
26081
  RecordApiFormComponent,
26000
26082
  MarkdownParserComponent,
26001
26083
  ImageOverlayPreviewComponent] }); }
@@ -26068,6 +26150,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26068
26150
  AvatarComponent,
26069
26151
  UserPreviewComponent,
26070
26152
  PaginationButtonsComponent,
26153
+ MaxLinesComponent,
26071
26154
  RecordApiFormComponent,
26072
26155
  MarkdownParserComponent,
26073
26156
  ImageOverlayPreviewComponent,
@@ -26075,143 +26158,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26075
26158
  }]
26076
26159
  }] });
26077
26160
 
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
26161
  class UiSearchModule {
26216
26162
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26217
26163
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26224,8 +26170,7 @@ class UiSearchModule {
26224
26170
  ResultsHitsNumberComponent,
26225
26171
  ResultsListItemComponent,
26226
26172
  RecordPreviewFeedComponent,
26227
- RecordPreviewRowComponent,
26228
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26173
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26229
26174
  FacetsModule$1,
26230
26175
  FormsModule,
26231
26176
  ReactiveFormsModule,
@@ -26236,7 +26181,8 @@ class UiSearchModule {
26236
26181
  UiElementsModule,
26237
26182
  MatIconModule,
26238
26183
  MatCheckboxModule,
26239
- RouterLink], exports: [RecordPreviewListComponent,
26184
+ RouterLink,
26185
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26240
26186
  RecordPreviewCardComponent,
26241
26187
  RecordPreviewTextComponent,
26242
26188
  RecordPreviewTitleComponent,
@@ -26246,8 +26192,7 @@ class UiSearchModule {
26246
26192
  RecordPreviewComponent,
26247
26193
  ResultsHitsNumberComponent,
26248
26194
  RecordPreviewFeedComponent,
26249
- RecordPreviewRowComponent,
26250
- RecordTableComponent] }); }
26195
+ RecordPreviewRowComponent] }); }
26251
26196
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26252
26197
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26253
26198
  ], imports: [CommonModule,
@@ -26262,7 +26207,8 @@ class UiSearchModule {
26262
26207
  UiInputsModule,
26263
26208
  UiElementsModule,
26264
26209
  MatIconModule,
26265
- MatCheckboxModule, FacetsModule$1] }); }
26210
+ MatCheckboxModule,
26211
+ InteractiveTableComponent, FacetsModule$1] }); }
26266
26212
  }
26267
26213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26268
26214
  type: NgModule,
@@ -26279,7 +26225,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26279
26225
  ResultsListItemComponent,
26280
26226
  RecordPreviewFeedComponent,
26281
26227
  RecordPreviewRowComponent,
26282
- RecordTableComponent,
26283
26228
  ],
26284
26229
  imports: [
26285
26230
  CommonModule,
@@ -26296,6 +26241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26296
26241
  MatIconModule,
26297
26242
  MatCheckboxModule,
26298
26243
  RouterLink,
26244
+ InteractiveTableComponent,
26299
26245
  ],
26300
26246
  exports: [
26301
26247
  RecordPreviewListComponent,
@@ -26309,7 +26255,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26309
26255
  ResultsHitsNumberComponent,
26310
26256
  RecordPreviewFeedComponent,
26311
26257
  RecordPreviewRowComponent,
26312
- RecordTableComponent,
26313
26258
  ],
26314
26259
  providers: [
26315
26260
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26868,6 +26813,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26868
26813
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26869
26814
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26870
26815
 
26816
+ // this geometry will be used to filter & boost results accordingly
26817
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26818
+
26871
26819
  class SearchFacade {
26872
26820
  constructor(store, filterGeometry) {
26873
26821
  this.store = store;
@@ -26972,6 +26920,7 @@ class SearchFacade {
26972
26920
  this.store.dispatch(new SetFilters({}, this.searchId));
26973
26921
  this.store.dispatch(new SetSortBy([], this.searchId));
26974
26922
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
26923
+ return this;
26975
26924
  }
26976
26925
  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
26926
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27356,8 +27305,11 @@ class FuzzySearchComponent {
27356
27305
  this.searchService.updateFilters({ any });
27357
27306
  }
27358
27307
  }
27359
- handleInputCleared() {
27360
- this.searchService.updateFilters({ any: '' });
27308
+ async handleInputCleared() {
27309
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27310
+ if (currentSearchFilters.any) {
27311
+ this.searchService.updateFilters({ any: '' });
27312
+ }
27361
27313
  }
27362
27314
  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
27315
  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 +27389,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27437
27389
  args: [RESULTS_LAYOUT_CONFIG]
27438
27390
  }] }]; } });
27439
27391
 
27392
+ // expects the replacement key ${uuid}
27393
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27394
+
27440
27395
  class FavoriteStarComponent {
27441
27396
  set record(value) {
27442
27397
  this.record_ = value;
@@ -27698,9 +27653,11 @@ class SearchEffects {
27698
27653
  // I could not get this to work (maybe a bug in rxjs?)
27699
27654
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27700
27655
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27701
- return of([state, favorites, null]);
27656
+ return of([state, favorites, undefined]);
27702
27657
  }
27703
27658
  return this.filterGeometry$.pipe(tap$2((geom) => {
27659
+ if (!geom)
27660
+ return;
27704
27661
  try {
27705
27662
  const trace = valid$1(geom, true);
27706
27663
  if (trace?.length > 0) {
@@ -27712,7 +27669,7 @@ class SearchEffects {
27712
27669
  throw new Error();
27713
27670
  }
27714
27671
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27715
- return of([state, favorites, null]);
27672
+ return of([state, favorites, undefined]);
27716
27673
  }));
27717
27674
  }), switchMap$1(([state, favorites, geometry]) => {
27718
27675
  const { currentPage, pageSize, sort } = state.params;
@@ -27811,10 +27768,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27811
27768
  class AbstractSearchField {
27812
27769
  }
27813
27770
  class SimpleSearchField {
27814
- constructor(esFieldName, order = 'asc', injector) {
27771
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27815
27772
  this.esFieldName = esFieldName;
27816
- this.order = order;
27817
27773
  this.injector = injector;
27774
+ this.order = order;
27775
+ this.orderType = orderType;
27818
27776
  this.repository = this.injector.get(RecordsRepositoryInterface);
27819
27777
  // FIXME: this is required to register runtime fields; abstract this as well
27820
27778
  this.esService = this.injector.get(ElasticsearchService);
@@ -27825,12 +27783,12 @@ class SimpleSearchField {
27825
27783
  type: 'terms',
27826
27784
  field: this.esFieldName,
27827
27785
  limit: 1000,
27828
- sort: [this.order, 'key'],
27786
+ sort: [this.order, this.orderType],
27829
27787
  },
27830
27788
  };
27831
27789
  }
27832
27790
  async getBucketLabel(bucket) {
27833
- return bucket.term;
27791
+ return bucket.term.toString();
27834
27792
  }
27835
27793
  getAvailableValues() {
27836
27794
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27858,9 +27816,13 @@ class SimpleSearchField {
27858
27816
  return of(values);
27859
27817
  }
27860
27818
  }
27861
- class KeySearchField extends SimpleSearchField {
27862
- constructor() {
27863
- super(...arguments);
27819
+ class TranslatedSearchField extends SimpleSearchField {
27820
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27821
+ super(esFieldName, injector, order, orderType);
27822
+ this.esFieldName = esFieldName;
27823
+ this.injector = injector;
27824
+ this.order = order;
27825
+ this.orderType = orderType;
27864
27826
  this.platformService = this.injector.get(PlatformServiceInterface);
27865
27827
  }
27866
27828
  async getTranslation(key) {
@@ -27870,26 +27832,36 @@ class KeySearchField extends SimpleSearchField {
27870
27832
  return (await this.getTranslation(bucket.term)) || bucket.term;
27871
27833
  }
27872
27834
  getAvailableValues() {
27835
+ if (this.orderType === 'count')
27836
+ return super.getAvailableValues();
27873
27837
  // sort values by alphabetical order
27874
27838
  return super
27875
27839
  .getAvailableValues()
27876
27840
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27877
27841
  }
27878
27842
  }
27879
- class ThesaurusField extends KeySearchField {
27880
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27881
- super(esFieldName, order, injector);
27882
- this.thesaurusName = thesaurusName;
27843
+ /**
27844
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
27845
+ * to the defined METADATA_LANGUAGE token
27846
+ * The provided ES field name should not include any prefix such as `.langeng`
27847
+ */
27848
+ class MultilingualSearchField extends SimpleSearchField {
27849
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27850
+ super(esFieldName, injector, order, orderType);
27851
+ this.esFieldName = esFieldName;
27852
+ this.injector = injector;
27853
+ this.order = order;
27854
+ this.orderType = orderType;
27883
27855
  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)));
27856
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
27857
+ // note: we're excluding the metadata language "current" value because that would produce
27858
+ // permalinks that might not work for different users
27859
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
27860
+ this.esFieldName += `.lang${this.searchLanguage}`;
27861
+ }
27862
+ else {
27863
+ this.esFieldName += '.default';
27864
+ }
27893
27865
  }
27894
27866
  }
27895
27867
  class FullTextSearchField {
@@ -27909,7 +27881,7 @@ marker('search.filters.isSpatial.yes');
27909
27881
  marker('search.filters.isSpatial.no');
27910
27882
  class IsSpatialSearchField extends SimpleSearchField {
27911
27883
  constructor(injector) {
27912
- super('isSpatial', 'asc', injector);
27884
+ super('isSpatial', injector, 'asc');
27913
27885
  this.translateService = this.injector.get(TranslateService);
27914
27886
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27915
27887
  String formats = doc.format.join('|').toLowerCase();
@@ -27959,7 +27931,7 @@ marker('search.filters.license.unknown');
27959
27931
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27960
27932
  class LicenseSearchField extends SimpleSearchField {
27961
27933
  constructor(injector) {
27962
- super('license', 'asc', injector);
27934
+ super('license', injector, 'asc');
27963
27935
  this.translateService = this.injector.get(TranslateService);
27964
27936
  this.esService.registerRuntimeField('license', `String raw = '';
27965
27937
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -28043,7 +28015,7 @@ class OrganizationSearchField {
28043
28015
  }
28044
28016
  class OwnerSearchField extends SimpleSearchField {
28045
28017
  constructor(injector) {
28046
- super('owner', 'asc', injector);
28018
+ super('owner', injector, 'asc');
28047
28019
  }
28048
28020
  getAvailableValues() {
28049
28021
  return of([]);
@@ -28052,6 +28024,7 @@ class OwnerSearchField extends SimpleSearchField {
28052
28024
 
28053
28025
  marker('search.filters.format');
28054
28026
  marker('search.filters.inspireKeyword');
28027
+ marker('search.filters.keyword');
28055
28028
  marker('search.filters.isSpatial');
28056
28029
  marker('search.filters.license');
28057
28030
  marker('search.filters.publicationYear');
@@ -28069,13 +28042,14 @@ class FieldsService {
28069
28042
  this.injector = injector;
28070
28043
  this.fields = {
28071
28044
  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),
28045
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28046
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28047
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28048
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28049
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28050
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28051
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28052
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
28079
28053
  isSpatial: new IsSpatialSearchField(this.injector),
28080
28054
  q: new FullTextSearchField(),
28081
28055
  license: new LicenseSearchField(this.injector),
@@ -28149,10 +28123,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28149
28123
  type: Input
28150
28124
  }] } });
28151
28125
 
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
28126
  class FeatureSearchModule {
28157
28127
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28158
28128
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28251,6 +28221,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28251
28221
  }]
28252
28222
  }] });
28253
28223
 
28224
+ class ResultsTableComponent {
28225
+ constructor(searchFacade, searchService, selectionService) {
28226
+ this.searchFacade = searchFacade;
28227
+ this.searchService = searchService;
28228
+ this.selectionService = selectionService;
28229
+ this.recordClick = new EventEmitter();
28230
+ this.records$ = this.searchFacade.results$;
28231
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28232
+ }
28233
+ dateToString(date) {
28234
+ return date?.toLocaleDateString(undefined, {
28235
+ year: 'numeric',
28236
+ month: 'long',
28237
+ day: 'numeric',
28238
+ timeZone: 'UTC',
28239
+ });
28240
+ }
28241
+ getStatus(isPublishedToAll) {
28242
+ return isPublishedToAll ? 'published' : 'not published';
28243
+ }
28244
+ getRecordFormats(record) {
28245
+ if (record.kind === 'service' || !('distributions' in record)) {
28246
+ return [];
28247
+ }
28248
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28249
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28250
+ return formats;
28251
+ }
28252
+ formatUserInfo(userInfo) {
28253
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28254
+ if (infos && infos.length === 4) {
28255
+ return `${infos[2]} ${infos[1]}`;
28256
+ }
28257
+ return undefined;
28258
+ }
28259
+ getBadgeColor(format) {
28260
+ return getBadgeColor(format);
28261
+ }
28262
+ handleRecordClick(item) {
28263
+ this.recordClick.emit(item);
28264
+ }
28265
+ setSortBy(col, order) {
28266
+ this.searchService.setSortBy([order, col]);
28267
+ }
28268
+ isSortedBy(col) {
28269
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28270
+ const sortArray = Array.isArray(sortOrder[0])
28271
+ ? sortOrder
28272
+ : [sortOrder];
28273
+ for (const sort of sortArray) {
28274
+ if (sort[1] === col) {
28275
+ return sort[0];
28276
+ }
28277
+ }
28278
+ return null;
28279
+ }));
28280
+ }
28281
+ isChecked(record) {
28282
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28283
+ return selectedRecords.includes(record.uniqueIdentifier);
28284
+ }));
28285
+ }
28286
+ handleRecordSelectedChange(selected, record) {
28287
+ if (!selected) {
28288
+ this.selectionService.deselectRecords([record]);
28289
+ }
28290
+ else {
28291
+ this.selectionService.selectRecords([record]);
28292
+ }
28293
+ }
28294
+ async toggleSelectAll() {
28295
+ const records = await firstValueFrom(this.records$);
28296
+ if (await firstValueFrom(this.isAllSelected())) {
28297
+ this.selectionService.deselectRecords(records);
28298
+ }
28299
+ else {
28300
+ this.selectionService.selectRecords(records);
28301
+ }
28302
+ }
28303
+ isAllSelected() {
28304
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28305
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28306
+ }));
28307
+ }
28308
+ isSomeSelected() {
28309
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28310
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28311
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28312
+ return !allSelected && someSelected;
28313
+ }));
28314
+ }
28315
+ 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 }); }
28316
+ 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"] }] }); }
28317
+ }
28318
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28319
+ type: Component,
28320
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28321
+ CommonModule,
28322
+ UiInputsModule,
28323
+ InteractiveTableComponent,
28324
+ InteractiveTableColumnComponent,
28325
+ MatIconModule,
28326
+ TranslateModule,
28327
+ ], 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" }]
28328
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28329
+ type: Output
28330
+ }] } });
28331
+
28254
28332
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28255
28333
  get mapLinks() {
28256
28334
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28577,6 +28655,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28577
28655
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28578
28656
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28579
28657
 
28658
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28659
+ class GeocodingService {
28660
+ constructor(provider) {
28661
+ this.provider = provider;
28662
+ }
28663
+ query(text) {
28664
+ let queryObservable;
28665
+ switch (this.provider[0]) {
28666
+ case 'geoadmin':
28667
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28668
+ break;
28669
+ case 'geonames':
28670
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28671
+ break;
28672
+ case 'data-gouv-fr':
28673
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28674
+ break;
28675
+ default:
28676
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28677
+ }
28678
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28679
+ }
28680
+ 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 }); }
28681
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28682
+ }
28683
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28684
+ type: Injectable,
28685
+ args: [{
28686
+ providedIn: 'root',
28687
+ }]
28688
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28689
+ type: Inject,
28690
+ args: [GEOCODING_PROVIDER]
28691
+ }] }]; } });
28692
+
28693
+ class GeocodingComponent {
28694
+ constructor(mapManager, geocodingService) {
28695
+ this.mapManager = mapManager;
28696
+ this.geocodingService = geocodingService;
28697
+ this.searchText = '';
28698
+ this.results = [];
28699
+ this.searchTextChanged = new Subject();
28700
+ this.destroy$ = new Subject();
28701
+ this.errorMessage = null;
28702
+ this.searchTextChanged
28703
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28704
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28705
+ this.errorMessage =
28706
+ 'An error occurred while searching. Please try again.';
28707
+ console.error(error);
28708
+ return [];
28709
+ }));
28710
+ }), takeUntil(this.destroy$))
28711
+ .subscribe((results) => {
28712
+ this.results = results;
28713
+ });
28714
+ }
28715
+ ngOnDestroy() {
28716
+ this.destroy$.next();
28717
+ this.destroy$.complete();
28718
+ }
28719
+ onSearchChange(searchText) {
28720
+ if (!searchText) {
28721
+ this.clearSearch();
28722
+ return;
28723
+ }
28724
+ else {
28725
+ this.searchTextChanged.next(searchText);
28726
+ }
28727
+ }
28728
+ clearSearch() {
28729
+ this.searchText = '';
28730
+ this.results = [];
28731
+ this.errorMessage = null;
28732
+ }
28733
+ zoomToLocation(result) {
28734
+ const map = this.mapManager.map;
28735
+ const view = map.getView();
28736
+ const geometry = result.geom;
28737
+ if (geometry.type === 'Point') {
28738
+ this.zoomToPoint(geometry.coordinates, view);
28739
+ }
28740
+ else if (geometry.type === 'Polygon') {
28741
+ this.zoomToPolygon(geometry.coordinates, view);
28742
+ }
28743
+ else {
28744
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28745
+ }
28746
+ }
28747
+ zoomToPoint(pointCoords, view) {
28748
+ const transformedCoords = fromLonLat(pointCoords);
28749
+ view.setCenter(transformedCoords);
28750
+ view.setZoom(12);
28751
+ }
28752
+ zoomToPolygon(polygonCoords, view) {
28753
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28754
+ const polygon = new Polygon([transformedCoords]);
28755
+ view.fit(polygon, {
28756
+ duration: 100,
28757
+ maxZoom: 12,
28758
+ });
28759
+ }
28760
+ onEnterPress() {
28761
+ if (this.results && this.results.length > 0) {
28762
+ this.zoomToLocation(this.results[0]);
28763
+ }
28764
+ }
28765
+ 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 }); }
28766
+ 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" }] }); }
28767
+ }
28768
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28769
+ type: Component,
28770
+ 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" }]
28771
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28772
+
28580
28773
  class FeatureMapModule {
28581
28774
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28582
28775
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28587,7 +28780,8 @@ class FeatureMapModule {
28587
28780
  AddLayerRecordPreviewComponent,
28588
28781
  AddLayerFromWmsComponent,
28589
28782
  AddLayerFromFileComponent,
28590
- AddLayerFromWfsComponent], imports: [CommonModule,
28783
+ AddLayerFromWfsComponent,
28784
+ GeocodingComponent], imports: [CommonModule,
28591
28785
  UiMapModule,
28592
28786
  UiLayoutModule,
28593
28787
  MatIconModule,
@@ -28598,13 +28792,18 @@ class FeatureMapModule {
28598
28792
  MapInstanceDirective,
28599
28793
  LayersPanelComponent,
28600
28794
  AddLayerFromCatalogComponent,
28601
- MapContainerComponent] }); }
28795
+ MapContainerComponent,
28796
+ GeocodingComponent] }); }
28602
28797
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28603
28798
  {
28604
28799
  provide: FEATURE_MAP_OPTIONS,
28605
28800
  useValue: defaultMapOptions,
28606
28801
  },
28607
28802
  MapFacade,
28803
+ {
28804
+ provide: GEOCODING_PROVIDER,
28805
+ useValue: ['geonames', { maxRows: 5 }],
28806
+ },
28608
28807
  ], imports: [CommonModule,
28609
28808
  UiMapModule,
28610
28809
  UiLayoutModule,
@@ -28630,6 +28829,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28630
28829
  AddLayerFromWmsComponent,
28631
28830
  AddLayerFromFileComponent,
28632
28831
  AddLayerFromWfsComponent,
28832
+ GeocodingComponent,
28633
28833
  ],
28634
28834
  exports: [
28635
28835
  MapContextComponent,
@@ -28637,6 +28837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28637
28837
  LayersPanelComponent,
28638
28838
  AddLayerFromCatalogComponent,
28639
28839
  MapContainerComponent,
28840
+ GeocodingComponent,
28640
28841
  ],
28641
28842
  imports: [
28642
28843
  CommonModule,
@@ -28657,6 +28858,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28657
28858
  useValue: defaultMapOptions,
28658
28859
  },
28659
28860
  MapFacade,
28861
+ {
28862
+ provide: GEOCODING_PROVIDER,
28863
+ useValue: ['geonames', { maxRows: 5 }],
28864
+ },
28660
28865
  ],
28661
28866
  }]
28662
28867
  }] });
@@ -28751,7 +28956,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28751
28956
  ...state,
28752
28957
  chartConfig,
28753
28958
  })), on(close, (state) => {
28754
- // eslint-disable-next-line
28959
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28755
28960
  const { metadata, related, ...stateWithoutMd } = state;
28756
28961
  return stateWithoutMd;
28757
28962
  }));
@@ -30018,15 +30223,16 @@ class DataService {
30018
30223
  // Pour DL toutes les données
30019
30224
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
30020
30225
  ...wfsLink,
30226
+ type: 'download',
30021
30227
  url: new URL(urls[format]),
30022
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30228
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
30023
30229
  }))));
30024
30230
  }
30025
30231
  getDownloadLinksFromEsriRest(esriRestLink) {
30026
30232
  return ['json', 'geojson'].map((format) => ({
30027
30233
  ...esriRestLink,
30028
30234
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
30029
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30235
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
30030
30236
  }));
30031
30237
  }
30032
30238
  readAsGeoJson(link) {
@@ -30420,12 +30626,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30420
30626
  }] } });
30421
30627
 
30422
30628
  class MapViewComponent {
30423
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30629
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30424
30630
  this.mdViewFacade = mdViewFacade;
30425
30631
  this.mapManager = mapManager;
30426
30632
  this.mapUtils = mapUtils;
30427
30633
  this.dataService = dataService;
30428
- this.proxy = proxy;
30429
30634
  this.featureInfo = featureInfo;
30430
30635
  this.changeRef = changeRef;
30431
30636
  this.styleService = styleService;
@@ -30460,7 +30665,7 @@ class MapViewComponent {
30460
30665
  return of([]);
30461
30666
  }), finalize(() => (this.loading = false)));
30462
30667
  }));
30463
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30668
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30464
30669
  console.warn(error); // FIXME: report this to the user somehow
30465
30670
  return of(undefined);
30466
30671
  }), map$1((extent) => ({
@@ -30468,7 +30673,18 @@ class MapViewComponent {
30468
30673
  view: {
30469
30674
  extent,
30470
30675
  },
30471
- })), tap$1(() => this.resetSelection()))));
30676
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30677
+ if (context.view.extent)
30678
+ return context;
30679
+ const extent = this.mapUtils.getRecordExtent(metadata);
30680
+ return {
30681
+ ...context,
30682
+ view: {
30683
+ ...context.view,
30684
+ extent,
30685
+ },
30686
+ };
30687
+ }));
30472
30688
  }
30473
30689
  ngOnDestroy() {
30474
30690
  this.subscription.unsubscribe();
@@ -30521,13 +30737,13 @@ class MapViewComponent {
30521
30737
  selectLinkToDisplay(link) {
30522
30738
  this.selectedLinkIndex$.next(link);
30523
30739
  }
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 }); }
30740
+ 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
30741
  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
30742
  }
30527
30743
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30528
30744
  type: Component,
30529
30745
  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 }]; } });
30746
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30531
30747
 
30532
30748
  class DataViewComponent {
30533
30749
  constructor(mdViewFacade) {
@@ -30979,13 +31195,6 @@ class MyOrgService {
30979
31195
  constructor(platformService, orgService) {
30980
31196
  this.platformService = platformService;
30981
31197
  this.orgService = orgService;
30982
- this.myOrgDataSubject = new BehaviorSubject({
30983
- orgName: '',
30984
- logoUrl: '',
30985
- recordCount: 0,
30986
- userCount: 0,
30987
- userList: [],
30988
- });
30989
31198
  this.myOrgData$ = combineLatest([
30990
31199
  this.platformService.getMe(),
30991
31200
  this.platformService.getUsers(),
@@ -31004,7 +31213,7 @@ class MyOrgService {
31004
31213
  userList,
31005
31214
  userCount,
31006
31215
  };
31007
- }));
31216
+ }), shareReplay(1));
31008
31217
  }
31009
31218
  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
31219
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31697,11 +31906,11 @@ class RecordFormComponent {
31697
31906
  return field.config.model;
31698
31907
  }
31699
31908
  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 }); }
31909
+ 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
31910
  }
31702
31911
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31703
31912
  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" }]
31913
+ 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
31914
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31706
31915
 
31707
31916
  const ROUTER_STATE_KEY = 'router';
@@ -32069,5 +32278,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32069
32278
  * Generated bundle index. Do not edit.
32070
32279
  */
32071
32280
 
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 };
32281
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32073
32282
  //# sourceMappingURL=geonetwork-ui.mjs.map