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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) 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/selection/selection.service.mjs +13 -26
  9. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  10. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  12. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  14. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  15. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  16. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  17. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  18. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  19. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  20. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  21. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +17 -3
  22. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  23. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  24. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  25. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  26. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  27. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  28. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  29. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +1 -1
  30. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  31. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  32. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  33. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  34. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  35. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  36. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  37. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  38. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  39. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  40. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  41. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  42. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  43. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  44. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -22
  45. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +2 -3
  46. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  47. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +3 -1
  48. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  49. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  50. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  51. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  52. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  53. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  54. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +8 -3
  55. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  56. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  57. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  58. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  59. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  60. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  61. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  62. package/esm2022/translations/de.json +6 -4
  63. package/esm2022/translations/en.json +9 -7
  64. package/esm2022/translations/es.json +6 -4
  65. package/esm2022/translations/fr.json +9 -7
  66. package/esm2022/translations/it.json +8 -6
  67. package/esm2022/translations/nl.json +6 -4
  68. package/esm2022/translations/pt.json +6 -4
  69. package/fesm2022/geonetwork-ui.mjs +730 -577
  70. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  71. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  72. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  73. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  74. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  75. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  76. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  77. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
  78. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  79. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  80. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  81. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  82. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  83. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  84. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  85. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +15 -15
  86. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  87. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  88. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  89. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  90. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  91. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  92. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  93. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  94. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  95. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  96. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  97. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  98. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  99. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  100. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  101. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  102. package/libs/feature/map/src/index.d.ts +1 -0
  103. package/libs/feature/map/src/index.d.ts.map +1 -1
  104. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  105. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  106. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  107. package/libs/feature/map/src/lib/feature-map.module.d.ts +13 -12
  108. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  109. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  110. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  111. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  112. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  113. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  114. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  115. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  116. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  117. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  118. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  119. package/libs/feature/search/src/index.d.ts +3 -0
  120. package/libs/feature/search/src/index.d.ts.map +1 -1
  121. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  122. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  123. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  124. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  125. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  126. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  127. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  128. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  129. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  130. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  131. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  132. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  133. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  134. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  135. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  136. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  137. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  138. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  139. package/libs/ui/elements/src/index.d.ts +1 -0
  140. package/libs/ui/elements/src/index.d.ts.map +1 -1
  141. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  142. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +7 -3
  143. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  144. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  145. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  146. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  147. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +1 -1
  148. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  149. package/libs/ui/inputs/src/index.d.ts +1 -0
  150. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  151. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  152. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  153. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  154. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  155. package/libs/ui/layout/src/index.d.ts +2 -0
  156. package/libs/ui/layout/src/index.d.ts.map +1 -1
  157. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  158. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  159. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  160. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  161. package/libs/ui/search/src/index.d.ts +0 -1
  162. package/libs/ui/search/src/index.d.ts.map +1 -1
  163. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  164. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  165. package/libs/util/i18n/src/index.d.ts +0 -1
  166. package/libs/util/i18n/src/index.d.ts.map +1 -1
  167. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  168. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  169. package/package.json +4 -1
  170. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
  171. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
  172. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
  173. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  174. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +112 -65
  175. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +3 -2
  176. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
  177. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
  178. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
  179. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  180. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  181. package/src/libs/common/domain/src/lib/index.ts +2 -0
  182. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +17 -18
  183. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  184. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  185. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  186. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  187. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  188. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  189. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -2
  190. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  191. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  192. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  193. package/src/libs/feature/map/src/index.ts +1 -0
  194. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  195. package/src/libs/feature/map/src/lib/feature-map.module.ts +8 -0
  196. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  197. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  198. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  199. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  200. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  201. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  202. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  203. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  204. package/src/libs/feature/search/src/index.ts +3 -0
  205. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  206. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  207. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  208. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  209. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  210. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  211. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  212. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  213. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  214. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  215. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  216. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  217. package/src/libs/ui/elements/src/index.ts +1 -0
  218. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  219. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
  220. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  221. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  222. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +45 -18
  223. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +31 -12
  224. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +1 -2
  225. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  226. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  227. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -0
  228. package/src/libs/ui/inputs/src/index.ts +1 -0
  229. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  230. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  231. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  232. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  233. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  234. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  235. package/src/libs/ui/layout/src/index.ts +2 -0
  236. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  237. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  238. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  239. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  240. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  241. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  242. package/src/libs/ui/search/src/index.ts +0 -1
  243. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  244. package/src/libs/util/i18n/src/index.ts +0 -1
  245. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  246. package/translations/de.json +6 -4
  247. package/translations/en.json +9 -7
  248. package/translations/es.json +6 -4
  249. package/translations/fr.json +9 -7
  250. package/translations/it.json +8 -6
  251. package/translations/nl.json +6 -4
  252. package/translations/pt.json +6 -4
  253. package/translations/sk.json +6 -4
  254. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  255. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  256. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  257. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  258. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  259. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  260. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  261. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  262. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  263. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  264. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  265. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  266. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  267. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  268. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  269. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  270. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  271. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  272. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  273. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  274. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  275. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  276. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  277. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  278. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  279. /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",
@@ -17027,20 +16920,21 @@ var en = {
17027
16920
  "chart.type.line": "line chart",
17028
16921
  "chart.type.lineSmooth": "smooth line chart",
17029
16922
  "chart.type.pie": "pie chart",
16923
+ "dashboard.createRecord": "New record",
17030
16924
  "dashboard.labels.mySpace": "My space",
17031
- "dashboard.records.all": "Catalog",
16925
+ "dashboard.records.all": "Metadata records",
17032
16926
  "dashboard.records.myDraft": "My drafts",
17033
16927
  "dashboard.records.myLibrary": "My library",
17034
16928
  "dashboard.records.myOrg": "Organization",
17035
16929
  "dashboard.records.myRecords": "My Records",
17036
- "dashboard.records.noRecord": "No record for this organization",
17037
- "dashboard.records.noUser": "No users for this organization",
17038
16930
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17039
16931
  "dashboard.records.search": "Search for \"{searchText}\"",
17040
16932
  "dashboard.records.userDetail": "Name",
17041
16933
  "dashboard.records.userEmail": "Email",
17042
16934
  "dashboard.records.username": "Username",
17043
16935
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
16936
+ "dashboard.results.listMetadata": "Show metadata",
16937
+ "dashboard.results.listResources": "Show resources",
17044
16938
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17045
16939
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17046
16940
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17188,6 +17082,7 @@ var en = {
17188
17082
  "map.add.layer.wfs": "From WFS",
17189
17083
  "map.add.layer.wms": "From WMS",
17190
17084
  "map.addFromFile.placeholder": "Click or drop a file here",
17085
+ "map.geocoding.placeholder": "Search for a place",
17191
17086
  "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17192
17087
  "map.layer.add": "Add",
17193
17088
  "map.layers.available": "Available Layers",
@@ -17231,16 +17126,15 @@ var en = {
17231
17126
  "record.metadata.author": "Author",
17232
17127
  "record.metadata.catalog": "Catalog",
17233
17128
  "record.metadata.contact": "Contact",
17234
- "record.metadata.createdOn": "Created on",
17235
17129
  "record.metadata.details": "Technical information",
17236
17130
  "record.metadata.download": "Downloads",
17237
17131
  "record.metadata.formats": "Formats",
17238
- "record.metadata.isOpenData": "Open Data",
17239
17132
  "record.metadata.keywords": "Keywords",
17240
17133
  "record.metadata.lastUpdate": "Last updated on",
17241
17134
  "record.metadata.links": "Links",
17242
17135
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17243
17136
  "record.metadata.origin": "About the data",
17137
+ "record.metadata.otherConstraints": "Additional Conditions",
17244
17138
  "record.metadata.owner": "Catalog of origin",
17245
17139
  "record.metadata.preview": "Preview",
17246
17140
  "record.metadata.publications": "publications",
@@ -17264,14 +17158,15 @@ var en = {
17264
17158
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17265
17159
  "record.metadata.related": "Related records",
17266
17160
  "record.metadata.sheet": "Original metadata",
17161
+ "record.metadata.status": "Status",
17267
17162
  "record.metadata.themes": "Categories",
17268
17163
  "record.metadata.title": "Title",
17269
17164
  "record.metadata.type": "Geographical dataset",
17270
17165
  "record.metadata.uniqueId": "Unique Identifier",
17271
17166
  "record.metadata.updateFrequency": "Data Update Frequency",
17272
17167
  "record.metadata.updateStatus": "Data Update Status",
17273
- "record.metadata.updatedOn": "Metadata's last update",
17274
- "record.metadata.usage": "Usage & constraints",
17168
+ "record.metadata.updatedOn": "Last Data Information Update",
17169
+ "record.metadata.usage": "License and Conditions",
17275
17170
  "record.more.details": "Read more",
17276
17171
  "record.tab.chart": "Chart",
17277
17172
  "record.tab.data": "Table",
@@ -17365,20 +17260,21 @@ var es = {
17365
17260
  "chart.type.line": "gráfico de líneas",
17366
17261
  "chart.type.lineSmooth": "gráfico de líneas suave",
17367
17262
  "chart.type.pie": "gráfico circular",
17263
+ "dashboard.createRecord": "",
17368
17264
  "dashboard.labels.mySpace": "Mi espacio",
17369
17265
  "dashboard.records.all": "Catálogo",
17370
17266
  "dashboard.records.myDraft": "Mis borradores",
17371
17267
  "dashboard.records.myLibrary": "Mi biblioteca",
17372
17268
  "dashboard.records.myOrg": "Organización",
17373
17269
  "dashboard.records.myRecords": "Mis Registros",
17374
- "dashboard.records.noRecord": "",
17375
- "dashboard.records.noUser": "",
17376
17270
  "dashboard.records.publishedRecords": "",
17377
17271
  "dashboard.records.search": "Buscar \"{searchText}\"",
17378
17272
  "dashboard.records.userDetail": "",
17379
17273
  "dashboard.records.userEmail": "",
17380
17274
  "dashboard.records.username": "",
17381
17275
  "dashboard.records.users": "",
17276
+ "dashboard.results.listMetadata": "",
17277
+ "dashboard.results.listResources": "",
17382
17278
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17383
17279
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17384
17280
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17526,6 +17422,7 @@ var es = {
17526
17422
  "map.add.layer.wfs": "",
17527
17423
  "map.add.layer.wms": "",
17528
17424
  "map.addFromFile.placeholder": "",
17425
+ "map.geocoding.placeholder": "",
17529
17426
  "map.help.addFromFile": "",
17530
17427
  "map.layer.add": "",
17531
17428
  "map.layers.available": "",
@@ -17569,16 +17466,15 @@ var es = {
17569
17466
  "record.metadata.author": "",
17570
17467
  "record.metadata.catalog": "",
17571
17468
  "record.metadata.contact": "",
17572
- "record.metadata.createdOn": "",
17573
17469
  "record.metadata.details": "",
17574
17470
  "record.metadata.download": "",
17575
17471
  "record.metadata.formats": "",
17576
- "record.metadata.isOpenData": "",
17577
17472
  "record.metadata.keywords": "",
17578
17473
  "record.metadata.lastUpdate": "",
17579
17474
  "record.metadata.links": "",
17580
17475
  "record.metadata.noUsage": "",
17581
17476
  "record.metadata.origin": "",
17477
+ "record.metadata.otherConstraints": "",
17582
17478
  "record.metadata.owner": "",
17583
17479
  "record.metadata.preview": "",
17584
17480
  "record.metadata.publications": "",
@@ -17602,6 +17498,7 @@ var es = {
17602
17498
  "record.metadata.quality.updateFrequency.success": "",
17603
17499
  "record.metadata.related": "",
17604
17500
  "record.metadata.sheet": "",
17501
+ "record.metadata.status": "",
17605
17502
  "record.metadata.themes": "",
17606
17503
  "record.metadata.title": "",
17607
17504
  "record.metadata.type": "",
@@ -17703,20 +17600,21 @@ var fr = {
17703
17600
  "chart.type.line": "ligne",
17704
17601
  "chart.type.lineSmooth": "ligne lisse",
17705
17602
  "chart.type.pie": "camembert",
17603
+ "dashboard.createRecord": "",
17706
17604
  "dashboard.labels.mySpace": "Mon espace",
17707
17605
  "dashboard.records.all": "Catalogue",
17708
17606
  "dashboard.records.myDraft": "Mes brouillons",
17709
17607
  "dashboard.records.myLibrary": "Ma bibliothèque",
17710
17608
  "dashboard.records.myOrg": "Mon organisation",
17711
17609
  "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
17610
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17715
17611
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17716
17612
  "dashboard.records.userDetail": "Nom",
17717
17613
  "dashboard.records.userEmail": "Email",
17718
17614
  "dashboard.records.username": "Nom d'utilisateur",
17719
17615
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17616
+ "dashboard.results.listMetadata": "",
17617
+ "dashboard.results.listResources": "",
17720
17618
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17721
17619
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17722
17620
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17798,7 +17696,7 @@ var fr = {
17798
17696
  "datahub.header.popularRecords": "Les plus appréciées",
17799
17697
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17800
17698
  "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>",
17699
+ "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont pour vous répondre.</p>",
17802
17700
  "datahub.news.contact.title": "Un besoin spécifique ?",
17803
17701
  "datahub.news.feed": "Fil d'activité",
17804
17702
  "datahub.news.figures": "Quelques chiffres",
@@ -17864,6 +17762,7 @@ var fr = {
17864
17762
  "map.add.layer.wfs": "",
17865
17763
  "map.add.layer.wms": "",
17866
17764
  "map.addFromFile.placeholder": "",
17765
+ "map.geocoding.placeholder": "",
17867
17766
  "map.help.addFromFile": "",
17868
17767
  "map.layer.add": "",
17869
17768
  "map.layers.available": "",
@@ -17907,16 +17806,15 @@ var fr = {
17907
17806
  "record.metadata.author": "Auteur",
17908
17807
  "record.metadata.catalog": "Catalogue",
17909
17808
  "record.metadata.contact": "Contact",
17910
- "record.metadata.createdOn": "Créé le",
17911
17809
  "record.metadata.details": "Informations techniques",
17912
17810
  "record.metadata.download": "Téléchargements",
17913
17811
  "record.metadata.formats": "Formats",
17914
- "record.metadata.isOpenData": "Donnée Ouverte",
17915
17812
  "record.metadata.keywords": "Mots clés",
17916
17813
  "record.metadata.lastUpdate": "Mis à jour le",
17917
17814
  "record.metadata.links": "Liens",
17918
17815
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17919
17816
  "record.metadata.origin": "À propos des données",
17817
+ "record.metadata.otherConstraints": "Limitations d'usage",
17920
17818
  "record.metadata.owner": "Catalogue d'origine",
17921
17819
  "record.metadata.preview": "Aperçu",
17922
17820
  "record.metadata.publications": "données",
@@ -17940,14 +17838,15 @@ var fr = {
17940
17838
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17941
17839
  "record.metadata.related": "Voir aussi",
17942
17840
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17841
+ "record.metadata.status": "",
17943
17842
  "record.metadata.themes": "Catégories",
17944
17843
  "record.metadata.title": "Titre",
17945
17844
  "record.metadata.type": "Donnée géographique",
17946
17845
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17947
17846
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17948
17847
  "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",
17848
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17849
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17951
17850
  "record.more.details": "Détails",
17952
17851
  "record.tab.chart": "Graphique",
17953
17852
  "record.tab.data": "Tableau",
@@ -18041,20 +17940,21 @@ var it = {
18041
17940
  "chart.type.line": "grafico a linee",
18042
17941
  "chart.type.lineSmooth": "grafico a linea liscia",
18043
17942
  "chart.type.pie": "grafico a torta",
17943
+ "dashboard.createRecord": "",
18044
17944
  "dashboard.labels.mySpace": "Il mio spazio",
18045
17945
  "dashboard.records.all": "Catalogo",
18046
17946
  "dashboard.records.myDraft": "Le mie bozze",
18047
17947
  "dashboard.records.myLibrary": "La mia biblioteca",
18048
17948
  "dashboard.records.myOrg": "La mia organizzazione",
18049
17949
  "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
17950
  "dashboard.records.publishedRecords": "dati pubblicati",
18053
17951
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18054
17952
  "dashboard.records.userDetail": "Nome",
18055
17953
  "dashboard.records.userEmail": "Email",
18056
17954
  "dashboard.records.username": "Nome utente",
18057
17955
  "dashboard.records.users": "utenti",
17956
+ "dashboard.results.listMetadata": "",
17957
+ "dashboard.results.listResources": "",
18058
17958
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18059
17959
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18060
17960
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18202,6 +18102,7 @@ var it = {
18202
18102
  "map.add.layer.wfs": "Da un WFS",
18203
18103
  "map.add.layer.wms": "Da un WMS",
18204
18104
  "map.addFromFile.placeholder": "",
18105
+ "map.geocoding.placeholder": "",
18205
18106
  "map.help.addFromFile": "",
18206
18107
  "map.layer.add": "",
18207
18108
  "map.layers.available": "",
@@ -18245,16 +18146,15 @@ var it = {
18245
18146
  "record.metadata.author": "Autore",
18246
18147
  "record.metadata.catalog": "Catalogo",
18247
18148
  "record.metadata.contact": "Contatto",
18248
- "record.metadata.createdOn": "Creato il",
18249
18149
  "record.metadata.details": "Informazioni tecniche",
18250
18150
  "record.metadata.download": "Download",
18251
18151
  "record.metadata.formats": "Formati",
18252
- "record.metadata.isOpenData": "Data aperta",
18253
18152
  "record.metadata.keywords": "Parole chiave",
18254
18153
  "record.metadata.lastUpdate": "Ultimo aggiornamento",
18255
18154
  "record.metadata.links": "Collegamenti",
18256
18155
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18257
18156
  "record.metadata.origin": "Informazioni sui dati",
18157
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18258
18158
  "record.metadata.owner": "Catalogo originale",
18259
18159
  "record.metadata.preview": "Anteprima",
18260
18160
  "record.metadata.publications": "pubblicazioni",
@@ -18278,14 +18178,15 @@ var it = {
18278
18178
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18279
18179
  "record.metadata.related": "Vedi anche",
18280
18180
  "record.metadata.sheet": "Origine del metadata",
18181
+ "record.metadata.status": "",
18281
18182
  "record.metadata.themes": "Categorie",
18282
18183
  "record.metadata.title": "Titolo",
18283
18184
  "record.metadata.type": "Dati geografici",
18284
18185
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18285
18186
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18286
18187
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18287
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18288
- "record.metadata.usage": "Condizioni d'uso",
18188
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18189
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18289
18190
  "record.more.details": "Dettagli",
18290
18191
  "record.tab.chart": "Grafico",
18291
18192
  "record.tab.data": "Tabella",
@@ -18379,20 +18280,21 @@ var nl = {
18379
18280
  "chart.type.line": "lijndiagram",
18380
18281
  "chart.type.lineSmooth": "glad lijndiagram",
18381
18282
  "chart.type.pie": "cirkeldiagram",
18283
+ "dashboard.createRecord": "",
18382
18284
  "dashboard.labels.mySpace": "Mijn ruimte",
18383
18285
  "dashboard.records.all": "Catalogus",
18384
18286
  "dashboard.records.myDraft": "Mijn concepten",
18385
18287
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18386
18288
  "dashboard.records.myOrg": "Organisatie",
18387
18289
  "dashboard.records.myRecords": "Mijn Records",
18388
- "dashboard.records.noRecord": "",
18389
- "dashboard.records.noUser": "",
18390
18290
  "dashboard.records.publishedRecords": "",
18391
18291
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18392
18292
  "dashboard.records.userDetail": "",
18393
18293
  "dashboard.records.userEmail": "",
18394
18294
  "dashboard.records.username": "",
18395
18295
  "dashboard.records.users": "",
18296
+ "dashboard.results.listMetadata": "",
18297
+ "dashboard.results.listResources": "",
18396
18298
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18397
18299
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18398
18300
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18540,6 +18442,7 @@ var nl = {
18540
18442
  "map.add.layer.wfs": "",
18541
18443
  "map.add.layer.wms": "",
18542
18444
  "map.addFromFile.placeholder": "",
18445
+ "map.geocoding.placeholder": "",
18543
18446
  "map.help.addFromFile": "",
18544
18447
  "map.layer.add": "",
18545
18448
  "map.layers.available": "",
@@ -18583,16 +18486,15 @@ var nl = {
18583
18486
  "record.metadata.author": "",
18584
18487
  "record.metadata.catalog": "",
18585
18488
  "record.metadata.contact": "",
18586
- "record.metadata.createdOn": "",
18587
18489
  "record.metadata.details": "",
18588
18490
  "record.metadata.download": "",
18589
18491
  "record.metadata.formats": "",
18590
- "record.metadata.isOpenData": "",
18591
18492
  "record.metadata.keywords": "",
18592
18493
  "record.metadata.lastUpdate": "",
18593
18494
  "record.metadata.links": "",
18594
18495
  "record.metadata.noUsage": "",
18595
18496
  "record.metadata.origin": "",
18497
+ "record.metadata.otherConstraints": "",
18596
18498
  "record.metadata.owner": "",
18597
18499
  "record.metadata.preview": "",
18598
18500
  "record.metadata.publications": "",
@@ -18616,6 +18518,7 @@ var nl = {
18616
18518
  "record.metadata.quality.updateFrequency.success": "",
18617
18519
  "record.metadata.related": "",
18618
18520
  "record.metadata.sheet": "",
18521
+ "record.metadata.status": "",
18619
18522
  "record.metadata.themes": "",
18620
18523
  "record.metadata.title": "",
18621
18524
  "record.metadata.type": "",
@@ -18717,20 +18620,21 @@ var pt = {
18717
18620
  "chart.type.line": "gráfico de linha",
18718
18621
  "chart.type.lineSmooth": "gráfico de linha suave",
18719
18622
  "chart.type.pie": "gráfico de pizza",
18623
+ "dashboard.createRecord": "",
18720
18624
  "dashboard.labels.mySpace": "Meu espaço",
18721
18625
  "dashboard.records.all": "Catálogo",
18722
18626
  "dashboard.records.myDraft": "Meus rascunhos",
18723
18627
  "dashboard.records.myLibrary": "Minha biblioteca",
18724
18628
  "dashboard.records.myOrg": "Organização",
18725
18629
  "dashboard.records.myRecords": "Meus Registros",
18726
- "dashboard.records.noRecord": "",
18727
- "dashboard.records.noUser": "",
18728
18630
  "dashboard.records.publishedRecords": "",
18729
18631
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18730
18632
  "dashboard.records.userDetail": "",
18731
18633
  "dashboard.records.userEmail": "",
18732
18634
  "dashboard.records.username": "",
18733
18635
  "dashboard.records.users": "",
18636
+ "dashboard.results.listMetadata": "",
18637
+ "dashboard.results.listResources": "",
18734
18638
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18735
18639
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18736
18640
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18878,6 +18782,7 @@ var pt = {
18878
18782
  "map.add.layer.wfs": "",
18879
18783
  "map.add.layer.wms": "",
18880
18784
  "map.addFromFile.placeholder": "",
18785
+ "map.geocoding.placeholder": "",
18881
18786
  "map.help.addFromFile": "",
18882
18787
  "map.layer.add": "",
18883
18788
  "map.layers.available": "",
@@ -18921,16 +18826,15 @@ var pt = {
18921
18826
  "record.metadata.author": "",
18922
18827
  "record.metadata.catalog": "",
18923
18828
  "record.metadata.contact": "",
18924
- "record.metadata.createdOn": "",
18925
18829
  "record.metadata.details": "",
18926
18830
  "record.metadata.download": "",
18927
18831
  "record.metadata.formats": "",
18928
- "record.metadata.isOpenData": "",
18929
18832
  "record.metadata.keywords": "",
18930
18833
  "record.metadata.lastUpdate": "",
18931
18834
  "record.metadata.links": "",
18932
18835
  "record.metadata.noUsage": "",
18933
18836
  "record.metadata.origin": "",
18837
+ "record.metadata.otherConstraints": "",
18934
18838
  "record.metadata.owner": "",
18935
18839
  "record.metadata.preview": "",
18936
18840
  "record.metadata.publications": "",
@@ -18954,6 +18858,7 @@ var pt = {
18954
18858
  "record.metadata.quality.updateFrequency.success": "",
18955
18859
  "record.metadata.related": "",
18956
18860
  "record.metadata.sheet": "",
18861
+ "record.metadata.status": "",
18957
18862
  "record.metadata.themes": "",
18958
18863
  "record.metadata.title": "",
18959
18864
  "record.metadata.type": "",
@@ -19166,20 +19071,11 @@ class Gn4FieldMapper {
19166
19071
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19167
19072
  ],
19168
19073
  }),
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
- }),
19074
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19075
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19076
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19077
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19078
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19183
19079
  lineageObject: (output, source) => ({
19184
19080
  ...output,
19185
19081
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19205,33 +19101,78 @@ class Gn4FieldMapper {
19205
19101
  kind,
19206
19102
  };
19207
19103
  },
19104
+ geom: (output, source) => {
19105
+ const geoms = getAsArray(selectField(source, 'geom'));
19106
+ const shapes = getAsArray(selectField(source, 'shape'));
19107
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19108
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19109
+ return {
19110
+ ...output,
19111
+ spatialExtents: [
19112
+ ...spatialExtents,
19113
+ ...geoms.map((geom, index) => {
19114
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19115
+ const geometry = shapes[index] ?? geom;
19116
+ return {
19117
+ ...(description !== null ? { description } : null),
19118
+ geometry,
19119
+ };
19120
+ }),
19121
+ ],
19122
+ };
19123
+ },
19124
+ resourceTemporalDateRange: (output, source) => {
19125
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19126
+ return {
19127
+ ...output,
19128
+ temporalExtents: ranges.map((range) => {
19129
+ const start = selectField(range, 'gte');
19130
+ const end = selectField(range, 'lte');
19131
+ return {
19132
+ ...(start !== null ? { start: toDate(start) } : null),
19133
+ ...(end !== null ? { end: toDate(end) } : null),
19134
+ };
19135
+ }),
19136
+ };
19137
+ },
19208
19138
  };
19209
19139
  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
- });
19140
+ this.constraintField = (type, output, constraintArray) => {
19141
+ let outputField;
19142
+ switch (type) {
19143
+ case 'license':
19144
+ outputField = 'licenses';
19145
+ break;
19146
+ case 'legal':
19147
+ outputField = 'legalConstraints';
19148
+ break;
19149
+ case 'security':
19150
+ outputField = 'securityConstraints';
19151
+ break;
19152
+ case 'other':
19153
+ outputField = 'otherConstraints';
19154
+ break;
19155
+ }
19156
+ const outputArray = outputField in output ? output[outputField] : [];
19157
+ outputArray.push(...constraintArray.map((item) => {
19158
+ const text = selectTranslatedValue(item, this.lang3);
19159
+ const url = getAsUrl(selectField(item, 'link'));
19160
+ return {
19161
+ text,
19162
+ ...(url ? { url } : {}),
19163
+ };
19164
+ }));
19165
+ const result = {
19166
+ ...output,
19167
+ [outputField]: outputArray,
19168
+ };
19169
+ // avoid legal constraints being duplicates of licenses
19170
+ if ('legalConstraints' in result &&
19171
+ (type === 'legal' || type === 'license')) {
19172
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19173
+ }
19174
+ return result;
19175
+ };
19235
19176
  this.mapLink = (sourceLink) => {
19236
19177
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19237
19178
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19279,17 +19220,6 @@ class Gn4FieldMapper {
19279
19220
  extras: { ...(output.extras || {}), ...value },
19280
19221
  });
19281
19222
  }
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
19223
  getMappingFn(fieldName) {
19294
19224
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19295
19225
  }
@@ -19351,12 +19281,13 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19351
19281
  recordUpdated: null,
19352
19282
  ownerOrganization: null,
19353
19283
  licenses: [],
19284
+ legalConstraints: [],
19285
+ securityConstraints: [],
19286
+ otherConstraints: [],
19354
19287
  contacts: [],
19355
19288
  contactsForResource: [],
19356
- accessConstraints: [],
19357
19289
  keywords: [],
19358
19290
  themes: [],
19359
- useLimitations: [],
19360
19291
  spatialExtents: [],
19361
19292
  temporalExtents: [],
19362
19293
  overviews: [],
@@ -20393,36 +20324,23 @@ class SelectionService {
20393
20324
  this.selectedRecordsIdentifiers$.next(filtered);
20394
20325
  }
20395
20326
  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(() => {
20327
+ const newIds = records.map((record) => record.uniqueIdentifier);
20328
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20402
20329
  this.addIdsToSelected(newIds);
20403
- }), map$2(() => undefined));
20330
+ });
20404
20331
  }
20405
20332
  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(() => {
20333
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20334
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20412
20335
  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
20336
  });
20421
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20422
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20423
- return apiResponse.pipe(tap$2(() => {
20337
+ }
20338
+ async clearSelection() {
20339
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20340
+ const currentSelection = Array.from(response);
20341
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20424
20342
  this.removeIdsFromSelected(currentSelection);
20425
- }), map$2(() => undefined));
20343
+ });
20426
20344
  }
20427
20345
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20428
20346
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20740,6 +20658,8 @@ const defaultMapOptions = {
20740
20658
  };
20741
20659
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20742
20660
 
20661
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20662
+
20743
20663
  var MapContextLayerTypeEnum;
20744
20664
  (function (MapContextLayerTypeEnum) {
20745
20665
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21115,9 +21035,15 @@ const FORMATS = {
21115
21035
  color: '#328556',
21116
21036
  mimeTypes: ['x-gis/x-shapefile'],
21117
21037
  },
21038
+ gml: {
21039
+ extensions: ['gml'],
21040
+ priority: 5,
21041
+ color: '#c92bce',
21042
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21043
+ },
21118
21044
  kml: {
21119
21045
  extensions: ['kml', 'kmz'],
21120
- priority: 5,
21046
+ priority: 6,
21121
21047
  color: '#348009',
21122
21048
  mimeTypes: [
21123
21049
  'application/vnd.google-earth.kml+xml',
@@ -21126,34 +21052,40 @@ const FORMATS = {
21126
21052
  },
21127
21053
  gpkg: {
21128
21054
  extensions: ['gpkg', 'geopackage'],
21129
- priority: 6,
21055
+ priority: 7,
21130
21056
  color: '#ea79ba',
21131
21057
  mimeTypes: ['application/geopackage+sqlite3'],
21132
21058
  },
21133
21059
  zip: {
21134
21060
  extensions: ['zip', 'tar.gz'],
21135
- priority: 7,
21061
+ priority: 8,
21136
21062
  color: '#f2bb3a',
21137
21063
  mimeTypes: ['application/zip', 'application/x-zip'],
21138
21064
  },
21139
21065
  pdf: {
21140
21066
  extensions: ['pdf'],
21141
- priority: 8,
21067
+ priority: 9,
21142
21068
  color: '#db544a',
21143
21069
  mimeTypes: ['application/pdf'],
21144
21070
  },
21145
21071
  jpg: {
21146
21072
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21147
- priority: 8,
21073
+ priority: 9,
21148
21074
  color: '#673ab7',
21149
21075
  mimeTypes: ['image/jpg'],
21150
21076
  },
21151
21077
  svg: {
21152
21078
  extensions: ['svg'],
21153
- priority: 9,
21079
+ priority: 10,
21154
21080
  color: '#d98294',
21155
21081
  mimeTypes: ['image/svg+xml'],
21156
21082
  },
21083
+ dxf: {
21084
+ extensions: ['dxf'],
21085
+ priority: 11,
21086
+ color: '#de630b',
21087
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21088
+ },
21157
21089
  };
21158
21090
  function getFormatPriority(linkFormat) {
21159
21091
  for (const format in FORMATS) {
@@ -21170,14 +21102,18 @@ function getFormatPriority(linkFormat) {
21170
21102
  function getLinkPriority(link) {
21171
21103
  return getFormatPriority(getFileFormat(link));
21172
21104
  }
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;
21105
+ function getFileFormatFromServiceOutput(serviceOutput) {
21106
+ function formatMatcher(format) {
21107
+ const output = serviceOutput.toLowerCase();
21108
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21109
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21110
+ }
21111
+ for (const formatName in FORMATS) {
21112
+ if (formatMatcher(FORMATS[formatName])) {
21113
+ return formatName;
21178
21114
  }
21179
21115
  }
21180
- return undefined;
21116
+ return null;
21181
21117
  }
21182
21118
  function getFileFormat(link) {
21183
21119
  if ('mimeType' in link) {
@@ -21318,72 +21254,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21318
21254
  }]
21319
21255
  }] });
21320
21256
 
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
21257
  const FEATURE_PROJECTION = 'EPSG:3857';
21368
21258
  const DATA_PROJECTION = 'EPSG:4326';
21259
+ const GEOJSON = new GeoJSON();
21369
21260
  class MapUtilsService {
21370
- constructor(http, wmsUtils) {
21261
+ constructor(http, proxy) {
21371
21262
  this.http = http;
21372
- this.wmsUtils = wmsUtils;
21263
+ this.proxy = proxy;
21373
21264
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21374
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21265
+ return GEOJSON.readFeatures(featureCollection, {
21375
21266
  featureProjection,
21376
21267
  dataProjection,
21377
21268
  });
21378
- return olFeatures;
21379
21269
  };
21380
21270
  }
21381
21271
  createEmptyMap() {
21382
- const map = new Map$1({
21272
+ return new Map$1({
21383
21273
  controls: [],
21384
21274
  pixelRatio: 1,
21385
21275
  });
21386
- return map;
21387
21276
  }
21388
21277
  isWMSLayer(layer) {
21389
21278
  return (layer.getSource() instanceof TileWMS ||
@@ -21398,8 +21287,7 @@ class MapUtilsService {
21398
21287
  ...source.getParams(),
21399
21288
  INFO_FORMAT: 'application/json',
21400
21289
  };
21401
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21402
- return url;
21290
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21403
21291
  }
21404
21292
  getVectorFeaturesFromClick(olMap, event) {
21405
21293
  const features = [];
@@ -21427,38 +21315,56 @@ class MapUtilsService {
21427
21315
  /**
21428
21316
  * Will emit `null` if no extent could be computed
21429
21317
  */
21430
- getLayerExtent(layer) {
21431
- let geographicExtent;
21318
+ async getLayerExtent(layer) {
21319
+ let latLonExtent;
21432
21320
  if (layer &&
21433
21321
  layer.type === 'geojson' &&
21434
21322
  'data' in layer &&
21435
21323
  typeof layer.data === 'object' &&
21436
21324
  layer.data.features[0] &&
21437
21325
  layer.data.features[0].geometry) {
21438
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21439
- .readFeatures(layerData)
21326
+ latLonExtent = new GeoJSON()
21327
+ .readFeatures(layer.data)
21440
21328
  .map((feature) => feature.getGeometry())
21441
21329
  .filter((geom) => !!geom)
21442
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21330
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21443
21331
  }
21444
21332
  else if (layer && layer.type === 'wms') {
21445
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21333
+ latLonExtent = await this.getWmsLayerExtent(layer);
21446
21334
  }
21447
21335
  else if (layer && layer.type === 'wmts') {
21448
21336
  if (layer.extent) {
21449
- geographicExtent = of(layer.extent);
21337
+ latLonExtent = layer.extent;
21450
21338
  }
21451
21339
  else {
21452
- return of(layer.options.tileGrid.getExtent());
21340
+ return layer.options.tileGrid.getExtent();
21453
21341
  }
21454
21342
  }
21455
21343
  else {
21456
- return of(null);
21344
+ return null;
21345
+ }
21346
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21347
+ return null;
21348
+ }
21349
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21350
+ }
21351
+ async getWmsLayerExtent(layer) {
21352
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21353
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21354
+ if (!Object.keys(boundingBoxes).length) {
21355
+ return null;
21356
+ }
21357
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21358
+ if (lonLatCRS) {
21359
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21360
+ }
21361
+ else {
21362
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21363
+ register(proj4);
21364
+ const proj = await fromEPSGCode(availableEPSGCode);
21365
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21366
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21457
21367
  }
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
21368
  }
21463
21369
  getWmtsLayerFromCapabilities(link) {
21464
21370
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21514,7 +21420,18 @@ ${e.stack || e.message || e}`);
21514
21420
  ])
21515
21421
  .getArray());
21516
21422
  }
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 }); }
21423
+ getRecordExtent(record) {
21424
+ if (!('spatialExtents' in record)) {
21425
+ return null;
21426
+ }
21427
+ // transform an array of geojson geometries into a bbox
21428
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21429
+ const geom = GEOJSON.readGeometry(curr.geometry);
21430
+ return extend(prev, geom.getExtent());
21431
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21432
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21433
+ }
21434
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, deps: [{ token: i1.HttpClient }, { token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21518
21435
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21519
21436
  }
21520
21437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21522,7 +21439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21522
21439
  args: [{
21523
21440
  providedIn: 'root',
21524
21441
  }]
21525
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21442
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21526
21443
  function dragPanCondition(event) {
21527
21444
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21528
21445
  if (!dragPanCondition) {
@@ -23395,8 +23312,7 @@ class MetadataQualityComponent {
23395
23312
  : this.calculatedQualityScore;
23396
23313
  }
23397
23314
  get calculatedQualityScore() {
23398
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23399
- this.items.length);
23315
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23400
23316
  }
23401
23317
  showMenu() {
23402
23318
  this.isMenuShown = true;
@@ -24021,11 +23937,11 @@ class MarkdownParserComponent {
24021
23937
  return marked.parse(this.textContent);
24022
23938
  }
24023
23939
  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 }); }
23940
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24025
23941
  }
24026
23942
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24027
23943
  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"] }]
23944
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
24029
23945
  }], propDecorators: { textContent: [{
24030
23946
  type: Input
24031
23947
  }] } });
@@ -24036,16 +23952,32 @@ class MetadataInfoComponent {
24036
23952
  }
24037
23953
  get hasUsage() {
24038
23954
  return (this.metadata.extras?.isOpenData === true ||
24039
- this.metadata.useLimitations?.length ||
24040
- this.metadata.accessConstraints?.length);
23955
+ (this.metadata.legalConstraints?.length > 0 &&
23956
+ this.legalConstraints.length > 0) ||
23957
+ (this.metadata.otherConstraints?.length > 0 &&
23958
+ this.otherConstraints.length > 0) ||
23959
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24041
23960
  }
24042
- get usages() {
23961
+ get legalConstraints() {
24043
23962
  let array = [];
24044
- if (this.metadata.useLimitations?.length) {
24045
- array = array.concat(this.metadata.useLimitations);
23963
+ if (this.metadata.legalConstraints?.length) {
23964
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24046
23965
  }
24047
- if (this.metadata.accessConstraints?.length) {
24048
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
23966
+ return array;
23967
+ }
23968
+ get otherConstraints() {
23969
+ let array = [];
23970
+ if (this.metadata.otherConstraints?.length) {
23971
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
23972
+ }
23973
+ return array;
23974
+ }
23975
+ get licenses() {
23976
+ let array = [];
23977
+ if (this.metadata.licenses?.length) {
23978
+ array = array.concat(this.metadata.licenses
23979
+ .filter((c) => c.text)
23980
+ .map((c) => ({ text: c.text, url: c.url })));
24049
23981
  }
24050
23982
  return array;
24051
23983
  }
@@ -24067,16 +23999,12 @@ class MetadataInfoComponent {
24067
23999
  onKeywordClick(keyword) {
24068
24000
  this.keyword.emit(keyword);
24069
24001
  }
24070
- copyText() {
24071
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24072
- event.target.blur();
24073
- }
24074
24002
  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 }); }
24003
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24076
24004
  }
24077
24005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24078
24006
  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"] }]
24007
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24080
24008
  }], propDecorators: { metadata: [{
24081
24009
  type: Input
24082
24010
  }], incomplete: [{
@@ -24145,11 +24073,11 @@ class ButtonComponent {
24145
24073
  propagateToDocumentOnly(event);
24146
24074
  }
24147
24075
  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 }); }
24076
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24149
24077
  }
24150
24078
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24151
24079
  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"] }]
24080
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24153
24081
  }], propDecorators: { type: [{
24154
24082
  type: Input
24155
24083
  }], disabled: [{
@@ -24224,11 +24152,11 @@ class DownloadsListComponent {
24224
24152
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24225
24153
  }
24226
24154
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
24155
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24228
24156
  }
24229
24157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24230
24158
  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" }]
24159
+ args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
24232
24160
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24233
24161
  type: Input
24234
24162
  }] } });
@@ -24477,6 +24405,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24477
24405
  }]
24478
24406
  }] });
24479
24407
 
24408
+ class InteractiveTableColumnComponent {
24409
+ constructor() {
24410
+ this.grow = false;
24411
+ this.sortable = false;
24412
+ this.activeSort = null;
24413
+ this.sortChange = new EventEmitter();
24414
+ }
24415
+ handleSortChange() {
24416
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24417
+ this.sortChange.emit(this.activeSort);
24418
+ }
24419
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24420
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: InteractiveTableColumnComponent, isStandalone: true, selector: "gn-ui-interactive-table-column", inputs: { grow: "grow", sortable: "sortable", activeSort: "activeSort" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "cell", first: true, predicate: ["cell"], descendants: true }], ngImport: i0, template: "<span>empty</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24421
+ }
24422
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24423
+ type: Component,
24424
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24425
+ }], propDecorators: { header: [{
24426
+ type: ContentChild,
24427
+ args: ['header']
24428
+ }], cell: [{
24429
+ type: ContentChild,
24430
+ args: ['cell']
24431
+ }], grow: [{
24432
+ type: Input
24433
+ }], sortable: [{
24434
+ type: Input
24435
+ }], activeSort: [{
24436
+ type: Input
24437
+ }], sortChange: [{
24438
+ type: Output
24439
+ }] } });
24440
+
24441
+ class InteractiveTableComponent {
24442
+ constructor() {
24443
+ this.items = [];
24444
+ this.itemClick = new EventEmitter();
24445
+ }
24446
+ get gridStyle() {
24447
+ return {
24448
+ 'grid-template-columns': this.columns
24449
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24450
+ .join(' '),
24451
+ };
24452
+ }
24453
+ handleRowClick(item) {
24454
+ this.itemClick.emit(item);
24455
+ }
24456
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24457
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items" }, outputs: { itemClick: "itemClick" }, queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24458
+ }
24459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24460
+ type: Component,
24461
+ args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, InteractiveTableColumnComponent, MatIconModule], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"] }]
24462
+ }], propDecorators: { columns: [{
24463
+ type: ContentChildren,
24464
+ args: [InteractiveTableColumnComponent]
24465
+ }], items: [{
24466
+ type: Input
24467
+ }], itemClick: [{
24468
+ type: Output
24469
+ }] } });
24470
+
24480
24471
  class LinkCardComponent {
24481
24472
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24482
24473
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, selector: "gn-ui-link-card", inputs: { link: "link" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -24522,11 +24513,11 @@ class MetadataContactComponent {
24522
24513
  this.organizationClick.emit(this.shownOrganization);
24523
24514
  }
24524
24515
  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 }); }
24516
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24526
24517
  }
24527
24518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24528
24519
  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" }]
24520
+ args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24530
24521
  }], propDecorators: { metadata: [{
24531
24522
  type: Input
24532
24523
  }], organizationClick: [{
@@ -24930,11 +24921,11 @@ class DropdownMultiselectComponent {
24930
24921
  this.setFocus();
24931
24922
  }
24932
24923
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$6.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
24924
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24934
24925
  }
24935
24926
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24936
24927
  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" }]
24928
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
24938
24929
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24939
24930
  type: Input
24940
24931
  }], choices: [{
@@ -25193,11 +25184,11 @@ class AutocompleteComponent {
25193
25184
  }
25194
25185
  }
25195
25186
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
25187
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25197
25188
  }
25198
25189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25199
25190
  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"] }]
25191
+ args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
25201
25192
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25202
25193
  type: Input
25203
25194
  }], action: [{
@@ -25573,11 +25564,11 @@ class CheckboxComponent {
25573
25564
  this.changed.emit(this.checked);
25574
25565
  }
25575
25566
  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 }); }
25567
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25577
25568
  }
25578
25569
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25579
25570
  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"] }]
25571
+ args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25581
25572
  }], propDecorators: { type: [{
25582
25573
  type: Input
25583
25574
  }], checked: [{
@@ -25632,6 +25623,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25632
25623
  args: [{ selector: 'gn-ui-date-range-picker', template: "<div\n class=\"flex items-center justify-center w-64 h-11 rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"w-48 flex justify-between\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matStartDate\n placeholder=\"Start date\"\n (dateInput)=\"startDateSelected($event)\"\n />\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matEndDate\n placeholder=\"End date\"\n (dateInput)=\"endDateSelected($event)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n</div>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"] }]
25633
25624
  }] });
25634
25625
 
25626
+ class EditableLabelDirective {
25627
+ constructor(el, renderer) {
25628
+ this.el = el;
25629
+ this.renderer = renderer;
25630
+ this.editableLabelChanged = new EventEmitter();
25631
+ }
25632
+ ngAfterViewInit() {
25633
+ if (this.gnUiEditableLabel !== false) {
25634
+ const appendedInput = this.renderer.createElement('input');
25635
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25636
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25637
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25638
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25639
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25640
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25641
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25642
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25643
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25644
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25645
+ const hostContent = this.el.nativeElement.textContent || '';
25646
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25647
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25648
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25649
+ this.renderer.listen(appendedInput, 'input', (event) => {
25650
+ this.editableLabelChanged.emit(event.target.value);
25651
+ });
25652
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25653
+ }
25654
+ }
25655
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
25656
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: EditableLabelDirective, isStandalone: true, selector: "[gnUiEditableLabel]", inputs: { gnUiEditableLabel: "gnUiEditableLabel" }, outputs: { editableLabelChanged: "editableLabelChanged" }, ngImport: i0 }); }
25657
+ }
25658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25659
+ type: Directive,
25660
+ args: [{
25661
+ selector: '[gnUiEditableLabel]',
25662
+ standalone: true,
25663
+ }]
25664
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25665
+ type: Output
25666
+ }], gnUiEditableLabel: [{
25667
+ type: Input
25668
+ }] } });
25669
+
25635
25670
  class UiInputsModule {
25636
25671
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25637
25672
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
@@ -25671,7 +25706,8 @@ class UiInputsModule {
25671
25706
  MatFormFieldModule,
25672
25707
  MatInputModule,
25673
25708
  MatDatepickerModule,
25674
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25709
+ MatNativeDateModule,
25710
+ EditableLabelDirective], exports: [DropdownSelectorComponent,
25675
25711
  AutocompleteComponent,
25676
25712
  ButtonComponent,
25677
25713
  TextInputComponent,
@@ -25687,7 +25723,8 @@ class UiInputsModule {
25687
25723
  CopyTextButtonComponent,
25688
25724
  CheckboxComponent,
25689
25725
  SearchInputComponent,
25690
- DateRangePickerComponent] }); }
25726
+ DateRangePickerComponent,
25727
+ EditableLabelDirective] }); }
25691
25728
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25692
25729
  TranslateModule.forChild(),
25693
25730
  NgxDropzoneModule,
@@ -25753,6 +25790,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25753
25790
  MatInputModule,
25754
25791
  MatDatepickerModule,
25755
25792
  MatNativeDateModule,
25793
+ EditableLabelDirective,
25756
25794
  ],
25757
25795
  exports: [
25758
25796
  DropdownSelectorComponent,
@@ -25772,6 +25810,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25772
25810
  CheckboxComponent,
25773
25811
  SearchInputComponent,
25774
25812
  DateRangePickerComponent,
25813
+ EditableLabelDirective,
25775
25814
  ],
25776
25815
  }]
25777
25816
  }] });
@@ -25871,7 +25910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25871
25910
 
25872
25911
  const DEFAULT_PARAMS = {
25873
25912
  OFFSET: '',
25874
- LIMIT: '',
25913
+ LIMIT: '-1',
25875
25914
  FORMAT: 'json',
25876
25915
  };
25877
25916
  class RecordApiFormComponent {
@@ -25900,6 +25939,8 @@ class RecordApiFormComponent {
25900
25939
  }
25901
25940
  return outputUrl;
25902
25941
  }));
25942
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
25943
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25903
25944
  }
25904
25945
  set apiLink(value) {
25905
25946
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25909,10 +25950,11 @@ class RecordApiFormComponent {
25909
25950
  this.offset$.next(value);
25910
25951
  }
25911
25952
  setLimit(value) {
25912
- this.limit$.next(value);
25953
+ const newLimit = value === '' ? '-1' : value;
25954
+ this.limit$.next(newLimit);
25913
25955
  }
25914
25956
  setFormat(value) {
25915
- this.format$.next(value);
25957
+ this.format$.next(String(value));
25916
25958
  }
25917
25959
  resetUrl() {
25918
25960
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25920,11 +25962,11 @@ class RecordApiFormComponent {
25920
25962
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25921
25963
  }
25922
25964
  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 }); }
25965
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25924
25966
  }
25925
25967
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25926
25968
  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"] }]
25969
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
25928
25970
  }], propDecorators: { apiLink: [{
25929
25971
  type: Input
25930
25972
  }] } });
@@ -25937,11 +25979,11 @@ class ImageOverlayPreviewComponent {
25937
25979
  basicLightbox.create(`<img src="${src}"/>`).show();
25938
25980
  }
25939
25981
  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"] }] }); }
25982
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: { imageUrl: "imageUrl" }, outputs: { isPlaceholderShown: "isPlaceholderShown" }, ngImport: i0, template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
25941
25983
  }
25942
25984
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25943
25985
  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" }]
25986
+ args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n" }]
25945
25987
  }], propDecorators: { imageUrl: [{
25946
25988
  type: Input
25947
25989
  }], isPlaceholderShown: [{
@@ -25996,6 +26038,7 @@ class UiElementsModule {
25996
26038
  AvatarComponent,
25997
26039
  UserPreviewComponent,
25998
26040
  PaginationButtonsComponent,
26041
+ MaxLinesComponent,
25999
26042
  RecordApiFormComponent,
26000
26043
  MarkdownParserComponent,
26001
26044
  ImageOverlayPreviewComponent] }); }
@@ -26068,6 +26111,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26068
26111
  AvatarComponent,
26069
26112
  UserPreviewComponent,
26070
26113
  PaginationButtonsComponent,
26114
+ MaxLinesComponent,
26071
26115
  RecordApiFormComponent,
26072
26116
  MarkdownParserComponent,
26073
26117
  ImageOverlayPreviewComponent,
@@ -26075,143 +26119,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26075
26119
  }]
26076
26120
  }] });
26077
26121
 
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
26122
  class UiSearchModule {
26216
26123
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26217
26124
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26224,8 +26131,7 @@ class UiSearchModule {
26224
26131
  ResultsHitsNumberComponent,
26225
26132
  ResultsListItemComponent,
26226
26133
  RecordPreviewFeedComponent,
26227
- RecordPreviewRowComponent,
26228
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26134
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26229
26135
  FacetsModule$1,
26230
26136
  FormsModule,
26231
26137
  ReactiveFormsModule,
@@ -26236,7 +26142,8 @@ class UiSearchModule {
26236
26142
  UiElementsModule,
26237
26143
  MatIconModule,
26238
26144
  MatCheckboxModule,
26239
- RouterLink], exports: [RecordPreviewListComponent,
26145
+ RouterLink,
26146
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26240
26147
  RecordPreviewCardComponent,
26241
26148
  RecordPreviewTextComponent,
26242
26149
  RecordPreviewTitleComponent,
@@ -26246,8 +26153,7 @@ class UiSearchModule {
26246
26153
  RecordPreviewComponent,
26247
26154
  ResultsHitsNumberComponent,
26248
26155
  RecordPreviewFeedComponent,
26249
- RecordPreviewRowComponent,
26250
- RecordTableComponent] }); }
26156
+ RecordPreviewRowComponent] }); }
26251
26157
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26252
26158
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26253
26159
  ], imports: [CommonModule,
@@ -26262,7 +26168,8 @@ class UiSearchModule {
26262
26168
  UiInputsModule,
26263
26169
  UiElementsModule,
26264
26170
  MatIconModule,
26265
- MatCheckboxModule, FacetsModule$1] }); }
26171
+ MatCheckboxModule,
26172
+ InteractiveTableComponent, FacetsModule$1] }); }
26266
26173
  }
26267
26174
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26268
26175
  type: NgModule,
@@ -26279,7 +26186,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26279
26186
  ResultsListItemComponent,
26280
26187
  RecordPreviewFeedComponent,
26281
26188
  RecordPreviewRowComponent,
26282
- RecordTableComponent,
26283
26189
  ],
26284
26190
  imports: [
26285
26191
  CommonModule,
@@ -26296,6 +26202,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26296
26202
  MatIconModule,
26297
26203
  MatCheckboxModule,
26298
26204
  RouterLink,
26205
+ InteractiveTableComponent,
26299
26206
  ],
26300
26207
  exports: [
26301
26208
  RecordPreviewListComponent,
@@ -26309,7 +26216,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26309
26216
  ResultsHitsNumberComponent,
26310
26217
  RecordPreviewFeedComponent,
26311
26218
  RecordPreviewRowComponent,
26312
- RecordTableComponent,
26313
26219
  ],
26314
26220
  providers: [
26315
26221
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26868,6 +26774,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26868
26774
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26869
26775
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26870
26776
 
26777
+ // this geometry will be used to filter & boost results accordingly
26778
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26779
+
26871
26780
  class SearchFacade {
26872
26781
  constructor(store, filterGeometry) {
26873
26782
  this.store = store;
@@ -26972,6 +26881,7 @@ class SearchFacade {
26972
26881
  this.store.dispatch(new SetFilters({}, this.searchId));
26973
26882
  this.store.dispatch(new SetSortBy([], this.searchId));
26974
26883
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
26884
+ return this;
26975
26885
  }
26976
26886
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade, deps: [{ token: i1$2.Store }, { token: FILTER_GEOMETRY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
26977
26887
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27356,8 +27266,11 @@ class FuzzySearchComponent {
27356
27266
  this.searchService.updateFilters({ any });
27357
27267
  }
27358
27268
  }
27359
- handleInputCleared() {
27360
- this.searchService.updateFilters({ any: '' });
27269
+ async handleInputCleared() {
27270
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27271
+ if (currentSearchFilters.any) {
27272
+ this.searchService.updateFilters({ any: '' });
27273
+ }
27361
27274
  }
27362
27275
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FuzzySearchComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
27363
27276
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n [value]=\"searchInputValue$ | async\"\n [clearOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "autoFocus", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -27437,6 +27350,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27437
27350
  args: [RESULTS_LAYOUT_CONFIG]
27438
27351
  }] }]; } });
27439
27352
 
27353
+ // expects the replacement key ${uuid}
27354
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27355
+
27440
27356
  class FavoriteStarComponent {
27441
27357
  set record(value) {
27442
27358
  this.record_ = value;
@@ -27698,9 +27614,11 @@ class SearchEffects {
27698
27614
  // I could not get this to work (maybe a bug in rxjs?)
27699
27615
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27700
27616
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27701
- return of([state, favorites, null]);
27617
+ return of([state, favorites, undefined]);
27702
27618
  }
27703
27619
  return this.filterGeometry$.pipe(tap$2((geom) => {
27620
+ if (!geom)
27621
+ return;
27704
27622
  try {
27705
27623
  const trace = valid$1(geom, true);
27706
27624
  if (trace?.length > 0) {
@@ -27712,7 +27630,7 @@ class SearchEffects {
27712
27630
  throw new Error();
27713
27631
  }
27714
27632
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27715
- return of([state, favorites, null]);
27633
+ return of([state, favorites, undefined]);
27716
27634
  }));
27717
27635
  }), switchMap$1(([state, favorites, geometry]) => {
27718
27636
  const { currentPage, pageSize, sort } = state.params;
@@ -28149,10 +28067,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28149
28067
  type: Input
28150
28068
  }] } });
28151
28069
 
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
28070
  class FeatureSearchModule {
28157
28071
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28158
28072
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28251,6 +28165,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28251
28165
  }]
28252
28166
  }] });
28253
28167
 
28168
+ class ResultsTableComponent {
28169
+ constructor(searchFacade, searchService, selectionService) {
28170
+ this.searchFacade = searchFacade;
28171
+ this.searchService = searchService;
28172
+ this.selectionService = selectionService;
28173
+ this.recordClick = new EventEmitter();
28174
+ this.records$ = this.searchFacade.results$;
28175
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28176
+ }
28177
+ dateToString(date) {
28178
+ return date?.toLocaleDateString(undefined, {
28179
+ year: 'numeric',
28180
+ month: 'long',
28181
+ day: 'numeric',
28182
+ timeZone: 'UTC',
28183
+ });
28184
+ }
28185
+ getStatus(isPublishedToAll) {
28186
+ return isPublishedToAll ? 'published' : 'not published';
28187
+ }
28188
+ getRecordFormats(record) {
28189
+ if (record.kind === 'service' || !('distributions' in record)) {
28190
+ return [];
28191
+ }
28192
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28193
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28194
+ return formats;
28195
+ }
28196
+ formatUserInfo(userInfo) {
28197
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28198
+ if (infos && infos.length === 4) {
28199
+ return `${infos[2]} ${infos[1]}`;
28200
+ }
28201
+ return undefined;
28202
+ }
28203
+ getBadgeColor(format) {
28204
+ return getBadgeColor(format);
28205
+ }
28206
+ handleRecordClick(item) {
28207
+ this.recordClick.emit(item);
28208
+ }
28209
+ setSortBy(col, order) {
28210
+ this.searchService.setSortBy([order, col]);
28211
+ }
28212
+ isSortedBy(col) {
28213
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28214
+ const sortArray = Array.isArray(sortOrder[0])
28215
+ ? sortOrder
28216
+ : [sortOrder];
28217
+ for (const sort of sortArray) {
28218
+ if (sort[1] === col) {
28219
+ return sort[0];
28220
+ }
28221
+ }
28222
+ return null;
28223
+ }));
28224
+ }
28225
+ isChecked(record) {
28226
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28227
+ return selectedRecords.includes(record.uniqueIdentifier);
28228
+ }));
28229
+ }
28230
+ handleRecordSelectedChange(selected, record) {
28231
+ if (!selected) {
28232
+ this.selectionService.deselectRecords([record]);
28233
+ }
28234
+ else {
28235
+ this.selectionService.selectRecords([record]);
28236
+ }
28237
+ }
28238
+ async toggleSelectAll() {
28239
+ const records = await firstValueFrom(this.records$);
28240
+ if (await firstValueFrom(this.isAllSelected())) {
28241
+ this.selectionService.deselectRecords(records);
28242
+ }
28243
+ else {
28244
+ this.selectionService.selectRecords(records);
28245
+ }
28246
+ }
28247
+ isAllSelected() {
28248
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28249
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28250
+ }));
28251
+ }
28252
+ isSomeSelected() {
28253
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28254
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28255
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28256
+ return !allSelected && someSelected;
28257
+ }));
28258
+ }
28259
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: SelectionService }], target: i0.ɵɵFactoryTarget.Component }); }
28260
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", outputs: { recordClick: "recordClick" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
28261
+ }
28262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28263
+ type: Component,
28264
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28265
+ CommonModule,
28266
+ UiInputsModule,
28267
+ InteractiveTableComponent,
28268
+ InteractiveTableColumnComponent,
28269
+ MatIconModule,
28270
+ TranslateModule,
28271
+ ], template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
28272
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28273
+ type: Output
28274
+ }] } });
28275
+
28254
28276
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28255
28277
  get mapLinks() {
28256
28278
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28577,6 +28599,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28577
28599
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28578
28600
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28579
28601
 
28602
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28603
+ class GeocodingService {
28604
+ constructor(provider) {
28605
+ this.provider = provider;
28606
+ }
28607
+ query(text) {
28608
+ let queryObservable;
28609
+ switch (this.provider[0]) {
28610
+ case 'geoadmin':
28611
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28612
+ break;
28613
+ case 'geonames':
28614
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28615
+ break;
28616
+ case 'data-gouv-fr':
28617
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28618
+ break;
28619
+ default:
28620
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28621
+ }
28622
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28623
+ }
28624
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, deps: [{ token: GEOCODING_PROVIDER }], target: i0.ɵɵFactoryTarget.Injectable }); }
28625
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28626
+ }
28627
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28628
+ type: Injectable,
28629
+ args: [{
28630
+ providedIn: 'root',
28631
+ }]
28632
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28633
+ type: Inject,
28634
+ args: [GEOCODING_PROVIDER]
28635
+ }] }]; } });
28636
+
28637
+ class GeocodingComponent {
28638
+ constructor(mapManager, geocodingService) {
28639
+ this.mapManager = mapManager;
28640
+ this.geocodingService = geocodingService;
28641
+ this.searchText = '';
28642
+ this.results = [];
28643
+ this.searchTextChanged = new Subject();
28644
+ this.destroy$ = new Subject();
28645
+ this.errorMessage = null;
28646
+ this.searchTextChanged
28647
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28648
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28649
+ this.errorMessage =
28650
+ 'An error occurred while searching. Please try again.';
28651
+ console.error(error);
28652
+ return [];
28653
+ }));
28654
+ }), takeUntil(this.destroy$))
28655
+ .subscribe((results) => {
28656
+ this.results = results;
28657
+ });
28658
+ }
28659
+ ngOnDestroy() {
28660
+ this.destroy$.next();
28661
+ this.destroy$.complete();
28662
+ }
28663
+ onSearchChange(searchText) {
28664
+ if (!searchText) {
28665
+ this.clearSearch();
28666
+ return;
28667
+ }
28668
+ else {
28669
+ this.searchTextChanged.next(searchText);
28670
+ }
28671
+ }
28672
+ clearSearch() {
28673
+ this.searchText = '';
28674
+ this.results = [];
28675
+ this.errorMessage = null;
28676
+ }
28677
+ zoomToLocation(result) {
28678
+ const map = this.mapManager.map;
28679
+ const view = map.getView();
28680
+ const geometry = result.geom;
28681
+ if (geometry.type === 'Point') {
28682
+ this.zoomToPoint(geometry.coordinates, view);
28683
+ }
28684
+ else if (geometry.type === 'Polygon') {
28685
+ this.zoomToPolygon(geometry.coordinates, view);
28686
+ }
28687
+ else {
28688
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28689
+ }
28690
+ }
28691
+ zoomToPoint(pointCoords, view) {
28692
+ const transformedCoords = fromLonLat(pointCoords);
28693
+ view.setCenter(transformedCoords);
28694
+ view.setZoom(12);
28695
+ }
28696
+ zoomToPolygon(polygonCoords, view) {
28697
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28698
+ const polygon = new Polygon([transformedCoords]);
28699
+ view.fit(polygon, {
28700
+ duration: 100,
28701
+ maxZoom: 12,
28702
+ });
28703
+ }
28704
+ onEnterPress() {
28705
+ if (this.results && this.results.length > 0) {
28706
+ this.zoomToLocation(this.results[0]);
28707
+ }
28708
+ }
28709
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, deps: [{ token: MapManagerService }, { token: GeocodingService }], target: i0.ɵɵFactoryTarget.Component }); }
28710
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: GeocodingComponent, selector: "gn-ui-geocoding", ngImport: i0, template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n<ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n *ngIf=\"results && results.length\"\n>\n <li\n *ngFor=\"let result of results\"\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n</ul>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: SearchInputComponent, selector: "gn-ui-search-input", inputs: ["value", "placeholder"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28711
+ }
28712
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28713
+ type: Component,
28714
+ args: [{ selector: 'gn-ui-geocoding', template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n<ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n *ngIf=\"results && results.length\"\n>\n <li\n *ngFor=\"let result of results\"\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n</ul>\n" }]
28715
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28716
+
28580
28717
  class FeatureMapModule {
28581
28718
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28582
28719
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28587,7 +28724,8 @@ class FeatureMapModule {
28587
28724
  AddLayerRecordPreviewComponent,
28588
28725
  AddLayerFromWmsComponent,
28589
28726
  AddLayerFromFileComponent,
28590
- AddLayerFromWfsComponent], imports: [CommonModule,
28727
+ AddLayerFromWfsComponent,
28728
+ GeocodingComponent], imports: [CommonModule,
28591
28729
  UiMapModule,
28592
28730
  UiLayoutModule,
28593
28731
  MatIconModule,
@@ -28598,13 +28736,18 @@ class FeatureMapModule {
28598
28736
  MapInstanceDirective,
28599
28737
  LayersPanelComponent,
28600
28738
  AddLayerFromCatalogComponent,
28601
- MapContainerComponent] }); }
28739
+ MapContainerComponent,
28740
+ GeocodingComponent] }); }
28602
28741
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28603
28742
  {
28604
28743
  provide: FEATURE_MAP_OPTIONS,
28605
28744
  useValue: defaultMapOptions,
28606
28745
  },
28607
28746
  MapFacade,
28747
+ {
28748
+ provide: GEOCODING_PROVIDER,
28749
+ useValue: ['geonames', { maxRows: 5 }],
28750
+ },
28608
28751
  ], imports: [CommonModule,
28609
28752
  UiMapModule,
28610
28753
  UiLayoutModule,
@@ -28630,6 +28773,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28630
28773
  AddLayerFromWmsComponent,
28631
28774
  AddLayerFromFileComponent,
28632
28775
  AddLayerFromWfsComponent,
28776
+ GeocodingComponent,
28633
28777
  ],
28634
28778
  exports: [
28635
28779
  MapContextComponent,
@@ -28637,6 +28781,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28637
28781
  LayersPanelComponent,
28638
28782
  AddLayerFromCatalogComponent,
28639
28783
  MapContainerComponent,
28784
+ GeocodingComponent,
28640
28785
  ],
28641
28786
  imports: [
28642
28787
  CommonModule,
@@ -28657,6 +28802,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28657
28802
  useValue: defaultMapOptions,
28658
28803
  },
28659
28804
  MapFacade,
28805
+ {
28806
+ provide: GEOCODING_PROVIDER,
28807
+ useValue: ['geonames', { maxRows: 5 }],
28808
+ },
28660
28809
  ],
28661
28810
  }]
28662
28811
  }] });
@@ -28751,7 +28900,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28751
28900
  ...state,
28752
28901
  chartConfig,
28753
28902
  })), on(close, (state) => {
28754
- // eslint-disable-next-line
28903
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28755
28904
  const { metadata, related, ...stateWithoutMd } = state;
28756
28905
  return stateWithoutMd;
28757
28906
  }));
@@ -30018,15 +30167,16 @@ class DataService {
30018
30167
  // Pour DL toutes les données
30019
30168
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
30020
30169
  ...wfsLink,
30170
+ type: 'download',
30021
30171
  url: new URL(urls[format]),
30022
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30172
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
30023
30173
  }))));
30024
30174
  }
30025
30175
  getDownloadLinksFromEsriRest(esriRestLink) {
30026
30176
  return ['json', 'geojson'].map((format) => ({
30027
30177
  ...esriRestLink,
30028
30178
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
30029
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30179
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
30030
30180
  }));
30031
30181
  }
30032
30182
  readAsGeoJson(link) {
@@ -30420,12 +30570,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30420
30570
  }] } });
30421
30571
 
30422
30572
  class MapViewComponent {
30423
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30573
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30424
30574
  this.mdViewFacade = mdViewFacade;
30425
30575
  this.mapManager = mapManager;
30426
30576
  this.mapUtils = mapUtils;
30427
30577
  this.dataService = dataService;
30428
- this.proxy = proxy;
30429
30578
  this.featureInfo = featureInfo;
30430
30579
  this.changeRef = changeRef;
30431
30580
  this.styleService = styleService;
@@ -30460,7 +30609,7 @@ class MapViewComponent {
30460
30609
  return of([]);
30461
30610
  }), finalize(() => (this.loading = false)));
30462
30611
  }));
30463
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30612
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30464
30613
  console.warn(error); // FIXME: report this to the user somehow
30465
30614
  return of(undefined);
30466
30615
  }), map$1((extent) => ({
@@ -30468,7 +30617,18 @@ class MapViewComponent {
30468
30617
  view: {
30469
30618
  extent,
30470
30619
  },
30471
- })), tap$1(() => this.resetSelection()))));
30620
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30621
+ if (context.view.extent)
30622
+ return context;
30623
+ const extent = this.mapUtils.getRecordExtent(metadata);
30624
+ return {
30625
+ ...context,
30626
+ view: {
30627
+ ...context.view,
30628
+ extent,
30629
+ },
30630
+ };
30631
+ }));
30472
30632
  }
30473
30633
  ngOnDestroy() {
30474
30634
  this.subscription.unsubscribe();
@@ -30521,13 +30681,13 @@ class MapViewComponent {
30521
30681
  selectLinkToDisplay(link) {
30522
30682
  this.selectedLinkIndex$.next(link);
30523
30683
  }
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 }); }
30684
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapManagerService }, { token: MapUtilsService }, { token: DataService }, { token: FeatureInfoService }, { token: i0.ChangeDetectorRef }, { token: MapStyleService }], target: i0.ɵɵFactoryTarget.Component }); }
30525
30685
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MapViewComponent, selector: "gn-ui-map-view", ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MapContextComponent, selector: "gn-ui-map-context", inputs: ["context", "mapConfig"], outputs: ["featureClicked"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mapConfig"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30526
30686
  }
30527
30687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30528
30688
  type: Component,
30529
30689
  args: [{ selector: 'gn-ui-map-view', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n" }]
30530
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30690
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30531
30691
 
30532
30692
  class DataViewComponent {
30533
30693
  constructor(mdViewFacade) {
@@ -30979,13 +31139,6 @@ class MyOrgService {
30979
31139
  constructor(platformService, orgService) {
30980
31140
  this.platformService = platformService;
30981
31141
  this.orgService = orgService;
30982
- this.myOrgDataSubject = new BehaviorSubject({
30983
- orgName: '',
30984
- logoUrl: '',
30985
- recordCount: 0,
30986
- userCount: 0,
30987
- userList: [],
30988
- });
30989
31142
  this.myOrgData$ = combineLatest([
30990
31143
  this.platformService.getMe(),
30991
31144
  this.platformService.getUsers(),
@@ -31004,7 +31157,7 @@ class MyOrgService {
31004
31157
  userList,
31005
31158
  userCount,
31006
31159
  };
31007
- }));
31160
+ }), shareReplay(1));
31008
31161
  }
31009
31162
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, deps: [{ token: PlatformServiceInterface }, { token: OrganizationsServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
31010
31163
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31697,11 +31850,11 @@ class RecordFormComponent {
31697
31850
  return field.config.model;
31698
31851
  }
31699
31852
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
31853
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31701
31854
  }
31702
31855
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31703
31856
  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" }]
31857
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n" }]
31705
31858
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31706
31859
 
31707
31860
  const ROUTER_STATE_KEY = 'router';
@@ -32069,5 +32222,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32069
32222
  * Generated bundle index. Do not edit.
32070
32223
  */
32071
32224
 
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 };
32225
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32073
32226
  //# sourceMappingURL=geonetwork-ui.mjs.map