geonetwork-ui 2.2.0-dev.177cac3b → 2.2.0-dev.260a7d93

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 (333) 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/organizations/organizations-from-metadata.service.mjs +10 -3
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  10. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  11. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  12. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  15. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  16. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  17. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  19. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  20. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  21. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  22. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  23. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  24. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +106 -0
  25. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  26. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  27. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +20 -3
  28. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  29. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  30. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +5 -4
  31. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  32. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  33. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  34. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  35. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  36. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  37. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +1 -1
  38. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  39. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  40. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  41. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  42. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  43. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  44. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  45. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  46. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  47. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  48. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  49. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  50. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  51. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  52. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -3
  53. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  54. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -22
  55. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +2 -3
  56. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  57. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +6 -4
  58. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  59. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  60. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +3 -3
  61. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  62. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  63. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  64. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  65. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +12 -7
  66. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  67. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  68. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  69. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  70. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  71. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  72. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  73. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  74. package/esm2022/translations/de.json +103 -98
  75. package/esm2022/translations/en.json +28 -23
  76. package/esm2022/translations/es.json +9 -4
  77. package/esm2022/translations/fr.json +12 -7
  78. package/esm2022/translations/it.json +11 -6
  79. package/esm2022/translations/nl.json +9 -4
  80. package/esm2022/translations/pt.json +9 -4
  81. package/fesm2022/geonetwork-ui.mjs +1098 -759
  82. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  83. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  84. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  85. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  86. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  87. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  88. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  89. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
  90. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  91. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  92. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  93. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  94. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  95. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  96. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  97. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  98. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  99. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  100. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  101. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  102. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +15 -15
  103. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  104. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  105. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  106. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  107. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  108. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  109. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  110. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  111. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  112. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  113. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  114. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  115. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  116. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  117. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  118. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  119. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  120. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  121. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  122. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  123. package/libs/feature/map/src/index.d.ts +1 -0
  124. package/libs/feature/map/src/index.d.ts.map +1 -1
  125. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +22 -0
  126. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -0
  127. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  128. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  129. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  130. package/libs/feature/map/src/lib/feature-map.module.d.ts +15 -13
  131. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  132. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +25 -0
  133. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  134. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  135. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  136. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  137. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  138. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  139. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  140. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  141. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  142. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  143. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  144. package/libs/feature/search/src/index.d.ts +3 -0
  145. package/libs/feature/search/src/index.d.ts.map +1 -1
  146. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  147. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  148. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  149. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  150. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  151. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  152. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  153. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  154. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  155. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  156. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  157. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  158. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  159. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  160. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  161. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  162. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  163. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  164. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  165. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  166. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  167. package/libs/ui/elements/src/index.d.ts +1 -0
  168. package/libs/ui/elements/src/index.d.ts.map +1 -1
  169. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  170. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  171. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  172. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +7 -3
  173. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  174. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  175. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  176. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  177. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  178. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  179. package/libs/ui/inputs/src/index.d.ts +1 -0
  180. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  181. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  182. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  183. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  184. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  185. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  186. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  187. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -39
  188. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  189. package/libs/ui/layout/src/index.d.ts +2 -0
  190. package/libs/ui/layout/src/index.d.ts.map +1 -1
  191. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  192. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  193. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  194. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  195. package/libs/ui/search/src/index.d.ts +0 -1
  196. package/libs/ui/search/src/index.d.ts.map +1 -1
  197. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  198. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  199. package/libs/util/i18n/src/index.d.ts +0 -1
  200. package/libs/util/i18n/src/index.d.ts.map +1 -1
  201. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  202. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  203. package/package.json +4 -1
  204. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
  205. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
  206. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
  207. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  208. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +112 -65
  209. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +3 -2
  210. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
  211. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
  212. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
  213. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  214. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  215. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  216. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  217. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  218. package/src/libs/common/domain/src/lib/index.ts +2 -0
  219. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +17 -18
  220. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  221. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  222. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  223. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  224. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  225. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  226. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  227. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  228. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  229. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -2
  230. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  231. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  232. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  233. package/src/libs/feature/map/src/index.ts +1 -0
  234. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.css +0 -0
  235. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +21 -0
  236. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +107 -0
  237. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  238. package/src/libs/feature/map/src/lib/feature-map.module.ts +10 -0
  239. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  240. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  241. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  242. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  243. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +3 -1
  244. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  245. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  246. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  247. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  248. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  249. package/src/libs/feature/search/src/index.ts +3 -0
  250. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  251. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  252. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  253. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  254. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  255. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  256. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  257. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  258. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  259. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  260. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  261. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  262. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  263. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  264. package/src/libs/ui/elements/src/index.ts +1 -0
  265. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  266. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
  267. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  268. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  269. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  270. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +54 -54
  271. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  272. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  273. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +45 -18
  274. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +31 -12
  275. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +1 -2
  276. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  277. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  278. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -1
  279. package/src/libs/ui/inputs/src/index.ts +1 -0
  280. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  281. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  282. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -0
  283. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  284. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  285. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  286. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  287. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +5 -2
  288. package/src/libs/ui/layout/src/index.ts +2 -0
  289. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  290. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  291. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  292. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  293. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  294. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  295. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  296. package/src/libs/ui/search/src/index.ts +0 -1
  297. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  298. package/src/libs/util/i18n/src/index.ts +0 -1
  299. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  300. package/translations/de.json +103 -98
  301. package/translations/en.json +28 -23
  302. package/translations/es.json +9 -4
  303. package/translations/fr.json +12 -7
  304. package/translations/it.json +11 -6
  305. package/translations/nl.json +9 -4
  306. package/translations/pt.json +9 -4
  307. package/translations/sk.json +9 -4
  308. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  309. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  310. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  311. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  312. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  313. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  314. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  315. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  316. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  317. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  318. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  319. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  320. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  321. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  322. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  323. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  324. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  325. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  326. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  327. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  328. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  329. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  330. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  331. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  332. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  333. /package/src/libs/feature/map/src/lib/{utils → constant}/projections.ts +0 -0
@@ -1,18 +1,18 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
2
  import format from 'date-fns/format';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ElementRef, ViewChildren } from '@angular/core';
4
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, ElementRef, ViewChildren } from '@angular/core';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
7
  import * as i1$1 from '@ngx-translate/core';
8
- import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService, TranslateFakeCompiler, TranslateDefaultParser, FakeMissingTranslationHandler } from '@ngx-translate/core';
8
+ import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
10
10
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
11
- import { map as map$1, shareReplay, filter, tap as tap$1, startWith, switchMap as switchMap$1, catchError, take, withLatestFrom, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
11
+ import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestFrom, switchMap as switchMap$1, catchError, take, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, tap as tap$2, fromEvent, timer, from, Subscription, animationFrameScheduler, firstValueFrom, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, EMPTY, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, from, Subscription, animationFrameScheduler, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
18
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
@@ -32,8 +32,8 @@ import WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';
32
32
  import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
33
33
  import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
34
34
  import WMTSCapabilities from 'ol/format/WMTSCapabilities';
35
- import { WmsEndpoint, WfsEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
36
35
  import chroma from 'chroma-js';
36
+ import { WmsEndpoint, WfsEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
37
37
  import { register, fromEPSGCode } from 'ol/proj/proj4';
38
38
  import proj4 from 'proj4/dist/proj4';
39
39
  import * as TOML from '@ltd/j-toml';
@@ -78,6 +78,8 @@ import * as i1$8 from '@ngrx/effects';
78
78
  import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
79
79
  import tippy from 'tippy.js';
80
80
  import { valid as valid$1 } from 'geojson-validation';
81
+ import { Polygon } from 'ol/geom';
82
+ import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
81
83
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
82
84
  import * as i4$1 from '@angular/cdk/scrolling';
83
85
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -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",
16692
- "dashboard.labels.mySpace": "",
16693
- "dashboard.records.all": "",
16694
- "dashboard.records.myDraft": "",
16695
- "dashboard.records.myLibrary": "",
16696
- "dashboard.records.myOrg": "",
16697
- "dashboard.records.myRecords": "",
16698
- "dashboard.records.noRecord": "",
16699
- "dashboard.records.noUser": "",
16700
- "dashboard.records.publishedRecords": "",
16701
- "dashboard.records.search": "",
16702
- "dashboard.records.userDetail": "",
16703
- "dashboard.records.userEmail": "",
16704
- "dashboard.records.username": "",
16705
- "dashboard.records.users": "",
16583
+ "dashboard.createRecord": "",
16584
+ "dashboard.labels.mySpace": "Mein Bereich",
16585
+ "dashboard.records.all": "Katalog",
16586
+ "dashboard.records.myDraft": "Meine Entwürfe",
16587
+ "dashboard.records.myLibrary": "Meine Bibliothek",
16588
+ "dashboard.records.myOrg": "Meine Organisation",
16589
+ "dashboard.records.myRecords": "Meine Datensätze",
16590
+ "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16591
+ "dashboard.records.search": "Suche nach \"{searchText}\"",
16592
+ "dashboard.records.userDetail": "Name",
16593
+ "dashboard.records.userEmail": "E-Mail",
16594
+ "dashboard.records.username": "Benutzername",
16595
+ "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16596
+ "dashboard.results.listMetadata": "",
16597
+ "dashboard.results.listResources": "",
16706
16598
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16707
16599
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16708
16600
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16716,7 +16608,7 @@ var de = {
16716
16608
  "datafeeder.form.datepicker": "Wissen Sie, wann der Datensatz erstellt wurde?",
16717
16609
  "datafeeder.form.description": "Beschreiben Sie abschließend den Prozess, der zur Erstellung des Datensatzes verwendet wurde",
16718
16610
  "datafeeder.form.dropdown": "Für welche Skala wurde er erstellt?",
16719
- "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tags aus, die zu Ihrem Datensatz passen",
16611
+ "datafeeder.form.tags": "Wählen Sie einen oder mehrere Tage aus, die zu Ihrem Datensatz passen",
16720
16612
  "datafeeder.form.title": "Geben Sie Ihrem Datensatz den besten Titel",
16721
16613
  "datafeeder.formsPage.title": "Erzählen Sie uns mehr über Ihren Datensatz",
16722
16614
  "datafeeder.month.april": "April",
@@ -16731,16 +16623,16 @@ var de = {
16731
16623
  "datafeeder.month.november": "November",
16732
16624
  "datafeeder.month.october": "Oktober",
16733
16625
  "datafeeder.month.september": "September",
16734
- "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist",
16735
- "datafeeder.publish.illustration.title": "Ein weiterer Datensatz zum Veröffentlichen?",
16626
+ "datafeeder.publish.hint": "Sie können diese Seite sicher verlassen. Sie werden benachrichtigt, wenn der Vorgang abgeschlossen ist.",
16627
+ "datafeeder.publish.illustration.title": "Ein weiterer Datensatz \n zum Veröffentlichen?",
16736
16628
  "datafeeder.publish.subtitle": "Das Veröffentlichen kann einige Minuten dauern.",
16737
- "datafeeder.publish.title": "Vielen Dank! Ihr Datensatz wird veröffentlicht",
16629
+ "datafeeder.publish.title": "Vielen Dank! \n Ihr Datensatz wird veröffentlicht",
16738
16630
  "datafeeder.publish.upload": "Jetzt hochladen",
16739
16631
  "datafeeder.publishSuccess.geonetworkRecord": "Metadatensatz",
16740
16632
  "datafeeder.publishSuccess.illustration.title": "Erledigt, alles ist gut!",
16741
16633
  "datafeeder.publishSuccess.mapViewer": "Kartenviewer",
16742
16634
  "datafeeder.publishSuccess.subtitle": "Zeigen Sie Ihre Daten an in:",
16743
- "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! Ihr Datensatz wurde veröffentlicht",
16635
+ "datafeeder.publishSuccess.title": "Herzlichen Glückwunsch! \n Ihr Datensatz wurde veröffentlicht",
16744
16636
  "datafeeder.publishSuccess.uploadAnotherData": "Ein weiteren Datensatz hochladen",
16745
16637
  "datafeeder.summarizePage.illustration": "Kein Fehler? Los geht's!",
16746
16638
  "datafeeder.summarizePage.previous": "Zurück",
@@ -16748,11 +16640,11 @@ var de = {
16748
16640
  "datafeeder.summarizePage.title": "Sie sind fast fertig...",
16749
16641
  "datafeeder.upload.acceptedFormats": "Akzeptierte Dateiformate:",
16750
16642
  "datafeeder.upload.checkboxLabel": "Ich besitze die Rechte zur Veröffentlichung dieses Datensatzes",
16751
- "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geospatialen Datensatz enthält",
16643
+ "datafeeder.upload.error.subtitle.analysis": "Überprüfen Sie, ob die Datei einen gültigen geografischen Datensatz enthält",
16752
16644
  "datafeeder.upload.error.subtitle.cantOpenFile": "Bitte überprüfen Sie, ob die Datei gültig ist",
16753
16645
  "datafeeder.upload.error.subtitle.fileFormat": "Beachten Sie: Nur SHP-Dateien",
16754
- "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximal {size} MB",
16755
- "datafeeder.upload.error.title.analysis": "Fehler bei der Datensatzanalyse",
16646
+ "datafeeder.upload.error.subtitle.fileSize": "Beachten Sie: Maximale Dateigröße {size} MB",
16647
+ "datafeeder.upload.error.title.analysis": "Fehler während der Datensatzanalyse",
16756
16648
  "datafeeder.upload.error.title.cantOpenFile": "Fehler beim Öffnen der Datei",
16757
16649
  "datafeeder.upload.error.title.fileFormat": "Das ausgewählte Dateiformat wird nicht unterstützt",
16758
16650
  "datafeeder.upload.error.title.fileHasntSelected": "Keine Datei ausgewählt",
@@ -16760,19 +16652,19 @@ var de = {
16760
16652
  "datafeeder.upload.error.title.noRightsToSendData": "Sie dürfen diesen Datensatz nicht veröffentlichen",
16761
16653
  "datafeeder.upload.illustration.enrichment": "Anreicherung",
16762
16654
  "datafeeder.upload.illustration.import": "Import",
16763
- "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten war noch nie einfacher",
16655
+ "datafeeder.upload.illustration.title": "Das Hinzufügen von Daten \n war noch nie so einfach",
16764
16656
  "datafeeder.upload.illustration.validation": "Validierung",
16765
- "datafeeder.upload.illustration.verification": "Verifizierung",
16657
+ "datafeeder.upload.illustration.verification": "Überprüfung",
16766
16658
  "datafeeder.upload.inputLabel": "Importieren Sie Ihre Datei",
16767
16659
  "datafeeder.upload.maxFileSize": "Maximale Dateigröße beträgt {size} MB",
16768
16660
  "datafeeder.upload.title": "Laden Sie Ihren Datensatz hoch",
16769
16661
  "datafeeder.upload.uploadButton": "Hochladen",
16770
- "datafeeder.validation.encoding": "Kodierung",
16662
+ "datafeeder.validation.encoding": "Codierung",
16771
16663
  "datafeeder.validation.extent.title": "Hier ist der Datensatzumfang",
16772
16664
  "datafeeder.validation.extent.title.unknown": "Das Projektionssystem ist unbekannt",
16773
16665
  "datafeeder.validation.projection": "Raumbezugssystem:",
16774
- "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem",
16775
- "datafeeder.validation.sample.title": "Und eine Beispieleinheit aus dem Datensatz",
16666
+ "datafeeder.validation.projection.unknown": "Wählen Sie ein Raumbezugssystem aus",
16667
+ "datafeeder.validation.sample.title": "Und eine Beispielentität aus dem Datensatz",
16776
16668
  "datafeeder.wizard.emptyRequiredValuesMessage": "Bitte füllen Sie die obligatorischen Felder aus",
16777
16669
  "datafeeder.wizardSummarize.createdAt": "Erstellt am",
16778
16670
  "datafeeder.wizardSummarize.scale": "Maßstab",
@@ -16782,20 +16674,20 @@ var de = {
16782
16674
  "datahub.header.news": "Startseite",
16783
16675
  "datahub.header.organisations": "Organisationen",
16784
16676
  "datahub.header.popularRecords": "Die beliebtesten",
16785
- "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten von meiner Organisation</div>",
16786
- "datahub.news.contact.contactus": "",
16787
- "datahub.news.contact.html": "",
16788
- "datahub.news.contact.title": "",
16677
+ "datahub.header.title.html": "<div class=\"text-white\">Entdecken Sie offene<br> Daten meiner Organisation</div>",
16678
+ "datahub.news.contact.contactus": "Kontaktieren Sie uns",
16679
+ "datahub.news.contact.html": "<p>Brauchen Sie Daten, die derzeit nicht auf der Plattform vorhanden sind?</p><p>Unsere Teams stehen Ihnen zur Verfügung.</p>",
16680
+ "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
16789
16681
  "datahub.news.feed": "Nachrichtenfeed",
16790
16682
  "datahub.news.figures": "Indikatoren",
16791
- "datahub.record.addToFavorites": "",
16792
- "datahub.search.back": "Zurück zu den Ergebnissen",
16683
+ "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
16684
+ "datahub.search.back": "Zurück",
16793
16685
  "datahub.search.filter.all": "Alle",
16794
- "datahub.search.filter.generatedByWfs": "Generiert durch API",
16686
+ "datahub.search.filter.generatedByWfs": "Generiert durch eine API",
16795
16687
  "datahub.search.filter.others": "Andere",
16796
16688
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
16797
16689
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
16798
- "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht geparst werden: \"{ info }\"",
16690
+ "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
16799
16691
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
16800
16692
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
16801
16693
  "domain.record.status.completed": "Abgeschlossen",
@@ -16803,18 +16695,18 @@ var de = {
16803
16695
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
16804
16696
  "domain.record.status.removed": "Entfernt",
16805
16697
  "domain.record.status.under_development": "In Erstellung",
16806
- "domain.record.updateFrequency.asNeeded": "Bei Bedarf",
16807
- "domain.record.updateFrequency.continual": "Kontinuierlich",
16698
+ "domain.record.updateFrequency.asNeeded": "Nach Bedarf",
16699
+ "domain.record.updateFrequency.continual": "Fortlaufend",
16808
16700
  "domain.record.updateFrequency.day": "{count, plural, =0{0} one{Ein} other{{count}}} mal am Tag",
16809
- "domain.record.updateFrequency.irregular": "Unregelmässig",
16701
+ "domain.record.updateFrequency.irregular": "Unregelmäßig",
16810
16702
  "domain.record.updateFrequency.month": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Monat",
16811
16703
  "domain.record.updateFrequency.notPlanned": "Nicht geplant",
16812
- "domain.record.updateFrequency.periodic": "Regelmässig",
16704
+ "domain.record.updateFrequency.periodic": "Regelmäßig",
16813
16705
  "domain.record.updateFrequency.unknown": "Unbekannt",
16814
16706
  "domain.record.updateFrequency.week": "{count, plural, =0{0} one{Ein} other{{count}}} mal in der Woche",
16815
16707
  "domain.record.updateFrequency.year": "{count, plural, =0{0} one{Ein} other{{count}}} mal im Jahr",
16816
16708
  "downloads.format.unknown": "unbekannt",
16817
- "downloads.wfs.featuretype.not.found": "Die Schicht wurde nicht gefunden",
16709
+ "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16818
16710
  dropFile: dropFile$6,
16819
16711
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16820
16712
  "facets.block.title.OrgForResource": "Organisation",
@@ -16849,15 +16741,18 @@ var de = {
16849
16741
  "map.add.layer.file": "Aus einer Datei",
16850
16742
  "map.add.layer.wfs": "Aus WFS",
16851
16743
  "map.add.layer.wms": "Aus WMS",
16852
- "map.layer.add": "",
16853
- "map.layers.available": "",
16744
+ "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16745
+ "map.geocoding.placeholder": "",
16746
+ "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16747
+ "map.layer.add": "Hinzufügen",
16748
+ "map.layers.available": "Verfügbare Layer",
16854
16749
  "map.layers.list": "Ebenen",
16855
16750
  "map.loading.data": "Kartendaten werden geladen...",
16856
- "map.loading.service": "",
16751
+ "map.loading.service": "Dienst wird geladen...",
16857
16752
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
16858
16753
  "map.select.layer": "Datenquelle",
16859
- "map.wfs.urlInput.hint": "",
16860
- "map.wms.urlInput.hint": "",
16754
+ "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
16755
+ "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
16861
16756
  "multiselect.filter.placeholder": "Suche",
16862
16757
  "nav.back": "Zurück",
16863
16758
  next: next$6,
@@ -16873,61 +16768,61 @@ var de = {
16873
16768
  "pagination.pageOf": "von",
16874
16769
  previous: previous$6,
16875
16770
  "record.action.download": "Herunterladen",
16876
- "record.action.view": "Ansehen",
16771
+ "record.action.view": "Anzeigen",
16877
16772
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
16878
16773
  "record.metadata.about": "Beschreibung",
16879
16774
  "record.metadata.api": "API",
16880
- "record.metadata.api.form.closeButton": "",
16881
- "record.metadata.api.form.closeForm": "",
16882
- "record.metadata.api.form.create": "",
16883
- "record.metadata.api.form.customUrl": "",
16884
- "record.metadata.api.form.limit": "",
16885
- "record.metadata.api.form.limit.all": "",
16886
- "record.metadata.api.form.offset": "",
16887
- "record.metadata.api.form.openForm": "",
16888
- "record.metadata.api.form.reset": "",
16889
- "record.metadata.api.form.title": "",
16890
- "record.metadata.api.form.type": "",
16891
- "record.metadata.author": "",
16775
+ "record.metadata.api.form.closeButton": "Schließen",
16776
+ "record.metadata.api.form.closeForm": "Formular schließen",
16777
+ "record.metadata.api.form.create": "Ihre Anfrage erstellen",
16778
+ "record.metadata.api.form.customUrl": "Benutzerdefinierte URL",
16779
+ "record.metadata.api.form.limit": "Anzahl der Datensätze",
16780
+ "record.metadata.api.form.limit.all": "Alle",
16781
+ "record.metadata.api.form.offset": "Anzahl des ersten Datensatzes",
16782
+ "record.metadata.api.form.openForm": "Formular öffnen",
16783
+ "record.metadata.api.form.reset": "Zurücksetzen",
16784
+ "record.metadata.api.form.title": "Benutzerdefinierte URL generieren",
16785
+ "record.metadata.api.form.type": "Ausgabeformat",
16786
+ "record.metadata.author": "Autor",
16892
16787
  "record.metadata.catalog": "Katalog",
16893
16788
  "record.metadata.contact": "Kontakt",
16894
- "record.metadata.createdOn": "Erstellt am",
16895
16789
  "record.metadata.details": "Technische Informationen",
16896
16790
  "record.metadata.download": "Downloads",
16897
- "record.metadata.formats": "",
16898
- "record.metadata.isOpenData": "Open Data",
16791
+ "record.metadata.formats": "Formate",
16899
16792
  "record.metadata.keywords": "Stichworte",
16900
- "record.metadata.lastUpdate": "",
16793
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16901
16794
  "record.metadata.links": "Links",
16902
- "record.metadata.noUsage": "Für diesen Datensatz sind keine Verwendungsbedingungen angegeben.",
16795
+ "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16903
16796
  "record.metadata.origin": "Über die Daten",
16797
+ "record.metadata.otherConstraints": "",
16904
16798
  "record.metadata.owner": "",
16905
16799
  "record.metadata.preview": "Vorschau",
16906
16800
  "record.metadata.publications": "Veröffentlichungen",
16907
- "record.metadata.quality": "",
16908
- "record.metadata.quality.contact.failed": "",
16909
- "record.metadata.quality.contact.success": "",
16910
- "record.metadata.quality.description.failed": "",
16911
- "record.metadata.quality.description.success": "",
16912
- "record.metadata.quality.details": "",
16913
- "record.metadata.quality.keywords.failed": "",
16914
- "record.metadata.quality.keywords.success": "",
16915
- "record.metadata.quality.legalConstraints.failed": "",
16916
- "record.metadata.quality.legalConstraints.success": "",
16917
- "record.metadata.quality.organisation.failed": "",
16918
- "record.metadata.quality.organisation.success": "",
16919
- "record.metadata.quality.title.failed": "",
16920
- "record.metadata.quality.title.success": "",
16921
- "record.metadata.quality.topic.failed": "",
16922
- "record.metadata.quality.topic.success": "",
16923
- "record.metadata.quality.updateFrequency.failed": "",
16924
- "record.metadata.quality.updateFrequency.success": "",
16801
+ "record.metadata.quality": "Metadatenqualität",
16802
+ "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
16803
+ "record.metadata.quality.contact.success": "Kontakt angegeben",
16804
+ "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
16805
+ "record.metadata.quality.description.success": "Beschreibung angegeben",
16806
+ "record.metadata.quality.details": "Details",
16807
+ "record.metadata.quality.keywords.failed": "Schlagwörter nicht angegeben",
16808
+ "record.metadata.quality.keywords.success": "Schlagwörter angegeben",
16809
+ "record.metadata.quality.legalConstraints.failed": "Rechtliche Beschränkungen nicht angegeben",
16810
+ "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
16811
+ "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
16812
+ "record.metadata.quality.organisation.success": "Organisation angegeben",
16813
+ "record.metadata.quality.title.failed": "Titel nicht angegeben",
16814
+ "record.metadata.quality.title.success": "Titel angegeben",
16815
+ "record.metadata.quality.topic.failed": "Thema nicht angegeben",
16816
+ "record.metadata.quality.topic.success": "Thema angegeben",
16817
+ "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
16818
+ "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16925
16819
  "record.metadata.related": "Ähnliche Datensätze",
16926
- "record.metadata.sheet": "Weitere Informationen erhalten Sie unter :",
16927
- "record.metadata.themes": "",
16820
+ "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16821
+ "record.metadata.status": "",
16822
+ "record.metadata.themes": "Kategorien",
16928
16823
  "record.metadata.title": "Titel",
16929
- "record.metadata.type": "",
16930
- "record.metadata.uniqueId": "",
16824
+ "record.metadata.type": "Geographischer Datensatz",
16825
+ "record.metadata.uniqueId": "Eindeutige Kennung",
16931
16826
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16932
16827
  "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16933
16828
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
@@ -16939,28 +16834,29 @@ var de = {
16939
16834
  "record.was.created.time": "erstellte diesen Datensatz {time}",
16940
16835
  records: records$6,
16941
16836
  "results.layout.selectOne": "Layout auswählen",
16942
- "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{auf {hits} insgesamt angezeigt.}}",
16943
- "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie andere Wörter</li><li>Geben Sie weniger Wörter ein</li></ul>",
16837
+ "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{angezeigt von {hits} insgesamt.}}",
16838
+ "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie es mit anderen Worten</li><li>Beschränken Sie die Suchwörter</li></ul>",
16944
16839
  "results.records.hits.found": "{hits, plural, =0{Keine Dokumente entsprechen der angegebenen Suche.} one{1 Datensatz gefunden.} other{{hits} Datensätze gefunden.}}",
16945
- "results.records.hits.selected": "",
16840
+ "results.records.hits.selected": "{ amount } ausgewählt",
16946
16841
  "results.showMore": "Mehr Ergebnisse anzeigen...",
16947
- "results.sortBy.dateStamp": "Letzte Aktualisierungen",
16842
+ "results.sortBy.dateStamp": "Neueste",
16948
16843
  "results.sortBy.popularity": "Beliebtheit",
16949
- "results.sortBy.qualityScore": "",
16844
+ "results.sortBy.qualityScore": "Qualitätsbewertung",
16950
16845
  "results.sortBy.relevancy": "Relevanz",
16951
16846
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
16952
16847
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
16953
- "search.error.receivedError": "Ein Fehler wurde empfangen",
16848
+ "search.error.receivedError": "Ein Fehler ist aufgetreten",
16954
16849
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
16955
- "search.field.any.placeholder": "Suche nach Datensätzen ...",
16850
+ "search.field.any.placeholder": "Suche Datensätze ...",
16956
16851
  "search.field.sortBy": "Sortieren nach:",
16957
16852
  "search.filters.clear": "Zurücksetzen",
16958
- "search.filters.contact": "Kontakt",
16853
+ "search.filters.contact": "Kontakte",
16959
16854
  "search.filters.format": "Formate",
16960
16855
  "search.filters.inspireKeyword": "INSPIRE-Schlüsselwort",
16961
16856
  "search.filters.isSpatial": "Ist räumliche Daten",
16962
16857
  "search.filters.isSpatial.no": "nicht räumlich",
16963
16858
  "search.filters.isSpatial.yes": "räumlich",
16859
+ "search.filters.keyword": "Schlüsselwort",
16964
16860
  "search.filters.license": "Lizenz",
16965
16861
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16966
16862
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16973,13 +16869,13 @@ var de = {
16973
16869
  "search.filters.license.unknown": "Unbekannt oder nicht vorhanden",
16974
16870
  "search.filters.maximize": "Erweitern",
16975
16871
  "search.filters.minimize": "Minimieren",
16976
- "search.filters.myRecords": "",
16977
- "search.filters.myRecordsHelp": "",
16978
- "search.filters.otherRecords": "",
16872
+ "search.filters.myRecords": "Nur meine Datensätze anzeigen",
16873
+ "search.filters.myRecordsHelp": "Wenn dies aktiviert ist, werden nur von mir erstellte Datensätze angezeigt; Datensätze, die von anderen erstellt wurden, werden nicht angezeigt.",
16874
+ "search.filters.otherRecords": "Datensätze von einer anderen Person anzeigen",
16979
16875
  "search.filters.publicationYear": "Veröffentlichungsjahr",
16980
16876
  "search.filters.publisher": "Organisationen",
16981
- "search.filters.representationType": "",
16982
- "search.filters.resourceType": "",
16877
+ "search.filters.representationType": "Repräsentationstyp",
16878
+ "search.filters.resourceType": "Ressourcentyp",
16983
16879
  "search.filters.standard": "Standard",
16984
16880
  "search.filters.title": "Ergebnisse filtern",
16985
16881
  "search.filters.topic": "Thema",
@@ -17025,20 +16921,21 @@ var en = {
17025
16921
  "chart.type.line": "line chart",
17026
16922
  "chart.type.lineSmooth": "smooth line chart",
17027
16923
  "chart.type.pie": "pie chart",
16924
+ "dashboard.createRecord": "New record",
17028
16925
  "dashboard.labels.mySpace": "My space",
17029
- "dashboard.records.all": "Catalog",
16926
+ "dashboard.records.all": "Metadata records",
17030
16927
  "dashboard.records.myDraft": "My drafts",
17031
16928
  "dashboard.records.myLibrary": "My library",
17032
16929
  "dashboard.records.myOrg": "Organization",
17033
16930
  "dashboard.records.myRecords": "My Records",
17034
- "dashboard.records.noRecord": "No record for this organization",
17035
- "dashboard.records.noUser": "No users for this organization",
17036
16931
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17037
16932
  "dashboard.records.search": "Search for \"{searchText}\"",
17038
16933
  "dashboard.records.userDetail": "Name",
17039
16934
  "dashboard.records.userEmail": "Email",
17040
16935
  "dashboard.records.username": "Username",
17041
16936
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
16937
+ "dashboard.results.listMetadata": "Show metadata",
16938
+ "dashboard.results.listResources": "Show resources",
17042
16939
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17043
16940
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17044
16941
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17185,6 +17082,9 @@ var en = {
17185
17082
  "map.add.layer.file": "From a file",
17186
17083
  "map.add.layer.wfs": "From WFS",
17187
17084
  "map.add.layer.wms": "From WMS",
17085
+ "map.addFromFile.placeholder": "Click or drop a file here",
17086
+ "map.geocoding.placeholder": "Search for a place",
17087
+ "map.help.addFromFile": "Click or drag and drop a file to add to the map (currently supports GeoJSON format only).",
17188
17088
  "map.layer.add": "Add",
17189
17089
  "map.layers.available": "Available Layers",
17190
17090
  "map.layers.list": "Layers",
@@ -17227,47 +17127,47 @@ var en = {
17227
17127
  "record.metadata.author": "Author",
17228
17128
  "record.metadata.catalog": "Catalog",
17229
17129
  "record.metadata.contact": "Contact",
17230
- "record.metadata.createdOn": "Created on",
17231
17130
  "record.metadata.details": "Technical information",
17232
17131
  "record.metadata.download": "Downloads",
17233
17132
  "record.metadata.formats": "Formats",
17234
- "record.metadata.isOpenData": "Open Data",
17235
17133
  "record.metadata.keywords": "Keywords",
17236
17134
  "record.metadata.lastUpdate": "Last updated on",
17237
17135
  "record.metadata.links": "Links",
17238
17136
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17239
17137
  "record.metadata.origin": "About the data",
17138
+ "record.metadata.otherConstraints": "Additional Conditions",
17240
17139
  "record.metadata.owner": "Catalog of origin",
17241
17140
  "record.metadata.preview": "Preview",
17242
17141
  "record.metadata.publications": "publications",
17243
17142
  "record.metadata.quality": "Metadata Quality",
17244
- "record.metadata.quality.contact.failed": "Contact is not completed",
17245
- "record.metadata.quality.contact.success": "Contact is completed",
17246
- "record.metadata.quality.description.failed": "Description is not completed",
17247
- "record.metadata.quality.description.success": "Description is completed",
17143
+ "record.metadata.quality.contact.failed": "Contact is not specified",
17144
+ "record.metadata.quality.contact.success": "Contact is specified",
17145
+ "record.metadata.quality.description.failed": "Description is not specified",
17146
+ "record.metadata.quality.description.success": "Description is specified",
17248
17147
  "record.metadata.quality.details": "Details",
17249
- "record.metadata.quality.keywords.failed": "Keywords are not completed",
17250
- "record.metadata.quality.keywords.success": "Keywords are completed",
17251
- "record.metadata.quality.legalConstraints.failed": "Legal constraints are not completed",
17252
- "record.metadata.quality.legalConstraints.success": "Legal constraints are completed",
17253
- "record.metadata.quality.organisation.failed": "Organisation is not completed",
17254
- "record.metadata.quality.organisation.success": "Organisation is completed",
17255
- "record.metadata.quality.title.failed": "Title is not completed",
17256
- "record.metadata.quality.title.success": "Title is completed",
17257
- "record.metadata.quality.topic.failed": "Topic is not completed",
17258
- "record.metadata.quality.topic.success": "Topic is completed",
17259
- "record.metadata.quality.updateFrequency.failed": "Update frequency is not completed",
17260
- "record.metadata.quality.updateFrequency.success": "Update frequency is completed",
17148
+ "record.metadata.quality.keywords.failed": "Keywords are not specified",
17149
+ "record.metadata.quality.keywords.success": "Keywords are specified",
17150
+ "record.metadata.quality.legalConstraints.failed": "Legal constraints are not specified",
17151
+ "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
17152
+ "record.metadata.quality.organisation.failed": "Organisation is not specified",
17153
+ "record.metadata.quality.organisation.success": "Organisation is specified",
17154
+ "record.metadata.quality.title.failed": "Title is not specified",
17155
+ "record.metadata.quality.title.success": "Title is specified",
17156
+ "record.metadata.quality.topic.failed": "Topic is not specified",
17157
+ "record.metadata.quality.topic.success": "Topic is specified",
17158
+ "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17159
+ "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17261
17160
  "record.metadata.related": "Related records",
17262
17161
  "record.metadata.sheet": "Original metadata",
17162
+ "record.metadata.status": "Status",
17263
17163
  "record.metadata.themes": "Categories",
17264
17164
  "record.metadata.title": "Title",
17265
17165
  "record.metadata.type": "Geographical dataset",
17266
17166
  "record.metadata.uniqueId": "Unique Identifier",
17267
17167
  "record.metadata.updateFrequency": "Data Update Frequency",
17268
17168
  "record.metadata.updateStatus": "Data Update Status",
17269
- "record.metadata.updatedOn": "Metadata's last update",
17270
- "record.metadata.usage": "Usage & constraints",
17169
+ "record.metadata.updatedOn": "Last Data Information Update",
17170
+ "record.metadata.usage": "License and Conditions",
17271
17171
  "record.more.details": "Read more",
17272
17172
  "record.tab.chart": "Chart",
17273
17173
  "record.tab.data": "Table",
@@ -17297,6 +17197,7 @@ var en = {
17297
17197
  "search.filters.isSpatial": "Is spatial data",
17298
17198
  "search.filters.isSpatial.no": "non spatial",
17299
17199
  "search.filters.isSpatial.yes": "spatial",
17200
+ "search.filters.keyword": "Keyword",
17300
17201
  "search.filters.license": "License",
17301
17202
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17302
17203
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17361,20 +17262,21 @@ var es = {
17361
17262
  "chart.type.line": "gráfico de líneas",
17362
17263
  "chart.type.lineSmooth": "gráfico de líneas suave",
17363
17264
  "chart.type.pie": "gráfico circular",
17265
+ "dashboard.createRecord": "",
17364
17266
  "dashboard.labels.mySpace": "Mi espacio",
17365
17267
  "dashboard.records.all": "Catálogo",
17366
17268
  "dashboard.records.myDraft": "Mis borradores",
17367
17269
  "dashboard.records.myLibrary": "Mi biblioteca",
17368
17270
  "dashboard.records.myOrg": "Organización",
17369
17271
  "dashboard.records.myRecords": "Mis Registros",
17370
- "dashboard.records.noRecord": "",
17371
- "dashboard.records.noUser": "",
17372
17272
  "dashboard.records.publishedRecords": "",
17373
17273
  "dashboard.records.search": "Buscar \"{searchText}\"",
17374
17274
  "dashboard.records.userDetail": "",
17375
17275
  "dashboard.records.userEmail": "",
17376
17276
  "dashboard.records.username": "",
17377
17277
  "dashboard.records.users": "",
17278
+ "dashboard.results.listMetadata": "",
17279
+ "dashboard.results.listResources": "",
17378
17280
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17379
17281
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17380
17282
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17521,6 +17423,9 @@ var es = {
17521
17423
  "map.add.layer.file": "",
17522
17424
  "map.add.layer.wfs": "",
17523
17425
  "map.add.layer.wms": "",
17426
+ "map.addFromFile.placeholder": "",
17427
+ "map.geocoding.placeholder": "",
17428
+ "map.help.addFromFile": "",
17524
17429
  "map.layer.add": "",
17525
17430
  "map.layers.available": "",
17526
17431
  "map.layers.list": "",
@@ -17563,16 +17468,15 @@ var es = {
17563
17468
  "record.metadata.author": "",
17564
17469
  "record.metadata.catalog": "",
17565
17470
  "record.metadata.contact": "",
17566
- "record.metadata.createdOn": "",
17567
17471
  "record.metadata.details": "",
17568
17472
  "record.metadata.download": "",
17569
17473
  "record.metadata.formats": "",
17570
- "record.metadata.isOpenData": "",
17571
17474
  "record.metadata.keywords": "",
17572
17475
  "record.metadata.lastUpdate": "",
17573
17476
  "record.metadata.links": "",
17574
17477
  "record.metadata.noUsage": "",
17575
17478
  "record.metadata.origin": "",
17479
+ "record.metadata.otherConstraints": "",
17576
17480
  "record.metadata.owner": "",
17577
17481
  "record.metadata.preview": "",
17578
17482
  "record.metadata.publications": "",
@@ -17596,6 +17500,7 @@ var es = {
17596
17500
  "record.metadata.quality.updateFrequency.success": "",
17597
17501
  "record.metadata.related": "",
17598
17502
  "record.metadata.sheet": "",
17503
+ "record.metadata.status": "",
17599
17504
  "record.metadata.themes": "",
17600
17505
  "record.metadata.title": "",
17601
17506
  "record.metadata.type": "",
@@ -17633,6 +17538,7 @@ var es = {
17633
17538
  "search.filters.isSpatial": "",
17634
17539
  "search.filters.isSpatial.no": "",
17635
17540
  "search.filters.isSpatial.yes": "",
17541
+ "search.filters.keyword": "",
17636
17542
  "search.filters.license": "",
17637
17543
  "search.filters.license.cc-by": "",
17638
17544
  "search.filters.license.cc-by-sa": "",
@@ -17697,20 +17603,21 @@ var fr = {
17697
17603
  "chart.type.line": "ligne",
17698
17604
  "chart.type.lineSmooth": "ligne lisse",
17699
17605
  "chart.type.pie": "camembert",
17606
+ "dashboard.createRecord": "",
17700
17607
  "dashboard.labels.mySpace": "Mon espace",
17701
17608
  "dashboard.records.all": "Catalogue",
17702
17609
  "dashboard.records.myDraft": "Mes brouillons",
17703
17610
  "dashboard.records.myLibrary": "Ma bibliothèque",
17704
17611
  "dashboard.records.myOrg": "Mon organisation",
17705
17612
  "dashboard.records.myRecords": "Mes fiches publiées",
17706
- "dashboard.records.noRecord": "Aucun jeu de données pour cette organisation",
17707
- "dashboard.records.noUser": "Aucun utilisateur pour cette organisation",
17708
17613
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17709
17614
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17710
17615
  "dashboard.records.userDetail": "Nom",
17711
17616
  "dashboard.records.userEmail": "Email",
17712
17617
  "dashboard.records.username": "Nom d'utilisateur",
17713
17618
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17619
+ "dashboard.results.listMetadata": "",
17620
+ "dashboard.results.listResources": "",
17714
17621
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17715
17622
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17716
17623
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17792,7 +17699,7 @@ var fr = {
17792
17699
  "datahub.header.popularRecords": "Les plus appréciées",
17793
17700
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17794
17701
  "datahub.news.contact.contactus": "Contactez-nous",
17795
- "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont la pour vous répondre.</p>",
17702
+ "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont pour vous répondre.</p>",
17796
17703
  "datahub.news.contact.title": "Un besoin spécifique ?",
17797
17704
  "datahub.news.feed": "Fil d'activité",
17798
17705
  "datahub.news.figures": "Quelques chiffres",
@@ -17857,6 +17764,9 @@ var fr = {
17857
17764
  "map.add.layer.file": "",
17858
17765
  "map.add.layer.wfs": "",
17859
17766
  "map.add.layer.wms": "",
17767
+ "map.addFromFile.placeholder": "",
17768
+ "map.geocoding.placeholder": "",
17769
+ "map.help.addFromFile": "",
17860
17770
  "map.layer.add": "",
17861
17771
  "map.layers.available": "",
17862
17772
  "map.layers.list": "",
@@ -17899,16 +17809,15 @@ var fr = {
17899
17809
  "record.metadata.author": "Auteur",
17900
17810
  "record.metadata.catalog": "Catalogue",
17901
17811
  "record.metadata.contact": "Contact",
17902
- "record.metadata.createdOn": "Créé le",
17903
17812
  "record.metadata.details": "Informations techniques",
17904
17813
  "record.metadata.download": "Téléchargements",
17905
17814
  "record.metadata.formats": "Formats",
17906
- "record.metadata.isOpenData": "Donnée Ouverte",
17907
17815
  "record.metadata.keywords": "Mots clés",
17908
17816
  "record.metadata.lastUpdate": "Mis à jour le",
17909
17817
  "record.metadata.links": "Liens",
17910
17818
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17911
17819
  "record.metadata.origin": "À propos des données",
17820
+ "record.metadata.otherConstraints": "Limitations d'usage",
17912
17821
  "record.metadata.owner": "Catalogue d'origine",
17913
17822
  "record.metadata.preview": "Aperçu",
17914
17823
  "record.metadata.publications": "données",
@@ -17932,14 +17841,15 @@ var fr = {
17932
17841
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17933
17842
  "record.metadata.related": "Voir aussi",
17934
17843
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17844
+ "record.metadata.status": "",
17935
17845
  "record.metadata.themes": "Catégories",
17936
17846
  "record.metadata.title": "Titre",
17937
17847
  "record.metadata.type": "Donnée géographique",
17938
17848
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17939
17849
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17940
17850
  "record.metadata.updateStatus": "Statut de mise à jour des données",
17941
- "record.metadata.updatedOn": "Mise à jour de la fiche de métadonnée",
17942
- "record.metadata.usage": "Conditions d'utilisation",
17851
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17852
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17943
17853
  "record.more.details": "Détails",
17944
17854
  "record.tab.chart": "Graphique",
17945
17855
  "record.tab.data": "Tableau",
@@ -17969,6 +17879,7 @@ var fr = {
17969
17879
  "search.filters.isSpatial": "Données spatiales",
17970
17880
  "search.filters.isSpatial.no": "non-géolocalisées",
17971
17881
  "search.filters.isSpatial.yes": "géolocalisées",
17882
+ "search.filters.keyword": "Mot-clé",
17972
17883
  "search.filters.license": "Licence",
17973
17884
  "search.filters.license.cc-by": "cc-by",
17974
17885
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18033,20 +17944,21 @@ var it = {
18033
17944
  "chart.type.line": "grafico a linee",
18034
17945
  "chart.type.lineSmooth": "grafico a linea liscia",
18035
17946
  "chart.type.pie": "grafico a torta",
17947
+ "dashboard.createRecord": "",
18036
17948
  "dashboard.labels.mySpace": "Il mio spazio",
18037
17949
  "dashboard.records.all": "Catalogo",
18038
17950
  "dashboard.records.myDraft": "Le mie bozze",
18039
17951
  "dashboard.records.myLibrary": "La mia biblioteca",
18040
17952
  "dashboard.records.myOrg": "La mia organizzazione",
18041
17953
  "dashboard.records.myRecords": "I miei dati",
18042
- "dashboard.records.noRecord": "Nessun dati per questa organizzazione",
18043
- "dashboard.records.noUser": "Nessun utente per questa organizzazione",
18044
17954
  "dashboard.records.publishedRecords": "dati pubblicati",
18045
17955
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18046
17956
  "dashboard.records.userDetail": "Nome",
18047
17957
  "dashboard.records.userEmail": "Email",
18048
17958
  "dashboard.records.username": "Nome utente",
18049
17959
  "dashboard.records.users": "utenti",
17960
+ "dashboard.results.listMetadata": "",
17961
+ "dashboard.results.listResources": "",
18050
17962
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18051
17963
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18052
17964
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18193,6 +18105,9 @@ var it = {
18193
18105
  "map.add.layer.file": "Da un file",
18194
18106
  "map.add.layer.wfs": "Da un WFS",
18195
18107
  "map.add.layer.wms": "Da un WMS",
18108
+ "map.addFromFile.placeholder": "",
18109
+ "map.geocoding.placeholder": "",
18110
+ "map.help.addFromFile": "",
18196
18111
  "map.layer.add": "",
18197
18112
  "map.layers.available": "",
18198
18113
  "map.layers.list": "Layers",
@@ -18235,16 +18150,15 @@ var it = {
18235
18150
  "record.metadata.author": "Autore",
18236
18151
  "record.metadata.catalog": "Catalogo",
18237
18152
  "record.metadata.contact": "Contatto",
18238
- "record.metadata.createdOn": "Creato il",
18239
18153
  "record.metadata.details": "Informazioni tecniche",
18240
18154
  "record.metadata.download": "Download",
18241
18155
  "record.metadata.formats": "Formati",
18242
- "record.metadata.isOpenData": "Data aperta",
18243
18156
  "record.metadata.keywords": "Parole chiave",
18244
18157
  "record.metadata.lastUpdate": "Ultimo aggiornamento",
18245
18158
  "record.metadata.links": "Collegamenti",
18246
18159
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18247
18160
  "record.metadata.origin": "Informazioni sui dati",
18161
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18248
18162
  "record.metadata.owner": "Catalogo originale",
18249
18163
  "record.metadata.preview": "Anteprima",
18250
18164
  "record.metadata.publications": "pubblicazioni",
@@ -18268,14 +18182,15 @@ var it = {
18268
18182
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18269
18183
  "record.metadata.related": "Vedi anche",
18270
18184
  "record.metadata.sheet": "Origine del metadata",
18185
+ "record.metadata.status": "",
18271
18186
  "record.metadata.themes": "Categorie",
18272
18187
  "record.metadata.title": "Titolo",
18273
18188
  "record.metadata.type": "Dati geografici",
18274
18189
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18275
18190
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18276
18191
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18277
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18278
- "record.metadata.usage": "Condizioni d'uso",
18192
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18193
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18279
18194
  "record.more.details": "Dettagli",
18280
18195
  "record.tab.chart": "Grafico",
18281
18196
  "record.tab.data": "Tabella",
@@ -18305,6 +18220,7 @@ var it = {
18305
18220
  "search.filters.isSpatial": "Dati spaziali",
18306
18221
  "search.filters.isSpatial.no": "Non geolocalizzati",
18307
18222
  "search.filters.isSpatial.yes": "Geolocalizzati",
18223
+ "search.filters.keyword": "Parola chiave",
18308
18224
  "search.filters.license": "Licenza",
18309
18225
  "search.filters.license.cc-by": "cc-by",
18310
18226
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18369,20 +18285,21 @@ var nl = {
18369
18285
  "chart.type.line": "lijndiagram",
18370
18286
  "chart.type.lineSmooth": "glad lijndiagram",
18371
18287
  "chart.type.pie": "cirkeldiagram",
18288
+ "dashboard.createRecord": "",
18372
18289
  "dashboard.labels.mySpace": "Mijn ruimte",
18373
18290
  "dashboard.records.all": "Catalogus",
18374
18291
  "dashboard.records.myDraft": "Mijn concepten",
18375
18292
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18376
18293
  "dashboard.records.myOrg": "Organisatie",
18377
18294
  "dashboard.records.myRecords": "Mijn Records",
18378
- "dashboard.records.noRecord": "",
18379
- "dashboard.records.noUser": "",
18380
18295
  "dashboard.records.publishedRecords": "",
18381
18296
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18382
18297
  "dashboard.records.userDetail": "",
18383
18298
  "dashboard.records.userEmail": "",
18384
18299
  "dashboard.records.username": "",
18385
18300
  "dashboard.records.users": "",
18301
+ "dashboard.results.listMetadata": "",
18302
+ "dashboard.results.listResources": "",
18386
18303
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18387
18304
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18388
18305
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18529,6 +18446,9 @@ var nl = {
18529
18446
  "map.add.layer.file": "",
18530
18447
  "map.add.layer.wfs": "",
18531
18448
  "map.add.layer.wms": "",
18449
+ "map.addFromFile.placeholder": "",
18450
+ "map.geocoding.placeholder": "",
18451
+ "map.help.addFromFile": "",
18532
18452
  "map.layer.add": "",
18533
18453
  "map.layers.available": "",
18534
18454
  "map.layers.list": "",
@@ -18571,16 +18491,15 @@ var nl = {
18571
18491
  "record.metadata.author": "",
18572
18492
  "record.metadata.catalog": "",
18573
18493
  "record.metadata.contact": "",
18574
- "record.metadata.createdOn": "",
18575
18494
  "record.metadata.details": "",
18576
18495
  "record.metadata.download": "",
18577
18496
  "record.metadata.formats": "",
18578
- "record.metadata.isOpenData": "",
18579
18497
  "record.metadata.keywords": "",
18580
18498
  "record.metadata.lastUpdate": "",
18581
18499
  "record.metadata.links": "",
18582
18500
  "record.metadata.noUsage": "",
18583
18501
  "record.metadata.origin": "",
18502
+ "record.metadata.otherConstraints": "",
18584
18503
  "record.metadata.owner": "",
18585
18504
  "record.metadata.preview": "",
18586
18505
  "record.metadata.publications": "",
@@ -18604,6 +18523,7 @@ var nl = {
18604
18523
  "record.metadata.quality.updateFrequency.success": "",
18605
18524
  "record.metadata.related": "",
18606
18525
  "record.metadata.sheet": "",
18526
+ "record.metadata.status": "",
18607
18527
  "record.metadata.themes": "",
18608
18528
  "record.metadata.title": "",
18609
18529
  "record.metadata.type": "",
@@ -18641,6 +18561,7 @@ var nl = {
18641
18561
  "search.filters.isSpatial": "",
18642
18562
  "search.filters.isSpatial.no": "",
18643
18563
  "search.filters.isSpatial.yes": "",
18564
+ "search.filters.keyword": "",
18644
18565
  "search.filters.license": "",
18645
18566
  "search.filters.license.cc-by": "",
18646
18567
  "search.filters.license.cc-by-sa": "",
@@ -18705,20 +18626,21 @@ var pt = {
18705
18626
  "chart.type.line": "gráfico de linha",
18706
18627
  "chart.type.lineSmooth": "gráfico de linha suave",
18707
18628
  "chart.type.pie": "gráfico de pizza",
18629
+ "dashboard.createRecord": "",
18708
18630
  "dashboard.labels.mySpace": "Meu espaço",
18709
18631
  "dashboard.records.all": "Catálogo",
18710
18632
  "dashboard.records.myDraft": "Meus rascunhos",
18711
18633
  "dashboard.records.myLibrary": "Minha biblioteca",
18712
18634
  "dashboard.records.myOrg": "Organização",
18713
18635
  "dashboard.records.myRecords": "Meus Registros",
18714
- "dashboard.records.noRecord": "",
18715
- "dashboard.records.noUser": "",
18716
18636
  "dashboard.records.publishedRecords": "",
18717
18637
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18718
18638
  "dashboard.records.userDetail": "",
18719
18639
  "dashboard.records.userEmail": "",
18720
18640
  "dashboard.records.username": "",
18721
18641
  "dashboard.records.users": "",
18642
+ "dashboard.results.listMetadata": "",
18643
+ "dashboard.results.listResources": "",
18722
18644
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18723
18645
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18724
18646
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18865,6 +18787,9 @@ var pt = {
18865
18787
  "map.add.layer.file": "",
18866
18788
  "map.add.layer.wfs": "",
18867
18789
  "map.add.layer.wms": "",
18790
+ "map.addFromFile.placeholder": "",
18791
+ "map.geocoding.placeholder": "",
18792
+ "map.help.addFromFile": "",
18868
18793
  "map.layer.add": "",
18869
18794
  "map.layers.available": "",
18870
18795
  "map.layers.list": "",
@@ -18907,16 +18832,15 @@ var pt = {
18907
18832
  "record.metadata.author": "",
18908
18833
  "record.metadata.catalog": "",
18909
18834
  "record.metadata.contact": "",
18910
- "record.metadata.createdOn": "",
18911
18835
  "record.metadata.details": "",
18912
18836
  "record.metadata.download": "",
18913
18837
  "record.metadata.formats": "",
18914
- "record.metadata.isOpenData": "",
18915
18838
  "record.metadata.keywords": "",
18916
18839
  "record.metadata.lastUpdate": "",
18917
18840
  "record.metadata.links": "",
18918
18841
  "record.metadata.noUsage": "",
18919
18842
  "record.metadata.origin": "",
18843
+ "record.metadata.otherConstraints": "",
18920
18844
  "record.metadata.owner": "",
18921
18845
  "record.metadata.preview": "",
18922
18846
  "record.metadata.publications": "",
@@ -18940,6 +18864,7 @@ var pt = {
18940
18864
  "record.metadata.quality.updateFrequency.success": "",
18941
18865
  "record.metadata.related": "",
18942
18866
  "record.metadata.sheet": "",
18867
+ "record.metadata.status": "",
18943
18868
  "record.metadata.themes": "",
18944
18869
  "record.metadata.title": "",
18945
18870
  "record.metadata.type": "",
@@ -18977,6 +18902,7 @@ var pt = {
18977
18902
  "search.filters.isSpatial": "",
18978
18903
  "search.filters.isSpatial.no": "",
18979
18904
  "search.filters.isSpatial.yes": "",
18905
+ "search.filters.keyword": "",
18980
18906
  "search.filters.license": "",
18981
18907
  "search.filters.license.cc-by": "",
18982
18908
  "search.filters.license.cc-by-sa": "",
@@ -19152,20 +19078,11 @@ class Gn4FieldMapper {
19152
19078
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19153
19079
  ],
19154
19080
  }),
19155
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19156
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19157
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19158
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19159
- licenseObject: (output, source) => ({
19160
- ...output,
19161
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19162
- const link = getAsUrl(selectField(license, 'link'));
19163
- return {
19164
- text: selectTranslatedValue(license, this.lang3),
19165
- ...(link ? { link } : {}),
19166
- };
19167
- }),
19168
- }),
19081
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19082
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19083
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19084
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19085
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19169
19086
  lineageObject: (output, source) => ({
19170
19087
  ...output,
19171
19088
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19191,33 +19108,78 @@ class Gn4FieldMapper {
19191
19108
  kind,
19192
19109
  };
19193
19110
  },
19111
+ geom: (output, source) => {
19112
+ const geoms = getAsArray(selectField(source, 'geom'));
19113
+ const shapes = getAsArray(selectField(source, 'shape'));
19114
+ const extentDescriptions = getAsArray(selectField(source, 'extentDescriptionObject'));
19115
+ const spatialExtents = getAsArray(selectField(source, 'spatialExtents'));
19116
+ return {
19117
+ ...output,
19118
+ spatialExtents: [
19119
+ ...spatialExtents,
19120
+ ...geoms.map((geom, index) => {
19121
+ const description = selectTranslatedValue(getArrayItem(extentDescriptions, index), this.lang3);
19122
+ const geometry = shapes[index] ?? geom;
19123
+ return {
19124
+ ...(description !== null ? { description } : null),
19125
+ geometry,
19126
+ };
19127
+ }),
19128
+ ],
19129
+ };
19130
+ },
19131
+ resourceTemporalDateRange: (output, source) => {
19132
+ const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19133
+ return {
19134
+ ...output,
19135
+ temporalExtents: ranges.map((range) => {
19136
+ const start = selectField(range, 'gte');
19137
+ const end = selectField(range, 'lte');
19138
+ return {
19139
+ ...(start !== null ? { start: toDate(start) } : null),
19140
+ ...(end !== null ? { end: toDate(end) } : null),
19141
+ };
19142
+ }),
19143
+ };
19144
+ },
19194
19145
  };
19195
19146
  this.genericField = (output) => output;
19196
- this.constraintField = (fieldName, output, source) => ({
19197
- ...output,
19198
- ...(fieldName.endsWith('UseLimitationObject')
19199
- ? {
19200
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19201
- ? [
19202
- ...(output.legalConstraints || []),
19203
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19204
- ]
19205
- : output.legalConstraints || [],
19206
- useLimitations: [
19207
- ...(output.useLimitations || []),
19208
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19209
- ],
19210
- }
19211
- : {
19212
- accessConstraints: [
19213
- ...(output.accessConstraints || []),
19214
- ...selectField(source, fieldName).map((field) => ({
19215
- text: selectTranslatedValue(field, this.lang3),
19216
- type: this.getConstraintsType(fieldName),
19217
- })),
19218
- ],
19219
- }),
19220
- });
19147
+ this.constraintField = (type, output, constraintArray) => {
19148
+ let outputField;
19149
+ switch (type) {
19150
+ case 'license':
19151
+ outputField = 'licenses';
19152
+ break;
19153
+ case 'legal':
19154
+ outputField = 'legalConstraints';
19155
+ break;
19156
+ case 'security':
19157
+ outputField = 'securityConstraints';
19158
+ break;
19159
+ case 'other':
19160
+ outputField = 'otherConstraints';
19161
+ break;
19162
+ }
19163
+ const outputArray = outputField in output ? output[outputField] : [];
19164
+ outputArray.push(...constraintArray.map((item) => {
19165
+ const text = selectTranslatedValue(item, this.lang3);
19166
+ const url = getAsUrl(selectField(item, 'link'));
19167
+ return {
19168
+ text,
19169
+ ...(url ? { url } : {}),
19170
+ };
19171
+ }));
19172
+ const result = {
19173
+ ...output,
19174
+ [outputField]: outputArray,
19175
+ };
19176
+ // avoid legal constraints being duplicates of licenses
19177
+ if ('legalConstraints' in result &&
19178
+ (type === 'legal' || type === 'license')) {
19179
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19180
+ }
19181
+ return result;
19182
+ };
19221
19183
  this.mapLink = (sourceLink) => {
19222
19184
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19223
19185
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19265,17 +19227,6 @@ class Gn4FieldMapper {
19265
19227
  extras: { ...(output.extras || {}), ...value },
19266
19228
  });
19267
19229
  }
19268
- getConstraintsType(indexField) {
19269
- switch (indexField) {
19270
- case 'MD_LegalConstraintsUseLimitationObject':
19271
- return 'legal';
19272
- case 'MD_SecurityConstraintsUseLimitationObject':
19273
- return 'security';
19274
- case 'MD_ConstraintsUseLimitationObject':
19275
- default:
19276
- return 'other';
19277
- }
19278
- }
19279
19230
  getMappingFn(fieldName) {
19280
19231
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19281
19232
  }
@@ -19337,12 +19288,13 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19337
19288
  recordUpdated: null,
19338
19289
  ownerOrganization: null,
19339
19290
  licenses: [],
19291
+ legalConstraints: [],
19292
+ securityConstraints: [],
19293
+ otherConstraints: [],
19340
19294
  contacts: [],
19341
19295
  contactsForResource: [],
19342
- accessConstraints: [],
19343
19296
  keywords: [],
19344
19297
  themes: [],
19345
- useLimitations: [],
19346
19298
  spatialExtents: [],
19347
19299
  temporalExtents: [],
19348
19300
  overviews: [],
@@ -20110,11 +20062,18 @@ class OrganizationsFromMetadataService {
20110
20062
  if (!allContactOrgs.length)
20111
20063
  return of(record);
20112
20064
  const ownerOrganization = allContactOrgs[0];
20113
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20065
+ // read the owner group as well to have a fallback logo
20066
+ const groupId = selectField(source, 'groupOwner');
20067
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20068
+ return group.id === Number(groupId);
20069
+ })));
20070
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20114
20071
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20072
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20115
20073
  return {
20116
20074
  ...record,
20117
20075
  ownerOrganization: {
20076
+ logoUrl,
20118
20077
  ...ownerOrganization,
20119
20078
  ...recordOrganisation,
20120
20079
  },
@@ -20379,36 +20338,23 @@ class SelectionService {
20379
20338
  this.selectedRecordsIdentifiers$.next(filtered);
20380
20339
  }
20381
20340
  selectRecords(records) {
20382
- const newIds = [];
20383
- records.map((record) => {
20384
- newIds.push(record.uniqueIdentifier);
20385
- });
20386
- const apiResponse = this.selectionsApi.add(BUCKET_ID, newIds);
20387
- return apiResponse.pipe(tap$2(() => {
20341
+ const newIds = records.map((record) => record.uniqueIdentifier);
20342
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20388
20343
  this.addIdsToSelected(newIds);
20389
- }), map$2(() => undefined));
20344
+ });
20390
20345
  }
20391
20346
  deselectRecords(records) {
20392
- const idsToBeRemoved = [];
20393
- records.map((record) => {
20394
- idsToBeRemoved.push(record.uniqueIdentifier);
20395
- });
20396
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved);
20397
- return apiResponse.pipe(tap$2(() => {
20347
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20348
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20398
20349
  this.removeIdsFromSelected(idsToBeRemoved);
20399
- }), map$2(() => undefined));
20400
- }
20401
- clearSelection() {
20402
- const currentSelectedResponse = this.selectionsApi.get(BUCKET_ID);
20403
- let currentSelection;
20404
- this.subscription = currentSelectedResponse.subscribe((value) => {
20405
- currentSelection = [...value];
20406
20350
  });
20407
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20408
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20409
- return apiResponse.pipe(tap$2(() => {
20351
+ }
20352
+ async clearSelection() {
20353
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20354
+ const currentSelection = Array.from(response);
20355
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20410
20356
  this.removeIdsFromSelected(currentSelection);
20411
- }), map$2(() => undefined));
20357
+ });
20412
20358
  }
20413
20359
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20414
20360
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20438,12 +20384,21 @@ class Gn4PlatformMapper {
20438
20384
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20439
20385
  return { ...apiUser, id: id.toString() };
20440
20386
  }
20441
- thesaurusFromApi(thesaurus) {
20387
+ thesaurusFromApi(thesaurus, lang3) {
20442
20388
  return thesaurus.map((keyword) => {
20443
- const { uri, value } = keyword;
20389
+ let key = keyword.uri;
20390
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20391
+ if (key.indexOf('@@@') > -1) {
20392
+ key = key.split('@@@')[1];
20393
+ }
20394
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20395
+ const description = lang3 && lang3 in keyword.definitions
20396
+ ? keyword.definitions[lang3]
20397
+ : keyword.definition;
20444
20398
  return {
20445
- key: uri,
20446
- label: value,
20399
+ key,
20400
+ label,
20401
+ description,
20447
20402
  };
20448
20403
  });
20449
20404
  }
@@ -20456,13 +20411,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20456
20411
 
20457
20412
  const minApiVersion = '4.2.2';
20458
20413
  class Gn4PlatformService {
20459
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20414
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20460
20415
  this.siteApiService = siteApiService;
20461
20416
  this.meApi = meApi;
20462
20417
  this.usersApi = usersApi;
20463
20418
  this.mapper = mapper;
20464
20419
  this.toolsApiService = toolsApiService;
20465
20420
  this.registriesApiService = registriesApiService;
20421
+ this.langService = langService;
20466
20422
  this.type = 'GeoNetwork';
20467
20423
  this.keyTranslations$ = this.toolsApiService
20468
20424
  .getTranslationsPackage1('gnui')
@@ -20476,6 +20432,11 @@ class Gn4PlatformService {
20476
20432
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20477
20433
  }
20478
20434
  }), shareReplay(1));
20435
+ /**
20436
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20437
+ * @private
20438
+ */
20439
+ this.thesauri = {};
20479
20440
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20480
20441
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20481
20442
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20502,19 +20463,36 @@ class Gn4PlatformService {
20502
20463
  return this.users$;
20503
20464
  }
20504
20465
  translateKey(key) {
20466
+ // if the key is a URI, use the registries API to look for the translation
20467
+ if (key.match(/^https?:\/\//)) {
20468
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20469
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20470
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20471
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20472
+ for (const item of thesaurus) {
20473
+ if (item.key === key)
20474
+ return item.label;
20475
+ }
20476
+ return key;
20477
+ }));
20478
+ }
20505
20479
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20506
20480
  }
20507
- getThesaurusByLang(thesaurusName, lang) {
20508
- return this.registriesApiService
20509
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20510
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20481
+ getThesaurusByUri(uri) {
20482
+ if (this.thesauri[uri]) {
20483
+ return this.thesauri[uri];
20484
+ }
20485
+ this.thesauri[uri] = this.registriesApiService
20486
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20487
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20488
+ return this.thesauri[uri];
20511
20489
  }
20512
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20490
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20513
20491
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20514
20492
  }
20515
20493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20516
20494
  type: Injectable
20517
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20495
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20518
20496
 
20519
20497
  function provideGn4() {
20520
20498
  return [
@@ -20726,6 +20704,8 @@ const defaultMapOptions = {
20726
20704
  };
20727
20705
  const FEATURE_MAP_OPTIONS = new InjectionToken('mapOptions');
20728
20706
 
20707
+ const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
20708
+
20729
20709
  var MapContextLayerTypeEnum;
20730
20710
  (function (MapContextLayerTypeEnum) {
20731
20711
  MapContextLayerTypeEnum["XYZ"] = "xyz";
@@ -21101,9 +21081,15 @@ const FORMATS = {
21101
21081
  color: '#328556',
21102
21082
  mimeTypes: ['x-gis/x-shapefile'],
21103
21083
  },
21084
+ gml: {
21085
+ extensions: ['gml'],
21086
+ priority: 5,
21087
+ color: '#c92bce',
21088
+ mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
21089
+ },
21104
21090
  kml: {
21105
21091
  extensions: ['kml', 'kmz'],
21106
- priority: 5,
21092
+ priority: 6,
21107
21093
  color: '#348009',
21108
21094
  mimeTypes: [
21109
21095
  'application/vnd.google-earth.kml+xml',
@@ -21112,34 +21098,40 @@ const FORMATS = {
21112
21098
  },
21113
21099
  gpkg: {
21114
21100
  extensions: ['gpkg', 'geopackage'],
21115
- priority: 6,
21101
+ priority: 7,
21116
21102
  color: '#ea79ba',
21117
21103
  mimeTypes: ['application/geopackage+sqlite3'],
21118
21104
  },
21119
21105
  zip: {
21120
21106
  extensions: ['zip', 'tar.gz'],
21121
- priority: 7,
21107
+ priority: 8,
21122
21108
  color: '#f2bb3a',
21123
21109
  mimeTypes: ['application/zip', 'application/x-zip'],
21124
21110
  },
21125
21111
  pdf: {
21126
21112
  extensions: ['pdf'],
21127
- priority: 8,
21113
+ priority: 9,
21128
21114
  color: '#db544a',
21129
21115
  mimeTypes: ['application/pdf'],
21130
21116
  },
21131
21117
  jpg: {
21132
21118
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
21133
- priority: 8,
21119
+ priority: 9,
21134
21120
  color: '#673ab7',
21135
21121
  mimeTypes: ['image/jpg'],
21136
21122
  },
21137
21123
  svg: {
21138
21124
  extensions: ['svg'],
21139
- priority: 9,
21125
+ priority: 10,
21140
21126
  color: '#d98294',
21141
21127
  mimeTypes: ['image/svg+xml'],
21142
21128
  },
21129
+ dxf: {
21130
+ extensions: ['dxf'],
21131
+ priority: 11,
21132
+ color: '#de630b',
21133
+ mimeTypes: ['application/x-dxf', 'image/x-dxf'],
21134
+ },
21143
21135
  };
21144
21136
  function getFormatPriority(linkFormat) {
21145
21137
  for (const format in FORMATS) {
@@ -21156,14 +21148,18 @@ function getFormatPriority(linkFormat) {
21156
21148
  function getLinkPriority(link) {
21157
21149
  return getFormatPriority(getFileFormat(link));
21158
21150
  }
21159
- function extensionToFormat(extension) {
21160
- for (const format in FORMATS) {
21161
- for (const alias of FORMATS[format].extensions) {
21162
- if (alias === extension.toLowerCase())
21163
- return format;
21151
+ function getFileFormatFromServiceOutput(serviceOutput) {
21152
+ function formatMatcher(format) {
21153
+ const output = serviceOutput.toLowerCase();
21154
+ return (format.extensions.some((extension) => output.includes(extension)) ||
21155
+ format.mimeTypes.some((mimeType) => output.includes(mimeType)));
21156
+ }
21157
+ for (const formatName in FORMATS) {
21158
+ if (formatMatcher(FORMATS[formatName])) {
21159
+ return formatName;
21164
21160
  }
21165
21161
  }
21166
- return undefined;
21162
+ return null;
21167
21163
  }
21168
21164
  function getFileFormat(link) {
21169
21165
  if ('mimeType' in link) {
@@ -21304,72 +21300,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21304
21300
  }]
21305
21301
  }] });
21306
21302
 
21307
- const LONLAT_CRS_CODES = ['EPSG:4326', 'CRS:84'];
21308
-
21309
- class MapUtilsWMSService {
21310
- constructor(proxy) {
21311
- this.proxy = proxy;
21312
- }
21313
- getCapabilities(layer) {
21314
- return from(new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady());
21315
- }
21316
- getLayerFull(layer) {
21317
- return this.getCapabilities(layer).pipe(map$1((endpoint) => endpoint.getLayerByName(layer.name)));
21318
- }
21319
- getLayerLonLatBBox(layer) {
21320
- return this.getLayerFull(layer).pipe(switchMap$1((wmsLayerFull) => from(this.getLonLatBBox(wmsLayerFull))));
21321
- }
21322
- async getLonLatBBox(wmsLayerFull) {
21323
- const { boundingBoxes } = wmsLayerFull;
21324
- const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21325
- if (lonLatCRS) {
21326
- return boundingBoxes[lonLatCRS];
21327
- }
21328
- else {
21329
- const availableEPSGCode = Object.keys(boundingBoxes)[0];
21330
- register(proj4);
21331
- const proj = await fromEPSGCode(availableEPSGCode);
21332
- proj4.defs(availableEPSGCode, proj);
21333
- const bboxWithFiniteNumbers = [
21334
- parseFloat(boundingBoxes[availableEPSGCode][0]),
21335
- parseFloat(boundingBoxes[availableEPSGCode][1]),
21336
- parseFloat(boundingBoxes[availableEPSGCode][2]),
21337
- parseFloat(boundingBoxes[availableEPSGCode][3]),
21338
- ];
21339
- const extent = transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21340
- return extent;
21341
- }
21342
- }
21343
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21344
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, providedIn: 'root' }); }
21345
- }
21346
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsWMSService, decorators: [{
21347
- type: Injectable,
21348
- args: [{
21349
- providedIn: 'root',
21350
- }]
21351
- }], ctorParameters: function () { return [{ type: ProxyService }]; } });
21352
-
21353
21303
  const FEATURE_PROJECTION = 'EPSG:3857';
21354
21304
  const DATA_PROJECTION = 'EPSG:4326';
21305
+ const GEOJSON = new GeoJSON();
21355
21306
  class MapUtilsService {
21356
- constructor(http, wmsUtils) {
21307
+ constructor(http, proxy) {
21357
21308
  this.http = http;
21358
- this.wmsUtils = wmsUtils;
21309
+ this.proxy = proxy;
21359
21310
  this.readFeatureCollection = (featureCollection, featureProjection = FEATURE_PROJECTION, dataProjection = DATA_PROJECTION) => {
21360
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
21311
+ return GEOJSON.readFeatures(featureCollection, {
21361
21312
  featureProjection,
21362
21313
  dataProjection,
21363
21314
  });
21364
- return olFeatures;
21365
21315
  };
21366
21316
  }
21367
21317
  createEmptyMap() {
21368
- const map = new Map$1({
21318
+ return new Map$1({
21369
21319
  controls: [],
21370
21320
  pixelRatio: 1,
21371
21321
  });
21372
- return map;
21373
21322
  }
21374
21323
  isWMSLayer(layer) {
21375
21324
  return (layer.getSource() instanceof TileWMS ||
@@ -21384,8 +21333,7 @@ class MapUtilsService {
21384
21333
  ...source.getParams(),
21385
21334
  INFO_FORMAT: 'application/json',
21386
21335
  };
21387
- const url = source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21388
- return url;
21336
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params);
21389
21337
  }
21390
21338
  getVectorFeaturesFromClick(olMap, event) {
21391
21339
  const features = [];
@@ -21413,38 +21361,56 @@ class MapUtilsService {
21413
21361
  /**
21414
21362
  * Will emit `null` if no extent could be computed
21415
21363
  */
21416
- getLayerExtent(layer) {
21417
- let geographicExtent;
21364
+ async getLayerExtent(layer) {
21365
+ let latLonExtent;
21418
21366
  if (layer &&
21419
21367
  layer.type === 'geojson' &&
21420
21368
  'data' in layer &&
21421
21369
  typeof layer.data === 'object' &&
21422
21370
  layer.data.features[0] &&
21423
21371
  layer.data.features[0].geometry) {
21424
- geographicExtent = of(layer.data).pipe(map$1((layerData) => new GeoJSON()
21425
- .readFeatures(layerData)
21372
+ latLonExtent = new GeoJSON()
21373
+ .readFeatures(layer.data)
21426
21374
  .map((feature) => feature.getGeometry())
21427
21375
  .filter((geom) => !!geom)
21428
- .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null)));
21376
+ .reduce((prev, curr) => prev ? extend(prev, curr.getExtent()) : curr.getExtent(), null);
21429
21377
  }
21430
21378
  else if (layer && layer.type === 'wms') {
21431
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer);
21379
+ latLonExtent = await this.getWmsLayerExtent(layer);
21432
21380
  }
21433
21381
  else if (layer && layer.type === 'wmts') {
21434
21382
  if (layer.extent) {
21435
- geographicExtent = of(layer.extent);
21383
+ latLonExtent = layer.extent;
21436
21384
  }
21437
21385
  else {
21438
- return of(layer.options.tileGrid.getExtent());
21386
+ return layer.options.tileGrid.getExtent();
21439
21387
  }
21440
21388
  }
21441
21389
  else {
21442
- return of(null);
21390
+ return null;
21391
+ }
21392
+ if (!latLonExtent || isEmpty(latLonExtent)) {
21393
+ return null;
21394
+ }
21395
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857');
21396
+ }
21397
+ async getWmsLayerExtent(layer) {
21398
+ const endpoint = await new WmsEndpoint(this.proxy.getProxiedUrl(layer.url)).isReady();
21399
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name);
21400
+ if (!Object.keys(boundingBoxes).length) {
21401
+ return null;
21402
+ }
21403
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) => LONLAT_CRS_CODES.includes(crs));
21404
+ if (lonLatCRS) {
21405
+ return boundingBoxes[lonLatCRS].map(parseFloat);
21406
+ }
21407
+ else {
21408
+ const availableEPSGCode = Object.keys(boundingBoxes)[0];
21409
+ register(proj4);
21410
+ const proj = await fromEPSGCode(availableEPSGCode);
21411
+ const bboxWithFiniteNumbers = boundingBoxes[availableEPSGCode].map(parseFloat);
21412
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326');
21443
21413
  }
21444
- return geographicExtent.pipe(map$1((extent) => [
21445
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
21446
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
21447
- ]), map$1((extent) => (isEmpty(extent) ? null : extent)));
21448
21414
  }
21449
21415
  getWmtsLayerFromCapabilities(link) {
21450
21416
  const getCapabilitiesUrl = new URL(link.url, window.location.toString());
@@ -21500,7 +21466,18 @@ ${e.stack || e.message || e}`);
21500
21466
  ])
21501
21467
  .getArray());
21502
21468
  }
21503
- 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 }); }
21469
+ getRecordExtent(record) {
21470
+ if (!('spatialExtents' in record)) {
21471
+ return null;
21472
+ }
21473
+ // transform an array of geojson geometries into a bbox
21474
+ const totalExtent = record.spatialExtents.reduce((prev, curr) => {
21475
+ const geom = GEOJSON.readGeometry(curr.geometry);
21476
+ return extend(prev, geom.getExtent());
21477
+ }, [Infinity, Infinity, -Infinity, -Infinity]);
21478
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
21479
+ }
21480
+ 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 }); }
21504
21481
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
21505
21482
  }
21506
21483
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapUtilsService, decorators: [{
@@ -21508,7 +21485,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21508
21485
  args: [{
21509
21486
  providedIn: 'root',
21510
21487
  }]
21511
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: MapUtilsWMSService }]; } });
21488
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: ProxyService }]; } });
21512
21489
  function dragPanCondition(event) {
21513
21490
  const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
21514
21491
  if (!dragPanCondition) {
@@ -22593,6 +22570,9 @@ class MapContextService {
22593
22570
  if (mapConfig) {
22594
22571
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22595
22572
  }
22573
+ else {
22574
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22575
+ }
22596
22576
  if (!mapContext.view?.extent &&
22597
22577
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22598
22578
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22703,6 +22683,11 @@ class MapContextService {
22703
22683
  }
22704
22684
  return view;
22705
22685
  }
22686
+ addDefaultBaselayerContext(layers) {
22687
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22688
+ ? layers
22689
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22690
+ }
22706
22691
  mergeMapConfigWithContext(mapContext, mapConfig) {
22707
22692
  return {
22708
22693
  ...mapContext,
@@ -23381,8 +23366,7 @@ class MetadataQualityComponent {
23381
23366
  : this.calculatedQualityScore;
23382
23367
  }
23383
23368
  get calculatedQualityScore() {
23384
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23385
- this.items.length);
23369
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23386
23370
  }
23387
23371
  showMenu() {
23388
23372
  this.isMenuShown = true;
@@ -23848,11 +23832,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23848
23832
  type: Input
23849
23833
  }] } });
23850
23834
 
23851
- class ContentGhostComponent {
23852
- constructor() {
23853
- this.ghostClass = '';
23835
+ class MarkdownParserComponent {
23836
+ get parsedMarkdown() {
23837
+ return marked.parse(this.textContent);
23854
23838
  }
23855
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23839
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23840
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23841
+ }
23842
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23843
+ type: Component,
23844
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
23845
+ }], propDecorators: { textContent: [{
23846
+ type: Input
23847
+ }] } });
23848
+
23849
+ class ContentGhostComponent {
23850
+ constructor() {
23851
+ this.ghostClass = '';
23852
+ }
23853
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23856
23854
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: { showContent: "showContent", ghostClass: "ghostClass" }, ngImport: i0, template: "<div\n *ngIf=\"!showContent\"\n class=\"ghost bg-gray-100 rounded-lg relative overflow-hidden {{ ghostClass }}\"\n></div>\n<ng-content *ngIf=\"showContent\"></ng-content>\n", styles: [".ghost{min-height:2rem;min-width:2rem;overflow:hidden}.ghost:after{content:\"\";position:absolute;top:0;bottom:0;width:50%;background-image:linear-gradient(to left,rgba(251,251,251,.05),rgba(251,251,251,.3),rgba(251,251,251,.6),rgba(251,251,251,.3),rgba(251,251,251,.05));animation:loading 1s infinite}@keyframes loading{0%{left:-50%}to{left:100%}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23857
23855
  }
23858
23856
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ContentGhostComponent, decorators: [{
@@ -24002,36 +24000,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24002
24000
  args: ['container']
24003
24001
  }] } });
24004
24002
 
24005
- class MarkdownParserComponent {
24006
- get parsedMarkdown() {
24007
- return marked.parse(this.textContent);
24008
- }
24009
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24010
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host /deep/ .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host /deep/ .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host /deep/ .markdown-body h1,:host /deep/ .markdown-body h2,:host /deep/ .markdown-body h3,:host /deep/ .markdown-body h4,:host /deep/ .markdown-body h5,:host /deep/ .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host /deep/ .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host /deep/ .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host /deep/ .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host /deep/ .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host /deep/ .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host /deep/ .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host /deep/ .markdown-body p{margin-top:0;margin-bottom:10px}:host /deep/ .markdown-body p > a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host /deep/ .markdown-body p > a:hover{color:var(--color-primary-darker)!important}:host /deep/ .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host /deep/ .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host /deep/ .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host /deep/ .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host /deep/ .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host /deep/ .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host /deep/ .markdown-body hr::before{display:table;content:\"\"}:host /deep/ .markdown-body hr::after{display:table;clear:both;content:\"\"}:host /deep/ .markdown-body ul,:host /deep/ .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host /deep/ .markdown-body ol ol,:host /deep/ .markdown-body ul ol{list-style-type:lower-roman}:host /deep/ .markdown-body ul ul ol,:host /deep/ .markdown-body ul ol ol,:host /deep/ .markdown-body ol ul ol,:host /deep/ .markdown-body ol ol ol{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host /deep/ .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host /deep/ .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host /deep/ .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body div > ol:not([type]){list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host /deep/ .markdown-body td,:host /deep/ .markdown-body th{padding:0}:host /deep/ .markdown-body th{color:var(--color-secondary)}:host /deep/ .markdown-body table th,:host /deep/ .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host /deep/ .markdown-body table td > :last-child{margin-bottom:0}:host /deep/ .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host /deep/ .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host /deep/ .markdown-body table img{background-color:transparent}:host /deep/ .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host /deep/ .markdown-body img[align=\"right\"]{padding-left:20px}:host /deep/ .markdown-body img[align=\"left\"]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24011
- }
24012
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24013
- type: Component,
24014
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host /deep/ .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host /deep/ .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host /deep/ .markdown-body h1,:host /deep/ .markdown-body h2,:host /deep/ .markdown-body h3,:host /deep/ .markdown-body h4,:host /deep/ .markdown-body h5,:host /deep/ .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host /deep/ .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host /deep/ .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host /deep/ .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host /deep/ .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host /deep/ .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host /deep/ .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host /deep/ .markdown-body p{margin-top:0;margin-bottom:10px}:host /deep/ .markdown-body p > a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host /deep/ .markdown-body p > a:hover{color:var(--color-primary-darker)!important}:host /deep/ .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host /deep/ .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host /deep/ .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host /deep/ .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host /deep/ .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host /deep/ .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host /deep/ .markdown-body hr::before{display:table;content:\"\"}:host /deep/ .markdown-body hr::after{display:table;clear:both;content:\"\"}:host /deep/ .markdown-body ul,:host /deep/ .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host /deep/ .markdown-body ol ol,:host /deep/ .markdown-body ul ol{list-style-type:lower-roman}:host /deep/ .markdown-body ul ul ol,:host /deep/ .markdown-body ul ol ol,:host /deep/ .markdown-body ol ul ol,:host /deep/ .markdown-body ol ol ol{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host /deep/ .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host /deep/ .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host /deep/ .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host /deep/ .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body div > ol:not([type]){list-style:unset;list-style-type:decimal}:host /deep/ .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host /deep/ .markdown-body td,:host /deep/ .markdown-body th{padding:0}:host /deep/ .markdown-body th{color:var(--color-secondary)}:host /deep/ .markdown-body table th,:host /deep/ .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host /deep/ .markdown-body table td > :last-child{margin-bottom:0}:host /deep/ .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host /deep/ .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host /deep/ .markdown-body table img{background-color:transparent}:host /deep/ .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host /deep/ .markdown-body img[align=\"right\"]{padding-left:20px}:host /deep/ .markdown-body img[align=\"left\"]{padding-right:20px}\n"] }]
24015
- }], propDecorators: { textContent: [{
24016
- type: Input
24017
- }] } });
24018
-
24019
24003
  class MetadataInfoComponent {
24020
24004
  constructor() {
24021
24005
  this.keyword = new EventEmitter();
24022
24006
  }
24023
24007
  get hasUsage() {
24024
24008
  return (this.metadata.extras?.isOpenData === true ||
24025
- this.metadata.useLimitations?.length ||
24026
- this.metadata.accessConstraints?.length);
24009
+ (this.metadata.legalConstraints?.length > 0 &&
24010
+ this.legalConstraints.length > 0) ||
24011
+ (this.metadata.otherConstraints?.length > 0 &&
24012
+ this.otherConstraints.length > 0) ||
24013
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24014
+ }
24015
+ get legalConstraints() {
24016
+ let array = [];
24017
+ if (this.metadata.legalConstraints?.length) {
24018
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24019
+ }
24020
+ return array;
24027
24021
  }
24028
- get usages() {
24022
+ get otherConstraints() {
24029
24023
  let array = [];
24030
- if (this.metadata.useLimitations?.length) {
24031
- array = array.concat(this.metadata.useLimitations);
24024
+ if (this.metadata.otherConstraints?.length) {
24025
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24032
24026
  }
24033
- if (this.metadata.accessConstraints?.length) {
24034
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24027
+ return array;
24028
+ }
24029
+ get licenses() {
24030
+ let array = [];
24031
+ if (this.metadata.licenses?.length) {
24032
+ array = array.concat(this.metadata.licenses
24033
+ .filter((c) => c.text)
24034
+ .map((c) => ({ text: c.text, url: c.url })));
24035
24035
  }
24036
24036
  return array;
24037
24037
  }
@@ -24053,16 +24053,12 @@ class MetadataInfoComponent {
24053
24053
  onKeywordClick(keyword) {
24054
24054
  this.keyword.emit(keyword);
24055
24055
  }
24056
- copyText() {
24057
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24058
- event.target.blur();
24059
- }
24060
24056
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24061
- 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 }); }
24057
+ 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: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24062
24058
  }
24063
24059
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24064
24060
  type: Component,
24065
- 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"] }]
24061
+ 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"] }]
24066
24062
  }], propDecorators: { metadata: [{
24067
24063
  type: Input
24068
24064
  }], incomplete: [{
@@ -24131,11 +24127,11 @@ class ButtonComponent {
24131
24127
  propagateToDocumentOnly(event);
24132
24128
  }
24133
24129
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24134
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host /deep/ mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24130
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, isStandalone: true, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24135
24131
  }
24136
24132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24137
24133
  type: Component,
24138
- args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host /deep/ mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24134
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24139
24135
  }], propDecorators: { type: [{
24140
24136
  type: Input
24141
24137
  }], disabled: [{
@@ -24210,11 +24206,11 @@ class DownloadsListComponent {
24210
24206
  return link.type === 'service' && link.accessServiceProtocol === 'wfs';
24211
24207
  }
24212
24208
  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 }); }
24213
- 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 }); }
24209
+ 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 }); }
24214
24210
  }
24215
24211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, decorators: [{
24216
24212
  type: Component,
24217
- 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" }]
24213
+ 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" }]
24218
24214
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { links: [{
24219
24215
  type: Input
24220
24216
  }] } });
@@ -24415,11 +24411,11 @@ class CarouselComponent {
24415
24411
  this.emblaApi.scrollTo(stepIndex);
24416
24412
  }
24417
24413
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24418
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container /deep/ > *{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24414
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24419
24415
  }
24420
24416
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24421
24417
  type: Component,
24422
- args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container /deep/ > *{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24418
+ args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24423
24419
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24424
24420
  type: Input
24425
24421
  }], stepsContainerClass: [{
@@ -24463,6 +24459,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24463
24459
  }]
24464
24460
  }] });
24465
24461
 
24462
+ class InteractiveTableColumnComponent {
24463
+ constructor() {
24464
+ this.grow = false;
24465
+ this.sortable = false;
24466
+ this.activeSort = null;
24467
+ this.sortChange = new EventEmitter();
24468
+ }
24469
+ handleSortChange() {
24470
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24471
+ this.sortChange.emit(this.activeSort);
24472
+ }
24473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24474
+ 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 }); }
24475
+ }
24476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24477
+ type: Component,
24478
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24479
+ }], propDecorators: { header: [{
24480
+ type: ContentChild,
24481
+ args: ['header']
24482
+ }], cell: [{
24483
+ type: ContentChild,
24484
+ args: ['cell']
24485
+ }], grow: [{
24486
+ type: Input
24487
+ }], sortable: [{
24488
+ type: Input
24489
+ }], activeSort: [{
24490
+ type: Input
24491
+ }], sortChange: [{
24492
+ type: Output
24493
+ }] } });
24494
+
24495
+ class InteractiveTableComponent {
24496
+ constructor() {
24497
+ this.items = [];
24498
+ this.itemClick = new EventEmitter();
24499
+ }
24500
+ get gridStyle() {
24501
+ return {
24502
+ 'grid-template-columns': this.columns
24503
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24504
+ .join(' '),
24505
+ };
24506
+ }
24507
+ handleRowClick(item) {
24508
+ this.itemClick.emit(item);
24509
+ }
24510
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24511
+ 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 }); }
24512
+ }
24513
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24514
+ type: Component,
24515
+ 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"] }]
24516
+ }], propDecorators: { columns: [{
24517
+ type: ContentChildren,
24518
+ args: [InteractiveTableColumnComponent]
24519
+ }], items: [{
24520
+ type: Input
24521
+ }], itemClick: [{
24522
+ type: Output
24523
+ }] } });
24524
+
24466
24525
  class LinkCardComponent {
24467
24526
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24468
24527
  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 }); }
@@ -24508,11 +24567,11 @@ class MetadataContactComponent {
24508
24567
  this.organizationClick.emit(this.shownOrganization);
24509
24568
  }
24510
24569
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24511
- 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 }); }
24570
+ 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 }); }
24512
24571
  }
24513
24572
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24514
24573
  type: Component,
24515
- 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" }]
24574
+ 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" }]
24516
24575
  }], propDecorators: { metadata: [{
24517
24576
  type: Input
24518
24577
  }], organizationClick: [{
@@ -24916,11 +24975,11 @@ class DropdownMultiselectComponent {
24916
24975
  this.setFocus();
24917
24976
  }
24918
24977
  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 }); }
24919
- 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 }); }
24978
+ 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 }); }
24920
24979
  }
24921
24980
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24922
24981
  type: Component,
24923
- 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" }]
24982
+ 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" }]
24924
24983
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24925
24984
  type: Input
24926
24985
  }], choices: [{
@@ -25074,11 +25133,11 @@ class TextAreaComponent {
25074
25133
  this.rawChange.next(value);
25075
25134
  }
25076
25135
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25077
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25136
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25078
25137
  }
25079
25138
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25080
25139
  type: Component,
25081
- args: [{ selector: 'gn-ui-text-area', template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25140
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25082
25141
  }], propDecorators: { value: [{
25083
25142
  type: Input
25084
25143
  }], placeholder: [{
@@ -25179,11 +25238,11 @@ class AutocompleteComponent {
25179
25238
  }
25180
25239
  }
25181
25240
  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 }); }
25182
- 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 }); }
25241
+ 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 }); }
25183
25242
  }
25184
25243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25185
25244
  type: Component,
25186
- 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"] }]
25245
+ 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"] }]
25187
25246
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25188
25247
  type: Input
25189
25248
  }], action: [{
@@ -25559,11 +25618,11 @@ class CheckboxComponent {
25559
25618
  this.changed.emit(this.checked);
25560
25619
  }
25561
25620
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25562
- 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 }); }
25621
+ 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 }); }
25563
25622
  }
25564
25623
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25565
25624
  type: Component,
25566
- 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"] }]
25625
+ 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"] }]
25567
25626
  }], propDecorators: { type: [{
25568
25627
  type: Input
25569
25628
  }], checked: [{
@@ -25618,14 +25677,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25618
25677
  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"] }]
25619
25678
  }] });
25620
25679
 
25680
+ class EditableLabelDirective {
25681
+ constructor(el, renderer) {
25682
+ this.el = el;
25683
+ this.renderer = renderer;
25684
+ this.editableLabelChanged = new EventEmitter();
25685
+ }
25686
+ ngAfterViewInit() {
25687
+ if (this.gnUiEditableLabel !== false) {
25688
+ const appendedInput = this.renderer.createElement('input');
25689
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
25690
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
25691
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
25692
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
25693
+ this.renderer.setStyle(appendedInput, 'width', '100%');
25694
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25695
+ this.renderer.setStyle(appendedInput, 'margin', '0');
25696
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
25697
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25698
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25699
+ const hostContent = this.el.nativeElement.textContent || '';
25700
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25701
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
25702
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25703
+ this.renderer.listen(appendedInput, 'input', (event) => {
25704
+ this.editableLabelChanged.emit(event.target.value);
25705
+ });
25706
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
25707
+ }
25708
+ }
25709
+ 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 }); }
25710
+ 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 }); }
25711
+ }
25712
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25713
+ type: Directive,
25714
+ args: [{
25715
+ selector: '[gnUiEditableLabel]',
25716
+ standalone: true,
25717
+ }]
25718
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25719
+ type: Output
25720
+ }], gnUiEditableLabel: [{
25721
+ type: Input
25722
+ }] } });
25723
+
25621
25724
  class UiInputsModule {
25622
25725
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25623
25726
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25624
25727
  AutocompleteComponent,
25625
- ButtonComponent,
25626
25728
  TextInputComponent,
25627
25729
  DragAndDropFileInputComponent,
25628
- TextAreaComponent,
25629
25730
  ChipsInputComponent,
25630
25731
  NavigationButtonComponent,
25631
25732
  StarToggleComponent,
@@ -25657,7 +25758,10 @@ class UiInputsModule {
25657
25758
  MatFormFieldModule,
25658
25759
  MatInputModule,
25659
25760
  MatDatepickerModule,
25660
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25761
+ MatNativeDateModule,
25762
+ EditableLabelDirective,
25763
+ TextAreaComponent,
25764
+ ButtonComponent], exports: [DropdownSelectorComponent,
25661
25765
  AutocompleteComponent,
25662
25766
  ButtonComponent,
25663
25767
  TextInputComponent,
@@ -25673,7 +25777,8 @@ class UiInputsModule {
25673
25777
  CopyTextButtonComponent,
25674
25778
  CheckboxComponent,
25675
25779
  SearchInputComponent,
25676
- DateRangePickerComponent] }); }
25780
+ DateRangePickerComponent,
25781
+ EditableLabelDirective] }); }
25677
25782
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, imports: [CommonModule,
25678
25783
  TranslateModule.forChild(),
25679
25784
  NgxDropzoneModule,
@@ -25698,10 +25803,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25698
25803
  declarations: [
25699
25804
  DropdownSelectorComponent,
25700
25805
  AutocompleteComponent,
25701
- ButtonComponent,
25702
25806
  TextInputComponent,
25703
25807
  DragAndDropFileInputComponent,
25704
- TextAreaComponent,
25705
25808
  ChipsInputComponent,
25706
25809
  NavigationButtonComponent,
25707
25810
  StarToggleComponent,
@@ -25739,6 +25842,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25739
25842
  MatInputModule,
25740
25843
  MatDatepickerModule,
25741
25844
  MatNativeDateModule,
25845
+ EditableLabelDirective,
25846
+ TextAreaComponent,
25847
+ ButtonComponent,
25742
25848
  ],
25743
25849
  exports: [
25744
25850
  DropdownSelectorComponent,
@@ -25758,6 +25864,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25758
25864
  CheckboxComponent,
25759
25865
  SearchInputComponent,
25760
25866
  DateRangePickerComponent,
25867
+ EditableLabelDirective,
25761
25868
  ],
25762
25869
  }]
25763
25870
  }] });
@@ -25857,7 +25964,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25857
25964
 
25858
25965
  const DEFAULT_PARAMS = {
25859
25966
  OFFSET: '',
25860
- LIMIT: '',
25967
+ LIMIT: '-1',
25861
25968
  FORMAT: 'json',
25862
25969
  };
25863
25970
  class RecordApiFormComponent {
@@ -25886,6 +25993,8 @@ class RecordApiFormComponent {
25886
25993
  }
25887
25994
  return outputUrl;
25888
25995
  }));
25996
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
25997
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25889
25998
  }
25890
25999
  set apiLink(value) {
25891
26000
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25895,10 +26004,11 @@ class RecordApiFormComponent {
25895
26004
  this.offset$.next(value);
25896
26005
  }
25897
26006
  setLimit(value) {
25898
- this.limit$.next(value);
26007
+ const newLimit = value === '' ? '-1' : value;
26008
+ this.limit$.next(newLimit);
25899
26009
  }
25900
26010
  setFormat(value) {
25901
- this.format$.next(value);
26011
+ this.format$.next(String(value));
25902
26012
  }
25903
26013
  resetUrl() {
25904
26014
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25906,11 +26016,11 @@ class RecordApiFormComponent {
25906
26016
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25907
26017
  }
25908
26018
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25909
- 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 }); }
26019
+ 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 }); }
25910
26020
  }
25911
26021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25912
26022
  type: Component,
25913
- 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"] }]
26023
+ 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"] }]
25914
26024
  }], propDecorators: { apiLink: [{
25915
26025
  type: Input
25916
26026
  }] } });
@@ -25923,11 +26033,11 @@ class ImageOverlayPreviewComponent {
25923
26033
  basicLightbox.create(`<img src="${src}"/>`).show();
25924
26034
  }
25925
26035
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25926
- 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"] }] }); }
26036
+ 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"] }] }); }
25927
26037
  }
25928
26038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
25929
26039
  type: Component,
25930
- 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" }]
26040
+ 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" }]
25931
26041
  }], propDecorators: { imageUrl: [{
25932
26042
  type: Input
25933
26043
  }], isPlaceholderShown: [{
@@ -25956,7 +26066,6 @@ class UiElementsModule {
25956
26066
  PaginationButtonsComponent,
25957
26067
  MaxLinesComponent,
25958
26068
  RecordApiFormComponent,
25959
- MarkdownParserComponent,
25960
26069
  ImageOverlayPreviewComponent], imports: [CommonModule,
25961
26070
  MatIconModule,
25962
26071
  MatTooltipModule,
@@ -25965,7 +26074,8 @@ class UiElementsModule {
25965
26074
  RouterModule,
25966
26075
  UiInputsModule,
25967
26076
  FormsModule,
25968
- NgOptimizedImage], exports: [MetadataInfoComponent,
26077
+ NgOptimizedImage,
26078
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
25969
26079
  ContentGhostComponent,
25970
26080
  DownloadItemComponent,
25971
26081
  DownloadsListComponent,
@@ -25982,6 +26092,7 @@ class UiElementsModule {
25982
26092
  AvatarComponent,
25983
26093
  UserPreviewComponent,
25984
26094
  PaginationButtonsComponent,
26095
+ MaxLinesComponent,
25985
26096
  RecordApiFormComponent,
25986
26097
  MarkdownParserComponent,
25987
26098
  ImageOverlayPreviewComponent] }); }
@@ -26011,6 +26122,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26011
26122
  UiInputsModule,
26012
26123
  FormsModule,
26013
26124
  NgOptimizedImage,
26125
+ MarkdownParserComponent,
26014
26126
  ],
26015
26127
  declarations: [
26016
26128
  MetadataInfoComponent,
@@ -26033,7 +26145,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26033
26145
  PaginationButtonsComponent,
26034
26146
  MaxLinesComponent,
26035
26147
  RecordApiFormComponent,
26036
- MarkdownParserComponent,
26037
26148
  ImageOverlayPreviewComponent,
26038
26149
  ],
26039
26150
  exports: [
@@ -26054,6 +26165,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26054
26165
  AvatarComponent,
26055
26166
  UserPreviewComponent,
26056
26167
  PaginationButtonsComponent,
26168
+ MaxLinesComponent,
26057
26169
  RecordApiFormComponent,
26058
26170
  MarkdownParserComponent,
26059
26171
  ImageOverlayPreviewComponent,
@@ -26061,143 +26173,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26061
26173
  }]
26062
26174
  }] });
26063
26175
 
26064
- class RecordTableComponent {
26065
- constructor() {
26066
- this.selectedRecords = [];
26067
- this.records = [];
26068
- this.recordClick = new EventEmitter();
26069
- this.recordsSelect = new EventEmitter();
26070
- this.recordsDeselect = new EventEmitter();
26071
- this.sortByChange = new EventEmitter();
26072
- }
26073
- dateToString(date) {
26074
- return date?.toLocaleDateString(undefined, {
26075
- year: 'numeric',
26076
- month: 'long',
26077
- day: 'numeric',
26078
- timeZone: 'UTC',
26079
- });
26080
- }
26081
- getStatus(isPublishedToAll) {
26082
- return isPublishedToAll ? 'published' : 'not published';
26083
- }
26084
- formatUserInfo(userInfo) {
26085
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
26086
- if (infos && infos.length === 4) {
26087
- return `${infos[2]} ${infos[1]}`;
26088
- }
26089
- return undefined;
26090
- }
26091
- getRecordFormats(record) {
26092
- if (record.kind === 'service' || !('distributions' in record)) {
26093
- return [];
26094
- }
26095
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
26096
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
26097
- return formats;
26098
- }
26099
- getBadgeColor(format) {
26100
- return getBadgeColor(format);
26101
- }
26102
- getOrderForColumn(col) {
26103
- if (!this.sortBy) {
26104
- return null;
26105
- }
26106
- let order = null;
26107
- const sortedArray = Array.isArray(this.sortBy[0])
26108
- ? this.sortBy
26109
- : [this.sortBy];
26110
- sortedArray.forEach((sortedCol) => {
26111
- if (sortedCol[1] === col) {
26112
- order = sortedCol[0];
26113
- }
26114
- });
26115
- return order;
26116
- }
26117
- setSortBy(col) {
26118
- const sortOrder = this.getOrderForColumn(col);
26119
- let newOrder;
26120
- if (sortOrder) {
26121
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
26122
- }
26123
- else {
26124
- newOrder = 'asc';
26125
- }
26126
- this.sortByChange.emit([newOrder, col]);
26127
- this.sortBy = [newOrder, col];
26128
- }
26129
- isSortedBy(col, order) {
26130
- const sortOrder = this.getOrderForColumn(col);
26131
- return sortOrder === order;
26132
- }
26133
- isChecked(record) {
26134
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
26135
- return true;
26136
- }
26137
- return false;
26138
- }
26139
- handleRecordSelectedChange(selected, record) {
26140
- if (!selected) {
26141
- this.recordsDeselect.emit([record]);
26142
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
26143
- }
26144
- else {
26145
- this.recordsSelect.emit([record]);
26146
- this.selectedRecords.push(record.uniqueIdentifier);
26147
- }
26148
- }
26149
- selectAll() {
26150
- if (this.isAllSelected()) {
26151
- this.recordsDeselect.emit(this.records);
26152
- this.selectedRecords = [];
26153
- }
26154
- else {
26155
- this.recordsSelect.emit(this.records);
26156
- this.selectedRecords = this.records.map((record) => {
26157
- return record.uniqueIdentifier;
26158
- });
26159
- }
26160
- }
26161
- isAllSelected() {
26162
- if (this.selectedRecords.length === this.records.length) {
26163
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
26164
- if (allRecords.length === this.records.length) {
26165
- return true;
26166
- }
26167
- }
26168
- return false;
26169
- }
26170
- isSomeSelected() {
26171
- if (this.selectedRecords.length > 0 &&
26172
- this.selectedRecords.length < this.records.length) {
26173
- return true;
26174
- }
26175
- return false;
26176
- }
26177
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26178
- 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"] }] }); }
26179
- }
26180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26181
- type: Component,
26182
- 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"] }]
26183
- }], propDecorators: { selectedRecords: [{
26184
- type: Input
26185
- }], records: [{
26186
- type: Input
26187
- }], totalHits: [{
26188
- type: Input
26189
- }], sortBy: [{
26190
- type: Input
26191
- }], recordClick: [{
26192
- type: Output
26193
- }], recordsSelect: [{
26194
- type: Output
26195
- }], recordsDeselect: [{
26196
- type: Output
26197
- }], sortByChange: [{
26198
- type: Output
26199
- }] } });
26200
-
26201
26176
  class UiSearchModule {
26202
26177
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26203
26178
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26210,8 +26185,7 @@ class UiSearchModule {
26210
26185
  ResultsHitsNumberComponent,
26211
26186
  ResultsListItemComponent,
26212
26187
  RecordPreviewFeedComponent,
26213
- RecordPreviewRowComponent,
26214
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26188
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26215
26189
  FacetsModule$1,
26216
26190
  FormsModule,
26217
26191
  ReactiveFormsModule,
@@ -26222,7 +26196,8 @@ class UiSearchModule {
26222
26196
  UiElementsModule,
26223
26197
  MatIconModule,
26224
26198
  MatCheckboxModule,
26225
- RouterLink], exports: [RecordPreviewListComponent,
26199
+ RouterLink,
26200
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26226
26201
  RecordPreviewCardComponent,
26227
26202
  RecordPreviewTextComponent,
26228
26203
  RecordPreviewTitleComponent,
@@ -26232,8 +26207,7 @@ class UiSearchModule {
26232
26207
  RecordPreviewComponent,
26233
26208
  ResultsHitsNumberComponent,
26234
26209
  RecordPreviewFeedComponent,
26235
- RecordPreviewRowComponent,
26236
- RecordTableComponent] }); }
26210
+ RecordPreviewRowComponent] }); }
26237
26211
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26238
26212
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26239
26213
  ], imports: [CommonModule,
@@ -26248,7 +26222,8 @@ class UiSearchModule {
26248
26222
  UiInputsModule,
26249
26223
  UiElementsModule,
26250
26224
  MatIconModule,
26251
- MatCheckboxModule, FacetsModule$1] }); }
26225
+ MatCheckboxModule,
26226
+ InteractiveTableComponent, FacetsModule$1] }); }
26252
26227
  }
26253
26228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26254
26229
  type: NgModule,
@@ -26265,7 +26240,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26265
26240
  ResultsListItemComponent,
26266
26241
  RecordPreviewFeedComponent,
26267
26242
  RecordPreviewRowComponent,
26268
- RecordTableComponent,
26269
26243
  ],
26270
26244
  imports: [
26271
26245
  CommonModule,
@@ -26282,6 +26256,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26282
26256
  MatIconModule,
26283
26257
  MatCheckboxModule,
26284
26258
  RouterLink,
26259
+ InteractiveTableComponent,
26285
26260
  ],
26286
26261
  exports: [
26287
26262
  RecordPreviewListComponent,
@@ -26295,7 +26270,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26295
26270
  ResultsHitsNumberComponent,
26296
26271
  RecordPreviewFeedComponent,
26297
26272
  RecordPreviewRowComponent,
26298
- RecordTableComponent,
26299
26273
  ],
26300
26274
  providers: [
26301
26275
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26854,6 +26828,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26854
26828
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26855
26829
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26856
26830
 
26831
+ // this geometry will be used to filter & boost results accordingly
26832
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
26833
+
26857
26834
  class SearchFacade {
26858
26835
  constructor(store, filterGeometry) {
26859
26836
  this.store = store;
@@ -26958,6 +26935,7 @@ class SearchFacade {
26958
26935
  this.store.dispatch(new SetFilters({}, this.searchId));
26959
26936
  this.store.dispatch(new SetSortBy([], this.searchId));
26960
26937
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
26938
+ return this;
26961
26939
  }
26962
26940
  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 }); }
26963
26941
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27342,8 +27320,11 @@ class FuzzySearchComponent {
27342
27320
  this.searchService.updateFilters({ any });
27343
27321
  }
27344
27322
  }
27345
- handleInputCleared() {
27346
- this.searchService.updateFilters({ any: '' });
27323
+ async handleInputCleared() {
27324
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27325
+ if (currentSearchFilters.any) {
27326
+ this.searchService.updateFilters({ any: '' });
27327
+ }
27347
27328
  }
27348
27329
  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 }); }
27349
27330
  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 }); }
@@ -27423,6 +27404,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27423
27404
  args: [RESULTS_LAYOUT_CONFIG]
27424
27405
  }] }]; } });
27425
27406
 
27407
+ // expects the replacement key ${uuid}
27408
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27409
+
27426
27410
  class FavoriteStarComponent {
27427
27411
  set record(value) {
27428
27412
  this.record_ = value;
@@ -27684,9 +27668,11 @@ class SearchEffects {
27684
27668
  // I could not get this to work (maybe a bug in rxjs?)
27685
27669
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27686
27670
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27687
- return of([state, favorites, null]);
27671
+ return of([state, favorites, undefined]);
27688
27672
  }
27689
27673
  return this.filterGeometry$.pipe(tap$2((geom) => {
27674
+ if (!geom)
27675
+ return;
27690
27676
  try {
27691
27677
  const trace = valid$1(geom, true);
27692
27678
  if (trace?.length > 0) {
@@ -27698,7 +27684,7 @@ class SearchEffects {
27698
27684
  throw new Error();
27699
27685
  }
27700
27686
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27701
- return of([state, favorites, null]);
27687
+ return of([state, favorites, undefined]);
27702
27688
  }));
27703
27689
  }), switchMap$1(([state, favorites, geometry]) => {
27704
27690
  const { currentPage, pageSize, sort } = state.params;
@@ -27797,10 +27783,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27797
27783
  class AbstractSearchField {
27798
27784
  }
27799
27785
  class SimpleSearchField {
27800
- constructor(esFieldName, order = 'asc', injector) {
27786
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27801
27787
  this.esFieldName = esFieldName;
27802
- this.order = order;
27803
27788
  this.injector = injector;
27789
+ this.order = order;
27790
+ this.orderType = orderType;
27804
27791
  this.repository = this.injector.get(RecordsRepositoryInterface);
27805
27792
  // FIXME: this is required to register runtime fields; abstract this as well
27806
27793
  this.esService = this.injector.get(ElasticsearchService);
@@ -27811,12 +27798,12 @@ class SimpleSearchField {
27811
27798
  type: 'terms',
27812
27799
  field: this.esFieldName,
27813
27800
  limit: 1000,
27814
- sort: [this.order, 'key'],
27801
+ sort: [this.order, this.orderType],
27815
27802
  },
27816
27803
  };
27817
27804
  }
27818
27805
  async getBucketLabel(bucket) {
27819
- return bucket.term;
27806
+ return bucket.term.toString();
27820
27807
  }
27821
27808
  getAvailableValues() {
27822
27809
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27844,9 +27831,13 @@ class SimpleSearchField {
27844
27831
  return of(values);
27845
27832
  }
27846
27833
  }
27847
- class KeySearchField extends SimpleSearchField {
27848
- constructor() {
27849
- super(...arguments);
27834
+ class TranslatedSearchField extends SimpleSearchField {
27835
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27836
+ super(esFieldName, injector, order, orderType);
27837
+ this.esFieldName = esFieldName;
27838
+ this.injector = injector;
27839
+ this.order = order;
27840
+ this.orderType = orderType;
27850
27841
  this.platformService = this.injector.get(PlatformServiceInterface);
27851
27842
  }
27852
27843
  async getTranslation(key) {
@@ -27856,26 +27847,36 @@ class KeySearchField extends SimpleSearchField {
27856
27847
  return (await this.getTranslation(bucket.term)) || bucket.term;
27857
27848
  }
27858
27849
  getAvailableValues() {
27850
+ if (this.orderType === 'count')
27851
+ return super.getAvailableValues();
27859
27852
  // sort values by alphabetical order
27860
27853
  return super
27861
27854
  .getAvailableValues()
27862
27855
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27863
27856
  }
27864
27857
  }
27865
- class ThesaurusField extends KeySearchField {
27866
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27867
- super(esFieldName, order, injector);
27868
- this.thesaurusName = thesaurusName;
27858
+ /**
27859
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
27860
+ * to the defined METADATA_LANGUAGE token
27861
+ * The provided ES field name should not include any prefix such as `.langeng`
27862
+ */
27863
+ class MultilingualSearchField extends SimpleSearchField {
27864
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27865
+ super(esFieldName, injector, order, orderType);
27866
+ this.esFieldName = esFieldName;
27867
+ this.injector = injector;
27868
+ this.order = order;
27869
+ this.orderType = orderType;
27869
27870
  this.langService = this.injector.get(LangService);
27870
- this.thesaurus$ = this.platformService
27871
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27872
- .pipe(catchError(() => {
27873
- console.warn('Error while loading thesaurus language package');
27874
- return of([]);
27875
- }), shareReplay(1));
27876
- }
27877
- async getTranslation(key) {
27878
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
27871
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
27872
+ // note: we're excluding the metadata language "current" value because that would produce
27873
+ // permalinks that might not work for different users
27874
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
27875
+ this.esFieldName += `.lang${this.searchLanguage}`;
27876
+ }
27877
+ else {
27878
+ this.esFieldName += '.default';
27879
+ }
27879
27880
  }
27880
27881
  }
27881
27882
  class FullTextSearchField {
@@ -27895,7 +27896,7 @@ marker('search.filters.isSpatial.yes');
27895
27896
  marker('search.filters.isSpatial.no');
27896
27897
  class IsSpatialSearchField extends SimpleSearchField {
27897
27898
  constructor(injector) {
27898
- super('isSpatial', 'asc', injector);
27899
+ super('isSpatial', injector, 'asc');
27899
27900
  this.translateService = this.injector.get(TranslateService);
27900
27901
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27901
27902
  String formats = doc.format.join('|').toLowerCase();
@@ -27945,7 +27946,7 @@ marker('search.filters.license.unknown');
27945
27946
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27946
27947
  class LicenseSearchField extends SimpleSearchField {
27947
27948
  constructor(injector) {
27948
- super('license', 'asc', injector);
27949
+ super('license', injector, 'asc');
27949
27950
  this.translateService = this.injector.get(TranslateService);
27950
27951
  this.esService.registerRuntimeField('license', `String raw = '';
27951
27952
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -28029,7 +28030,7 @@ class OrganizationSearchField {
28029
28030
  }
28030
28031
  class OwnerSearchField extends SimpleSearchField {
28031
28032
  constructor(injector) {
28032
- super('owner', 'asc', injector);
28033
+ super('owner', injector, 'asc');
28033
28034
  }
28034
28035
  getAvailableValues() {
28035
28036
  return of([]);
@@ -28038,6 +28039,7 @@ class OwnerSearchField extends SimpleSearchField {
28038
28039
 
28039
28040
  marker('search.filters.format');
28040
28041
  marker('search.filters.inspireKeyword');
28042
+ marker('search.filters.keyword');
28041
28043
  marker('search.filters.isSpatial');
28042
28044
  marker('search.filters.license');
28043
28045
  marker('search.filters.publicationYear');
@@ -28055,13 +28057,14 @@ class FieldsService {
28055
28057
  this.injector = injector;
28056
28058
  this.fields = {
28057
28059
  publisher: new OrganizationSearchField(this.injector),
28058
- format: new SimpleSearchField('format', 'asc', this.injector),
28059
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
28060
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
28061
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
28062
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
28063
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
28064
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28060
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28061
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28062
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28063
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28064
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28065
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28066
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28067
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
28065
28068
  isSpatial: new IsSpatialSearchField(this.injector),
28066
28069
  q: new FullTextSearchField(),
28067
28070
  license: new LicenseSearchField(this.injector),
@@ -28135,10 +28138,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28135
28138
  type: Input
28136
28139
  }] } });
28137
28140
 
28138
- // this geometry will be used to filter & boost results accordingly
28139
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
28140
- // expects the replacement key ${uuid}
28141
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28142
28141
  class FeatureSearchModule {
28143
28142
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28144
28143
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28237,6 +28236,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28237
28236
  }]
28238
28237
  }] });
28239
28238
 
28239
+ class ResultsTableComponent {
28240
+ constructor(searchFacade, searchService, selectionService) {
28241
+ this.searchFacade = searchFacade;
28242
+ this.searchService = searchService;
28243
+ this.selectionService = selectionService;
28244
+ this.recordClick = new EventEmitter();
28245
+ this.records$ = this.searchFacade.results$;
28246
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28247
+ }
28248
+ dateToString(date) {
28249
+ return date?.toLocaleDateString(undefined, {
28250
+ year: 'numeric',
28251
+ month: 'long',
28252
+ day: 'numeric',
28253
+ timeZone: 'UTC',
28254
+ });
28255
+ }
28256
+ getStatus(isPublishedToAll) {
28257
+ return isPublishedToAll ? 'published' : 'not published';
28258
+ }
28259
+ getRecordFormats(record) {
28260
+ if (record.kind === 'service' || !('distributions' in record)) {
28261
+ return [];
28262
+ }
28263
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28264
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28265
+ return formats;
28266
+ }
28267
+ formatUserInfo(userInfo) {
28268
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28269
+ if (infos && infos.length === 4) {
28270
+ return `${infos[2]} ${infos[1]}`;
28271
+ }
28272
+ return undefined;
28273
+ }
28274
+ getBadgeColor(format) {
28275
+ return getBadgeColor(format);
28276
+ }
28277
+ handleRecordClick(item) {
28278
+ this.recordClick.emit(item);
28279
+ }
28280
+ setSortBy(col, order) {
28281
+ this.searchService.setSortBy([order, col]);
28282
+ }
28283
+ isSortedBy(col) {
28284
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28285
+ const sortArray = Array.isArray(sortOrder[0])
28286
+ ? sortOrder
28287
+ : [sortOrder];
28288
+ for (const sort of sortArray) {
28289
+ if (sort[1] === col) {
28290
+ return sort[0];
28291
+ }
28292
+ }
28293
+ return null;
28294
+ }));
28295
+ }
28296
+ isChecked(record) {
28297
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28298
+ return selectedRecords.includes(record.uniqueIdentifier);
28299
+ }));
28300
+ }
28301
+ handleRecordSelectedChange(selected, record) {
28302
+ if (!selected) {
28303
+ this.selectionService.deselectRecords([record]);
28304
+ }
28305
+ else {
28306
+ this.selectionService.selectRecords([record]);
28307
+ }
28308
+ }
28309
+ async toggleSelectAll() {
28310
+ const records = await firstValueFrom(this.records$);
28311
+ if (await firstValueFrom(this.isAllSelected())) {
28312
+ this.selectionService.deselectRecords(records);
28313
+ }
28314
+ else {
28315
+ this.selectionService.selectRecords(records);
28316
+ }
28317
+ }
28318
+ isAllSelected() {
28319
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28320
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28321
+ }));
28322
+ }
28323
+ isSomeSelected() {
28324
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28325
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28326
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28327
+ return !allSelected && someSelected;
28328
+ }));
28329
+ }
28330
+ 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 }); }
28331
+ 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"] }] }); }
28332
+ }
28333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28334
+ type: Component,
28335
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28336
+ CommonModule,
28337
+ UiInputsModule,
28338
+ InteractiveTableComponent,
28339
+ InteractiveTableColumnComponent,
28340
+ MatIconModule,
28341
+ TranslateModule,
28342
+ ], 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" }]
28343
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28344
+ type: Output
28345
+ }] } });
28346
+
28240
28347
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28241
28348
  get mapLinks() {
28242
28349
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28366,6 +28473,105 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28366
28473
  args: [{ selector: 'gn-ui-add-layer-from-wms', template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n" }]
28367
28474
  }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28368
28475
 
28476
+ const INVALID_FILE_FORMAT_ERROR_MESSAGE = 'Invalid file format';
28477
+ class AddLayerFromFileComponent {
28478
+ constructor(mapFacade, changeDetectorRef) {
28479
+ this.mapFacade = mapFacade;
28480
+ this.changeDetectorRef = changeDetectorRef;
28481
+ this.errorMessage = null;
28482
+ this.successMessage = null;
28483
+ this.loading = false;
28484
+ this.acceptedMimeType = ['.geojson'];
28485
+ this.maxFileSize = 5000000;
28486
+ }
28487
+ async handleFileChange(file) {
28488
+ if (!file) {
28489
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28490
+ return;
28491
+ }
28492
+ if (file.size > this.maxFileSize) {
28493
+ this.displayMessage('File size exceeds the limit of 5MB', 'error');
28494
+ return;
28495
+ }
28496
+ await this.addLayer(file);
28497
+ }
28498
+ async addLayer(file) {
28499
+ this.errorMessage = null;
28500
+ this.loading = true;
28501
+ try {
28502
+ if (!this.isFileFormatValid(file)) {
28503
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28504
+ return;
28505
+ }
28506
+ const fileExtension = this.getFileExtension(file);
28507
+ switch (fileExtension) {
28508
+ case 'geojson':
28509
+ await this.addGeoJsonLayer(file);
28510
+ break;
28511
+ default:
28512
+ this.displayMessage(INVALID_FILE_FORMAT_ERROR_MESSAGE, 'error');
28513
+ break;
28514
+ }
28515
+ }
28516
+ catch (error) {
28517
+ const err = error;
28518
+ this.displayMessage('Error loading file: ' + err.message, 'error');
28519
+ }
28520
+ finally {
28521
+ this.loading = false;
28522
+ }
28523
+ }
28524
+ addGeoJsonLayer(file) {
28525
+ return new Promise((resolve, reject) => {
28526
+ try {
28527
+ const reader = new FileReader();
28528
+ reader.onload = () => {
28529
+ const result = reader.result;
28530
+ const title = file.name.split('.').slice(0, -1).join('.');
28531
+ const layerToAdd = {
28532
+ type: 'geojson',
28533
+ data: result,
28534
+ };
28535
+ this.mapFacade.addLayer({ ...layerToAdd, title: title });
28536
+ this.displayMessage('File successfully added to map', 'success');
28537
+ resolve();
28538
+ };
28539
+ reader.onerror = reject;
28540
+ reader.readAsText(file);
28541
+ }
28542
+ catch (error) {
28543
+ reject(error);
28544
+ }
28545
+ });
28546
+ }
28547
+ isFileFormatValid(file) {
28548
+ const fileExtension = this.getFileExtension(file);
28549
+ return this.acceptedMimeType.includes(`.${fileExtension}`);
28550
+ }
28551
+ getFileExtension(file) {
28552
+ return file.name.split('.').pop();
28553
+ }
28554
+ displayMessage(message, type) {
28555
+ if (type === 'success') {
28556
+ this.successMessage = message;
28557
+ }
28558
+ else if (type === 'error') {
28559
+ this.errorMessage = message;
28560
+ }
28561
+ setTimeout(() => {
28562
+ this.successMessage = null;
28563
+ this.errorMessage = null;
28564
+ this.changeDetectorRef.detectChanges();
28565
+ }, 5000);
28566
+ }
28567
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28568
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromFileComponent, selector: "gn-ui-add-layer-from-file", ngImport: i0, template: "<div class=\"flex flex-col gap-2 my-2\">\n <div class=\"flex items-center gap-4\">\n <div class=\"flex-grow rounded-md border-2 border-gray-200\">\n <gn-ui-drag-and-drop-file-input\n (fileChange)=\"handleFileChange($event)\"\n [accept]=\"acceptedMimeType.join(',')\"\n [placeholder]=\"'map.addFromFile.placeholder' | translate\"\n class=\"placeholder-grey\"\n ></gn-ui-drag-and-drop-file-input>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\" translate>map.help.addFromFile</p>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"successMessage\" class=\"text-green-500 mt-2\">\n {{ successMessage }}\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: ["placeholder", "accept"], outputs: ["fileChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28569
+ }
28570
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromFileComponent, decorators: [{
28571
+ type: Component,
28572
+ args: [{ selector: 'gn-ui-add-layer-from-file', template: "<div class=\"flex flex-col gap-2 my-2\">\n <div class=\"flex items-center gap-4\">\n <div class=\"flex-grow rounded-md border-2 border-gray-200\">\n <gn-ui-drag-and-drop-file-input\n (fileChange)=\"handleFileChange($event)\"\n [accept]=\"acceptedMimeType.join(',')\"\n [placeholder]=\"'map.addFromFile.placeholder' | translate\"\n class=\"placeholder-grey\"\n ></gn-ui-drag-and-drop-file-input>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\" translate>map.help.addFromFile</p>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"successMessage\" class=\"text-green-500 mt-2\">\n {{ successMessage }}\n</div>\n" }]
28573
+ }], ctorParameters: function () { return [{ type: MapFacade }, { type: i0.ChangeDetectorRef }]; } });
28574
+
28369
28575
  class AddLayerFromWfsComponent {
28370
28576
  constructor(mapFacade, changeDetectorRef) {
28371
28577
  this.mapFacade = mapFacade;
@@ -28427,11 +28633,11 @@ class LayersPanelComponent {
28427
28633
  this.mapFacade.removeLayer(index);
28428
28634
  }
28429
28635
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
28430
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LayersPanelComponent, selector: "gn-ui-layers-panel", ngImport: i0, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from file</div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ExpandablePanelButtonComponent, selector: "gn-ui-expandable-panel-button", inputs: ["titleTemplate", "collapsed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$3.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { kind: "component", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28636
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LayersPanelComponent, selector: "gn-ui-layers-panel", ngImport: i0, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>\n </div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ExpandablePanelButtonComponent, selector: "gn-ui-expandable-panel-button", inputs: ["titleTemplate", "collapsed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$3.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { kind: "component", type: AddLayerFromFileComponent, selector: "gn-ui-add-layer-from-file" }, { kind: "component", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28431
28637
  }
28432
28638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
28433
28639
  type: Component,
28434
- args: [{ selector: 'gn-ui-layers-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3 h-full\">Add from file</div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n" }]
28640
+ args: [{ selector: 'gn-ui-layers-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>\n </div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n" }]
28435
28641
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28436
28642
 
28437
28643
  class MapEffects {
@@ -28464,6 +28670,121 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28464
28670
  args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-context [context]=\"context$ | async\"></gn-ui-map-context>\n" }]
28465
28671
  }], ctorParameters: function () { return [{ type: MapFacade }]; } });
28466
28672
 
28673
+ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
28674
+ class GeocodingService {
28675
+ constructor(provider) {
28676
+ this.provider = provider;
28677
+ }
28678
+ query(text) {
28679
+ let queryObservable;
28680
+ switch (this.provider[0]) {
28681
+ case 'geoadmin':
28682
+ queryObservable = from(queryGeoadmin(text, this.provider[1]));
28683
+ break;
28684
+ case 'geonames':
28685
+ queryObservable = from(queryGeonames(text, this.provider[1]));
28686
+ break;
28687
+ case 'data-gouv-fr':
28688
+ queryObservable = from(queryDataGouvFr(text, this.provider[1]));
28689
+ break;
28690
+ default:
28691
+ return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
28692
+ }
28693
+ return queryObservable.pipe(catchError((error) => throwError(error)));
28694
+ }
28695
+ 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 }); }
28696
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
28697
+ }
28698
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingService, decorators: [{
28699
+ type: Injectable,
28700
+ args: [{
28701
+ providedIn: 'root',
28702
+ }]
28703
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
28704
+ type: Inject,
28705
+ args: [GEOCODING_PROVIDER]
28706
+ }] }]; } });
28707
+
28708
+ class GeocodingComponent {
28709
+ constructor(mapManager, geocodingService) {
28710
+ this.mapManager = mapManager;
28711
+ this.geocodingService = geocodingService;
28712
+ this.searchText = '';
28713
+ this.results = [];
28714
+ this.searchTextChanged = new Subject();
28715
+ this.destroy$ = new Subject();
28716
+ this.errorMessage = null;
28717
+ this.searchTextChanged
28718
+ .pipe(debounceTime(300), switchMap$1((searchText) => {
28719
+ return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
28720
+ this.errorMessage =
28721
+ 'An error occurred while searching. Please try again.';
28722
+ console.error(error);
28723
+ return [];
28724
+ }));
28725
+ }), takeUntil(this.destroy$))
28726
+ .subscribe((results) => {
28727
+ this.results = results;
28728
+ });
28729
+ }
28730
+ ngOnDestroy() {
28731
+ this.destroy$.next();
28732
+ this.destroy$.complete();
28733
+ }
28734
+ onSearchChange(searchText) {
28735
+ if (!searchText) {
28736
+ this.clearSearch();
28737
+ return;
28738
+ }
28739
+ else {
28740
+ this.searchTextChanged.next(searchText);
28741
+ }
28742
+ }
28743
+ clearSearch() {
28744
+ this.searchText = '';
28745
+ this.results = [];
28746
+ this.errorMessage = null;
28747
+ }
28748
+ zoomToLocation(result) {
28749
+ const map = this.mapManager.map;
28750
+ const view = map.getView();
28751
+ const geometry = result.geom;
28752
+ if (geometry.type === 'Point') {
28753
+ this.zoomToPoint(geometry.coordinates, view);
28754
+ }
28755
+ else if (geometry.type === 'Polygon') {
28756
+ this.zoomToPolygon(geometry.coordinates, view);
28757
+ }
28758
+ else {
28759
+ console.error(`Unsupported geometry type: ${geometry.type}`);
28760
+ }
28761
+ }
28762
+ zoomToPoint(pointCoords, view) {
28763
+ const transformedCoords = fromLonLat(pointCoords);
28764
+ view.setCenter(transformedCoords);
28765
+ view.setZoom(12);
28766
+ }
28767
+ zoomToPolygon(polygonCoords, view) {
28768
+ const transformedCoords = polygonCoords[0].map((coord) => fromLonLat(coord));
28769
+ const polygon = new Polygon([transformedCoords]);
28770
+ view.fit(polygon, {
28771
+ duration: 100,
28772
+ maxZoom: 12,
28773
+ });
28774
+ }
28775
+ onEnterPress() {
28776
+ if (this.results && this.results.length > 0) {
28777
+ this.zoomToLocation(this.results[0]);
28778
+ }
28779
+ }
28780
+ 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 }); }
28781
+ 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" }] }); }
28782
+ }
28783
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GeocodingComponent, decorators: [{
28784
+ type: Component,
28785
+ 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" }]
28786
+ }], ctorParameters: function () { return [{ type: MapManagerService }, { type: GeocodingService }]; } });
28787
+
28467
28788
  class FeatureMapModule {
28468
28789
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28469
28790
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, declarations: [MapContextComponent,
@@ -28473,7 +28794,9 @@ class FeatureMapModule {
28473
28794
  MapContainerComponent,
28474
28795
  AddLayerRecordPreviewComponent,
28475
28796
  AddLayerFromWmsComponent,
28476
- AddLayerFromWfsComponent], imports: [CommonModule,
28797
+ AddLayerFromFileComponent,
28798
+ AddLayerFromWfsComponent,
28799
+ GeocodingComponent], imports: [CommonModule,
28477
28800
  UiMapModule,
28478
28801
  UiLayoutModule,
28479
28802
  MatIconModule,
@@ -28484,13 +28807,18 @@ class FeatureMapModule {
28484
28807
  MapInstanceDirective,
28485
28808
  LayersPanelComponent,
28486
28809
  AddLayerFromCatalogComponent,
28487
- MapContainerComponent] }); }
28810
+ MapContainerComponent,
28811
+ GeocodingComponent] }); }
28488
28812
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureMapModule, providers: [
28489
28813
  {
28490
28814
  provide: FEATURE_MAP_OPTIONS,
28491
28815
  useValue: defaultMapOptions,
28492
28816
  },
28493
28817
  MapFacade,
28818
+ {
28819
+ provide: GEOCODING_PROVIDER,
28820
+ useValue: ['geonames', { maxRows: 5 }],
28821
+ },
28494
28822
  ], imports: [CommonModule,
28495
28823
  UiMapModule,
28496
28824
  UiLayoutModule,
@@ -28514,7 +28842,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28514
28842
  MapContainerComponent,
28515
28843
  AddLayerRecordPreviewComponent,
28516
28844
  AddLayerFromWmsComponent,
28845
+ AddLayerFromFileComponent,
28517
28846
  AddLayerFromWfsComponent,
28847
+ GeocodingComponent,
28518
28848
  ],
28519
28849
  exports: [
28520
28850
  MapContextComponent,
@@ -28522,6 +28852,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28522
28852
  LayersPanelComponent,
28523
28853
  AddLayerFromCatalogComponent,
28524
28854
  MapContainerComponent,
28855
+ GeocodingComponent,
28525
28856
  ],
28526
28857
  imports: [
28527
28858
  CommonModule,
@@ -28542,6 +28873,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28542
28873
  useValue: defaultMapOptions,
28543
28874
  },
28544
28875
  MapFacade,
28876
+ {
28877
+ provide: GEOCODING_PROVIDER,
28878
+ useValue: ['geonames', { maxRows: 5 }],
28879
+ },
28545
28880
  ],
28546
28881
  }]
28547
28882
  }] });
@@ -28636,7 +28971,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28636
28971
  ...state,
28637
28972
  chartConfig,
28638
28973
  })), on(close, (state) => {
28639
- // eslint-disable-next-line
28974
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28640
28975
  const { metadata, related, ...stateWithoutMd } = state;
28641
28976
  return stateWithoutMd;
28642
28977
  }));
@@ -29903,15 +30238,16 @@ class DataService {
29903
30238
  // Pour DL toutes les données
29904
30239
  return this.getDownloadUrlsFromWfs(wfsLink.url.toString(), wfsLink.name).pipe(map$1((urls) => urls.all), map$1((urls) => Object.keys(urls).map((format) => ({
29905
30240
  ...wfsLink,
30241
+ type: 'download',
29906
30242
  url: new URL(urls[format]),
29907
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30243
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29908
30244
  }))));
29909
30245
  }
29910
30246
  getDownloadLinksFromEsriRest(esriRestLink) {
29911
30247
  return ['json', 'geojson'].map((format) => ({
29912
30248
  ...esriRestLink,
29913
30249
  url: new URL(this.getDownloadUrlFromEsriRest(esriRestLink.url.toString(), format)),
29914
- mimeType: getMimeTypeForFormat(extensionToFormat(format)) || format,
30250
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
29915
30251
  }));
29916
30252
  }
29917
30253
  readAsGeoJson(link) {
@@ -30305,12 +30641,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30305
30641
  }] } });
30306
30642
 
30307
30643
  class MapViewComponent {
30308
- constructor(mdViewFacade, mapManager, mapUtils, dataService, proxy, featureInfo, changeRef, styleService) {
30644
+ constructor(mdViewFacade, mapManager, mapUtils, dataService, featureInfo, changeRef, styleService) {
30309
30645
  this.mdViewFacade = mdViewFacade;
30310
30646
  this.mapManager = mapManager;
30311
30647
  this.mapUtils = mapUtils;
30312
30648
  this.dataService = dataService;
30313
- this.proxy = proxy;
30314
30649
  this.featureInfo = featureInfo;
30315
30650
  this.changeRef = changeRef;
30316
30651
  this.styleService = styleService;
@@ -30345,7 +30680,7 @@ class MapViewComponent {
30345
30680
  return of([]);
30346
30681
  }), finalize(() => (this.loading = false)));
30347
30682
  }));
30348
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => this.mapUtils.getLayerExtent(layers[0]).pipe(catchError((error) => {
30683
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
30349
30684
  console.warn(error); // FIXME: report this to the user somehow
30350
30685
  return of(undefined);
30351
30686
  }), map$1((extent) => ({
@@ -30353,7 +30688,18 @@ class MapViewComponent {
30353
30688
  view: {
30354
30689
  extent,
30355
30690
  },
30356
- })), tap$1(() => this.resetSelection()))));
30691
+ })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
30692
+ if (context.view.extent)
30693
+ return context;
30694
+ const extent = this.mapUtils.getRecordExtent(metadata);
30695
+ return {
30696
+ ...context,
30697
+ view: {
30698
+ ...context.view,
30699
+ extent,
30700
+ },
30701
+ };
30702
+ }));
30357
30703
  }
30358
30704
  ngOnDestroy() {
30359
30705
  this.subscription.unsubscribe();
@@ -30406,13 +30752,13 @@ class MapViewComponent {
30406
30752
  selectLinkToDisplay(link) {
30407
30753
  this.selectedLinkIndex$.next(link);
30408
30754
  }
30409
- 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 }); }
30755
+ 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 }); }
30410
30756
  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 }); }
30411
30757
  }
30412
30758
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
30413
30759
  type: Component,
30414
30760
  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" }]
30415
- }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: ProxyService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30761
+ }], ctorParameters: function () { return [{ type: MdViewFacade }, { type: MapManagerService }, { type: MapUtilsService }, { type: DataService }, { type: FeatureInfoService }, { type: i0.ChangeDetectorRef }, { type: MapStyleService }]; } });
30416
30762
 
30417
30763
  class DataViewComponent {
30418
30764
  constructor(mdViewFacade) {
@@ -30864,13 +31210,6 @@ class MyOrgService {
30864
31210
  constructor(platformService, orgService) {
30865
31211
  this.platformService = platformService;
30866
31212
  this.orgService = orgService;
30867
- this.myOrgDataSubject = new BehaviorSubject({
30868
- orgName: '',
30869
- logoUrl: '',
30870
- recordCount: 0,
30871
- userCount: 0,
30872
- userList: [],
30873
- });
30874
31213
  this.myOrgData$ = combineLatest([
30875
31214
  this.platformService.getMe(),
30876
31215
  this.platformService.getUsers(),
@@ -30889,7 +31228,7 @@ class MyOrgService {
30889
31228
  userList,
30890
31229
  userCount,
30891
31230
  };
30892
- }));
31231
+ }), shareReplay(1));
30893
31232
  }
30894
31233
  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 }); }
30895
31234
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31582,11 +31921,11 @@ class RecordFormComponent {
31582
31921
  return field.config.model;
31583
31922
  }
31584
31923
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31585
- 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 }); }
31924
+ 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 }); }
31586
31925
  }
31587
31926
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31588
31927
  type: Component,
31589
- 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" }]
31928
+ 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" }]
31590
31929
  }], ctorParameters: function () { return [{ type: EditorService }]; } });
31591
31930
 
31592
31931
  const ROUTER_STATE_KEY = 'router';
@@ -31954,5 +32293,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31954
32293
  * Generated bundle index. Do not edit.
31955
32294
  */
31956
32295
 
31957
- 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 };
32296
+ 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 };
31958
32297
  //# sourceMappingURL=geonetwork-ui.mjs.map