geonetwork-ui 2.6.0-dev.502fa026d → 2.6.0-dev.76a84fb05

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 (249) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +1 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +8 -3
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -4
  5. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -10
  6. package/esm2022/libs/api/repository/src/lib/gn4/gn4.provider.mjs +7 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  8. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +5 -1
  9. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +5 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +2 -3
  11. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +1 -1
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -5
  13. package/esm2022/libs/feature/record/src/index.mjs +1 -2
  14. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +5 -9
  15. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +7 -11
  16. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +6 -1
  17. package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +1 -1
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +8 -5
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -6
  20. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +3 -1
  21. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  22. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +10 -2
  23. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -3
  24. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +8 -7
  25. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -15
  26. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -2
  27. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +26 -10
  28. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  29. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  30. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +27 -6
  31. package/esm2022/libs/ui/elements/src/lib/download-item/download-item.component.mjs +22 -6
  32. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  33. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +163 -0
  34. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +29 -7
  35. package/esm2022/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.mjs +3 -3
  36. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  37. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +8 -5
  38. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  39. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +3 -2
  40. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +161 -0
  41. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +16 -4
  42. package/esm2022/libs/ui/inputs/src/index.mjs +1 -2
  43. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +4 -3
  44. package/esm2022/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.mjs +43 -3
  45. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  46. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  47. package/esm2022/libs/ui/map/src/index.mjs +2 -1
  48. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +79 -0
  49. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  50. package/esm2022/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.mjs +3 -3
  51. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +2 -1
  52. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  53. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  54. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  55. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  56. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +33 -24
  57. package/esm2022/translations/de.json +33 -3
  58. package/esm2022/translations/en.json +34 -4
  59. package/esm2022/translations/es.json +33 -3
  60. package/esm2022/translations/fr.json +35 -5
  61. package/esm2022/translations/it.json +33 -4
  62. package/esm2022/translations/nl.json +33 -3
  63. package/esm2022/translations/pt.json +33 -3
  64. package/fesm2022/geonetwork-ui.mjs +1266 -515
  65. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  67. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  68. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  69. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  70. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +6 -2
  71. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  72. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  73. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +1 -1
  74. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
  75. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
  76. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +6 -6
  77. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  78. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
  79. package/libs/feature/record/src/index.d.ts +0 -1
  80. package/libs/feature/record/src/index.d.ts.map +1 -1
  81. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  82. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  83. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  84. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  85. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  86. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  87. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  88. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  89. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  90. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  91. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  92. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  93. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  94. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  95. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  96. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  97. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  98. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  99. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  100. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  101. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  102. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -1
  103. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -1
  104. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  105. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  106. package/libs/ui/elements/src/index.d.ts +2 -0
  107. package/libs/ui/elements/src/index.d.ts.map +1 -1
  108. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts +9 -1
  109. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  110. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts +8 -1
  111. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts.map +1 -1
  112. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +43 -0
  113. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -0
  114. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +10 -2
  115. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  116. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  117. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  118. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  119. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  120. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  121. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +3 -1
  122. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  123. package/libs/ui/inputs/src/index.d.ts +0 -1
  124. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  125. package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts.map +1 -1
  126. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts +10 -3
  127. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts.map +1 -1
  128. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  129. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  130. package/libs/ui/map/src/index.d.ts +1 -0
  131. package/libs/ui/map/src/index.d.ts.map +1 -1
  132. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  133. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  134. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  135. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  136. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  137. package/libs/util/shared/src/index.d.ts +1 -0
  138. package/libs/util/shared/src/index.d.ts.map +1 -1
  139. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  140. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  141. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  142. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  143. package/libs/util/shared/src/lib/links/link-utils.d.ts +30 -23
  144. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  145. package/package.json +1 -1
  146. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  147. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  148. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  149. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  150. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  151. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +8 -2
  152. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  153. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  154. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  155. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  156. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +6 -2
  157. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  158. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  159. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  160. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +4 -0
  161. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +4 -0
  162. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  163. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  164. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  165. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  166. package/src/libs/feature/record/src/index.ts +0 -1
  167. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  168. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  169. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +5 -0
  170. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  171. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  172. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  173. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  174. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  175. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  176. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  177. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +1 -7
  178. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +16 -8
  179. package/src/libs/feature/search/src/lib/feature-search.module.ts +0 -8
  180. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  181. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.css +6 -0
  182. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  183. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  184. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  185. package/src/libs/ui/elements/src/index.ts +2 -0
  186. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +64 -38
  187. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +26 -2
  188. package/src/libs/ui/elements/src/lib/download-item/download-item.component.html +17 -17
  189. package/src/libs/ui/elements/src/lib/download-item/download-item.component.ts +20 -2
  190. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +7 -6
  191. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +156 -0
  192. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +190 -0
  193. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +27 -29
  194. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +33 -3
  195. package/src/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.html +1 -1
  196. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  197. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  198. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  199. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  200. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +4 -2
  201. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +2 -1
  202. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.css +0 -0
  203. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  204. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  205. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -0
  206. package/src/libs/ui/inputs/src/index.ts +0 -1
  207. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +5 -5
  208. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.ts +2 -1
  209. package/src/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.ts +46 -2
  210. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +0 -4
  211. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  212. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  213. package/src/libs/ui/map/src/index.ts +1 -0
  214. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  215. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  216. package/src/libs/{feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.ts → ui/map/src/lib/components/spatial-extent/spatial-extent.component.ts} +7 -8
  217. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  218. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  219. package/src/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.html +3 -2
  220. package/src/libs/util/app-config/src/lib/app-config.ts +1 -0
  221. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  222. package/src/libs/util/shared/src/index.ts +1 -0
  223. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  224. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  225. package/src/libs/util/shared/src/lib/links/link-utils.ts +50 -30
  226. package/tailwind.base.css +51 -13
  227. package/translations/de.json +33 -3
  228. package/translations/en.json +34 -4
  229. package/translations/es.json +33 -3
  230. package/translations/fr.json +35 -5
  231. package/translations/it.json +33 -4
  232. package/translations/nl.json +33 -3
  233. package/translations/pt.json +33 -3
  234. package/translations/sk.json +33 -3
  235. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  236. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  237. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +0 -16
  238. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  239. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts.map +0 -1
  240. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  241. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  242. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts +0 -8
  243. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts.map +0 -1
  244. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  245. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  246. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +0 -3
  247. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +0 -9
  248. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.ts +0 -15
  249. /package/src/libs/{feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.css → ui/elements/src/lib/internal-link-card/internal-link-card.component.css} +0 -0
@@ -7,17 +7,17 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker';
7
7
  import { format } from 'date-fns/format';
8
8
  import { Namespace, Literal, lit, parse as parse$2, sym, BlankNode, graph } from 'rdflib';
9
9
  import * as i0 from '@angular/core';
10
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, ContentChild, ContentChildren, TemplateRef, Host, ElementRef, ViewChildren, ViewContainerRef, Pipe, ViewEncapsulation, inject } from '@angular/core';
10
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, ContentChild, ContentChildren, TemplateRef, Host, ElementRef, ViewChildren, ViewContainerRef, ViewEncapsulation, Pipe, inject } from '@angular/core';
11
11
  import * as i1 from '@angular/common/http';
12
12
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpEventType, HttpClientXsrfModule } from '@angular/common/http';
13
13
  import * as i1$1 from '@ngx-translate/core';
14
14
  import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
15
15
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
16
16
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
17
- import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, first as first$1, share, pairwise, delay, defaultIfEmpty, toArray } from 'rxjs/operators';
17
+ import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, delay, first as first$1, share, pairwise, defaultIfEmpty, toArray } from 'rxjs/operators';
18
18
  import * as i1$2 from '@angular/common';
19
- import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgOptimizedImage, DatePipe, NgIf } from '@angular/common';
20
- import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, filter as filter$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, timer, takeUntil, EMPTY, mergeMap as mergeMap$1, startWith as startWith$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
19
+ import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgIf, NgClass, NgTemplateOutlet, NgOptimizedImage, DatePipe } from '@angular/common';
20
+ import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, timer, filter as filter$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$1, startWith as startWith$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
21
21
  import { lt, valid, coerce, satisfies, ltr } from 'semver';
22
22
  import chroma from 'chroma-js';
23
23
  import { WmtsEndpoint, WmsEndpoint, WfsEndpoint, OgcApiEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
@@ -26,8 +26,8 @@ import { createAction, props, createReducer, on, createFeatureSelector, createSe
26
26
  import EmblaCarousel from 'embla-carousel';
27
27
  import * as i2$2 from '@ng-icons/core';
28
28
  import { provideIcons, NgIcon, NgIconComponent, provideNgIconsConfig, NgIconsModule } from '@ng-icons/core';
29
- import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirNavArrowDown, iconoirNavArrowUp, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirUser, iconoirLock, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
30
- import { matExpandMore, matExpandLess, matAdd, matRemove, matClose, matContentCopy, matSearch, matStar, matStarBorder, matChevronLeft, matChevronRight, matArrowForward, matArrowBack, matCheck, matWarningAmber, matMoreHoriz, matFace, matQuestionMark, matMoodBad, matZoomOutMap, matOpenInNew, matMailOutline, matPersonOutline, matCheckCircleOutline, matWarning, matMoreVert, matCorporateFare } from '@ng-icons/material-icons/baseline';
29
+ import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirNavArrowDown, iconoirNavArrowUp, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirDatabase, iconoirMap, iconoirInternet, iconoirUser, iconoirLock, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
30
+ import { matExpandMore, matExpandLess, matAdd, matRemove, matClose, matContentCopy, matSearch, matStar, matStarBorder, matChevronLeft, matChevronRight, matArrowForward, matArrowBack, matCheck, matWarningAmber, matFace, matQuestionMark, matMoodBad, matZoomOutMap, matOpenInNew, matMailOutline, matPersonOutline, matCheckCircleOutline, matWarning, matCode, matMoreVert, matCorporateFare } from '@ng-icons/material-icons/baseline';
31
31
  import * as i1$4 from '@angular/material/tooltip';
32
32
  import { MatTooltipModule } from '@angular/material/tooltip';
33
33
  import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
@@ -41,7 +41,7 @@ import { TagInputModule } from 'ngx-chips';
41
41
  import * as i1$5 from '@angular/material/progress-spinner';
42
42
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
43
43
  import tippy from 'tippy.js';
44
- import { matErrorOutlineOutline, matInfoOutline, matCloudDownloadOutline, matComputerOutline, matCallOutline, matLocationOnOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matSendOutline, matMapOutline, matHomeWorkOutline, matSwipeOutline, matLayersOutline, matAddCircleOutlineOutline } from '@ng-icons/material-icons/outline';
44
+ import { matErrorOutlineOutline, matInfoOutline, matComputerOutline, matCallOutline, matLocationOnOutline, matSwipeOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matLocationSearchingOutline, matEmailOutline, matPhoneOutline, matSendOutline, matMapOutline, matCloudDownloadOutline, matHomeWorkOutline, matLayersOutline, matAddCircleOutlineOutline } from '@ng-icons/material-icons/outline';
45
45
  import * as i2 from '@angular/material/core';
46
46
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
47
47
  import * as i1$7 from '@angular/material/checkbox';
@@ -58,11 +58,17 @@ import * as i1$b from '@angular/material/dialog';
58
58
  import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
59
59
  import * as i2$3 from '@angular/material/tabs';
60
60
  import { MatTabsModule } from '@angular/material/tabs';
61
- import * as i1$e from '@angular/router';
61
+ import * as i1$d from '@angular/router';
62
62
  import { RouterLink, RouterModule, RouteReuseStrategy } from '@angular/router';
63
63
  import { marked } from 'marked';
64
64
  import Duration from 'duration-relativetimeformat';
65
65
  import * as basicLightbox from 'basiclightbox';
66
+ import { FeaturesClickEventType, FeaturesHoverEventType, MapClickEventType, SourceLoadErrorType, computeMapContextDiff, createViewFromLayer } from '@geospatial-sdk/core';
67
+ import { listen, createMapFromContext, applyContextDiffToMap } from '@geospatial-sdk/openlayers';
68
+ import { createLegendFromLayer } from '@geospatial-sdk/legend';
69
+ import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
70
+ import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
71
+ import { Polygon } from 'ol/geom';
66
72
  import { formatDistance } from 'date-fns/formatDistance';
67
73
  import { enUS, sk, pt as pt$1, nl as nl$1, it as it$1, es as es$1, de as de$1, fr as fr$1 } from 'date-fns/locale';
68
74
  import { MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
@@ -72,11 +78,6 @@ import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
72
78
  import { valid as valid$1 } from 'geojson-validation';
73
79
  import { trigger, transition, animate, keyframes, style } from '@angular/animations';
74
80
  import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
75
- import { FeaturesClickEventType, FeaturesHoverEventType, MapClickEventType, SourceLoadErrorType, computeMapContextDiff, createViewFromLayer } from '@geospatial-sdk/core';
76
- import { listen, createMapFromContext, applyContextDiffToMap } from '@geospatial-sdk/openlayers';
77
- import { createLegendFromLayer } from '@geospatial-sdk/legend';
78
- import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
79
- import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
80
81
  import { extend } from 'ol/extent';
81
82
  import * as TOML from '@ltd/j-toml';
82
83
  import { Style, Fill, Stroke, Circle } from 'ol/style';
@@ -96,9 +97,8 @@ import * as i4 from '@angular/material/paginator';
96
97
  import { MatPaginatorIntl, MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
97
98
  import { LetDirective } from '@ngrx/component';
98
99
  import axios from 'axios';
99
- import * as i1$d from '@angular/platform-browser';
100
+ import * as i1$e from '@angular/platform-browser';
100
101
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
101
- import { Polygon } from 'ol/geom';
102
102
  import * as i4$1 from '@angular/material/radio';
103
103
  import { MatRadioModule } from '@angular/material/radio';
104
104
  import { MatIconModule } from '@angular/material/icon';
@@ -1351,8 +1351,8 @@ function extractServiceOnlineResources() {
1351
1351
  else {
1352
1352
  return {
1353
1353
  type: 'endpoint',
1354
- endpointUrl: url,
1355
- protocol,
1354
+ url: url,
1355
+ accessServiceProtocol: protocol,
1356
1356
  ...(description && { description }),
1357
1357
  translations,
1358
1358
  };
@@ -1851,7 +1851,7 @@ function writeLineage$1(record, rootEl) {
1851
1851
  pipe(findNestedChildOrCreate('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), writeLocalizedCharacterString(record.lineage, record.translations?.lineage, record.defaultLanguage))(rootEl);
1852
1852
  }
1853
1853
  function getServiceEndpointProtocol(endpoint) {
1854
- switch (endpoint.protocol.toLowerCase()) {
1854
+ switch (endpoint.accessServiceProtocol.toLowerCase()) {
1855
1855
  case 'wfs':
1856
1856
  return 'OGC:WFS';
1857
1857
  case 'wms':
@@ -1859,13 +1859,13 @@ function getServiceEndpointProtocol(endpoint) {
1859
1859
  case 'wps':
1860
1860
  return 'OGC:WPS';
1861
1861
  default:
1862
- return endpoint.protocol;
1862
+ return endpoint.accessServiceProtocol;
1863
1863
  }
1864
1864
  }
1865
1865
  function createOnlineResource(onlineResource) {
1866
1866
  let linkageUrl, functionCode, protocol;
1867
1867
  if (onlineResource.type === 'endpoint') {
1868
- linkageUrl = onlineResource.endpointUrl.toString();
1868
+ linkageUrl = onlineResource.url.toString();
1869
1869
  protocol = getServiceEndpointProtocol(onlineResource);
1870
1870
  functionCode = 'download';
1871
1871
  }
@@ -18602,6 +18602,7 @@ var records$6 = "Datensätze";
18602
18602
  var de = {
18603
18603
  "": "",
18604
18604
  "Add Layer As": "",
18605
+ "Enter to search": "",
18605
18606
  "button.login": "",
18606
18607
  "catalog.figures.datasets": "{count, plural, =0{Datensätze} one{Datensatz} other{Datensätze}}",
18607
18608
  "catalog.figures.organizations": "{count, plural, =0{Organisationen} one{Organisation} other{Organisationen}}",
@@ -18663,7 +18664,6 @@ var de = {
18663
18664
  "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
18664
18665
  "datahub.news.feed": "Nachrichtenfeed",
18665
18666
  "datahub.news.figures": "Indikatoren",
18666
- "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
18667
18667
  "datahub.search.back": "Zurück",
18668
18668
  "datahub.search.filter.all": "Alle",
18669
18669
  "datahub.search.filter.generatedByAPI": "Generiert durch eine API",
@@ -18673,6 +18673,7 @@ var de = {
18673
18673
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
18674
18674
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
18675
18675
  "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
18676
+ "dataset.error.restrictedAccess": "",
18676
18677
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
18677
18678
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
18678
18679
  "domain.contact.role.author": "",
@@ -18833,6 +18834,7 @@ var de = {
18833
18834
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18834
18835
  "editor.record.loadError.closeMessage": "Verstanden",
18835
18836
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18837
+ "editor.record.lock.format": "",
18836
18838
  "editor.record.lock.reason": "",
18837
18839
  "editor.record.onlineResource.protocol.other": "",
18838
18840
  "editor.record.onlineResourceError.body": "",
@@ -18892,7 +18894,6 @@ var de = {
18892
18894
  "input.image.dropFileLabel": "",
18893
18895
  "input.image.selectFileLabel": "",
18894
18896
  "input.image.uploadErrorLabel": "",
18895
- "input.image.uploadErrorRetry": "",
18896
18897
  "input.image.uploadProgressCancel": "",
18897
18898
  "input.image.uploadProgressLabel": "",
18898
18899
  "language.ca": "Katalanisch",
@@ -18932,6 +18933,7 @@ var de = {
18932
18933
  "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
18933
18934
  "multiselect.filter.placeholder": "Suche",
18934
18935
  "nav.back": "Zurück",
18936
+ "navbar.mobile.menuTitle": "Schnellzugriff",
18935
18937
  next: next$6,
18936
18938
  "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
18937
18939
  "organisation.filter.placeholder": "Ergebnisse filtern",
@@ -18955,8 +18957,13 @@ var de = {
18955
18957
  "record.action.duplicating": "",
18956
18958
  "record.action.rollback": "",
18957
18959
  "record.action.view": "Anzeigen",
18960
+ "record.card.metadata.contact": "",
18958
18961
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
18959
18962
  "record.feature.limit": "Die Vorschau wurde aufgrund zu vieler Elemente deaktiviert",
18963
+ "record.kind.data": "",
18964
+ "record.kind.dataset": "",
18965
+ "record.kind.reuse": "",
18966
+ "record.kind.service": "",
18960
18967
  "record.metadata.about": "Beschreibung",
18961
18968
  "record.metadata.api": "API",
18962
18969
  "record.metadata.api.form.closeButton": "Schließen",
@@ -18990,6 +18997,7 @@ var de = {
18990
18997
  "record.metadata.api.form.zoneTitle": "",
18991
18998
  "record.metadata.api.form.zoneTooltip": "",
18992
18999
  "record.metadata.api.gpfdl": "",
19000
+ "record.metadata.capabilities": "",
18993
19001
  "record.metadata.catalog": "Katalog",
18994
19002
  "record.metadata.contact": "Kontakt",
18995
19003
  "record.metadata.creation": "Erstellungsdatum",
@@ -19026,11 +19034,12 @@ var de = {
19026
19034
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19027
19035
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19028
19036
  "record.metadata.related": "Ähnliche Datensätze",
19037
+ "record.metadata.related.contents": "",
19038
+ "record.metadata.ressources.and.links": "Ressourcen und Links",
19029
19039
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19030
19040
  "record.metadata.status": "Status",
19031
19041
  "record.metadata.status.notPublished": "",
19032
19042
  "record.metadata.status.published": "",
19033
- "record.metadata.technical": "Technische Informationen",
19034
19043
  "record.metadata.temporalExtent": "Zeitlicher Umfang",
19035
19044
  "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
19036
19045
  "record.metadata.temporalExtent.sinceDate": "Seit {start}",
@@ -19067,6 +19076,7 @@ var de = {
19067
19076
  "results.sortBy.popularity": "Beliebtheit",
19068
19077
  "results.sortBy.qualityScore": "Qualitätsbewertung",
19069
19078
  "results.sortBy.relevancy": "Relevanz",
19079
+ "reuse.metadata.access": "",
19070
19080
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
19071
19081
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
19072
19082
  "search.error.organizationHasNoDataset": "",
@@ -19116,6 +19126,26 @@ var de = {
19116
19126
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
19117
19127
  "search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden Datensätze im Bereich des Katalogs zuerst angezeigt. Datensätze außerhalb dieses Bereichs werden nicht angezeigt.",
19118
19128
  "search.filters.user": "Editor",
19129
+ "service.metadata.capabilities": "",
19130
+ "service.metadata.capabilities.abstract": "",
19131
+ "service.metadata.capabilities.attribution": "",
19132
+ "service.metadata.capabilities.availableCrs": "",
19133
+ "service.metadata.capabilities.defaultCrs": "",
19134
+ "service.metadata.capabilities.geometryName": "",
19135
+ "service.metadata.capabilities.geometryType": "",
19136
+ "service.metadata.capabilities.keywords": "",
19137
+ "service.metadata.capabilities.name": "",
19138
+ "service.metadata.capabilities.objectCount": "",
19139
+ "service.metadata.capabilities.otherCrs": "",
19140
+ "service.metadata.capabilities.outputFormats": "",
19141
+ "service.metadata.capabilities.resourceLinks": "",
19142
+ "service.metadata.capabilities.title": "",
19143
+ "service.metadata.filter": "",
19144
+ "service.metadata.filter.noLayers": "",
19145
+ "service.metadata.other": "",
19146
+ "service.metadata.question": "",
19147
+ "service.metadata.search": "",
19148
+ "service.metadata.spatialExtent": "",
19119
19149
  "share.tab.permalink": "Teilen",
19120
19150
  "share.tab.webComponent": "Integrieren",
19121
19151
  "table.loading.data": "Daten werden geladen...",
@@ -19148,6 +19178,7 @@ var records$5 = "datasets";
19148
19178
  var en = {
19149
19179
  "": "",
19150
19180
  "Add Layer As": "",
19181
+ "Enter to search": "",
19151
19182
  "button.login": "Log in",
19152
19183
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
19153
19184
  "catalog.figures.organizations": "{count, plural, =0{organizations} one{organization} other{organizations}}",
@@ -19209,16 +19240,16 @@ var en = {
19209
19240
  "datahub.news.contact.title": "A specific need?",
19210
19241
  "datahub.news.feed": "News feed",
19211
19242
  "datahub.news.figures": "Indicators",
19212
- "datahub.record.addToFavorites": "Add to favorites",
19213
19243
  "datahub.search.back": "Back",
19214
19244
  "datahub.search.filter.all": "All",
19215
19245
  "datahub.search.filter.generatedByAPI": "Generated by an API",
19216
- "datahub.search.filter.generatedByWfs": "",
19246
+ "datahub.search.filter.generatedByWfs": "Generated by a WFS",
19217
19247
  "datahub.search.filter.others": "Others",
19218
19248
  "dataset.error.forbidden": "Access to this resource is restricted",
19219
19249
  "dataset.error.http": "The data could not be loaded because of an HTTP error: \"{ info }\"",
19220
19250
  "dataset.error.network": "The data could not be loaded because of a network error or CORS limitations: \"{ info }\"",
19221
19251
  "dataset.error.parse": "The data was loaded but could not be parsed: \"{ info }\"",
19252
+ "dataset.error.restrictedAccess": "Access to this resource is restricted",
19222
19253
  "dataset.error.unknown": "The data cannot be displayed: \"{ info }\"",
19223
19254
  "dataset.error.unsupportedType": "The following content type is unsupported: \"{ info }\"",
19224
19255
  "domain.contact.role.author": "Author",
@@ -19379,6 +19410,7 @@ var en = {
19379
19410
  "editor.record.loadError.body": "The dataset could not be loaded:",
19380
19411
  "editor.record.loadError.closeMessage": "Understood",
19381
19412
  "editor.record.loadError.title": "Error loading dataset",
19413
+ "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
19382
19414
  "editor.record.lock.reason": "You are not an editor of the allowed groups",
19383
19415
  "editor.record.onlineResource.protocol.other": "Other",
19384
19416
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
@@ -19438,7 +19470,6 @@ var en = {
19438
19470
  "input.image.dropFileLabel": "or drop it here",
19439
19471
  "input.image.selectFileLabel": "Select an image",
19440
19472
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19441
- "input.image.uploadErrorRetry": "Retry",
19442
19473
  "input.image.uploadProgressCancel": "Cancel",
19443
19474
  "input.image.uploadProgressLabel": "Upload in progress...",
19444
19475
  "language.ca": "Catalan",
@@ -19478,6 +19509,7 @@ var en = {
19478
19509
  "map.wms.urlInput.hint": "Enter WMS service URL",
19479
19510
  "multiselect.filter.placeholder": "Search",
19480
19511
  "nav.back": "Back",
19512
+ "navbar.mobile.menuTitle": "Quick access",
19481
19513
  next: next$5,
19482
19514
  "ogc.unreachable.unknown": "The service could not be reached",
19483
19515
  "organisation.filter.placeholder": "Filter results",
@@ -19501,8 +19533,13 @@ var en = {
19501
19533
  "record.action.duplicating": "Duplicating...",
19502
19534
  "record.action.rollback": "Rollback",
19503
19535
  "record.action.view": "View",
19536
+ "record.card.metadata.contact": "Metadata Contact",
19504
19537
  "record.externalViewer.open": "Open in the external map viewer",
19505
19538
  "record.feature.limit": "Preview disabled due to too many elements",
19539
+ "record.kind.data": "Data",
19540
+ "record.kind.dataset": "Dataset",
19541
+ "record.kind.reuse": "Reuse",
19542
+ "record.kind.service": "Service",
19506
19543
  "record.metadata.about": "Description",
19507
19544
  "record.metadata.api": "API",
19508
19545
  "record.metadata.api.form.closeButton": "Close",
@@ -19536,6 +19573,7 @@ var en = {
19536
19573
  "record.metadata.api.form.zoneTitle": "Zone",
19537
19574
  "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
19538
19575
  "record.metadata.api.gpfdl": "Data download",
19576
+ "record.metadata.capabilities": "Service capabilities",
19539
19577
  "record.metadata.catalog": "Catalog",
19540
19578
  "record.metadata.contact": "Contact",
19541
19579
  "record.metadata.creation": "Date of creation",
@@ -19572,11 +19610,12 @@ var en = {
19572
19610
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19573
19611
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19574
19612
  "record.metadata.related": "Related datasets",
19613
+ "record.metadata.related.contents": "Related content",
19614
+ "record.metadata.ressources.and.links": "Resources and links",
19575
19615
  "record.metadata.sheet": "Original metadata",
19576
19616
  "record.metadata.status": "Status",
19577
19617
  "record.metadata.status.notPublished": "Not published",
19578
19618
  "record.metadata.status.published": "Published",
19579
- "record.metadata.technical": "Technical information",
19580
19619
  "record.metadata.temporalExtent": "Temporal extent",
19581
19620
  "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
19582
19621
  "record.metadata.temporalExtent.sinceDate": "Since { start }",
@@ -19613,6 +19652,7 @@ var en = {
19613
19652
  "results.sortBy.popularity": "Popularity",
19614
19653
  "results.sortBy.qualityScore": "Quality score",
19615
19654
  "results.sortBy.relevancy": "Relevancy",
19655
+ "reuse.metadata.access": "Access the reuse",
19616
19656
  "search.autocomplete.error": "Suggestions could not be fetched:",
19617
19657
  "search.error.couldNotReachApi": "The API could not be reached",
19618
19658
  "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
@@ -19662,6 +19702,26 @@ var en = {
19662
19702
  "search.filters.useSpatialFilter": "Show datasets in the area of interest first",
19663
19703
  "search.filters.useSpatialFilterHelp": "When this is enabled, datasets situated in the catalog's area of interest are shown first; records outside of this area will not show up.",
19664
19704
  "search.filters.user": "Editor",
19705
+ "service.metadata.capabilities": "Technical information",
19706
+ "service.metadata.capabilities.abstract": "Abstract",
19707
+ "service.metadata.capabilities.attribution": "Attribution",
19708
+ "service.metadata.capabilities.availableCrs": "Available CRS",
19709
+ "service.metadata.capabilities.defaultCrs": "Default CRS",
19710
+ "service.metadata.capabilities.geometryName": "Geometry name",
19711
+ "service.metadata.capabilities.geometryType": "Geometry type",
19712
+ "service.metadata.capabilities.keywords": "Keywords",
19713
+ "service.metadata.capabilities.name": "Name",
19714
+ "service.metadata.capabilities.objectCount": "Object count",
19715
+ "service.metadata.capabilities.otherCrs": "Other CRS",
19716
+ "service.metadata.capabilities.outputFormats": "Output formats",
19717
+ "service.metadata.capabilities.resourceLinks": "Resource links",
19718
+ "service.metadata.capabilities.title": "Title",
19719
+ "service.metadata.filter": "Layers will be filtered by title and abstract",
19720
+ "service.metadata.filter.noLayers": "No layer matches your search",
19721
+ "service.metadata.other": "Other information",
19722
+ "service.metadata.question": "Ask a question",
19723
+ "service.metadata.search": "Search through the layer list",
19724
+ "service.metadata.spatialExtent": "Spatial extent",
19665
19725
  "share.tab.permalink": "Share",
19666
19726
  "share.tab.webComponent": "Integrate",
19667
19727
  "table.loading.data": "Loading data...",
@@ -19694,6 +19754,7 @@ var records$4 = "";
19694
19754
  var es = {
19695
19755
  "": "",
19696
19756
  "Add Layer As": "",
19757
+ "Enter to search": "",
19697
19758
  "button.login": "",
19698
19759
  "catalog.figures.datasets": "conjuntos de datos",
19699
19760
  "catalog.figures.organizations": "organizaciones",
@@ -19755,7 +19816,6 @@ var es = {
19755
19816
  "datahub.news.contact.title": "",
19756
19817
  "datahub.news.feed": "",
19757
19818
  "datahub.news.figures": "",
19758
- "datahub.record.addToFavorites": "",
19759
19819
  "datahub.search.back": "",
19760
19820
  "datahub.search.filter.all": "",
19761
19821
  "datahub.search.filter.generatedByAPI": "",
@@ -19765,6 +19825,7 @@ var es = {
19765
19825
  "dataset.error.http": "",
19766
19826
  "dataset.error.network": "",
19767
19827
  "dataset.error.parse": "",
19828
+ "dataset.error.restrictedAccess": "",
19768
19829
  "dataset.error.unknown": "",
19769
19830
  "dataset.error.unsupportedType": "",
19770
19831
  "domain.contact.role.author": "",
@@ -19925,6 +19986,7 @@ var es = {
19925
19986
  "editor.record.loadError.body": "",
19926
19987
  "editor.record.loadError.closeMessage": "",
19927
19988
  "editor.record.loadError.title": "",
19989
+ "editor.record.lock.format": "",
19928
19990
  "editor.record.lock.reason": "",
19929
19991
  "editor.record.onlineResource.protocol.other": "",
19930
19992
  "editor.record.onlineResourceError.body": "",
@@ -19984,7 +20046,6 @@ var es = {
19984
20046
  "input.image.dropFileLabel": "",
19985
20047
  "input.image.selectFileLabel": "",
19986
20048
  "input.image.uploadErrorLabel": "",
19987
- "input.image.uploadErrorRetry": "",
19988
20049
  "input.image.uploadProgressCancel": "",
19989
20050
  "input.image.uploadProgressLabel": "",
19990
20051
  "language.ca": "Catalán",
@@ -20024,6 +20085,7 @@ var es = {
20024
20085
  "map.wms.urlInput.hint": "",
20025
20086
  "multiselect.filter.placeholder": "",
20026
20087
  "nav.back": "",
20088
+ "navbar.mobile.menuTitle": "Acceso rápido",
20027
20089
  next: next$4,
20028
20090
  "ogc.unreachable.unknown": "",
20029
20091
  "organisation.filter.placeholder": "",
@@ -20047,8 +20109,13 @@ var es = {
20047
20109
  "record.action.duplicating": "",
20048
20110
  "record.action.rollback": "",
20049
20111
  "record.action.view": "",
20112
+ "record.card.metadata.contact": "",
20050
20113
  "record.externalViewer.open": "",
20051
20114
  "record.feature.limit": "",
20115
+ "record.kind.data": "",
20116
+ "record.kind.dataset": "",
20117
+ "record.kind.reuse": "",
20118
+ "record.kind.service": "",
20052
20119
  "record.metadata.about": "",
20053
20120
  "record.metadata.api": "",
20054
20121
  "record.metadata.api.form.closeButton": "",
@@ -20082,6 +20149,7 @@ var es = {
20082
20149
  "record.metadata.api.form.zoneTitle": "",
20083
20150
  "record.metadata.api.form.zoneTooltip": "",
20084
20151
  "record.metadata.api.gpfdl": "",
20152
+ "record.metadata.capabilities": "",
20085
20153
  "record.metadata.catalog": "",
20086
20154
  "record.metadata.contact": "",
20087
20155
  "record.metadata.creation": "",
@@ -20118,11 +20186,12 @@ var es = {
20118
20186
  "record.metadata.quality.updateFrequency.failed": "",
20119
20187
  "record.metadata.quality.updateFrequency.success": "",
20120
20188
  "record.metadata.related": "",
20189
+ "record.metadata.related.contents": "",
20190
+ "record.metadata.ressources.and.links": "Recursos y enlaces",
20121
20191
  "record.metadata.sheet": "",
20122
20192
  "record.metadata.status": "",
20123
20193
  "record.metadata.status.notPublished": "",
20124
20194
  "record.metadata.status.published": "",
20125
- "record.metadata.technical": "",
20126
20195
  "record.metadata.temporalExtent": "",
20127
20196
  "record.metadata.temporalExtent.fromDateToDate": "",
20128
20197
  "record.metadata.temporalExtent.sinceDate": "",
@@ -20159,6 +20228,7 @@ var es = {
20159
20228
  "results.sortBy.popularity": "",
20160
20229
  "results.sortBy.qualityScore": "",
20161
20230
  "results.sortBy.relevancy": "",
20231
+ "reuse.metadata.access": "",
20162
20232
  "search.autocomplete.error": "",
20163
20233
  "search.error.couldNotReachApi": "",
20164
20234
  "search.error.organizationHasNoDataset": "",
@@ -20208,6 +20278,26 @@ var es = {
20208
20278
  "search.filters.useSpatialFilter": "",
20209
20279
  "search.filters.useSpatialFilterHelp": "",
20210
20280
  "search.filters.user": "",
20281
+ "service.metadata.capabilities": "",
20282
+ "service.metadata.capabilities.abstract": "",
20283
+ "service.metadata.capabilities.attribution": "",
20284
+ "service.metadata.capabilities.availableCrs": "",
20285
+ "service.metadata.capabilities.defaultCrs": "",
20286
+ "service.metadata.capabilities.geometryName": "",
20287
+ "service.metadata.capabilities.geometryType": "",
20288
+ "service.metadata.capabilities.keywords": "",
20289
+ "service.metadata.capabilities.name": "",
20290
+ "service.metadata.capabilities.objectCount": "",
20291
+ "service.metadata.capabilities.otherCrs": "",
20292
+ "service.metadata.capabilities.outputFormats": "",
20293
+ "service.metadata.capabilities.resourceLinks": "",
20294
+ "service.metadata.capabilities.title": "",
20295
+ "service.metadata.filter": "",
20296
+ "service.metadata.filter.noLayers": "",
20297
+ "service.metadata.other": "",
20298
+ "service.metadata.question": "",
20299
+ "service.metadata.search": "",
20300
+ "service.metadata.spatialExtent": "",
20211
20301
  "share.tab.permalink": "",
20212
20302
  "share.tab.webComponent": "",
20213
20303
  "table.loading.data": "",
@@ -20240,6 +20330,7 @@ var records$3 = "Enregistrements";
20240
20330
  var fr = {
20241
20331
  "": "",
20242
20332
  "Add Layer As": "",
20333
+ "Enter to search": "",
20243
20334
  "button.login": "Se connecter",
20244
20335
  "catalog.figures.datasets": "{count, plural, =0{données} one{donnée} other{données}}",
20245
20336
  "catalog.figures.organizations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
@@ -20301,7 +20392,6 @@ var fr = {
20301
20392
  "datahub.news.contact.title": "Un besoin spécifique ?",
20302
20393
  "datahub.news.feed": "Fil d'activité",
20303
20394
  "datahub.news.figures": "Quelques chiffres",
20304
- "datahub.record.addToFavorites": "Ajouter aux favoris",
20305
20395
  "datahub.search.back": "Retour",
20306
20396
  "datahub.search.filter.all": "Tous",
20307
20397
  "datahub.search.filter.generatedByAPI": "généré par une API",
@@ -20311,6 +20401,7 @@ var fr = {
20311
20401
  "dataset.error.http": "Le chargement des données a échoué en raison d'une erreur HTTP: \"{ info }\"",
20312
20402
  "dataset.error.network": "Le chargement des données a échoué en raison d'une erreur réseau ou de limitations CORS: \"{ info }\"",
20313
20403
  "dataset.error.parse": "Les données ont été chargées mais leur décodage a échoué: \"{ info }\"",
20404
+ "dataset.error.restrictedAccess": "L’accès à cette ressource est restreint",
20314
20405
  "dataset.error.unknown": "Les données ne peuvent être affichées: \"{ info }\"",
20315
20406
  "dataset.error.unsupportedType": "Le type de contenu suivant n'est pas pris en charge: \"{ info }\"",
20316
20407
  "domain.contact.role.author": "Auteur",
@@ -20471,6 +20562,7 @@ var fr = {
20471
20562
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20472
20563
  "editor.record.loadError.closeMessage": "Compris",
20473
20564
  "editor.record.loadError.title": "Erreur lors du chargement",
20565
+ "editor.record.lock.format": "Les jeux de données de type 'service' et 'reuse' ne sont pas éditables",
20474
20566
  "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
20475
20567
  "editor.record.onlineResource.protocol.other": "Autre",
20476
20568
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
@@ -20530,7 +20622,6 @@ var fr = {
20530
20622
  "input.image.dropFileLabel": "ou glissez-la ici",
20531
20623
  "input.image.selectFileLabel": "Sélectionnez une image",
20532
20624
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20533
- "input.image.uploadErrorRetry": "Réessayer",
20534
20625
  "input.image.uploadProgressCancel": "Annuler",
20535
20626
  "input.image.uploadProgressLabel": "Chargement en cours...",
20536
20627
  "language.ca": "Catalan",
@@ -20570,6 +20661,7 @@ var fr = {
20570
20661
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20571
20662
  "multiselect.filter.placeholder": "Rechercher",
20572
20663
  "nav.back": "Retour",
20664
+ "navbar.mobile.menuTitle": "Navigation rapide",
20573
20665
  next: next$3,
20574
20666
  "ogc.unreachable.unknown": "Le service n'est pas accessible",
20575
20667
  "organisation.filter.placeholder": "Filtrer les résultats",
@@ -20593,9 +20685,14 @@ var fr = {
20593
20685
  "record.action.duplicating": "Duplication...",
20594
20686
  "record.action.rollback": "Restaurer",
20595
20687
  "record.action.view": "Voir",
20688
+ "record.card.metadata.contact": "Contact de la métadonnée ",
20596
20689
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
20597
20690
  "record.feature.limit": "L’aperçu a été désactivé en raison d’un trop grand nombre d'éléments",
20598
- "record.metadata.about": "Description",
20691
+ "record.kind.data": "Donnée",
20692
+ "record.kind.dataset": "Donnée",
20693
+ "record.kind.reuse": "Réutilisation",
20694
+ "record.kind.service": "Service",
20695
+ "record.metadata.about": "A propos",
20599
20696
  "record.metadata.api": "API",
20600
20697
  "record.metadata.api.form.closeButton": "Fermer",
20601
20698
  "record.metadata.api.form.closeForm": "Fermer le panneau de personnalisation",
@@ -20628,6 +20725,7 @@ var fr = {
20628
20725
  "record.metadata.api.form.zoneTitle": "Zone",
20629
20726
  "record.metadata.api.form.zoneTooltip": "Menu déroulant pour sélectionner une zone géographique",
20630
20727
  "record.metadata.api.gpfdl": "Téléchargement",
20728
+ "record.metadata.capabilities": "Capacités du service",
20631
20729
  "record.metadata.catalog": "Catalogue",
20632
20730
  "record.metadata.contact": "Contact",
20633
20731
  "record.metadata.creation": "Date de création",
@@ -20637,7 +20735,7 @@ var fr = {
20637
20735
  "record.metadata.keywords": "Mots-clés",
20638
20736
  "record.metadata.languages": "Langues",
20639
20737
  "record.metadata.lastUpdate": "Mis à jour le {date}",
20640
- "record.metadata.links": "Liens",
20738
+ "record.metadata.links": "Ressources & liens",
20641
20739
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20642
20740
  "record.metadata.otherConstraints": "Limitations d'usage",
20643
20741
  "record.metadata.owner": "Catalogue d'origine",
@@ -20664,11 +20762,12 @@ var fr = {
20664
20762
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20665
20763
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20666
20764
  "record.metadata.related": "Voir aussi",
20765
+ "record.metadata.related.contents": "Contenu associé",
20766
+ "record.metadata.ressources.and.links": "Ressources et liens",
20667
20767
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20668
20768
  "record.metadata.status": "Statut",
20669
20769
  "record.metadata.status.notPublished": "Non publié",
20670
20770
  "record.metadata.status.published": "Publié",
20671
- "record.metadata.technical": "Informations techniques",
20672
20771
  "record.metadata.temporalExtent": "Étendue temporelle",
20673
20772
  "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
20674
20773
  "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
@@ -20705,6 +20804,7 @@ var fr = {
20705
20804
  "results.sortBy.popularity": "Popularité",
20706
20805
  "results.sortBy.qualityScore": "Indicateur de qualité",
20707
20806
  "results.sortBy.relevancy": "Pertinence",
20807
+ "reuse.metadata.access": "Accéder à la réutilisation",
20708
20808
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
20709
20809
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
20710
20810
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
@@ -20754,6 +20854,26 @@ var fr = {
20754
20854
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
20755
20855
  "search.filters.useSpatialFilterHelp": "Si cette option est activée, les jeux de données portant sur la zone d'intérêt du catalogue seront montrés en premier; les jeux de données situés en dehors de cette zone n'apparaîtront pas dans les résultats.",
20756
20856
  "search.filters.user": "Éditeur",
20857
+ "service.metadata.capabilities": "Informations techniques",
20858
+ "service.metadata.capabilities.abstract": "Description",
20859
+ "service.metadata.capabilities.attribution": "Attribution",
20860
+ "service.metadata.capabilities.availableCrs": "CRS disponibles",
20861
+ "service.metadata.capabilities.defaultCrs": "CRS par défaut",
20862
+ "service.metadata.capabilities.geometryName": "Nom de la géométrie",
20863
+ "service.metadata.capabilities.geometryType": "Type de géométrie",
20864
+ "service.metadata.capabilities.keywords": "Mots-clés",
20865
+ "service.metadata.capabilities.name": "Nom",
20866
+ "service.metadata.capabilities.objectCount": "Nombre d'objets",
20867
+ "service.metadata.capabilities.otherCrs": "Autres CRS",
20868
+ "service.metadata.capabilities.outputFormats": "Formats de sortie",
20869
+ "service.metadata.capabilities.resourceLinks": "Liens vers les ressources",
20870
+ "service.metadata.capabilities.title": "Titre",
20871
+ "service.metadata.filter": "Les couches seront filtrées par titre et description",
20872
+ "service.metadata.filter.noLayers": "Aucune couche ne correspond à votre recherche",
20873
+ "service.metadata.other": "Autres informations",
20874
+ "service.metadata.question": "Poser une question",
20875
+ "service.metadata.search": "Rechercher dans la liste des couches",
20876
+ "service.metadata.spatialExtent": "Etendue spatiale",
20757
20877
  "share.tab.permalink": "Partager",
20758
20878
  "share.tab.webComponent": "Intégrer",
20759
20879
  "table.loading.data": "Chargement des données...",
@@ -20786,6 +20906,7 @@ var records$2 = "record";
20786
20906
  var it = {
20787
20907
  "": "",
20788
20908
  "Add Layer As": "",
20909
+ "Enter to search": "",
20789
20910
  "button.login": "Login",
20790
20911
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
20791
20912
  "catalog.figures.organizations": "{count, plural, =0{organizzazioni} one{organizzazione} other{organizzazioni}}",
@@ -20847,7 +20968,6 @@ var it = {
20847
20968
  "datahub.news.contact.title": "Ha un bisogno specifico?",
20848
20969
  "datahub.news.feed": "Feed di attività",
20849
20970
  "datahub.news.figures": "Alcune figure",
20850
- "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
20851
20971
  "datahub.search.back": "Ritorna",
20852
20972
  "datahub.search.filter.all": "Tutti",
20853
20973
  "datahub.search.filter.generatedByAPI": "generato da un'API",
@@ -20857,6 +20977,7 @@ var it = {
20857
20977
  "dataset.error.http": "Il caricamento dei dati non è riuscito a causa di un errore HTTP: \"{info}\"",
20858
20978
  "dataset.error.network": "Il caricamento dei dati non è riuscito a causa di un errore di rete o di limitazioni CORS: \"{info}\"",
20859
20979
  "dataset.error.parse": "I dati sono stati caricati ma la decodifica non è riuscita: \"{info}\"",
20980
+ "dataset.error.restrictedAccess": "",
20860
20981
  "dataset.error.unknown": "Impossibile visualizzare i dati: \"{info}\"",
20861
20982
  "dataset.error.unsupportedType": "Il seguente tipo di contenuto non è supportato: \"{info}\"",
20862
20983
  "domain.contact.role.author": "Autore",
@@ -21017,6 +21138,7 @@ var it = {
21017
21138
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21018
21139
  "editor.record.loadError.closeMessage": "Capito",
21019
21140
  "editor.record.loadError.title": "Errore durante il caricamento",
21141
+ "editor.record.lock.format": "",
21020
21142
  "editor.record.lock.reason": "Non è un editore di uno dei gruppi autorizzati",
21021
21143
  "editor.record.onlineResource.protocol.other": "Altro",
21022
21144
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
@@ -21076,7 +21198,6 @@ var it = {
21076
21198
  "input.image.dropFileLabel": "oppure trascinalo qui",
21077
21199
  "input.image.selectFileLabel": "Seleziona un'immagine",
21078
21200
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21079
- "input.image.uploadErrorRetry": "Riprova",
21080
21201
  "input.image.uploadProgressCancel": "Annulla",
21081
21202
  "input.image.uploadProgressLabel": "Caricamento...",
21082
21203
  "language.ca": "Catalano",
@@ -21116,6 +21237,7 @@ var it = {
21116
21237
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21117
21238
  "multiselect.filter.placeholder": "Cerca",
21118
21239
  "nav.back": "Indietro",
21240
+ "navbar.mobile.menuTitle": "",
21119
21241
  next: next$2,
21120
21242
  "ogc.unreachable.unknown": "Il servizio non è accessibile",
21121
21243
  "organisation.filter.placeholder": "Filtra i risultati",
@@ -21139,8 +21261,13 @@ var it = {
21139
21261
  "record.action.duplicating": "Duplicazione",
21140
21262
  "record.action.rollback": "Annulla",
21141
21263
  "record.action.view": "Visualizza",
21264
+ "record.card.metadata.contact": "",
21142
21265
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
21143
21266
  "record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
21267
+ "record.kind.data": "",
21268
+ "record.kind.dataset": "",
21269
+ "record.kind.reuse": "",
21270
+ "record.kind.service": "",
21144
21271
  "record.metadata.about": "Descrizione",
21145
21272
  "record.metadata.api": "API",
21146
21273
  "record.metadata.api.form.closeButton": "Chiude",
@@ -21174,6 +21301,7 @@ var it = {
21174
21301
  "record.metadata.api.form.zoneTitle": "Zona",
21175
21302
  "record.metadata.api.form.zoneTooltip": "Menu a discesa per selezionare una zona geografica",
21176
21303
  "record.metadata.api.gpfdl": "Scarica",
21304
+ "record.metadata.capabilities": "",
21177
21305
  "record.metadata.catalog": "Catalogo",
21178
21306
  "record.metadata.contact": "Contatto",
21179
21307
  "record.metadata.creation": "Data di creazione",
@@ -21210,11 +21338,12 @@ var it = {
21210
21338
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21211
21339
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21212
21340
  "record.metadata.related": "Vedi anche",
21341
+ "record.metadata.related.contents": "",
21342
+ "record.metadata.ressources.and.links": "Risorse e collegamenti",
21213
21343
  "record.metadata.sheet": "Origine del metadata",
21214
21344
  "record.metadata.status": "Stato",
21215
21345
  "record.metadata.status.notPublished": "Non pubblicato",
21216
21346
  "record.metadata.status.published": "Pubblicato",
21217
- "record.metadata.technical": "Informazioni tecniche",
21218
21347
  "record.metadata.temporalExtent": "Periodo di tempo",
21219
21348
  "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
21220
21349
  "record.metadata.temporalExtent.sinceDate": "Dal {start}",
@@ -21251,6 +21380,7 @@ var it = {
21251
21380
  "results.sortBy.popularity": "Popolarità",
21252
21381
  "results.sortBy.qualityScore": "Indicatore di qualità",
21253
21382
  "results.sortBy.relevancy": "Rilevanza",
21383
+ "reuse.metadata.access": "",
21254
21384
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
21255
21385
  "search.error.couldNotReachApi": "Problema di connessione all'API",
21256
21386
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora dati.",
@@ -21300,6 +21430,26 @@ var it = {
21300
21430
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
21301
21431
  "search.filters.useSpatialFilterHelp": "Se attivata, le schede relative all'area di interesse del catalogo saranno mostrate per prime; le schede al di fuori di questa area non appariranno nei risultati.",
21302
21432
  "search.filters.user": "Editore",
21433
+ "service.metadata.capabilities": "Informazioni tecniche",
21434
+ "service.metadata.capabilities.abstract": "",
21435
+ "service.metadata.capabilities.attribution": "",
21436
+ "service.metadata.capabilities.availableCrs": "",
21437
+ "service.metadata.capabilities.defaultCrs": "",
21438
+ "service.metadata.capabilities.geometryName": "",
21439
+ "service.metadata.capabilities.geometryType": "",
21440
+ "service.metadata.capabilities.keywords": "",
21441
+ "service.metadata.capabilities.name": "",
21442
+ "service.metadata.capabilities.objectCount": "",
21443
+ "service.metadata.capabilities.otherCrs": "",
21444
+ "service.metadata.capabilities.outputFormats": "",
21445
+ "service.metadata.capabilities.resourceLinks": "",
21446
+ "service.metadata.capabilities.title": "",
21447
+ "service.metadata.filter": "",
21448
+ "service.metadata.filter.noLayers": "",
21449
+ "service.metadata.other": "",
21450
+ "service.metadata.question": "",
21451
+ "service.metadata.search": "",
21452
+ "service.metadata.spatialExtent": "",
21303
21453
  "share.tab.permalink": "Condividere",
21304
21454
  "share.tab.webComponent": "Incorporare",
21305
21455
  "table.loading.data": "Caricamento dei dati...",
@@ -21317,7 +21467,6 @@ var it = {
21317
21467
  "tooltip.url.open": "Aprire l'URL",
21318
21468
  "ui.readLess": "Ridurre",
21319
21469
  "ui.readMore": "Leggere di più",
21320
- "wfs.aggregations.notsupported": "Aggregazioni non supportate per i servizi WFS",
21321
21470
  "wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
21322
21471
  "wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
21323
21472
  "wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
@@ -21333,6 +21482,7 @@ var records$1 = "";
21333
21482
  var nl = {
21334
21483
  "": "",
21335
21484
  "Add Layer As": "",
21485
+ "Enter to search": "",
21336
21486
  "button.login": "",
21337
21487
  "catalog.figures.datasets": "datasets",
21338
21488
  "catalog.figures.organizations": "organisaties",
@@ -21394,7 +21544,6 @@ var nl = {
21394
21544
  "datahub.news.contact.title": "",
21395
21545
  "datahub.news.feed": "",
21396
21546
  "datahub.news.figures": "",
21397
- "datahub.record.addToFavorites": "",
21398
21547
  "datahub.search.back": "",
21399
21548
  "datahub.search.filter.all": "",
21400
21549
  "datahub.search.filter.generatedByAPI": "",
@@ -21404,6 +21553,7 @@ var nl = {
21404
21553
  "dataset.error.http": "",
21405
21554
  "dataset.error.network": "",
21406
21555
  "dataset.error.parse": "",
21556
+ "dataset.error.restrictedAccess": "",
21407
21557
  "dataset.error.unknown": "",
21408
21558
  "dataset.error.unsupportedType": "",
21409
21559
  "domain.contact.role.author": "",
@@ -21564,6 +21714,7 @@ var nl = {
21564
21714
  "editor.record.loadError.body": "",
21565
21715
  "editor.record.loadError.closeMessage": "",
21566
21716
  "editor.record.loadError.title": "",
21717
+ "editor.record.lock.format": "",
21567
21718
  "editor.record.lock.reason": "",
21568
21719
  "editor.record.onlineResource.protocol.other": "",
21569
21720
  "editor.record.onlineResourceError.body": "",
@@ -21623,7 +21774,6 @@ var nl = {
21623
21774
  "input.image.dropFileLabel": "",
21624
21775
  "input.image.selectFileLabel": "",
21625
21776
  "input.image.uploadErrorLabel": "",
21626
- "input.image.uploadErrorRetry": "",
21627
21777
  "input.image.uploadProgressCancel": "",
21628
21778
  "input.image.uploadProgressLabel": "",
21629
21779
  "language.ca": "Catalaans",
@@ -21663,6 +21813,7 @@ var nl = {
21663
21813
  "map.wms.urlInput.hint": "",
21664
21814
  "multiselect.filter.placeholder": "",
21665
21815
  "nav.back": "",
21816
+ "navbar.mobile.menuTitle": "",
21666
21817
  next: next$1,
21667
21818
  "ogc.unreachable.unknown": "",
21668
21819
  "organisation.filter.placeholder": "",
@@ -21686,8 +21837,13 @@ var nl = {
21686
21837
  "record.action.duplicating": "",
21687
21838
  "record.action.rollback": "",
21688
21839
  "record.action.view": "",
21840
+ "record.card.metadata.contact": "",
21689
21841
  "record.externalViewer.open": "",
21690
21842
  "record.feature.limit": "",
21843
+ "record.kind.data": "",
21844
+ "record.kind.dataset": "",
21845
+ "record.kind.reuse": "",
21846
+ "record.kind.service": "",
21691
21847
  "record.metadata.about": "",
21692
21848
  "record.metadata.api": "",
21693
21849
  "record.metadata.api.form.closeButton": "",
@@ -21721,6 +21877,7 @@ var nl = {
21721
21877
  "record.metadata.api.form.zoneTitle": "",
21722
21878
  "record.metadata.api.form.zoneTooltip": "",
21723
21879
  "record.metadata.api.gpfdl": "",
21880
+ "record.metadata.capabilities": "",
21724
21881
  "record.metadata.catalog": "",
21725
21882
  "record.metadata.contact": "",
21726
21883
  "record.metadata.creation": "",
@@ -21757,11 +21914,12 @@ var nl = {
21757
21914
  "record.metadata.quality.updateFrequency.failed": "",
21758
21915
  "record.metadata.quality.updateFrequency.success": "",
21759
21916
  "record.metadata.related": "",
21917
+ "record.metadata.related.contents": "",
21918
+ "record.metadata.ressources.and.links": "Bronnen en links",
21760
21919
  "record.metadata.sheet": "",
21761
21920
  "record.metadata.status": "",
21762
21921
  "record.metadata.status.notPublished": "",
21763
21922
  "record.metadata.status.published": "",
21764
- "record.metadata.technical": "",
21765
21923
  "record.metadata.temporalExtent": "",
21766
21924
  "record.metadata.temporalExtent.fromDateToDate": "",
21767
21925
  "record.metadata.temporalExtent.sinceDate": "",
@@ -21798,6 +21956,7 @@ var nl = {
21798
21956
  "results.sortBy.popularity": "",
21799
21957
  "results.sortBy.qualityScore": "",
21800
21958
  "results.sortBy.relevancy": "",
21959
+ "reuse.metadata.access": "",
21801
21960
  "search.autocomplete.error": "",
21802
21961
  "search.error.couldNotReachApi": "",
21803
21962
  "search.error.organizationHasNoDataset": "",
@@ -21847,6 +22006,26 @@ var nl = {
21847
22006
  "search.filters.useSpatialFilter": "",
21848
22007
  "search.filters.useSpatialFilterHelp": "",
21849
22008
  "search.filters.user": "",
22009
+ "service.metadata.capabilities": "",
22010
+ "service.metadata.capabilities.abstract": "",
22011
+ "service.metadata.capabilities.attribution": "",
22012
+ "service.metadata.capabilities.availableCrs": "",
22013
+ "service.metadata.capabilities.defaultCrs": "",
22014
+ "service.metadata.capabilities.geometryName": "",
22015
+ "service.metadata.capabilities.geometryType": "",
22016
+ "service.metadata.capabilities.keywords": "",
22017
+ "service.metadata.capabilities.name": "",
22018
+ "service.metadata.capabilities.objectCount": "",
22019
+ "service.metadata.capabilities.otherCrs": "",
22020
+ "service.metadata.capabilities.outputFormats": "",
22021
+ "service.metadata.capabilities.resourceLinks": "",
22022
+ "service.metadata.capabilities.title": "",
22023
+ "service.metadata.filter": "",
22024
+ "service.metadata.filter.noLayers": "",
22025
+ "service.metadata.other": "",
22026
+ "service.metadata.question": "",
22027
+ "service.metadata.search": "",
22028
+ "service.metadata.spatialExtent": "",
21850
22029
  "share.tab.permalink": "",
21851
22030
  "share.tab.webComponent": "",
21852
22031
  "table.loading.data": "",
@@ -21879,6 +22058,7 @@ var records = "";
21879
22058
  var pt = {
21880
22059
  "": "",
21881
22060
  "Add Layer As": "",
22061
+ "Enter to search": "",
21882
22062
  "button.login": "",
21883
22063
  "catalog.figures.datasets": "conjuntos de dados",
21884
22064
  "catalog.figures.organizations": "organizações",
@@ -21940,7 +22120,6 @@ var pt = {
21940
22120
  "datahub.news.contact.title": "",
21941
22121
  "datahub.news.feed": "",
21942
22122
  "datahub.news.figures": "",
21943
- "datahub.record.addToFavorites": "",
21944
22123
  "datahub.search.back": "",
21945
22124
  "datahub.search.filter.all": "",
21946
22125
  "datahub.search.filter.generatedByAPI": "",
@@ -21950,6 +22129,7 @@ var pt = {
21950
22129
  "dataset.error.http": "",
21951
22130
  "dataset.error.network": "",
21952
22131
  "dataset.error.parse": "",
22132
+ "dataset.error.restrictedAccess": "",
21953
22133
  "dataset.error.unknown": "",
21954
22134
  "dataset.error.unsupportedType": "",
21955
22135
  "domain.contact.role.author": "",
@@ -22110,6 +22290,7 @@ var pt = {
22110
22290
  "editor.record.loadError.body": "",
22111
22291
  "editor.record.loadError.closeMessage": "",
22112
22292
  "editor.record.loadError.title": "",
22293
+ "editor.record.lock.format": "",
22113
22294
  "editor.record.lock.reason": "",
22114
22295
  "editor.record.onlineResource.protocol.other": "",
22115
22296
  "editor.record.onlineResourceError.body": "",
@@ -22169,7 +22350,6 @@ var pt = {
22169
22350
  "input.image.dropFileLabel": "",
22170
22351
  "input.image.selectFileLabel": "",
22171
22352
  "input.image.uploadErrorLabel": "",
22172
- "input.image.uploadErrorRetry": "",
22173
22353
  "input.image.uploadProgressCancel": "",
22174
22354
  "input.image.uploadProgressLabel": "",
22175
22355
  "language.ca": "Catalão",
@@ -22209,6 +22389,7 @@ var pt = {
22209
22389
  "map.wms.urlInput.hint": "",
22210
22390
  "multiselect.filter.placeholder": "",
22211
22391
  "nav.back": "",
22392
+ "navbar.mobile.menuTitle": "",
22212
22393
  next: next,
22213
22394
  "ogc.unreachable.unknown": "",
22214
22395
  "organisation.filter.placeholder": "",
@@ -22232,8 +22413,13 @@ var pt = {
22232
22413
  "record.action.duplicating": "",
22233
22414
  "record.action.rollback": "",
22234
22415
  "record.action.view": "",
22416
+ "record.card.metadata.contact": "",
22235
22417
  "record.externalViewer.open": "",
22236
22418
  "record.feature.limit": "",
22419
+ "record.kind.data": "",
22420
+ "record.kind.dataset": "",
22421
+ "record.kind.reuse": "",
22422
+ "record.kind.service": "",
22237
22423
  "record.metadata.about": "",
22238
22424
  "record.metadata.api": "",
22239
22425
  "record.metadata.api.form.closeButton": "",
@@ -22267,6 +22453,7 @@ var pt = {
22267
22453
  "record.metadata.api.form.zoneTitle": "",
22268
22454
  "record.metadata.api.form.zoneTooltip": "",
22269
22455
  "record.metadata.api.gpfdl": "",
22456
+ "record.metadata.capabilities": "",
22270
22457
  "record.metadata.catalog": "",
22271
22458
  "record.metadata.contact": "",
22272
22459
  "record.metadata.creation": "",
@@ -22303,11 +22490,12 @@ var pt = {
22303
22490
  "record.metadata.quality.updateFrequency.failed": "",
22304
22491
  "record.metadata.quality.updateFrequency.success": "",
22305
22492
  "record.metadata.related": "",
22493
+ "record.metadata.related.contents": "",
22494
+ "record.metadata.ressources.and.links": "Recursos e links",
22306
22495
  "record.metadata.sheet": "",
22307
22496
  "record.metadata.status": "",
22308
22497
  "record.metadata.status.notPublished": "",
22309
22498
  "record.metadata.status.published": "",
22310
- "record.metadata.technical": "",
22311
22499
  "record.metadata.temporalExtent": "",
22312
22500
  "record.metadata.temporalExtent.fromDateToDate": "",
22313
22501
  "record.metadata.temporalExtent.sinceDate": "",
@@ -22344,6 +22532,7 @@ var pt = {
22344
22532
  "results.sortBy.popularity": "",
22345
22533
  "results.sortBy.qualityScore": "",
22346
22534
  "results.sortBy.relevancy": "",
22535
+ "reuse.metadata.access": "",
22347
22536
  "search.autocomplete.error": "",
22348
22537
  "search.error.couldNotReachApi": "",
22349
22538
  "search.error.organizationHasNoDataset": "",
@@ -22393,6 +22582,26 @@ var pt = {
22393
22582
  "search.filters.useSpatialFilter": "",
22394
22583
  "search.filters.useSpatialFilterHelp": "",
22395
22584
  "search.filters.user": "",
22585
+ "service.metadata.capabilities": "",
22586
+ "service.metadata.capabilities.abstract": "",
22587
+ "service.metadata.capabilities.attribution": "",
22588
+ "service.metadata.capabilities.availableCrs": "",
22589
+ "service.metadata.capabilities.defaultCrs": "",
22590
+ "service.metadata.capabilities.geometryName": "",
22591
+ "service.metadata.capabilities.geometryType": "",
22592
+ "service.metadata.capabilities.keywords": "",
22593
+ "service.metadata.capabilities.name": "",
22594
+ "service.metadata.capabilities.objectCount": "",
22595
+ "service.metadata.capabilities.otherCrs": "",
22596
+ "service.metadata.capabilities.outputFormats": "",
22597
+ "service.metadata.capabilities.resourceLinks": "",
22598
+ "service.metadata.capabilities.title": "",
22599
+ "service.metadata.filter": "",
22600
+ "service.metadata.filter.noLayers": "",
22601
+ "service.metadata.other": "",
22602
+ "service.metadata.question": "",
22603
+ "service.metadata.search": "",
22604
+ "service.metadata.spatialExtent": "",
22396
22605
  "share.tab.permalink": "",
22397
22606
  "share.tab.webComponent": "",
22398
22607
  "table.loading.data": "",
@@ -22696,6 +22905,10 @@ class Gn4FieldMapper {
22696
22905
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
22697
22906
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
22698
22907
  const description = selectFallback(selectTranslatedField(sourceLink, 'descriptionObject', this.lang3), selectField(sourceLink, 'description'));
22908
+ const descriptionLink = selectField(sourceLink, 'descriptionObject');
22909
+ const accessRestricted = descriptionLink &&
22910
+ 'link' in descriptionLink &&
22911
+ descriptionLink.link.toString().includes('#MD_RestrictionCode_restricted');
22699
22912
  // no url: fail early
22700
22913
  if (url === null) {
22701
22914
  // TODO: collect errors at the record level?
@@ -22718,6 +22931,7 @@ class Gn4FieldMapper {
22718
22931
  type,
22719
22932
  url: url,
22720
22933
  accessServiceProtocol,
22934
+ accessRestricted: accessRestricted,
22721
22935
  };
22722
22936
  case 'link':
22723
22937
  return {
@@ -22736,8 +22950,8 @@ class Gn4FieldMapper {
22736
22950
  return {
22737
22951
  ...distribution,
22738
22952
  type,
22739
- endpointUrl: url,
22740
- protocol: accessServiceProtocol,
22953
+ url: url,
22954
+ accessServiceProtocol: accessServiceProtocol,
22741
22955
  };
22742
22956
  }
22743
22957
  };
@@ -23133,14 +23347,6 @@ class ElasticsearchService {
23133
23347
  }
23134
23348
  mustNotFilters() {
23135
23349
  return [
23136
- {
23137
- ...this.queryFilterOnValues('resourceType', [
23138
- 'service',
23139
- 'map',
23140
- 'map/static',
23141
- 'mapDigital',
23142
- ]),
23143
- },
23144
23350
  {
23145
23351
  query_string: {
23146
23352
  query: 'resourceType:featureCatalog AND !resourceType:dataset AND !cl_level.key:dataset',
@@ -23239,7 +23445,7 @@ class ElasticsearchService {
23239
23445
  must_not: this.mustNotFilters(),
23240
23446
  },
23241
23447
  },
23242
- _source: ['resourceTitleObject', 'uuid'],
23448
+ _source: ['resourceTitleObject', 'uuid', 'resourceType'],
23243
23449
  from: 0,
23244
23450
  size: 20,
23245
23451
  };
@@ -24765,7 +24971,7 @@ const FORMATS = {
24765
24971
  csv: {
24766
24972
  extensions: ['csv'],
24767
24973
  priority: 1,
24768
- color: '#a6d6c0',
24974
+ color: '#F6A924',
24769
24975
  mimeTypes: ['text/csv', 'application/csv'],
24770
24976
  },
24771
24977
  excel: {
@@ -24777,7 +24983,7 @@ const FORMATS = {
24777
24983
  'openxmlformats-officedocument',
24778
24984
  ],
24779
24985
  priority: 2,
24780
- color: '#acc5e4',
24986
+ color: '#FFDE10',
24781
24987
  mimeTypes: [
24782
24988
  'application/vnd.ms-excel',
24783
24989
  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
@@ -24786,31 +24992,31 @@ const FORMATS = {
24786
24992
  geojson: {
24787
24993
  extensions: ['geojson'],
24788
24994
  priority: 3,
24789
- color: '#b3cde8',
24995
+ color: '#293C6F',
24790
24996
  mimeTypes: ['application/geo+json', 'application/vnd.geo+json'],
24791
24997
  },
24792
24998
  json: {
24793
24999
  extensions: ['json'],
24794
25000
  priority: 3,
24795
- color: '#b3cde8',
25001
+ color: '#84D0F0',
24796
25002
  mimeTypes: ['application/json'],
24797
25003
  },
24798
25004
  shp: {
24799
25005
  extensions: ['shp', 'shape', 'zipped-shapefile'],
24800
25006
  priority: 4,
24801
- color: '#b2d8ba',
25007
+ color: '#009036',
24802
25008
  mimeTypes: ['x-gis/x-shapefile'],
24803
25009
  },
24804
25010
  gml: {
24805
25011
  extensions: ['gml'],
24806
25012
  priority: 5,
24807
- color: '#e3b3e5',
25013
+ color: '#E75113',
24808
25014
  mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
24809
25015
  },
24810
25016
  kml: {
24811
25017
  extensions: ['kml', 'kmz'],
24812
25018
  priority: 6,
24813
- color: '#c1e6a0',
25019
+ color: '#F4B5D0',
24814
25020
  mimeTypes: [
24815
25021
  'application/vnd.google-earth.kml+xml',
24816
25022
  'application/vnd.google-earth.kmz',
@@ -24819,55 +25025,55 @@ const FORMATS = {
24819
25025
  gpkg: {
24820
25026
  extensions: ['gpkg', 'geopackage'],
24821
25027
  priority: 7,
24822
- color: '#f7cce6',
25028
+ color: '#7D5D9F',
24823
25029
  mimeTypes: ['application/geopackage+sqlite3'],
24824
25030
  },
24825
25031
  zip: {
24826
25032
  extensions: ['zip', 'tar.gz'],
24827
25033
  priority: 8,
24828
- color: '#ffe7a3',
25034
+ color: '#B0CB52',
24829
25035
  mimeTypes: ['application/zip', 'application/x-zip'],
24830
25036
  },
24831
25037
  pdf: {
24832
25038
  extensions: ['pdf'],
24833
25039
  priority: 9,
24834
- color: '#f5b2a3',
25040
+ color: '#49579E',
24835
25041
  mimeTypes: ['application/pdf'],
24836
25042
  },
24837
25043
  jpg: {
24838
25044
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
24839
25045
  priority: 9,
24840
- color: '#d1c1e9',
25046
+ color: '#C4A98F',
24841
25047
  mimeTypes: ['image/jpg'],
24842
25048
  },
24843
25049
  svg: {
24844
25050
  extensions: ['svg'],
24845
25051
  priority: 10,
24846
- color: '#f3c1c9',
25052
+ color: '#EB6D82',
24847
25053
  mimeTypes: ['image/svg+xml'],
24848
25054
  },
24849
25055
  dxf: {
24850
25056
  extensions: ['dxf'],
24851
25057
  priority: 11,
24852
- color: '#f6ceac',
25058
+ color: '#DCCD00',
24853
25059
  mimeTypes: ['application/x-dxf', 'image/x-dxf'],
24854
25060
  },
24855
25061
  html: {
24856
25062
  extensions: ['html', 'htm'],
24857
25063
  priority: 12,
24858
- color: '#FFF2CC',
25064
+ color: '#C0C9B6',
24859
25065
  mimeTypes: ['text/html'],
24860
25066
  },
24861
25067
  fgb: {
24862
25068
  extensions: ['fgb', 'flatgeobuf'],
24863
25069
  priority: 13,
24864
- color: '#ffe7a3',
25070
+ color: '#A8111C',
24865
25071
  mimeTypes: ['application/flatgeobuf'],
24866
25072
  },
24867
25073
  jsonfg: {
24868
25074
  extensions: ['jsonfg', 'jsonfgc'],
24869
25075
  priority: 14,
24870
- color: '#ffe7a3',
25076
+ color: '#009EE0',
24871
25077
  mimeTypes: [
24872
25078
  'application/vnd.ogc.fg+json',
24873
25079
  'application/vnd.ogc.fg+json;compatibility=geojson',
@@ -24938,9 +25144,11 @@ function mimeTypeToFormat(mimeType) {
24938
25144
  return null;
24939
25145
  }
24940
25146
  function checkFileFormat(link, format) {
24941
- return (('name' in link && new RegExp(`[./]${format}`, 'i').test(link.name)) ||
25147
+ return (('name' in link &&
25148
+ new RegExp(`[./]${format}`, 'i').test(link.name.toLowerCase())) ||
24942
25149
  ('url' in link &&
24943
- new RegExp(`[./]${format}`, 'i').test(link.url.toString())));
25150
+ new RegExp(`[./]${format}`, 'i').test(link.url.toString())) ||
25151
+ ('name' in link && link.name.toLowerCase().includes(format)));
24944
25152
  }
24945
25153
  function getBadgeColor(linkFormat) {
24946
25154
  for (const format in FORMATS) {
@@ -24975,7 +25183,7 @@ function getLinkLabel(link) {
24975
25183
  default:
24976
25184
  format = getFileFormat(link);
24977
25185
  }
24978
- const label = link.description || link.name;
25186
+ const label = link.description || ('name' in link ? link.name : '');
24979
25187
  return format ? `${label} (${format})` : label;
24980
25188
  }
24981
25189
  async function getLayers(url, serviceProtocol) {
@@ -24986,14 +25194,21 @@ async function getLayers(url, serviceProtocol) {
24986
25194
  }
24987
25195
  case 'wfs': {
24988
25196
  const endpointWfs = await new WfsEndpoint(url).isReady();
24989
- return endpointWfs.getFeatureTypes();
25197
+ const featureTypes = await endpointWfs.getFeatureTypes();
25198
+ const layers = await Promise.all(featureTypes.map(async (collection) => {
25199
+ return await endpointWfs.getFeatureTypeFull(collection.name);
25200
+ }));
25201
+ return layers;
24990
25202
  }
24991
25203
  case 'wms': {
24992
25204
  const endpointWms = await new WmsEndpoint(url).isReady();
24993
- return endpointWms
25205
+ const layers = (await endpointWms
24994
25206
  .getLayers()
24995
25207
  .flatMap(wmsLayerFlatten)
24996
- .filter((l) => l.name);
25208
+ .filter((l) => l.name)).map((collection) => {
25209
+ return endpointWms.getLayerByName(collection.name);
25210
+ });
25211
+ return layers;
24997
25212
  }
24998
25213
  case 'wmts': {
24999
25214
  const endpointWmts = await new WmtsEndpoint(url).isReady();
@@ -25030,6 +25245,7 @@ var LinkUsage;
25030
25245
  class LinkClassifierService {
25031
25246
  getUsagesForLink(link) {
25032
25247
  switch (link.type) {
25248
+ case 'endpoint':
25033
25249
  case 'service': {
25034
25250
  switch (link.accessServiceProtocol) {
25035
25251
  case 'esriRest':
@@ -25078,6 +25294,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25078
25294
  }]
25079
25295
  }] });
25080
25296
 
25297
+ var name = "geonetwork-ui";
25298
+ var version = "2.6.0-dev.76a84fb05";
25299
+ var engines = {
25300
+ node: ">=20"
25301
+ };
25302
+ var main = "./index.ts";
25303
+ var type = "module";
25304
+ var exports = {
25305
+ "./tailwind.base.config.js": "./tailwind.base.config.js",
25306
+ "./style.css": "./style.css"
25307
+ };
25308
+ var repository = {
25309
+ url: "https://github.com/geonetwork/geonetwork-ui"
25310
+ };
25311
+ var peerDependencies = {
25312
+ "@angular/animations": "17.x || 18.x || 19.x",
25313
+ "@angular/cdk": "17.x || 18.x || 19.x",
25314
+ "@angular/common": "17.x || 18.x || 19.x",
25315
+ "@angular/compiler": "17.x || 18.x || 19.x",
25316
+ "@angular/core": "17.x || 18.x || 19.x",
25317
+ "@angular/forms": "17.x || 18.x || 19.x",
25318
+ "@angular/material": "17.x || 18.x || 19.x",
25319
+ "@angular/material-moment-adapter": "17.x || 18.x || 19.x",
25320
+ "@angular/platform-browser": "17.x || 18.x || 19.x",
25321
+ "@angular/platform-browser-dynamic": "17.x || 18.x || 19.x",
25322
+ "@angular/router": "17.x || 18.x || 19.x",
25323
+ "@ngrx/component": "17.x || 18.x || 19.x",
25324
+ "@ngrx/effects": "17.x || 18.x || 19.x",
25325
+ "@ngrx/router-store": "17.x || 18.x || 19.x",
25326
+ "@ngrx/store": "17.x || 18.x || 19.x",
25327
+ "@ngrx/store-devtools": "17.x || 18.x || 19.x",
25328
+ "@ngrx/operators": "18.x",
25329
+ "@ngx-translate/core": "15.x",
25330
+ "@ngx-translate/http-loader": "16.x",
25331
+ rxjs: "7.x",
25332
+ "zone.js": "*",
25333
+ tailwindcss: "3.x"
25334
+ };
25335
+ var dependencies = {
25336
+ "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
25337
+ "@camptocamp/ogc-client": "1.1.1-dev.3e2d3cc",
25338
+ "@geospatial-sdk/core": "0.0.5-dev.31",
25339
+ "@geospatial-sdk/geocoding": "0.0.5-dev.31",
25340
+ "@geospatial-sdk/legend": "0.0.5-dev.31",
25341
+ "@geospatial-sdk/openlayers": "0.0.5-dev.31",
25342
+ "@ltd/j-toml": "~1.35.2",
25343
+ "@messageformat/core": "^3.0.1",
25344
+ "@ng-icons/core": "29.10.0",
25345
+ "@ng-icons/iconoir": "29.10.0",
25346
+ "@ng-icons/material-icons": "29.10.0",
25347
+ "@ng-icons/tabler-icons": "29.10.0",
25348
+ "@nx/angular": "20.2.2",
25349
+ "@rgrove/parse-xml": "4.2.0",
25350
+ alasql: "4.6.0",
25351
+ axios: "1.7.9",
25352
+ basiclightbox: "^5.0.4",
25353
+ "chart.js": "4.4.7",
25354
+ "chroma-js": "3.1.2",
25355
+ "date-fns": "4.1.0",
25356
+ "document-register-element": "^1.14.10",
25357
+ "duration-relativetimeformat": "^2.0.4",
25358
+ "embla-carousel": "8.5.1",
25359
+ express: "^4.21.1",
25360
+ "geojson-validation": "^1.0.2",
25361
+ marked: "15.0.4",
25362
+ moment: "2.30.1",
25363
+ "ng-table-virtual-scroll": "1.6.1",
25364
+ "ngx-chips": "3.0.0",
25365
+ "ngx-dropzone": "3.1.0",
25366
+ "ngx-translate-messageformat-compiler": "7.0.0",
25367
+ ol: "^8.2.0",
25368
+ papaparse: "5.4.1",
25369
+ pg: "^8.9.0",
25370
+ proj4: "^2.9.2",
25371
+ rdflib: "^2.2.35",
25372
+ "reflect-metadata": "^0.1.13",
25373
+ semver: "7.6.3",
25374
+ "tippy.js": "6.3.7",
25375
+ tslib: "^2.3.0",
25376
+ typeorm: "^0.3.14",
25377
+ "whatwg-fetch": "^3.6.2",
25378
+ xlsx: "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz"
25379
+ };
25380
+ var packageJson = {
25381
+ name: name,
25382
+ version: version,
25383
+ engines: engines,
25384
+ main: main,
25385
+ type: type,
25386
+ exports: exports,
25387
+ repository: repository,
25388
+ peerDependencies: peerDependencies,
25389
+ dependencies: dependencies
25390
+ };
25391
+
25392
+ const GEONETWORK_UI_VERSION = packageJson.version;
25393
+ const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1] === 'dev'
25394
+ ? 'main'
25395
+ : `v${packageJson.version}`;
25396
+
25081
25397
  const minApiVersion = '4.2.2';
25082
25398
  class Gn4PlatformService {
25083
25399
  constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService, httpClient, recordsApiService) {
@@ -25271,12 +25587,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25271
25587
  type: Injectable
25272
25588
  }], ctorParameters: () => [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }, { type: i1.HttpClient }, { type: RecordsApiService }] });
25273
25589
 
25590
+ class RecordsRepositoryInterface {
25591
+ }
25592
+
25274
25593
  function provideGn4() {
25275
25594
  return [
25276
25595
  {
25277
25596
  provide: PlatformServiceInterface,
25278
25597
  useClass: Gn4PlatformService,
25279
25598
  },
25599
+ {
25600
+ provide: RecordsRepositoryInterface,
25601
+ useClass: Gn4Repository,
25602
+ },
25280
25603
  Gn4PlatformMapper,
25281
25604
  ];
25282
25605
  }
@@ -25352,7 +25675,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25352
25675
 
25353
25676
  class AnchorLinkDirective {
25354
25677
  get elementClass() {
25355
- return this.disabled ? this.disabledClass : this.enabledClass;
25678
+ if (this.disabled) {
25679
+ return this.disabledClass;
25680
+ }
25681
+ if (this.inView) {
25682
+ return `${this.inViewClass} ${this.enabledClass}`;
25683
+ }
25684
+ else {
25685
+ return `${this.outOfViewClass} ${this.enabledClass}`;
25686
+ }
25356
25687
  }
25357
25688
  constructor(changeDetector) {
25358
25689
  this.changeDetector = changeDetector;
@@ -25360,6 +25691,8 @@ class AnchorLinkDirective {
25360
25691
  this.observer = new MutationObserver(() => {
25361
25692
  this.refreshDisabledState();
25362
25693
  });
25694
+ this.inView = false;
25695
+ this.initialized = false;
25363
25696
  }
25364
25697
  ngOnInit() {
25365
25698
  this.observer.observe(document.body, {
@@ -25368,8 +25701,32 @@ class AnchorLinkDirective {
25368
25701
  });
25369
25702
  this.refreshDisabledState();
25370
25703
  }
25704
+ ngAfterViewChecked() {
25705
+ if (!this.initialized && !this.disabled) {
25706
+ const target = document.getElementById(this.targetId);
25707
+ if (target) {
25708
+ this.initializeIntersectionObserver(target);
25709
+ this.initialized = true;
25710
+ }
25711
+ }
25712
+ }
25713
+ initializeIntersectionObserver(target) {
25714
+ this.intersectionObserver = new IntersectionObserver((entries) => {
25715
+ entries.forEach((entry) => {
25716
+ this.inView = entry.isIntersecting;
25717
+ this.changeDetector.detectChanges();
25718
+ });
25719
+ }, {
25720
+ root: null,
25721
+ rootMargin: '-30% 0% -60% 0%',
25722
+ });
25723
+ this.intersectionObserver.observe(target);
25724
+ }
25371
25725
  ngOnDestroy() {
25372
25726
  this.observer.disconnect();
25727
+ if (this.intersectionObserver) {
25728
+ this.intersectionObserver.disconnect();
25729
+ }
25373
25730
  }
25374
25731
  refreshDisabledState() {
25375
25732
  const targetNotPresent = !document.getElementById(this.targetId);
@@ -25388,7 +25745,7 @@ class AnchorLinkDirective {
25388
25745
  });
25389
25746
  }
25390
25747
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
25391
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: AnchorLinkDirective, selector: "[gnUiAnchorLink]", inputs: { targetId: ["gnUiAnchorLink", "targetId"], disabledClass: ["gnUiAnchorLinkDisabledClass", "disabledClass"], enabledClass: ["gnUiAnchorLinkEnabledClass", "enabledClass"] }, host: { listeners: { "click": "scrollToTarget()" }, properties: { "class": "this.elementClass" } }, ngImport: i0 }); }
25748
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: AnchorLinkDirective, selector: "[gnUiAnchorLink]", inputs: { targetId: ["gnUiAnchorLink", "targetId"], disabledClass: ["gnUiAnchorLinkDisabledClass", "disabledClass"], enabledClass: ["gnUiAnchorLinkEnabledClass", "enabledClass"], inViewClass: ["gnUiAnchorLinkInViewClass", "inViewClass"], outOfViewClass: ["gnUiAnchorLinkOutOfViewClass", "outOfViewClass"] }, host: { listeners: { "click": "scrollToTarget()" }, properties: { "class": "this.elementClass" } }, ngImport: i0 }); }
25392
25749
  }
25393
25750
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, decorators: [{
25394
25751
  type: Directive,
@@ -25404,6 +25761,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25404
25761
  }], enabledClass: [{
25405
25762
  type: Input,
25406
25763
  args: ['gnUiAnchorLinkEnabledClass']
25764
+ }], inViewClass: [{
25765
+ type: Input,
25766
+ args: ['gnUiAnchorLinkInViewClass']
25767
+ }], outOfViewClass: [{
25768
+ type: Input,
25769
+ args: ['gnUiAnchorLinkOutOfViewClass']
25407
25770
  }], elementClass: [{
25408
25771
  type: HostBinding,
25409
25772
  args: ['class']
@@ -25493,11 +25856,11 @@ class CarouselComponent {
25493
25856
  .on('select', this.refreshSteps);
25494
25857
  }
25495
25858
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25496
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CarouselComponent, isStandalone: true, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, outputs: { currentStepChange: "currentStepChange" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"w-full\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative;display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25859
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CarouselComponent, isStandalone: true, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, outputs: { currentStepChange: "currentStepChange" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"w-full\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host{position:relative;display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25497
25860
  }
25498
25861
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, decorators: [{
25499
25862
  type: Component,
25500
- args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div #carouselOverflowContainer class=\"w-full\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative;display:block}\n"] }]
25863
+ args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div #carouselOverflowContainer class=\"w-full\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host{position:relative;display:block}\n"] }]
25501
25864
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { carouselOverflowContainer: [{
25502
25865
  type: ViewChild,
25503
25866
  args: ['carouselOverflowContainer']
@@ -25668,6 +26031,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25668
26031
  type: Output
25669
26032
  }] } });
25670
26033
 
26034
+ marker('editor.record.lock.reason');
26035
+ marker('editor.record.lock.format');
25671
26036
  class InteractiveTableComponent {
25672
26037
  constructor() {
25673
26038
  this.items = [];
@@ -25685,15 +26050,24 @@ class InteractiveTableComponent {
25685
26050
  .join(' '),
25686
26051
  };
25687
26052
  }
26053
+ getItemTitle(item) {
26054
+ if (!item.extras?.edit && !this.isDraftPage && item.kind === 'dataset') {
26055
+ return 'editor.record.lock.reason';
26056
+ }
26057
+ else if (item.kind !== 'dataset') {
26058
+ return 'editor.record.lock.format';
26059
+ }
26060
+ return '';
26061
+ }
25688
26062
  handleRowClick(item) {
25689
26063
  this.itemClick.emit(item);
25690
26064
  }
25691
26065
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25692
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items", isDraftPage: "isDraftPage" }, outputs: { itemClick: "itemClick" }, providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\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 <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\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 data-cy=\"table-row\"\n [title]=\"\n !item.extras?.edit && !isDraftPage\n ? ('editor.record.lock.reason' | translate)\n : ''\n \"\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-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n !item.extras?.edit && !isDraftPage,\n 'group-hover:text-main group-hover:bg-gray-50':\n item.extras?.edit || isDraftPage,\n }\"\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: [".table-header-cell{@apply text-gray-700 px-3 py-3 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;}ng-icon{@apply w-4 h-4;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26066
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items", isDraftPage: "isDraftPage" }, outputs: { itemClick: "itemClick" }, providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\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 <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\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 data-cy=\"table-row\"\n [title]=\"getItemTitle(item) | translate\"\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-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n 'group-hover:text-main group-hover:bg-gray-50':\n (item.extras?.edit || isDraftPage) && item.kind === 'dataset',\n }\"\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: [".table-header-cell{@apply text-gray-700 px-3 py-3 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;}ng-icon{@apply w-4 h-4;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25693
26067
  }
25694
26068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
25695
26069
  type: Component,
25696
- args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\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 <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\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 data-cy=\"table-row\"\n [title]=\"\n !item.extras?.edit && !isDraftPage\n ? ('editor.record.lock.reason' | translate)\n : ''\n \"\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-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n !item.extras?.edit && !isDraftPage,\n 'group-hover:text-main group-hover:bg-gray-50':\n item.extras?.edit || isDraftPage,\n }\"\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: [".table-header-cell{@apply text-gray-700 px-3 py-3 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;}ng-icon{@apply w-4 h-4;}\n"] }]
26070
+ args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\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 <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\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 data-cy=\"table-row\"\n [title]=\"getItemTitle(item) | translate\"\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-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n 'group-hover:text-main group-hover:bg-gray-50':\n (item.extras?.edit || isDraftPage) && item.kind === 'dataset',\n }\"\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: [".table-header-cell{@apply text-gray-700 px-3 py-3 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;}ng-icon{@apply w-4 h-4;}\n"] }]
25697
26071
  }], propDecorators: { columns: [{
25698
26072
  type: ContentChildren,
25699
26073
  args: [InteractiveTableColumnComponent]
@@ -25937,11 +26311,11 @@ class ProgressBarComponent {
25937
26311
  }
25938
26312
  }
25939
26313
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25940
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[6px] w-full {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm h-full\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"], dependencies: [{ kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
26314
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"], dependencies: [{ kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
25941
26315
  }
25942
26316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, decorators: [{
25943
26317
  type: Component,
25944
- args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [NgSwitch, NgSwitchCase, NgSwitchDefault], template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[6px] w-full {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm h-full\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
26318
+ args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [NgSwitch, NgSwitchCase, NgSwitchDefault], template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
25945
26319
  }], propDecorators: { value: [{
25946
26320
  type: Input
25947
26321
  }], type: [{
@@ -27335,19 +27709,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27335
27709
  type: Input
27336
27710
  }] } });
27337
27711
 
27338
- class NavigationButtonComponent {
27339
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27340
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NavigationButtonComponent, isStandalone: true, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <ng-icon [name]=\"icon\" class=\"align-middle w-[18px]\"></ng-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27341
- }
27342
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, decorators: [{
27343
- type: Component,
27344
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgIcon], standalone: true, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <ng-icon [name]=\"icon\" class=\"align-middle w-[18px]\"></ng-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
27345
- }], propDecorators: { label: [{
27346
- type: Input
27347
- }], icon: [{
27348
- type: Input
27349
- }] } });
27350
-
27351
27712
  class SearchInputComponent {
27352
27713
  constructor() {
27353
27714
  this.value = '';
@@ -27406,11 +27767,11 @@ class StarToggleComponent {
27406
27767
  event.preventDefault();
27407
27768
  }
27408
27769
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27409
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StarToggleComponent, isStandalone: true, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [provideIcons({ matStar, matStarBorder })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27770
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StarToggleComponent, isStandalone: true, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <gn-ui-button\n [type]=\"'outline'\"\n class=\"-m-[8px] p-[8px]\"\n (buttonClick)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n disabled: !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </gn-ui-button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], viewProviders: [provideIcons({ matStar, matStarBorder })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27410
27771
  }
27411
27772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, decorators: [{
27412
27773
  type: Component,
27413
- args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIcon], viewProviders: [provideIcons({ matStar, matStarBorder })], template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
27774
+ args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIcon, ButtonComponent], viewProviders: [provideIcons({ matStar, matStarBorder })], template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <gn-ui-button\n [type]=\"'outline'\"\n class=\"-m-[8px] p-[8px]\"\n (buttonClick)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n disabled: !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </gn-ui-button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
27414
27775
  }], propDecorators: { toggled: [{
27415
27776
  type: Input
27416
27777
  }], disabled: [{
@@ -28457,7 +28818,7 @@ class MetadataQualityComponent {
28457
28818
  size: '1.2em',
28458
28819
  strokeWidth: '1.5px',
28459
28820
  }),
28460
- ], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"smaller ? 'leading-[8px] min-w-[120px]' : 'min-w-[200px]'\"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28821
+ ], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"\n smaller ? 'leading-[8px] min-w-[120px] m-h-[120px]' : 'min-w-[200px]'\n \"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28461
28822
  }
28462
28823
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataQualityComponent, decorators: [{
28463
28824
  type: Component,
@@ -28476,7 +28837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28476
28837
  size: '1.2em',
28477
28838
  strokeWidth: '1.5px',
28478
28839
  }),
28479
- ], template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"smaller ? 'leading-[8px] min-w-[120px]' : 'min-w-[200px]'\"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
28840
+ ], template: "<div *ngIf=\"metadataQualityDisplay\" class=\"metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"\n smaller ? 'leading-[8px] min-w-[120px] m-h-[120px]' : 'min-w-[200px]'\n \"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
28480
28841
  }], propDecorators: { metadata: [{
28481
28842
  type: Input
28482
28843
  }], smaller: [{
@@ -28653,9 +29014,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28653
29014
 
28654
29015
  class ApiCardComponent {
28655
29016
  constructor() {
29017
+ this.sizeClassMap = {
29018
+ L: 'gn-ui-card-l py-2 px-5 flex-row',
29019
+ M: 'gn-ui-card-m py-2 px-5 flex-row',
29020
+ S: 'gn-ui-card-s p-4 flex-col',
29021
+ XS: 'gn-ui-card-xs py-2 px-5 flex-row',
29022
+ };
29023
+ this.cardClass = '';
28656
29024
  this.currentlyActive = false;
28657
29025
  this.openRecordApiForm = new EventEmitter();
28658
29026
  }
29027
+ set size(value) {
29028
+ this._size = value;
29029
+ this.cardClass = this.sizeClassMap[value];
29030
+ }
29031
+ get size() {
29032
+ return this._size;
29033
+ }
29034
+ get generatedText() {
29035
+ return this.link.accessServiceProtocol === 'wfs'
29036
+ ? 'datahub.search.filter.generatedByWfs'
29037
+ : 'datahub.search.filter.generatedByAPI';
29038
+ }
28659
29039
  ngOnInit() {
28660
29040
  this.displayApiFormButton =
28661
29041
  this.link.accessServiceProtocol === 'ogcFeatures' ||
@@ -28673,9 +29053,9 @@ class ApiCardComponent {
28673
29053
  }
28674
29054
  }
28675
29055
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28676
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n *ngIf=\"link.accessServiceProtocol !== 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <span\n *ngIf=\"link.accessServiceProtocol === 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"matMoreHoriz\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [
29056
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink", size: "size" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden\"\n [ngClass]=\"cardClass\"\n>\n <ng-container *ngIf=\"size !== 'S'\">\n <div>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"size === 'S'\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #content>\n <div>\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n <span\n *ngIf=\"link.accessServiceProtocol !== 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <span\n *ngIf=\"link.accessServiceProtocol === 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n </div>\n <div *ngIf=\"size === 'S'\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [
28677
29057
  provideIcons({
28678
- matMoreHoriz,
29058
+ iconoirSettings,
28679
29059
  }),
28680
29060
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28681
29061
  }
@@ -28689,13 +29069,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28689
29069
  NgIcon,
28690
29070
  ], viewProviders: [
28691
29071
  provideIcons({
28692
- matMoreHoriz,
29072
+ iconoirSettings,
28693
29073
  }),
28694
- ], template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n *ngIf=\"link.accessServiceProtocol !== 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <span\n *ngIf=\"link.accessServiceProtocol === 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"matMoreHoriz\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n </div>\n </div>\n </div>\n</div>\n" }]
29074
+ ], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden\"\n [ngClass]=\"cardClass\"\n>\n <ng-container *ngIf=\"size !== 'S'\">\n <div>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"size === 'S'\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #content>\n <div>\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n <span\n *ngIf=\"link.accessServiceProtocol !== 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <span\n *ngIf=\"link.accessServiceProtocol === 'GPFDL'\"\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n </div>\n <div *ngIf=\"size === 'S'\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n </div>\n</ng-template>\n" }]
28695
29075
  }], propDecorators: { link: [{
28696
29076
  type: Input
28697
29077
  }], currentLink: [{
28698
29078
  type: Input
29079
+ }], size: [{
29080
+ type: Input
28699
29081
  }], openRecordApiForm: [{
28700
29082
  type: Output
28701
29083
  }] } });
@@ -28756,15 +29138,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28756
29138
 
28757
29139
  class DownloadItemComponent {
28758
29140
  constructor() {
29141
+ this.sizeClassMap = {
29142
+ L: 'gn-ui-card-l py-2 px-5',
29143
+ M: 'gn-ui-card-m py-2 px-5',
29144
+ S: 'gn-ui-card-s p-4',
29145
+ XS: 'gn-ui-card-xs py-2 px-5',
29146
+ };
29147
+ this.cardClass = '';
28759
29148
  this.exportUrl = new EventEmitter();
28760
29149
  }
29150
+ set size(value) {
29151
+ this._size = value;
29152
+ this.cardClass = this.sizeClassMap[value];
29153
+ }
29154
+ get size() {
29155
+ return this._size;
29156
+ }
28761
29157
  openUrl() {
28762
29158
  this.exportUrl.emit(this.link.url.toString());
28763
29159
  }
28764
29160
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28765
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DownloadItemComponent, isStandalone: true, selector: "gn-ui-download-item", inputs: { link: "link", color: "color", format: "format", isFromApi: "isFromApi" }, outputs: { exportUrl: "exportUrl" }, ngImport: i0, template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex justify-between card-shadow px-6 py-5 cursor-pointer\"\n rel=\"noopener\"\n>\n <div class=\"grow-1 w-full overflow-hidden\">\n <div\n class=\"text-21 text-black truncate font-title w-11/12\"\n [title]=\"link.description || link.name\"\n >\n {{ link.description || link.name }}\n </div>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span\n class=\"pl-2 inline-flex items-center text-gray-800 text-sm\"\n *ngIf=\"isFromApi\"\n translate=\"\"\n >datahub.search.filter.generatedByAPI</span\n >\n </div>\n </div>\n <div class=\"shrink-1 w-14 flex flex-col justify-center items-center\">\n <ng-icon\n class=\"!w-8 !h-8 card-icon text-3xl\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [
29161
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DownloadItemComponent, isStandalone: true, selector: "gn-ui-download-item", inputs: { link: "link", color: "color", format: "format", isFromApi: "isFromApi", size: "size" }, outputs: { exportUrl: "exportUrl" }, ngImport: i0, template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden\"\n rel=\"noopener\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-col justify-between\">\n <div class=\"gn-ui-card-title\" [title]=\"link.description || link.name\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n <div class=\"flex flex-row gap-2 items-center pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span class=\"text-gray-800 text-xs\" *ngIf=\"isFromApi\" translate=\"\"\n >datahub.search.filter.generatedByAPI</span\n >\n </div>\n </div>\n <div class=\"flex\" [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\">\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"iconoirDownload\"\n >\n </ng-icon>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [
28766
29162
  provideIcons({
28767
- matCloudDownloadOutline,
29163
+ iconoirDownload,
28768
29164
  }),
28769
29165
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28770
29166
  }
@@ -28772,9 +29168,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28772
29168
  type: Component,
28773
29169
  args: [{ selector: 'gn-ui-download-item', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, TranslateModule, NgIcon], standalone: true, viewProviders: [
28774
29170
  provideIcons({
28775
- matCloudDownloadOutline,
29171
+ iconoirDownload,
28776
29172
  }),
28777
- ], template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex justify-between card-shadow px-6 py-5 cursor-pointer\"\n rel=\"noopener\"\n>\n <div class=\"grow-1 w-full overflow-hidden\">\n <div\n class=\"text-21 text-black truncate font-title w-11/12\"\n [title]=\"link.description || link.name\"\n >\n {{ link.description || link.name }}\n </div>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span\n class=\"pl-2 inline-flex items-center text-gray-800 text-sm\"\n *ngIf=\"isFromApi\"\n translate=\"\"\n >datahub.search.filter.generatedByAPI</span\n >\n </div>\n </div>\n <div class=\"shrink-1 w-14 flex flex-col justify-center items-center\">\n <ng-icon\n class=\"!w-8 !h-8 card-icon text-3xl\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n </div>\n</a>\n" }]
29173
+ ], template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden\"\n rel=\"noopener\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-col justify-between\">\n <div class=\"gn-ui-card-title\" [title]=\"link.description || link.name\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n <div class=\"flex flex-row gap-2 items-center pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"color\"\n data-cy=\"download-format\"\n >{{ format || ('downloads.format.unknown' | translate) }}</span\n >\n <span class=\"text-gray-800 text-xs\" *ngIf=\"isFromApi\" translate=\"\"\n >datahub.search.filter.generatedByAPI</span\n >\n </div>\n </div>\n <div class=\"flex\" [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\">\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"iconoirDownload\"\n >\n </ng-icon>\n </div>\n </div>\n</a>\n" }]
28778
29174
  }], propDecorators: { link: [{
28779
29175
  type: Input
28780
29176
  }], color: [{
@@ -28783,6 +29179,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28783
29179
  type: Input
28784
29180
  }], isFromApi: [{
28785
29181
  type: Input
29182
+ }], size: [{
29183
+ type: Input
28786
29184
  }], exportUrl: [{
28787
29185
  type: Output
28788
29186
  }] } });
@@ -28873,7 +29271,7 @@ class DownloadsListComponent {
28873
29271
  link.accessServiceProtocol === 'ogcFeatures'));
28874
29272
  }
28875
29273
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
28876
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DownloadsListComponent, isStandalone: true, 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 [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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", "isFromApi"], outputs: ["exportUrl"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29274
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DownloadsListComponent, isStandalone: true, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between items-center pb-4\"\n *ngIf=\"links && links.length > 0\"\n>\n <div\n class=\"font-title text-xl text-title font-medium mr-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </div>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end\"\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-60')\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 size=\"L\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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", "isFromApi", "size"], outputs: ["exportUrl"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28877
29275
  }
28878
29276
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadsListComponent, decorators: [{
28879
29277
  type: Component,
@@ -28882,7 +29280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28882
29280
  ButtonComponent,
28883
29281
  DownloadItemComponent,
28884
29282
  TranslateModule,
28885
- ], 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 [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
29283
+ ], template: "<div\n class=\"flex flex-wrap justify-between items-center pb-4\"\n *ngIf=\"links && links.length > 0\"\n>\n <div\n class=\"font-title text-xl text-title font-medium mr-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </div>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end\"\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-60')\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 size=\"L\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
28886
29284
  }], ctorParameters: () => [{ type: i1$1.TranslateService }], propDecorators: { links: [{
28887
29285
  type: Input
28888
29286
  }] } });
@@ -29166,7 +29564,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29166
29564
 
29167
29565
  class LinkCardComponent {
29168
29566
  constructor() {
29169
- this.compact = false;
29567
+ this.sizeClassMap = {
29568
+ L: 'gn-ui-card-l py-2 px-5',
29569
+ M: 'gn-ui-card-m py-2 px-5',
29570
+ S: 'gn-ui-card-s p-4',
29571
+ XS: 'gn-ui-card-xs py-2 px-5',
29572
+ };
29573
+ this.cardClass = '';
29574
+ }
29575
+ set size(value) {
29576
+ this._size = value;
29577
+ this.cardClass = this.sizeClassMap[value];
29578
+ }
29579
+ get size() {
29580
+ return this._size;
29170
29581
  }
29171
29582
  get title() {
29172
29583
  if (this.link.name && this.link.description) {
@@ -29174,25 +29585,31 @@ class LinkCardComponent {
29174
29585
  }
29175
29586
  return this.link.name || this.link.description || '';
29176
29587
  }
29588
+ getLinkFormat(link) {
29589
+ return getFileFormat(link);
29590
+ }
29591
+ getLinkColor(link) {
29592
+ return getBadgeColor(getFileFormat(link));
29593
+ }
29177
29594
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LinkCardComponent, isStandalone: true, selector: "gn-ui-link-card", inputs: { link: "link", compact: "compact" }, providers: [
29595
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LinkCardComponent, isStandalone: true, selector: "gn-ui-link-card", inputs: { link: "link", size: "size" }, providers: [
29179
29596
  provideIcons({
29180
29597
  matOpenInNew,
29181
29598
  }),
29182
29599
  provideNgIconsConfig({ size: '1.5em' }),
29183
- ], ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden\"\n [ngClass]=\"{ 'h-40': !compact }\"\n [title]=\"title\"\n>\n <ng-container *ngIf=\"!compact; else compactTpl\">\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 <ng-icon class=\"card-icon\" name=\"matOpenInNew\"></ng-icon>\n </div>\n </ng-container>\n <ng-template #compactTpl>\n <div class=\"flex items-center justify-between gap-4\">\n <p\n class=\"overflow-hidden font-title font-medium text-21 text-black text-ellipsis whitespace-nowrap\"\n >\n {{ link.name || link.description }}\n </p>\n <ng-icon class=\"card-icon flex-shrink-0\" name=\"matOpenInNew\"></ng-icon>\n </div>\n </ng-template>\n</a>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29600
+ ], ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden\"\n [ngClass]=\"cardClass\"\n [title]=\"title\"\n>\n <div class=\"flex flex-col justify-between\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n <p *ngIf=\"!link.name && !link.description\" class=\"gn-ui-card-title\">\n {{ link.url }}\n </p>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"getLinkColor(link)\"\n data-cy=\"download-format\"\n >{{\n getLinkFormat(link) || ('downloads.format.unknown' | translate)\n }}</span\n >\n </div>\n </div>\n <div class=\"flex\" [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\">\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29184
29601
  }
29185
29602
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinkCardComponent, decorators: [{
29186
29603
  type: Component,
29187
- args: [{ selector: 'gn-ui-link-card', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent], providers: [
29604
+ args: [{ selector: 'gn-ui-link-card', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [
29188
29605
  provideIcons({
29189
29606
  matOpenInNew,
29190
29607
  }),
29191
29608
  provideNgIconsConfig({ size: '1.5em' }),
29192
- ], template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden\"\n [ngClass]=\"{ 'h-40': !compact }\"\n [title]=\"title\"\n>\n <ng-container *ngIf=\"!compact; else compactTpl\">\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 <ng-icon class=\"card-icon\" name=\"matOpenInNew\"></ng-icon>\n </div>\n </ng-container>\n <ng-template #compactTpl>\n <div class=\"flex items-center justify-between gap-4\">\n <p\n class=\"overflow-hidden font-title font-medium text-21 text-black text-ellipsis whitespace-nowrap\"\n >\n {{ link.name || link.description }}\n </p>\n <ng-icon class=\"card-icon flex-shrink-0\" name=\"matOpenInNew\"></ng-icon>\n </div>\n </ng-template>\n</a>\n" }]
29609
+ ], template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden\"\n [ngClass]=\"cardClass\"\n [title]=\"title\"\n>\n <div class=\"flex flex-col justify-between\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n <p *ngIf=\"!link.name && !link.description\" class=\"gn-ui-card-title\">\n {{ link.url }}\n </p>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"getLinkColor(link)\"\n data-cy=\"download-format\"\n >{{\n getLinkFormat(link) || ('downloads.format.unknown' | translate)\n }}</span\n >\n </div>\n </div>\n <div class=\"flex\" [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\">\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </div>\n </div>\n</a>\n" }]
29193
29610
  }], propDecorators: { link: [{
29194
29611
  type: Input
29195
- }], compact: [{
29612
+ }], size: [{
29196
29613
  type: Input
29197
29614
  }] } });
29198
29615
 
@@ -29234,11 +29651,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29234
29651
 
29235
29652
  class MetadataCatalogComponent {
29236
29653
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29237
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataCatalogComponent, isStandalone: true, selector: "gn-ui-metadata-catalog", inputs: { sourceLabel: "sourceLabel" }, ngImport: i0, template: "<div>\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29654
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataCatalogComponent, isStandalone: true, selector: "gn-ui-metadata-catalog", inputs: { sourceLabel: "sourceLabel" }, ngImport: i0, template: "<div>\n <p class=\"text-gray-900 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29238
29655
  }
29239
29656
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataCatalogComponent, decorators: [{
29240
29657
  type: Component,
29241
- args: [{ selector: 'gn-ui-metadata-catalog', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [TranslateModule], template: "<div>\n <p class=\"text-gray-700 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n" }]
29658
+ args: [{ selector: 'gn-ui-metadata-catalog', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [TranslateModule], template: "<div>\n <p class=\"text-gray-900 text-xs mb-3 uppercase\" translate>\n record.metadata.catalog\n </p>\n <p class=\"text-primary font-title text-21 mb-1\">\n {{ sourceLabel }}\n </p>\n</div>\n" }]
29242
29659
  }], propDecorators: { sourceLabel: [{
29243
29660
  type: Input
29244
29661
  }] } });
@@ -29266,7 +29683,7 @@ class MetadataContactComponent {
29266
29683
  this.organizationClick.emit(this.shownOrganization);
29267
29684
  }
29268
29685
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29269
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
29686
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataContactComponent, isStandalone: true, 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\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
29270
29687
  provideIcons({
29271
29688
  matOpenInNew,
29272
29689
  matCallOutline,
@@ -29286,7 +29703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29286
29703
  matPersonOutline,
29287
29704
  matLocationOnOutline,
29288
29705
  }),
29289
- ], template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\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" }]
29706
+ ], template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\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 <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\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" }]
29290
29707
  }], propDecorators: { metadata: [{
29291
29708
  type: Input
29292
29709
  }], organizationClick: [{
@@ -29371,6 +29788,316 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29371
29788
  }]
29372
29789
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] });
29373
29790
 
29791
+ const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
29792
+ const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
29793
+ const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
29794
+ factory: () => ({}),
29795
+ });
29796
+ const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
29797
+ factory: () => ({
29798
+ fill: { color: 'rgba(255, 255, 255, 0.2)' },
29799
+ stroke: { color: '#ffcc33', width: 2 },
29800
+ }),
29801
+ });
29802
+
29803
+ const DEFAULT_BASEMAP_LAYER = {
29804
+ type: 'xyz',
29805
+ url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
29806
+ attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
29807
+ };
29808
+ const DEFAULT_VIEW = {
29809
+ center: [0, 15],
29810
+ zoom: 2,
29811
+ };
29812
+ class MapContainerComponent {
29813
+ get featuresClick() {
29814
+ if (!this._featuresClick) {
29815
+ this.openlayersMap.then((olMap) => {
29816
+ listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
29817
+ });
29818
+ this._featuresClick = new EventEmitter();
29819
+ }
29820
+ return this._featuresClick;
29821
+ }
29822
+ get featuresHover() {
29823
+ if (!this._featuresHover) {
29824
+ this.openlayersMap.then((olMap) => {
29825
+ listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
29826
+ });
29827
+ this._featuresHover = new EventEmitter();
29828
+ }
29829
+ return this._featuresHover;
29830
+ }
29831
+ get mapClick() {
29832
+ if (!this._mapClick) {
29833
+ this.openlayersMap.then((olMap) => {
29834
+ listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
29835
+ });
29836
+ this._mapClick = new EventEmitter();
29837
+ }
29838
+ return this._mapClick;
29839
+ }
29840
+ get sourceLoadError() {
29841
+ if (!this._sourceLoadError) {
29842
+ this.openlayersMap.then((olMap) => {
29843
+ listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
29844
+ });
29845
+ this._sourceLoadError = new EventEmitter();
29846
+ }
29847
+ return this._sourceLoadError;
29848
+ }
29849
+ constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
29850
+ this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
29851
+ this.basemapLayers = basemapLayers;
29852
+ this.mapViewConstraints = mapViewConstraints;
29853
+ this.openlayersMap = new Promise((resolve) => {
29854
+ this.olMapResolver = resolve;
29855
+ });
29856
+ }
29857
+ async ngAfterViewInit() {
29858
+ this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
29859
+ this.displayMessage$ = merge(fromEvent(this.olMap, 'mapmuted').pipe(map$1(() => true)), fromEvent(this.olMap, 'movestart').pipe(map$1(() => false)), fromEvent(this.olMap, 'singleclick').pipe(map$1(() => false))).pipe(switchMap$1((muted) => muted
29860
+ ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
29861
+ : of(false)));
29862
+ this.olMapResolver(this.olMap);
29863
+ }
29864
+ async ngOnChanges(changes) {
29865
+ if ('context' in changes && !changes['context'].isFirstChange()) {
29866
+ const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
29867
+ await applyContextDiffToMap(this.olMap, diff);
29868
+ }
29869
+ }
29870
+ // This will apply basemap layers & view constraints
29871
+ processContext(context) {
29872
+ const processed = context
29873
+ ? { ...context, view: context.view ?? DEFAULT_VIEW }
29874
+ : { layers: [], view: DEFAULT_VIEW };
29875
+ if (this.basemapLayers.length) {
29876
+ processed.layers = [...this.basemapLayers, ...processed.layers];
29877
+ }
29878
+ if (!this.doNotUseDefaultBasemap) {
29879
+ processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
29880
+ }
29881
+ if (this.mapViewConstraints.maxZoom) {
29882
+ processed.view = {
29883
+ maxZoom: this.mapViewConstraints.maxZoom,
29884
+ ...processed.view,
29885
+ };
29886
+ }
29887
+ if (this.mapViewConstraints.maxExtent) {
29888
+ processed.view = {
29889
+ maxExtent: this.mapViewConstraints.maxExtent,
29890
+ ...processed.view,
29891
+ };
29892
+ }
29893
+ if (processed.view &&
29894
+ !('zoom' in processed.view) &&
29895
+ !('center' in processed.view)) {
29896
+ if (this.mapViewConstraints.maxExtent) {
29897
+ processed.view = {
29898
+ extent: this.mapViewConstraints.maxExtent,
29899
+ ...processed.view,
29900
+ };
29901
+ }
29902
+ else {
29903
+ processed.view = { ...DEFAULT_VIEW, ...processed.view };
29904
+ }
29905
+ }
29906
+ return processed;
29907
+ }
29908
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, deps: [{ token: DO_NOT_USE_DEFAULT_BASEMAP }, { token: BASEMAP_LAYERS }, { token: MAP_VIEW_CONSTRAINTS }], target: i0.ɵɵFactoryTarget.Component }); }
29909
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapContainerComponent, isStandalone: true, selector: "gn-ui-map-container", inputs: { context: "context" }, outputs: { featuresClick: "featuresClick", featuresHover: "featuresHover", mapClick: "mapClick", sourceLoadError: "sourceLoadError" }, providers: [
29910
+ provideIcons({ matSwipeOutline }),
29911
+ provideNgIconsConfig({
29912
+ size: '1.5em',
29913
+ }),
29914
+ ], viewQueries: [{ propertyName: "container", first: true, predicate: ["map"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29915
+ }
29916
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
29917
+ type: Component,
29918
+ args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
29919
+ provideIcons({ matSwipeOutline }),
29920
+ provideNgIconsConfig({
29921
+ size: '1.5em',
29922
+ }),
29923
+ ], template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n" }]
29924
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
29925
+ type: Inject,
29926
+ args: [DO_NOT_USE_DEFAULT_BASEMAP]
29927
+ }] }, { type: undefined, decorators: [{
29928
+ type: Inject,
29929
+ args: [BASEMAP_LAYERS]
29930
+ }] }, { type: undefined, decorators: [{
29931
+ type: Inject,
29932
+ args: [MAP_VIEW_CONSTRAINTS]
29933
+ }] }], propDecorators: { context: [{
29934
+ type: Input
29935
+ }], featuresClick: [{
29936
+ type: Output
29937
+ }], featuresHover: [{
29938
+ type: Output
29939
+ }], mapClick: [{
29940
+ type: Output
29941
+ }], sourceLoadError: [{
29942
+ type: Output
29943
+ }], container: [{
29944
+ type: ViewChild,
29945
+ args: ['map']
29946
+ }] } });
29947
+
29948
+ const geometryKeys = ['geometry', 'the_geom'];
29949
+ class FeatureDetailComponent {
29950
+ get properties() {
29951
+ if (!this.feature)
29952
+ return [];
29953
+ return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
29954
+ }
29955
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29956
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeatureDetailComponent, isStandalone: true, selector: "gn-ui-feature-detail", inputs: { feature: "feature" }, ngImport: i0, template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29957
+ }
29958
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
29959
+ type: Component,
29960
+ args: [{ selector: 'gn-ui-feature-detail', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"] }]
29961
+ }], propDecorators: { feature: [{
29962
+ type: Input
29963
+ }] } });
29964
+
29965
+ class MapLegendComponent {
29966
+ constructor() {
29967
+ this.legendStatusChange = new EventEmitter();
29968
+ }
29969
+ async ngOnChanges(changes) {
29970
+ if ('context' in changes) {
29971
+ const mapContext = changes['context'].currentValue;
29972
+ if (mapContext.layers && mapContext.layers.length > 0) {
29973
+ const mapContextLayer = mapContext.layers[0];
29974
+ this.legendHTML = await createLegendFromLayer(mapContextLayer);
29975
+ if (this.legendHTML) {
29976
+ this.legendStatusChange.emit(true);
29977
+ }
29978
+ }
29979
+ else {
29980
+ this.legendHTML = false;
29981
+ this.legendStatusChange.emit(false);
29982
+ }
29983
+ }
29984
+ }
29985
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29986
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapLegendComponent, isStandalone: true, selector: "gn-ui-map-legend", inputs: { context: "context" }, outputs: { legendStatusChange: "legendStatusChange" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
29987
+ }
29988
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
29989
+ type: Component,
29990
+ args: [{ selector: 'gn-ui-map-legend', standalone: true, encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"] }]
29991
+ }], propDecorators: { context: [{
29992
+ type: Input
29993
+ }], legendStatusChange: [{
29994
+ type: Output
29995
+ }] } });
29996
+
29997
+ function prioritizePageScroll(interactions) {
29998
+ interactions.clear();
29999
+ interactions.extend(defaults({
30000
+ // remove rotate interactions
30001
+ altShiftDragRotate: false,
30002
+ pinchRotate: false,
30003
+ // replace drag and zoom interactions
30004
+ dragPan: false,
30005
+ mouseWheelZoom: false,
30006
+ })
30007
+ .extend([
30008
+ new DragPan({
30009
+ condition: dragPanCondition,
30010
+ }),
30011
+ new MouseWheelZoom({
30012
+ condition: mouseWheelZoomCondition,
30013
+ }),
30014
+ ])
30015
+ .getArray());
30016
+ }
30017
+ function dragPanCondition(event) {
30018
+ const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
30019
+ if (!dragPanCondition) {
30020
+ this.getMap().dispatchEvent('mapmuted');
30021
+ }
30022
+ // combine the condition with the default DragPan conditions
30023
+ return dragPanCondition && noModifierKeys(event) && primaryAction(event);
30024
+ }
30025
+ function mouseWheelZoomCondition(event) {
30026
+ if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
30027
+ this.getMap().dispatchEvent('mapmuted');
30028
+ }
30029
+ return platformModifierKeyOnly(event);
30030
+ }
30031
+
30032
+ class SpatialExtentComponent {
30033
+ constructor() {
30034
+ this.spatialExtents$ = new BehaviorSubject([]);
30035
+ this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
30036
+ if (extents.length === 0) {
30037
+ return null; // null extent means default view
30038
+ }
30039
+ const featureCollection = {
30040
+ type: 'FeatureCollection',
30041
+ features: [],
30042
+ };
30043
+ extents.forEach((extent) => {
30044
+ if (extent.geometry) {
30045
+ featureCollection.features.push({
30046
+ type: 'Feature',
30047
+ properties: {},
30048
+ geometry: extent.geometry,
30049
+ });
30050
+ }
30051
+ else if (extent.bbox?.length >= 0) {
30052
+ featureCollection.features.push({
30053
+ type: 'Feature',
30054
+ properties: {},
30055
+ geometry: this.bboxCoordsToGeometry(extent.bbox),
30056
+ });
30057
+ }
30058
+ });
30059
+ const layer = {
30060
+ type: 'geojson',
30061
+ data: featureCollection,
30062
+ label: 'Spatial extents',
30063
+ style: {
30064
+ 'stroke-color': 'black',
30065
+ 'stroke-width': 2,
30066
+ },
30067
+ };
30068
+ const view = await createViewFromLayer(layer);
30069
+ return {
30070
+ view,
30071
+ layers: [layer],
30072
+ };
30073
+ }));
30074
+ this.error = '';
30075
+ }
30076
+ set spatialExtents(value) {
30077
+ this.spatialExtents$.next(value);
30078
+ }
30079
+ bboxCoordsToGeometry(bbox) {
30080
+ const geometry = new Polygon([
30081
+ [
30082
+ [bbox[0], bbox[1]],
30083
+ [bbox[0], bbox[3]],
30084
+ [bbox[2], bbox[3]],
30085
+ [bbox[2], bbox[1]],
30086
+ [bbox[0], bbox[1]],
30087
+ ],
30088
+ ]);
30089
+ return new GeoJSON().writeGeometryObject(geometry);
30090
+ }
30091
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialExtentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30092
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SpatialExtentComponent, isStandalone: true, selector: "gn-ui-spatial-extent", inputs: { spatialExtents: "spatialExtents" }, ngImport: i0, template: "<gn-ui-map-container\n class=\"h-full w-full\"\n [context]=\"mapContext$ | async\"\n></gn-ui-map-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }] }); }
30093
+ }
30094
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialExtentComponent, decorators: [{
30095
+ type: Component,
30096
+ args: [{ selector: 'gn-ui-spatial-extent', standalone: true, imports: [CommonModule, MapContainerComponent], template: "<gn-ui-map-container\n class=\"h-full w-full\"\n [context]=\"mapContext$ | async\"\n></gn-ui-map-container>\n" }]
30097
+ }], propDecorators: { spatialExtents: [{
30098
+ type: Input
30099
+ }] } });
30100
+
29374
30101
  class MetadataInfoComponent {
29375
30102
  constructor(dateService) {
29376
30103
  this.dateService = dateService;
@@ -29423,7 +30150,7 @@ class MetadataInfoComponent {
29423
30150
  }
29424
30151
  }
29425
30152
  get temporalExtent() {
29426
- const temporalExtents = this.metadata.temporalExtents;
30153
+ const temporalExtents = this.metadata.kind === 'dataset' ? this.metadata.temporalExtents : [];
29427
30154
  return getTemporalRangeUnion(temporalExtents, this.dateService);
29428
30155
  }
29429
30156
  get shownOrganization() {
@@ -29445,7 +30172,7 @@ class MetadataInfoComponent {
29445
30172
  return this.dateService.formatDateTime(date);
29446
30173
  }
29447
30174
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataInfoComponent, deps: [{ token: DateService }], target: i0.ɵɵFactoryTarget.Component }); }
29448
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataInfoComponent, isStandalone: true, 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\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\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\n <p\n class=\"mt-6 mb-3 font-medium text-primary text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\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 <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\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.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\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 ng-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }], viewProviders: [
30175
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataInfoComponent, isStandalone: true, 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\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\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\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\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 <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\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.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.kind !== 'dataset' && metadata.spatialExtents\"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | 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 && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\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 ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: SpatialExtentComponent, selector: "gn-ui-spatial-extent", inputs: ["spatialExtents"] }], viewProviders: [
29449
30176
  provideIcons({
29450
30177
  matOpenInNew,
29451
30178
  matMailOutline: matMailOutline$1,
@@ -29466,12 +30193,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29466
30193
  CopyTextButtonComponent,
29467
30194
  NgIcon,
29468
30195
  GnUiLinkifyDirective,
30196
+ MapContainerComponent,
30197
+ SpatialExtentComponent,
29469
30198
  ], viewProviders: [
29470
30199
  provideIcons({
29471
30200
  matOpenInNew,
29472
30201
  matMailOutline: matMailOutline$1,
29473
30202
  }),
29474
- ], template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\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\n <p\n class=\"mt-6 mb-3 font-medium text-primary text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\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 <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\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.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\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 ng-icon{transform:scale(.8)}\n"] }]
30203
+ ], template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\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\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\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 <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\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 <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\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.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.kind !== 'dataset' && metadata.spatialExtents\"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | 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 && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\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 ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"] }]
29475
30204
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
29476
30205
  type: Input
29477
30206
  }], incomplete: [{
@@ -29639,7 +30368,7 @@ class RecordApiFormComponent {
29639
30368
  maxFeatures: limit !== '-1' ? Number(limit) : undefined,
29640
30369
  limit: limit !== '-1' ? Number(limit) : -1,
29641
30370
  offset: offset !== '' ? Number(offset) : undefined,
29642
- outputCrs: format === ('application/json' || 'geojson') ? 'EPSG:4326' : undefined,
30371
+ outputCrs: format.toLowerCase().indexOf('json') > -1 ? 'EPSG:4326' : undefined,
29643
30372
  };
29644
30373
  if (this.endpoint instanceof WfsEndpoint) {
29645
30374
  delete options.limit;
@@ -29647,6 +30376,7 @@ class RecordApiFormComponent {
29647
30376
  return this.endpoint.getFeatureUrl(this.apiFeatureType, options);
29648
30377
  }
29649
30378
  else {
30379
+ delete options.outputCrs;
29650
30380
  return await this.endpoint.getCollectionItemsUrl(this.apiFeatureType, options);
29651
30381
  }
29652
30382
  }
@@ -29842,6 +30572,302 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29842
30572
  type: Input
29843
30573
  }] } });
29844
30574
 
30575
+ marker('record.kind.data');
30576
+ marker('record.kind.reuse');
30577
+ marker('record.kind.service');
30578
+ class InternalLinkCardComponent {
30579
+ set size(value) {
30580
+ this._size = value;
30581
+ this.cardClass = this.sizeClassMap[value] || '';
30582
+ this.thumbnailContainerClass = this.thumbnailSizeClassMap[value] || 'hidden';
30583
+ }
30584
+ get size() {
30585
+ return this._size;
30586
+ }
30587
+ constructor(elementRef) {
30588
+ this.elementRef = elementRef;
30589
+ this.linkHref = null;
30590
+ this.mdSelect = new EventEmitter();
30591
+ this.subscription = new Subscription();
30592
+ this.cardClass = '';
30593
+ this.thumbnailContainerClass = '';
30594
+ this._size = 'M';
30595
+ this.sizeClassMap = {
30596
+ L: 'min-h-[190px] md:w-[992px] py-3 px-3 flex items-start gap-5',
30597
+ M: 'min-h-[140px] md:w-[570px] py-3 px-3 flex items-start gap-4',
30598
+ S: 'min-h-[220px] md:w-[370px] py-3 px-3 flex gap-4',
30599
+ XS: 'min-h-[108px] md:w-[570px] py-3 px-3 flex gap-4',
30600
+ };
30601
+ this.thumbnailSizeClassMap = {
30602
+ L: 'w-[190px] h-[180px] rounded-lg overflow-hidden shrink-0',
30603
+ M: 'w-[110px] h-[140px] rounded-lg overflow-hidden shrink-0',
30604
+ S: 'hidden',
30605
+ XS: 'hidden',
30606
+ };
30607
+ this.titleClassMap = {
30608
+ L: 'text-xl line-clamp-2',
30609
+ M: 'text-base line-clamp-2',
30610
+ S: 'text-base line-clamp-3',
30611
+ XS: 'text-base mt-3 line-clamp-2',
30612
+ };
30613
+ }
30614
+ ngOnInit() {
30615
+ this.abstract = removeWhitespace(stripHtml(this.record?.abstract));
30616
+ this.subscription.add(fromEvent(this.elementRef.nativeElement, 'click').subscribe((event) => {
30617
+ event.preventDefault();
30618
+ propagateToDocumentOnly(event);
30619
+ this.mdSelect.emit(this.record);
30620
+ }));
30621
+ }
30622
+ get organization() {
30623
+ return this.record.ownerOrganization;
30624
+ }
30625
+ get contacts() {
30626
+ return ((this.record.kind === 'dataset'
30627
+ ? this.record.contactsForResource
30628
+ : this.record.contacts) || []);
30629
+ }
30630
+ getTitleClass() {
30631
+ return (this.titleClassMap[this._size] +
30632
+ ' ' +
30633
+ (this.record.ownerOrganization?.name ? '' : 'mt-3') || '');
30634
+ }
30635
+ openExternalUrl(event, url) {
30636
+ event.stopPropagation();
30637
+ window.open(url, '_blank');
30638
+ }
30639
+ openMailto(event, email) {
30640
+ event.stopPropagation();
30641
+ window.open(`mailto:${email}`, '_blank');
30642
+ }
30643
+ copyToClipboard(event, text) {
30644
+ event.stopPropagation();
30645
+ navigator.clipboard.writeText(text);
30646
+ }
30647
+ get shouldShowThumbnail() {
30648
+ return this.size === 'L' || this.size === 'M';
30649
+ }
30650
+ getKindInfo() {
30651
+ if (!this.record?.kind)
30652
+ return { text: '', icon: '' };
30653
+ switch (this.record.kind.toLowerCase()) {
30654
+ case 'dataset':
30655
+ return { text: 'record.kind.data', icon: 'iconoirDatabase' };
30656
+ case 'reuse':
30657
+ return { text: 'record.kind.reuse', icon: 'iconoirMap' };
30658
+ case 'service':
30659
+ return { text: 'record.kind.service', icon: 'matCode' };
30660
+ default:
30661
+ return { text: '', icon: '' };
30662
+ }
30663
+ }
30664
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
30665
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InternalLinkCardComponent, isStandalone: true, selector: "gn-ui-internal-link-card", inputs: { record: "record", metadataQualityDisplay: "metadataQualityDisplay", favoriteTemplate: "favoriteTemplate", linkHref: "linkHref", isGeodata: "isGeodata", size: "size" }, outputs: { mdSelect: "mdSelect" }, providers: [
30666
+ provideIcons({
30667
+ matLocationSearchingOutline,
30668
+ matCode,
30669
+ iconoirDatabase,
30670
+ iconoirMap,
30671
+ iconoirInternet,
30672
+ matEmailOutline,
30673
+ matPhoneOutline,
30674
+ matLocationOnOutline,
30675
+ }),
30676
+ provideNgIconsConfig({
30677
+ size: '1.2em',
30678
+ }),
30679
+ ], ngImport: i0, template: "<div\n class=\"rounded-lg group card-shadow cursor-pointer overflow-hidden hover:bg-gray-50\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-row justify-between w-full\">\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div\n class=\"flex flex-col flex-1 relative\"\n [ngClass]=\"{\n 'justify-between': record.ownerOrganization?.name && size !== 'XS',\n }\"\n >\n <div class=\"flex items-center space-x-2\">\n <span\n *ngIf=\"getKindInfo().text\"\n class=\"badge-btn text-white text-xs px-2 py-0.5 font-bold shrink-0 bg-primary leading-tight flex items-center justify-evenly h-6 min-h-6\"\n >\n <ng-icon\n class=\"text-[0.9em] text-white mr-1\"\n [name]=\"getKindInfo().icon\"\n ></ng-icon>\n <span class=\"font-medium text-white text-xs\" translate>\n {{ getKindInfo().text }}\n </span>\n </span>\n <span\n *ngIf=\"isGeodata\"\n class=\"badge-btn text-black text-xs px-2 py-0.5 font-bold shrink-0 bg-primary-white leading-tight flex items-center justify-evenly h-6 min-h-6\"\n [ngClass]=\"size === 'L' ? 'w-[164px]' : 'w-8'\"\n >\n <ng-icon\n class=\"text-[0.9em] text-primary-darkest\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <ng-container *ngIf=\"size === 'L'\">\n <span\n class=\"font-medium text-primary-darkest text-xs ml-1\"\n translate\n >\n record.metadata.type\n </span>\n </ng-container>\n </span>\n <div class=\"flex items-center\">\n <gn-ui-metadata-quality\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div class=\"absolute top-0 right-0 items-center\">\n <ng-container\n *ngIf=\"size !== 'XS'\"\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div\n class=\"font-medium text-title group-hover:text-primary overflow-hidden break-words\"\n [ngClass]=\"getTitleClass()\"\n >\n {{ record.title }}\n </div>\n <div\n *ngIf=\"size === 'L'\"\n class=\"mt-1 mb-2 font-normal text-xs text-gray-900 line-clamp-2 overflow-hidden\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n <div\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n >\n <div class=\"flex items-center flex-1 min-w-0\">\n <div\n class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\"\n >\n <gn-ui-thumbnail\n [thumbnailUrl]=\"\n record.ownerOrganization?.logoUrl?.toString() || ''\n \"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div class=\"text-xl text-primary-black font-medium truncate\">\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }] }); }
30680
+ }
30681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
30682
+ type: Component,
30683
+ args: [{ selector: 'gn-ui-internal-link-card', standalone: true, imports: [
30684
+ NgClass,
30685
+ NgIf,
30686
+ ThumbnailComponent,
30687
+ MetadataQualityComponent,
30688
+ NgTemplateOutlet,
30689
+ NgIconComponent,
30690
+ TranslateModule,
30691
+ MarkdownParserComponent,
30692
+ ], providers: [
30693
+ provideIcons({
30694
+ matLocationSearchingOutline,
30695
+ matCode,
30696
+ iconoirDatabase,
30697
+ iconoirMap,
30698
+ iconoirInternet,
30699
+ matEmailOutline,
30700
+ matPhoneOutline,
30701
+ matLocationOnOutline,
30702
+ }),
30703
+ provideNgIconsConfig({
30704
+ size: '1.2em',
30705
+ }),
30706
+ ], template: "<div\n class=\"rounded-lg group card-shadow cursor-pointer overflow-hidden hover:bg-gray-50\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-row justify-between w-full\">\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div\n class=\"flex flex-col flex-1 relative\"\n [ngClass]=\"{\n 'justify-between': record.ownerOrganization?.name && size !== 'XS',\n }\"\n >\n <div class=\"flex items-center space-x-2\">\n <span\n *ngIf=\"getKindInfo().text\"\n class=\"badge-btn text-white text-xs px-2 py-0.5 font-bold shrink-0 bg-primary leading-tight flex items-center justify-evenly h-6 min-h-6\"\n >\n <ng-icon\n class=\"text-[0.9em] text-white mr-1\"\n [name]=\"getKindInfo().icon\"\n ></ng-icon>\n <span class=\"font-medium text-white text-xs\" translate>\n {{ getKindInfo().text }}\n </span>\n </span>\n <span\n *ngIf=\"isGeodata\"\n class=\"badge-btn text-black text-xs px-2 py-0.5 font-bold shrink-0 bg-primary-white leading-tight flex items-center justify-evenly h-6 min-h-6\"\n [ngClass]=\"size === 'L' ? 'w-[164px]' : 'w-8'\"\n >\n <ng-icon\n class=\"text-[0.9em] text-primary-darkest\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <ng-container *ngIf=\"size === 'L'\">\n <span\n class=\"font-medium text-primary-darkest text-xs ml-1\"\n translate\n >\n record.metadata.type\n </span>\n </ng-container>\n </span>\n <div class=\"flex items-center\">\n <gn-ui-metadata-quality\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div class=\"absolute top-0 right-0 items-center\">\n <ng-container\n *ngIf=\"size !== 'XS'\"\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div\n class=\"font-medium text-title group-hover:text-primary overflow-hidden break-words\"\n [ngClass]=\"getTitleClass()\"\n >\n {{ record.title }}\n </div>\n <div\n *ngIf=\"size === 'L'\"\n class=\"mt-1 mb-2 font-normal text-xs text-gray-900 line-clamp-2 overflow-hidden\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n <div\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n >\n <div class=\"flex items-center flex-1 min-w-0\">\n <div\n class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\"\n >\n <gn-ui-thumbnail\n [thumbnailUrl]=\"\n record.ownerOrganization?.logoUrl?.toString() || ''\n \"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div class=\"text-xl text-primary-black font-medium truncate\">\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
30707
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { record: [{
30708
+ type: Input
30709
+ }], metadataQualityDisplay: [{
30710
+ type: Input
30711
+ }], favoriteTemplate: [{
30712
+ type: Input
30713
+ }], linkHref: [{
30714
+ type: Input
30715
+ }], isGeodata: [{
30716
+ type: Input
30717
+ }], size: [{
30718
+ type: Input
30719
+ }], mdSelect: [{
30720
+ type: Output
30721
+ }] } });
30722
+
30723
+ marker(`service.metadata.search`);
30724
+ marker(`service.metadata.capabilities.title`);
30725
+ marker(`service.metadata.capabilities.abstract`);
30726
+ marker(`service.metadata.capabilities.name`);
30727
+ marker(`service.metadata.capabilities.defaultCrs`);
30728
+ marker(`service.metadata.capabilities.availableCrs`);
30729
+ marker(`service.metadata.capabilities.otherCrs`);
30730
+ marker(`service.metadata.capabilities.objectCount`);
30731
+ marker(`service.metadata.capabilities.geometryName`);
30732
+ marker(`service.metadata.capabilities.geometryType`);
30733
+ marker(`service.metadata.capabilities.keywords`);
30734
+ marker(`service.metadata.capabilities.outputFormats`);
30735
+ marker(`service.metadata.capabilities.resourceLinks`);
30736
+ marker(`service.metadata.capabilities.attribution`);
30737
+ class ServiceCapabilitiesComponent {
30738
+ constructor(cdr, translateService) {
30739
+ this.cdr = cdr;
30740
+ this.translateService = translateService;
30741
+ this.apiLinks = [];
30742
+ this.availableLayers = [];
30743
+ this.filteredLayers = [];
30744
+ this.selectedLayer = null;
30745
+ this.layerInformation = [];
30746
+ this.searchQuery = '';
30747
+ this.loading = false;
30748
+ this.capabilitiesKeys = [
30749
+ 'title',
30750
+ 'abstract',
30751
+ 'name',
30752
+ 'defaultCrs',
30753
+ 'availableCrs',
30754
+ 'otherCrs',
30755
+ 'objectCount',
30756
+ 'geometryName',
30757
+ 'geometryType',
30758
+ 'keywords',
30759
+ 'outputFormats',
30760
+ 'resourceLinks',
30761
+ 'attribution',
30762
+ ];
30763
+ }
30764
+ ngOnInit() {
30765
+ this.loadLayers();
30766
+ }
30767
+ onSearchChange(event) {
30768
+ const input = event.target;
30769
+ this.searchQuery = input.value;
30770
+ if (!input.value) {
30771
+ this.searchActive = false;
30772
+ this.filteredLayers = this.availableLayers;
30773
+ }
30774
+ }
30775
+ onSearchEnter(event) {
30776
+ if (event.key === 'Enter') {
30777
+ this.searchActive = true;
30778
+ this.searchLayers();
30779
+ }
30780
+ }
30781
+ async loadLayers() {
30782
+ if (this.apiLinks.length > 0 &&
30783
+ this.apiLinks[0].accessServiceProtocol !== 'ogcFeatures') {
30784
+ this.loading = true;
30785
+ this.availableLayers = await getLayers(this.apiLinks[0].url.href, this.apiLinks[0].accessServiceProtocol);
30786
+ this.loading = false;
30787
+ this.cdr.detectChanges();
30788
+ this.filteredLayers = this.availableLayers;
30789
+ }
30790
+ else {
30791
+ this.availableLayers = [];
30792
+ }
30793
+ }
30794
+ selectLayer(layer) {
30795
+ if (layer === this.selectedLayer) {
30796
+ this.selectedLayer = null;
30797
+ this.layerInformation = [];
30798
+ return;
30799
+ }
30800
+ this.selectedLayer = layer;
30801
+ const filteredInfo = [];
30802
+ Object.keys(layer).map((key) => {
30803
+ if (this.capabilitiesKeys.includes(key)) {
30804
+ const displayName = this.translateService.instant(`service.metadata.capabilities.${key}`);
30805
+ if (key in layer && layer[key]?.length) {
30806
+ filteredInfo.push({ displayName, value: layer[key] });
30807
+ }
30808
+ }
30809
+ });
30810
+ this.layerInformation = filteredInfo;
30811
+ }
30812
+ isList(value) {
30813
+ return Array.isArray(value);
30814
+ }
30815
+ getExtraInputClass() {
30816
+ if (this.searchActive) {
30817
+ return 'h-14 border rounded-lg border-primary text-primary focus:border-primary hover:border-primary';
30818
+ }
30819
+ return 'h-14 border rounded-lg';
30820
+ }
30821
+ searchLayers() {
30822
+ this.searchActive = true;
30823
+ this.filteredLayers = this.availableLayers.filter((layer) => {
30824
+ const query = this.searchQuery.toLowerCase();
30825
+ if (layer.title) {
30826
+ return (layer.title.toLowerCase().includes(query) ||
30827
+ layer.abstract?.toLowerCase().includes(query));
30828
+ }
30829
+ else {
30830
+ return layer.name.toLowerCase().includes(query);
30831
+ }
30832
+ });
30833
+ if (!this.filteredLayers.includes(this.selectedLayer)) {
30834
+ this.selectedLayer = null;
30835
+ this.layerInformation = [];
30836
+ }
30837
+ }
30838
+ getExtraClass(layerItem) {
30839
+ return layerItem.title === this.selectedLayer?.title
30840
+ ? `h-8 rounded-lg bg-primary-darker text-white hover:text-primary-darker hover:bg-white`
30841
+ : `h-8 rounded-lg`;
30842
+ }
30843
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCapabilitiesComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30844
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "<div style=\"height: 652px\" id=\"preview\" *ngIf=\"apiLinks.length > 0\">\n <div class=\"bg-primary-opacity-10 overflow-visible\" style=\"height: 512px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n <div\n *ngIf=\"loading\"\n class=\"flex justify-center w-full h-[200px] items-center\"\n >\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n <div *ngIf=\"!loading\">\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div class=\"border-l absolute border-gray-200 right-0 h-14 w-14\">\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon name=\"matInfoOutline\" class=\"w-6 h-6 pt-0.5\"></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n <gn-ui-button\n *ngFor=\"let layerItem of filteredLayers\"\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n <span *ngIf=\"filteredLayers.length === 0\" class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n <div\n *ngFor=\"let item of layerInformation\"\n class=\"flex flex-row gap-4 border-b border-gray-200\"\n >\n <span class=\"font-semibold w-24\">{{ item.displayName }}</span>\n <div *ngIf=\"isList(item.value)\">\n <div\n *ngFor=\"let subItem of item.value\"\n class=\"flex flex-row break-words max-w-72\"\n >\n {{ subItem }}\n </div>\n </div>\n <div class=\"break-words max-w-72\" *ngIf=\"!isList(item.value)\">\n {{ item.value }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { 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: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }], viewProviders: [
30845
+ provideIcons({
30846
+ iconoirSearch,
30847
+ matInfoOutline,
30848
+ }),
30849
+ ] }); }
30850
+ }
30851
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCapabilitiesComponent, decorators: [{
30852
+ type: Component,
30853
+ args: [{ selector: 'gn-ui-service-capabilities', standalone: true, imports: [
30854
+ CommonModule,
30855
+ TranslateModule,
30856
+ ButtonComponent,
30857
+ TextInputComponent,
30858
+ NgIcon,
30859
+ PopoverComponent,
30860
+ SpinningLoaderComponent,
30861
+ ], viewProviders: [
30862
+ provideIcons({
30863
+ iconoirSearch,
30864
+ matInfoOutline,
30865
+ }),
30866
+ ], template: "<div style=\"height: 652px\" id=\"preview\" *ngIf=\"apiLinks.length > 0\">\n <div class=\"bg-primary-opacity-10 overflow-visible\" style=\"height: 512px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n <div\n *ngIf=\"loading\"\n class=\"flex justify-center w-full h-[200px] items-center\"\n >\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n <div *ngIf=\"!loading\">\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div class=\"border-l absolute border-gray-200 right-0 h-14 w-14\">\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon name=\"matInfoOutline\" class=\"w-6 h-6 pt-0.5\"></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n <gn-ui-button\n *ngFor=\"let layerItem of filteredLayers\"\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n <span *ngIf=\"filteredLayers.length === 0\" class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n <div\n *ngFor=\"let item of layerInformation\"\n class=\"flex flex-row gap-4 border-b border-gray-200\"\n >\n <span class=\"font-semibold w-24\">{{ item.displayName }}</span>\n <div *ngIf=\"isList(item.value)\">\n <div\n *ngFor=\"let subItem of item.value\"\n class=\"flex flex-row break-words max-w-72\"\n >\n {{ subItem }}\n </div>\n </div>\n <div class=\"break-words max-w-72\" *ngIf=\"!isList(item.value)\">\n {{ item.value }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n" }]
30867
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { apiLinks: [{
30868
+ type: Input
30869
+ }] } });
30870
+
29845
30871
  class UiElementsModule {
29846
30872
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
29847
30873
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, declarations: [AvatarComponent, UserPreviewComponent], imports: [CommonModule,
@@ -29860,12 +30886,16 @@ class UiElementsModule {
29860
30886
  MaxLinesComponent,
29861
30887
  TextInputComponent,
29862
30888
  ImageInputComponent,
29863
- ApplicationBannerComponent], exports: [ThumbnailComponent,
30889
+ ApplicationBannerComponent,
30890
+ InternalLinkCardComponent,
30891
+ ServiceCapabilitiesComponent], exports: [ThumbnailComponent,
29864
30892
  AvatarComponent,
29865
30893
  UserPreviewComponent,
29866
30894
  MarkdownParserComponent,
29867
30895
  ImageInputComponent,
29868
- ApplicationBannerComponent] }); }
30896
+ ApplicationBannerComponent,
30897
+ InternalLinkCardComponent,
30898
+ ServiceCapabilitiesComponent] }); }
29869
30899
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, providers: [
29870
30900
  provideNgIconsConfig({
29871
30901
  size: '1.5em',
@@ -29885,7 +30915,9 @@ class UiElementsModule {
29885
30915
  MaxLinesComponent,
29886
30916
  TextInputComponent,
29887
30917
  ImageInputComponent,
29888
- ApplicationBannerComponent] }); }
30918
+ ApplicationBannerComponent,
30919
+ InternalLinkCardComponent,
30920
+ ServiceCapabilitiesComponent] }); }
29889
30921
  }
29890
30922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
29891
30923
  type: NgModule,
@@ -29910,6 +30942,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29910
30942
  TextInputComponent,
29911
30943
  ImageInputComponent,
29912
30944
  ApplicationBannerComponent,
30945
+ InternalLinkCardComponent,
30946
+ ServiceCapabilitiesComponent,
29913
30947
  ],
29914
30948
  providers: [
29915
30949
  provideNgIconsConfig({
@@ -29924,6 +30958,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29924
30958
  MarkdownParserComponent,
29925
30959
  ImageInputComponent,
29926
30960
  ApplicationBannerComponent,
30961
+ InternalLinkCardComponent,
30962
+ ServiceCapabilitiesComponent,
29927
30963
  ],
29928
30964
  }]
29929
30965
  }] });
@@ -30264,8 +31300,9 @@ class ResultsTableComponent {
30264
31300
  return getBadgeColor(format);
30265
31301
  }
30266
31302
  handleRecordClick(item) {
30267
- if (item?.extras?.edit || this.isDraftPage)
31303
+ if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
30268
31304
  this.recordClick.emit(item);
31305
+ }
30269
31306
  }
30270
31307
  handleDuplicate(item) {
30271
31308
  this.duplicateRecord.emit(item);
@@ -30302,7 +31339,7 @@ class ResultsTableComponent {
30302
31339
  this.recordsSelectedChange.emit([[record], selected]);
30303
31340
  }
30304
31341
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, deps: [{ token: i1$9.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: DateService }], target: i0.ɵɵFactoryTarget.Component }); }
30305
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete", isDraftPage: "isDraftPage", isDuplicating: "isDuplicating" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", rollbackDraft: "rollbackDraft", recordsSelectedChange: "recordsSelectedChange" }, providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"!item.extras?.edit && !isDraftPage\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"item.extras?.edit || isDraftPage\"\n [checked]=\"isChecked(item)\"\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 [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\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 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 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-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *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 [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"!item.extras?.edit && !isDraftPage\"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light': !item.extras?.edit && !isDraftPage,\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\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$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { 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: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items", "isDraftPage"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "width", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "canDelete", "isDraftPage"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
31342
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete", isDraftPage: "isDraftPage", isDuplicating: "isDuplicating" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", rollbackDraft: "rollbackDraft", recordsSelectedChange: "recordsSelectedChange" }, providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"(item.extras?.edit || isDraftPage) && item.kind === 'dataset'\"\n [checked]=\"isChecked(item)\"\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 [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\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 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 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-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *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 [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\n \"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\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$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { 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: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items", "isDraftPage"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "width", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "canDelete", "isDraftPage"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
30306
31343
  }
30307
31344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
30308
31345
  type: Component,
@@ -30316,7 +31353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30316
31353
  ActionMenuComponent,
30317
31354
  NgIconComponent,
30318
31355
  CdkOverlayOrigin,
30319
- ], providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"!item.extras?.edit && !isDraftPage\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"item.extras?.edit || isDraftPage\"\n [checked]=\"isChecked(item)\"\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 [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\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 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 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-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *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 [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"!item.extras?.edit && !isDraftPage\"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light': !item.extras?.edit && !isDraftPage,\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
31356
+ ], providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"(item.extras?.edit || isDraftPage) && item.kind === 'dataset'\"\n [checked]=\"isChecked(item)\"\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 [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\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 <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\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 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 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-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *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 [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\n \"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
30320
31357
  }], ctorParameters: () => [{ type: i1$9.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
30321
31358
  type: Input
30322
31359
  }], selectedRecordsIdentifiers: [{
@@ -31347,9 +32384,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31347
32384
  type: Injectable
31348
32385
  }], ctorParameters: () => [{ type: SearchFacade }] });
31349
32386
 
31350
- class RecordsRepositoryInterface {
31351
- }
31352
-
31353
32387
  class FuzzySearchComponent {
31354
32388
  constructor(searchFacade, searchService, recordsRepository) {
31355
32389
  this.searchFacade = searchFacade;
@@ -31488,7 +32522,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31488
32522
  }] }] });
31489
32523
 
31490
32524
  // expects the replacement key ${uuid}
31491
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
32525
+ const RECORD_DATASET_URL_TOKEN = new InjectionToken('record-dataset-url-token');
32526
+ const RECORD_SERVICE_URL_TOKEN = new InjectionToken('record-service-url-token');
32527
+ const RECORD_REUSE_URL_TOKEN = new InjectionToken('record-reuse-url-token');
31492
32528
 
31493
32529
  class FavoriteStarComponent {
31494
32530
  set record(value) {
@@ -31515,9 +32551,10 @@ class FavoriteStarComponent {
31515
32551
  this.isAnonymous$ = this.platformService.isAnonymous();
31516
32552
  this.loading = false;
31517
32553
  this.loginUrl = this.authService.loginUrl;
31518
- this.loginMessage$ = this.translateService.get('favorite.not.authenticated.tooltip', {
32554
+ this.loginMessage$ = this.translateService.onLangChange.pipe(startWith(null), // make sure to wait for translations to be loaded with and without language change
32555
+ switchMap$1(() => this.translateService.get('favorite.not.authenticated.tooltip', {
31519
32556
  link: this.loginUrl,
31520
- });
32557
+ })));
31521
32558
  }
31522
32559
  ngAfterViewInit() {
31523
32560
  this.subscription = this.isAnonymous$
@@ -31573,11 +32610,11 @@ class FavoriteStarComponent {
31573
32610
  });
31574
32611
  }
31575
32612
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, deps: [{ token: FavoritesService }, { token: PlatformServiceInterface }, { token: i0.ChangeDetectorRef }, { token: AuthService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
31576
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FavoriteStarComponent, isStandalone: true, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32613
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FavoriteStarComponent, isStandalone: true, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 mt-0.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31577
32614
  }
31578
32615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, decorators: [{
31579
32616
  type: Component,
31580
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, StarToggleComponent], template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
32617
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, StarToggleComponent, TranslateModule], template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 mt-0.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n" }]
31581
32618
  }], ctorParameters: () => [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }], propDecorators: { displayCount: [{
31582
32619
  type: Input
31583
32620
  }], record: [{
@@ -31588,10 +32625,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31588
32625
  }] } });
31589
32626
 
31590
32627
  class ResultsListContainerComponent {
31591
- constructor(facade, resultsLayoutConfig, recordUrlTemplate) {
32628
+ constructor(facade, resultsLayoutConfig, recordDatasetUrlTemplate, recordServiceUrlTemplate, recordReuseUrlTemplate) {
31592
32629
  this.facade = facade;
31593
32630
  this.resultsLayoutConfig = resultsLayoutConfig;
31594
- this.recordUrlTemplate = recordUrlTemplate;
32631
+ this.recordDatasetUrlTemplate = recordDatasetUrlTemplate;
32632
+ this.recordServiceUrlTemplate = recordServiceUrlTemplate;
32633
+ this.recordReuseUrlTemplate = recordReuseUrlTemplate;
31595
32634
  this.showMore = 'auto';
31596
32635
  this.mdSelect = new EventEmitter();
31597
32636
  this.errorTypes = ErrorType;
@@ -31623,16 +32662,24 @@ class ResultsListContainerComponent {
31623
32662
  this.facade.scroll();
31624
32663
  }
31625
32664
  getRecordUrl(metadata) {
31626
- if (!this.recordUrlTemplate)
32665
+ const tokenMap = {
32666
+ dataset: this.recordDatasetUrlTemplate,
32667
+ service: this.recordServiceUrlTemplate,
32668
+ reuse: this.recordReuseUrlTemplate,
32669
+ };
32670
+ if (!this.recordDatasetUrlTemplate &&
32671
+ !this.recordServiceUrlTemplate &&
32672
+ !this.recordReuseUrlTemplate)
31627
32673
  return null;
31628
- return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
32674
+ const urlKind = tokenMap[metadata.kind];
32675
+ return urlKind.replace('${uuid}', metadata.uniqueIdentifier);
31629
32676
  }
31630
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }, { token: RECORD_URL_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
31631
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ErrorComponent, selector: "gn-ui-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] }); }
32677
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }, { token: RECORD_DATASET_URL_TOKEN, optional: true }, { token: RECORD_SERVICE_URL_TOKEN }, { token: RECORD_REUSE_URL_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
32678
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n [style.--gn-ui-button-width]=\"!auto\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [":host{--gn-ui-button-height: 24px;--gn-ui-button-width: 24px;--gn-ui-button-color: var(--color-secondary);--gn-ui-button-border-width: 0px}\n"], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ErrorComponent, selector: "gn-ui-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] }); }
31632
32679
  }
31633
32680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
31634
32681
  type: Component,
31635
- args: [{ selector: 'gn-ui-results-list-container', template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n" }]
32682
+ args: [{ selector: 'gn-ui-results-list-container', template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n [style.--gn-ui-button-width]=\"!auto\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [":host{--gn-ui-button-height: 24px;--gn-ui-button-width: 24px;--gn-ui-button-color: var(--color-secondary);--gn-ui-button-border-width: 0px}\n"] }]
31636
32683
  }], ctorParameters: () => [{ type: SearchFacade }, { type: undefined, decorators: [{
31637
32684
  type: Inject,
31638
32685
  args: [RESULTS_LAYOUT_CONFIG]
@@ -31640,7 +32687,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31640
32687
  type: Optional
31641
32688
  }, {
31642
32689
  type: Inject,
31643
- args: [RECORD_URL_TOKEN]
32690
+ args: [RECORD_DATASET_URL_TOKEN]
32691
+ }] }, { type: undefined, decorators: [{
32692
+ type: Inject,
32693
+ args: [RECORD_SERVICE_URL_TOKEN]
32694
+ }] }, { type: undefined, decorators: [{
32695
+ type: Inject,
32696
+ args: [RECORD_REUSE_URL_TOKEN]
31644
32697
  }] }], propDecorators: { metadataQualityDisplay: [{
31645
32698
  type: Input
31646
32699
  }], layout: [{
@@ -32392,12 +33445,7 @@ class FeatureSearchModule {
32392
33445
  FacetsModule,
32393
33446
  SearchStateContainerDirective,
32394
33447
  FilterDropdownComponent] }); }
32395
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, providers: [
32396
- {
32397
- provide: RecordsRepositoryInterface,
32398
- useClass: Gn4Repository,
32399
- },
32400
- ], imports: [CommonModule,
33448
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, imports: [CommonModule,
32401
33449
  TranslateModule.forChild(),
32402
33450
  StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
32403
33451
  initialState,
@@ -32459,12 +33507,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32459
33507
  SearchStateContainerDirective,
32460
33508
  FilterDropdownComponent,
32461
33509
  ],
32462
- providers: [
32463
- {
32464
- provide: RecordsRepositoryInterface,
32465
- useClass: Gn4Repository,
32466
- },
32467
- ],
32468
33510
  }]
32469
33511
  }] });
32470
33512
 
@@ -32952,247 +33994,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32952
33994
  }]
32953
33995
  }] });
32954
33996
 
32955
- const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
32956
- const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
32957
- const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
32958
- factory: () => ({}),
32959
- });
32960
- const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
32961
- factory: () => ({
32962
- fill: { color: 'rgba(255, 255, 255, 0.2)' },
32963
- stroke: { color: '#ffcc33', width: 2 },
32964
- }),
32965
- });
32966
-
32967
- const DEFAULT_BASEMAP_LAYER = {
32968
- type: 'xyz',
32969
- url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
32970
- attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
32971
- };
32972
- const DEFAULT_VIEW = {
32973
- center: [0, 15],
32974
- zoom: 2,
32975
- };
32976
- class MapContainerComponent {
32977
- get featuresClick() {
32978
- if (!this._featuresClick) {
32979
- this.openlayersMap.then((olMap) => {
32980
- listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
32981
- });
32982
- this._featuresClick = new EventEmitter();
32983
- }
32984
- return this._featuresClick;
32985
- }
32986
- get featuresHover() {
32987
- if (!this._featuresHover) {
32988
- this.openlayersMap.then((olMap) => {
32989
- listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
32990
- });
32991
- this._featuresHover = new EventEmitter();
32992
- }
32993
- return this._featuresHover;
32994
- }
32995
- get mapClick() {
32996
- if (!this._mapClick) {
32997
- this.openlayersMap.then((olMap) => {
32998
- listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
32999
- });
33000
- this._mapClick = new EventEmitter();
33001
- }
33002
- return this._mapClick;
33003
- }
33004
- get sourceLoadError() {
33005
- if (!this._sourceLoadError) {
33006
- this.openlayersMap.then((olMap) => {
33007
- listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
33008
- });
33009
- this._sourceLoadError = new EventEmitter();
33010
- }
33011
- return this._sourceLoadError;
33012
- }
33013
- constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
33014
- this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
33015
- this.basemapLayers = basemapLayers;
33016
- this.mapViewConstraints = mapViewConstraints;
33017
- this.openlayersMap = new Promise((resolve) => {
33018
- this.olMapResolver = resolve;
33019
- });
33020
- }
33021
- async ngAfterViewInit() {
33022
- this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
33023
- this.displayMessage$ = merge(fromEvent(this.olMap, 'mapmuted').pipe(map$1(() => true)), fromEvent(this.olMap, 'movestart').pipe(map$1(() => false)), fromEvent(this.olMap, 'singleclick').pipe(map$1(() => false))).pipe(switchMap$1((muted) => muted
33024
- ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
33025
- : of(false)));
33026
- this.olMapResolver(this.olMap);
33027
- }
33028
- async ngOnChanges(changes) {
33029
- if ('context' in changes && !changes['context'].isFirstChange()) {
33030
- const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
33031
- await applyContextDiffToMap(this.olMap, diff);
33032
- }
33033
- }
33034
- // This will apply basemap layers & view constraints
33035
- processContext(context) {
33036
- const processed = context
33037
- ? { ...context, view: context.view ?? DEFAULT_VIEW }
33038
- : { layers: [], view: DEFAULT_VIEW };
33039
- if (this.basemapLayers.length) {
33040
- processed.layers = [...this.basemapLayers, ...processed.layers];
33041
- }
33042
- if (!this.doNotUseDefaultBasemap) {
33043
- processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
33044
- }
33045
- if (this.mapViewConstraints.maxZoom) {
33046
- processed.view = {
33047
- maxZoom: this.mapViewConstraints.maxZoom,
33048
- ...processed.view,
33049
- };
33050
- }
33051
- if (this.mapViewConstraints.maxExtent) {
33052
- processed.view = {
33053
- maxExtent: this.mapViewConstraints.maxExtent,
33054
- ...processed.view,
33055
- };
33056
- }
33057
- if (processed.view &&
33058
- !('zoom' in processed.view) &&
33059
- !('center' in processed.view)) {
33060
- if (this.mapViewConstraints.maxExtent) {
33061
- processed.view = {
33062
- extent: this.mapViewConstraints.maxExtent,
33063
- ...processed.view,
33064
- };
33065
- }
33066
- else {
33067
- processed.view = { ...DEFAULT_VIEW, ...processed.view };
33068
- }
33069
- }
33070
- return processed;
33071
- }
33072
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, deps: [{ token: DO_NOT_USE_DEFAULT_BASEMAP }, { token: BASEMAP_LAYERS }, { token: MAP_VIEW_CONSTRAINTS }], target: i0.ɵɵFactoryTarget.Component }); }
33073
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapContainerComponent, isStandalone: true, selector: "gn-ui-map-container", inputs: { context: "context" }, outputs: { featuresClick: "featuresClick", featuresHover: "featuresHover", mapClick: "mapClick", sourceLoadError: "sourceLoadError" }, providers: [
33074
- provideIcons({ matSwipeOutline }),
33075
- provideNgIconsConfig({
33076
- size: '1.5em',
33077
- }),
33078
- ], viewQueries: [{ propertyName: "container", first: true, predicate: ["map"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33079
- }
33080
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
33081
- type: Component,
33082
- args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
33083
- provideIcons({ matSwipeOutline }),
33084
- provideNgIconsConfig({
33085
- size: '1.5em',
33086
- }),
33087
- ], template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n" }]
33088
- }], ctorParameters: () => [{ type: undefined, decorators: [{
33089
- type: Inject,
33090
- args: [DO_NOT_USE_DEFAULT_BASEMAP]
33091
- }] }, { type: undefined, decorators: [{
33092
- type: Inject,
33093
- args: [BASEMAP_LAYERS]
33094
- }] }, { type: undefined, decorators: [{
33095
- type: Inject,
33096
- args: [MAP_VIEW_CONSTRAINTS]
33097
- }] }], propDecorators: { context: [{
33098
- type: Input
33099
- }], featuresClick: [{
33100
- type: Output
33101
- }], featuresHover: [{
33102
- type: Output
33103
- }], mapClick: [{
33104
- type: Output
33105
- }], sourceLoadError: [{
33106
- type: Output
33107
- }], container: [{
33108
- type: ViewChild,
33109
- args: ['map']
33110
- }] } });
33111
-
33112
- const geometryKeys = ['geometry', 'the_geom'];
33113
- class FeatureDetailComponent {
33114
- get properties() {
33115
- if (!this.feature)
33116
- return [];
33117
- return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
33118
- }
33119
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33120
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeatureDetailComponent, isStandalone: true, selector: "gn-ui-feature-detail", inputs: { feature: "feature" }, ngImport: i0, template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33121
- }
33122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
33123
- type: Component,
33124
- args: [{ selector: 'gn-ui-feature-detail', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"] }]
33125
- }], propDecorators: { feature: [{
33126
- type: Input
33127
- }] } });
33128
-
33129
- class MapLegendComponent {
33130
- constructor() {
33131
- this.legendStatusChange = new EventEmitter();
33132
- }
33133
- async ngOnChanges(changes) {
33134
- if ('context' in changes) {
33135
- const mapContext = changes['context'].currentValue;
33136
- if (mapContext.layers && mapContext.layers.length > 0) {
33137
- const mapContextLayer = mapContext.layers[0];
33138
- this.legendHTML = await createLegendFromLayer(mapContextLayer);
33139
- if (this.legendHTML) {
33140
- this.legendStatusChange.emit(true);
33141
- }
33142
- }
33143
- else {
33144
- this.legendHTML = false;
33145
- this.legendStatusChange.emit(false);
33146
- }
33147
- }
33148
- }
33149
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33150
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapLegendComponent, isStandalone: true, selector: "gn-ui-map-legend", inputs: { context: "context" }, outputs: { legendStatusChange: "legendStatusChange" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
33151
- }
33152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
33153
- type: Component,
33154
- args: [{ selector: 'gn-ui-map-legend', standalone: true, encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"] }]
33155
- }], propDecorators: { context: [{
33156
- type: Input
33157
- }], legendStatusChange: [{
33158
- type: Output
33159
- }] } });
33160
-
33161
- function prioritizePageScroll(interactions) {
33162
- interactions.clear();
33163
- interactions.extend(defaults({
33164
- // remove rotate interactions
33165
- altShiftDragRotate: false,
33166
- pinchRotate: false,
33167
- // replace drag and zoom interactions
33168
- dragPan: false,
33169
- mouseWheelZoom: false,
33170
- })
33171
- .extend([
33172
- new DragPan({
33173
- condition: dragPanCondition,
33174
- }),
33175
- new MouseWheelZoom({
33176
- condition: mouseWheelZoomCondition,
33177
- }),
33178
- ])
33179
- .getArray());
33180
- }
33181
- function dragPanCondition(event) {
33182
- const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
33183
- if (!dragPanCondition) {
33184
- this.getMap().dispatchEvent('mapmuted');
33185
- }
33186
- // combine the condition with the default DragPan conditions
33187
- return dragPanCondition && noModifierKeys(event) && primaryAction(event);
33188
- }
33189
- function mouseWheelZoomCondition(event) {
33190
- if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
33191
- this.getMap().dispatchEvent('mapmuted');
33192
- }
33193
- return platformModifierKeyOnly(event);
33194
- }
33195
-
33196
33997
  class MapStateContainerComponent {
33197
33998
  constructor(mapFacade) {
33198
33999
  this.mapFacade = mapFacade;
@@ -33844,6 +34645,7 @@ function loadAppConfig() {
33844
34645
  'metadata_language',
33845
34646
  'login_url',
33846
34647
  'logout_url',
34648
+ 'settings_url',
33847
34649
  'web_component_embedder_url',
33848
34650
  'languages',
33849
34651
  'contact_email',
@@ -33994,6 +34796,7 @@ proxy_path = "/proxy/?url="
33994
34796
  metadata_language = "fre"
33995
34797
  login_url = "/cas/login?service="
33996
34798
  logout_url = "/geonetwork/signout"
34799
+ settings_url = "/geonetwork/settings"
33997
34800
  web_component_embedder_url = "/datahub/wc-embedder.html"
33998
34801
 
33999
34802
  [map]
@@ -36508,6 +37311,10 @@ class ChartViewComponent {
36508
37311
  this.dataset$ = this.currentLink$.pipe(filter((link) => !!link), switchMap$1((link) => {
36509
37312
  this.error = null;
36510
37313
  this.loading = true;
37314
+ if (link.accessRestricted) {
37315
+ this.handleError('dataset.error.restrictedAccess');
37316
+ return EMPTY;
37317
+ }
36511
37318
  return this.dataService.getDataset(link, this.cacheActive).pipe(catchError((error) => {
36512
37319
  this.handleError(error);
36513
37320
  return EMPTY;
@@ -36772,6 +37579,10 @@ class TableViewComponent {
36772
37579
  this.error = null;
36773
37580
  if (!link)
36774
37581
  return of(undefined);
37582
+ if (link.accessRestricted) {
37583
+ this.handleError('dataset.error.restrictedAccess');
37584
+ return of([]);
37585
+ }
36775
37586
  this.loading = true;
36776
37587
  return this.getDatasetReader(link).pipe(catchError((error) => {
36777
37588
  this.handleError(error);
@@ -36849,15 +37660,13 @@ class MdViewFacade {
36849
37660
  this.error$ = this.store.pipe(select(getMetadataError));
36850
37661
  this.related$ = this.store.pipe(select(getRelated));
36851
37662
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
36852
- this.allLinks$ = this.metadata$.pipe(map$1((record) => record.kind === 'dataset' && 'onlineResources' in record
36853
- ? record.onlineResources
36854
- : []));
37663
+ this.allLinks$ = this.metadata$.pipe(map$1((record) => ('onlineResources' in record ? record.onlineResources : [])));
36855
37664
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links
36856
37665
  .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
36857
37666
  // Put links to IGN Géoplateforme first
36858
37667
  .sort((dd1, dd2) => {
36859
- return dd2.accessServiceProtocol ===
36860
- 'GPFDL'
37668
+ return dd2
37669
+ .accessServiceProtocol === 'GPFDL'
36861
37670
  ? 1
36862
37671
  : undefined; // do not change the sorting otherwise
36863
37672
  })));
@@ -36928,15 +37737,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
36928
37737
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }, { type: DataService }] });
36929
37738
 
36930
37739
  class MdViewEffects {
36931
- constructor(actions$, recordsRepository, platformServiceInterface) {
37740
+ constructor(actions$, recordsRepository, platformServiceInterface, router) {
36932
37741
  this.actions$ = actions$;
36933
37742
  this.recordsRepository = recordsRepository;
36934
37743
  this.platformServiceInterface = platformServiceInterface;
37744
+ this.router = router;
36935
37745
  /*
36936
37746
  Metadata effects
36937
37747
  */
36938
37748
  this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getRecord(uuid)), map$1((record) => {
36939
- if (record === null) {
37749
+ if (record === null || !this.router.url.includes(record.kind)) {
36940
37750
  return loadFullMetadataFailure({ notFound: true });
36941
37751
  }
36942
37752
  return loadFullMetadataSuccess({ full: record });
@@ -36971,12 +37781,12 @@ class MdViewEffects {
36971
37781
  }));
36972
37782
  })))));
36973
37783
  }
36974
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$c.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
37784
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$c.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }, { token: i1$d.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
36975
37785
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects }); }
36976
37786
  }
36977
37787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, decorators: [{
36978
37788
  type: Injectable
36979
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }] });
37789
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }, { type: i1$d.Router }] });
36980
37790
 
36981
37791
  class CatalogTitleComponent {
36982
37792
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CatalogTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -37033,11 +37843,11 @@ class LanguageSwitcherComponent {
37033
37843
  this.translate.use(value);
37034
37844
  }
37035
37845
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
37036
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LanguageSwitcherComponent, isStandalone: true, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }] }); }
37846
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LanguageSwitcherComponent, isStandalone: true, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1 rounded-lg\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }] }); }
37037
37847
  }
37038
37848
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
37039
37849
  type: Component,
37040
- args: [{ selector: 'gn-ui-language-switcher', imports: [DropdownSelectorComponent], standalone: true, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n" }]
37850
+ args: [{ selector: 'gn-ui-language-switcher', imports: [DropdownSelectorComponent], standalone: true, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1 rounded-lg\"\n>\n</gn-ui-dropdown-selector>\n" }]
37041
37851
  }], ctorParameters: () => [{ type: undefined, decorators: [{
37042
37852
  type: Optional
37043
37853
  }, {
@@ -37459,17 +38269,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37459
38269
  }]
37460
38270
  }] });
37461
38271
 
37462
- const GN_UI_VERSION = new InjectionToken('gnUiVersion');
37463
-
37464
38272
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
37465
38273
  class DataViewPermalinkComponent {
37466
38274
  set viewType(value) {
37467
38275
  this.viewType$.next(value);
37468
38276
  }
37469
- constructor(config, wcEmbedderBaseUrl, version, facade) {
38277
+ constructor(config, wcEmbedderBaseUrl, facade) {
37470
38278
  this.config = config;
37471
38279
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
37472
- this.version = version;
37473
38280
  this.facade = facade;
37474
38281
  this.viewType$ = new BehaviorSubject('map');
37475
38282
  this.permalinkUrl$ = combineLatest([
@@ -37478,7 +38285,7 @@ class DataViewPermalinkComponent {
37478
38285
  this.facade.metadata$,
37479
38286
  ]).pipe(map$2(([viewType, config, metadata]) => {
37480
38287
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
37481
- url.searchParams.set('v', `${this.version}`);
38288
+ url.searchParams.set('v', `${GEONETWORK_UI_TAG_NAME}`);
37482
38289
  if (viewType === 'chart') {
37483
38290
  if (config) {
37484
38291
  const { aggregation, xProperty, yProperty, chartType } = config;
@@ -37509,7 +38316,7 @@ class DataViewPermalinkComponent {
37509
38316
  return url.toString();
37510
38317
  }));
37511
38318
  }
37512
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, deps: [{ token: Configuration }, { token: WEB_COMPONENT_EMBEDDER_URL, optional: true }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
38319
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, deps: [{ token: Configuration }, { token: WEB_COMPONENT_EMBEDDER_URL, optional: true }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
37513
38320
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataViewPermalinkComponent, isStandalone: true, selector: "gn-ui-data-view-permalink", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n *ngIf=\"wcEmbedderBaseUrl\"\n [text]=\"permalinkUrl$ | async\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37514
38321
  }
37515
38322
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
@@ -37523,9 +38330,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37523
38330
  }, {
37524
38331
  type: Inject,
37525
38332
  args: [WEB_COMPONENT_EMBEDDER_URL]
37526
- }] }, { type: undefined, decorators: [{
37527
- type: Inject,
37528
- args: [GN_UI_VERSION]
37529
38333
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37530
38334
  type: Input
37531
38335
  }] } });
@@ -37604,16 +38408,15 @@ class DataViewWebComponentComponent {
37604
38408
  set viewType(value) {
37605
38409
  this.viewType$.next(value);
37606
38410
  }
37607
- constructor(config, version, facade) {
38411
+ constructor(config, facade) {
37608
38412
  this.config = config;
37609
- this.version = version;
37610
38413
  this.facade = facade;
37611
38414
  this.viewType$ = new BehaviorSubject('map');
37612
38415
  this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
37613
38416
  if (viewType === 'chart') {
37614
38417
  if (config) {
37615
38418
  const { aggregation, xProperty, yProperty, chartType } = config;
37616
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38419
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37617
38420
  <gn-dataset-view-chart
37618
38421
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37619
38422
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37632,7 +38435,7 @@ class DataViewWebComponentComponent {
37632
38435
  return '';
37633
38436
  }
37634
38437
  else if (viewType === 'table') {
37635
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38438
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37636
38439
  <gn-dataset-view-table
37637
38440
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37638
38441
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37645,7 +38448,7 @@ class DataViewWebComponentComponent {
37645
38448
  ></gn-dataset-view-table>`;
37646
38449
  }
37647
38450
  else {
37648
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38451
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37649
38452
  <gn-dataset-view-map
37650
38453
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37651
38454
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37659,7 +38462,7 @@ class DataViewWebComponentComponent {
37659
38462
  }
37660
38463
  }));
37661
38464
  }
37662
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, deps: [{ token: Configuration }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
38465
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, deps: [{ token: Configuration }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
37663
38466
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataViewWebComponentComponent, isStandalone: true, selector: "gn-ui-data-view-web-component", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n [text]=\"webComponentHtml$ | async\"\n [rows]=\"3\"\n [tooltipText]=\"'tooltip.html.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37664
38467
  }
37665
38468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
@@ -37668,9 +38471,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37668
38471
  }], ctorParameters: () => [{ type: Configuration, decorators: [{
37669
38472
  type: Inject,
37670
38473
  args: [Configuration]
37671
- }] }, { type: undefined, decorators: [{
37672
- type: Inject,
37673
- args: [GN_UI_VERSION]
37674
38474
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37675
38475
  type: Input
37676
38476
  }] } });
@@ -37766,6 +38566,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37766
38566
 
37767
38567
  marker('map.dropdown.placeholder');
37768
38568
  marker('wfs.feature.limit');
38569
+ marker('dataset.error.restrictedAccess');
37769
38570
  class MapViewComponent {
37770
38571
  set exceedsLimit(value) {
37771
38572
  this.excludeWfs$.next(value);
@@ -37817,6 +38618,10 @@ class MapViewComponent {
37817
38618
  this.hidePreview = false;
37818
38619
  this.loading = true;
37819
38620
  this.error = null;
38621
+ if (link.accessRestricted) {
38622
+ this.handleError('dataset.error.restrictedAccess');
38623
+ return of([]);
38624
+ }
37820
38625
  return this.getLayerFromLink(link).pipe(map$1((layer) => [layer]), catchError((e) => {
37821
38626
  this.handleError(e);
37822
38627
  return of([]);
@@ -38166,7 +38971,7 @@ class RecordMetaComponent {
38166
38971
  this.meta.removeTag('property="og:url"');
38167
38972
  this.meta.removeTag('property="og:title"');
38168
38973
  }
38169
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, deps: [{ token: i1$d.Meta }], target: i0.ɵɵFactoryTarget.Component }); }
38974
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, deps: [{ token: i1$e.Meta }], target: i0.ɵɵFactoryTarget.Component }); }
38170
38975
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RecordMetaComponent, isStandalone: true, selector: "gn-ui-record-meta", inputs: { metadata: "metadata" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
38171
38976
  }
38172
38977
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, decorators: [{
@@ -38177,7 +38982,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
38177
38982
  changeDetection: ChangeDetectionStrategy.OnPush,
38178
38983
  standalone: true,
38179
38984
  }]
38180
- }], ctorParameters: () => [{ type: i1$d.Meta }], propDecorators: { metadata: [{
38985
+ }], ctorParameters: () => [{ type: i1$e.Meta }], propDecorators: { metadata: [{
38181
38986
  type: Input
38182
38987
  }] } });
38183
38988
 
@@ -39225,7 +40030,7 @@ class ImportRecordComponent {
39225
40030
  },
39226
40031
  });
39227
40032
  }
39228
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportRecordComponent, deps: [{ token: i1$e.Router }, { token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: NotificationsService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
40033
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportRecordComponent, deps: [{ token: i1$d.Router }, { token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: NotificationsService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
39229
40034
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ImportRecordComponent, isStandalone: true, selector: "gn-ui-import-record", outputs: { closeImportMenu: "closeImportMenu" }, providers: [
39230
40035
  provideIcons({
39231
40036
  iconoirImport,
@@ -39256,7 +40061,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39256
40061
  size: '1.5em',
39257
40062
  }),
39258
40063
  ], template: "<ng-container [ngSwitch]=\"sectionDisplayed\">\n <ng-container *ngSwitchCase=\"'mainMenu'\">\n <div\n data-test=\"importMenuMainSection\"\n class=\"mt-2 border border-gray-100 p-2 flex items-center bg-white shadow-2xl rounded-2xl\"\n >\n <ul class=\"flex flex-col gap-2 w-full\">\n <li *ngFor=\"let menuItem of importMenuItems\">\n <gn-ui-button\n [attr.data-test]=\"menuItem.dataTest\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"menuItem.action()\"\n [disabled]=\"menuItem.disabled\"\n [title]=\"\n (menuItem.disabled ? 'editor.temporary.disabled' : '') | translate\n \"\n ><ng-icon [name]=\"menuItem.icon\"></ng-icon\n ><span>{{ menuItem.label }}</span></gn-ui-button\n >\n </li>\n </ul>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'importExternalFile'\">\n <div\n data-test=\"importMenuImportExternalFileSection\"\n class=\"p-6 flex flex-col gap-2 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-button\n data-test=\"importMenuImportExternalFileSectionBackButton\"\n type=\"light\"\n (buttonClick)=\"displayMainMenu()\"\n >\n <ng-icon name=\"iconoirArrowLeft\"></ng-icon>\n </gn-ui-button>\n <span class=\"font-bold\" translate\n >dashboard.importRecord.importExternal.title</span\n >\n <span translate>dashboard.importRecord.importExternal.subtitle</span>\n </div>\n <gn-ui-url-input\n (uploadClick)=\"importRecord($event)\"\n [disabled]=\"isRecordImportInProgress\"\n ></gn-ui-url-input>\n </div>\n </ng-container>\n</ng-container>\n" }]
39259
- }], ctorParameters: () => [{ type: i1$e.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
40064
+ }], ctorParameters: () => [{ type: i1$d.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
39260
40065
  type: Output
39261
40066
  }] } });
39262
40067
 
@@ -39620,75 +40425,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39620
40425
  args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-array works!</p>\n" }]
39621
40426
  }] });
39622
40427
 
39623
- class FormFieldMapContainerComponent {
39624
- constructor() {
39625
- this.spatialExtents$ = new BehaviorSubject([]);
39626
- this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
39627
- if (extents.length === 0) {
39628
- return null; // null extent means default view
39629
- }
39630
- const featureCollection = {
39631
- type: 'FeatureCollection',
39632
- features: [],
39633
- };
39634
- extents.forEach((extent) => {
39635
- if (extent.geometry) {
39636
- featureCollection.features.push({
39637
- type: 'Feature',
39638
- properties: {},
39639
- geometry: extent.geometry,
39640
- });
39641
- }
39642
- else if (extent.bbox?.length >= 0) {
39643
- featureCollection.features.push({
39644
- type: 'Feature',
39645
- properties: {},
39646
- geometry: this.bboxCoordsToGeometry(extent.bbox),
39647
- });
39648
- }
39649
- });
39650
- const layer = {
39651
- type: 'geojson',
39652
- data: featureCollection,
39653
- label: 'Spatial extents',
39654
- style: {
39655
- 'stroke-color': 'black',
39656
- 'stroke-width': 2,
39657
- },
39658
- };
39659
- const view = await createViewFromLayer(layer);
39660
- return {
39661
- view,
39662
- layers: [layer],
39663
- };
39664
- }));
39665
- this.error = '';
39666
- }
39667
- set spatialExtents(value) {
39668
- this.spatialExtents$.next(value);
39669
- }
39670
- bboxCoordsToGeometry(bbox) {
39671
- const geometry = new Polygon([
39672
- [
39673
- [bbox[0], bbox[1]],
39674
- [bbox[0], bbox[3]],
39675
- [bbox[2], bbox[3]],
39676
- [bbox[2], bbox[1]],
39677
- [bbox[0], bbox[1]],
39678
- ],
39679
- ]);
39680
- return new GeoJSON().writeGeometryObject(geometry);
39681
- }
39682
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39683
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldMapContainerComponent, isStandalone: true, selector: "gn-ui-form-field-map-container", inputs: { spatialExtents: "spatialExtents" }, ngImport: i0, template: "<gn-ui-map-container [context]=\"mapContext$ | async\"></gn-ui-map-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39684
- }
39685
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, decorators: [{
39686
- type: Component,
39687
- args: [{ selector: 'gn-ui-form-field-map-container', standalone: true, imports: [CommonModule, MapContainerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-container [context]=\"mapContext$ | async\"></gn-ui-map-container>\n" }]
39688
- }], propDecorators: { spatialExtents: [{
39689
- type: Input
39690
- }] } });
39691
-
39692
40428
  /**
39693
40429
  * This form field is not like the others, as it will read directly from the state to handle both spatial extents
39694
40430
  * and place keywords.
@@ -39785,16 +40521,16 @@ class FormFieldSpatialExtentComponent {
39785
40521
  this.editorFacade.updateRecordField('spatialExtents', spatialExtents);
39786
40522
  }
39787
40523
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, deps: [{ token: PlatformServiceInterface }, { token: EditorFacade }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
39788
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldSpatialExtentComponent, isStandalone: true, selector: "gn-ui-form-field-spatial-extent", ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-form-field-map-container\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-form-field-map-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: GenericKeywordsComponent, selector: "gn-ui-generic-keywords", inputs: ["keywords", "keywordTypes", "placeholder", "allowSubmit"], outputs: ["changedKeywords", "addedKeyword", "deletedKeyword"] }, { kind: "component", type: FormFieldMapContainerComponent, selector: "gn-ui-form-field-map-container", inputs: ["spatialExtents"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40524
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldSpatialExtentComponent, isStandalone: true, selector: "gn-ui-form-field-spatial-extent", ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-spatial-extent\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-spatial-extent>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: GenericKeywordsComponent, selector: "gn-ui-generic-keywords", inputs: ["keywords", "keywordTypes", "placeholder", "allowSubmit"], outputs: ["changedKeywords", "addedKeyword", "deletedKeyword"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: SpatialExtentComponent, selector: "gn-ui-spatial-extent", inputs: ["spatialExtents"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39789
40525
  }
39790
40526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
39791
40527
  type: Component,
39792
40528
  args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
39793
40529
  CommonModule,
39794
40530
  GenericKeywordsComponent,
39795
- FormFieldMapContainerComponent,
39796
40531
  TranslateModule,
39797
- ], template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-form-field-map-container\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-form-field-map-container>\n </div>\n</div>\n" }]
40532
+ SpatialExtentComponent,
40533
+ ], template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-spatial-extent\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-spatial-extent>\n </div>\n</div>\n" }]
39798
40534
  }], ctorParameters: () => [{ type: PlatformServiceInterface }, { type: EditorFacade }, { type: i1$1.TranslateService }] });
39799
40535
 
39800
40536
  class ContactCardComponent {
@@ -40052,9 +40788,8 @@ class OnlineResourceCardComponent {
40052
40788
  get subtitle() {
40053
40789
  switch (this.onlineResource.type) {
40054
40790
  case 'service':
40055
- return `${this.onlineResource.accessServiceProtocol}`;
40056
40791
  case 'endpoint':
40057
- return `${this.onlineResource.protocol}`;
40792
+ return `${this.onlineResource.accessServiceProtocol}`;
40058
40793
  case 'link':
40059
40794
  case 'download':
40060
40795
  return this.getFormat(this.onlineResource);
@@ -41211,6 +41946,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41211
41946
  const ROUTER_STATE_KEY = 'router';
41212
41947
  const ROUTER_ROUTE_SEARCH = 'search';
41213
41948
  const ROUTER_ROUTE_DATASET = 'dataset';
41949
+ const ROUTER_ROUTE_SERVICE = 'service';
41950
+ const ROUTER_ROUTE_REUSE = 'reuse';
41214
41951
  const ROUTER_ROUTE_ORGANIZATION = 'organization';
41215
41952
  var ROUTE_PARAMS;
41216
41953
  (function (ROUTE_PARAMS) {
@@ -41243,6 +41980,14 @@ class RouterService {
41243
41980
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
41244
41981
  component: this.routerConfig.recordRouteComponent,
41245
41982
  },
41983
+ {
41984
+ path: `${ROUTER_ROUTE_SERVICE}/:metadataUuid`,
41985
+ component: this.routerConfig.recordRouteComponent,
41986
+ },
41987
+ {
41988
+ path: `${ROUTER_ROUTE_REUSE}/:metadataUuid`,
41989
+ component: this.routerConfig.recordRouteComponent,
41990
+ },
41246
41991
  {
41247
41992
  path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
41248
41993
  component: this.routerConfig.organizationRouteComponent,
@@ -41255,7 +42000,7 @@ class RouterService {
41255
42000
  getOrganizationPageRoute() {
41256
42001
  return ROUTER_ROUTE_ORGANIZATION;
41257
42002
  }
41258
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$e.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
42003
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$d.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
41259
42004
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
41260
42005
  }
41261
42006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, decorators: [{
@@ -41266,7 +42011,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41266
42011
  }], ctorParameters: () => [{ type: undefined, decorators: [{
41267
42012
  type: Inject,
41268
42013
  args: [ROUTER_CONFIG]
41269
- }] }, { type: i1$e.Router }] });
42014
+ }] }, { type: i1$d.Router }] });
41270
42015
 
41271
42016
  const goAction = createAction('[Router] Go', props());
41272
42017
  const backAction = createAction('[Router] Back');
@@ -41338,13 +42083,19 @@ class RouterFacade {
41338
42083
  this.currentRoute$ = this.store.pipe(select(selectCurrentRoute));
41339
42084
  this.pathParams$ = this.store.pipe(select(selectRouteParams));
41340
42085
  this.searchParams$ = this.currentRoute$.pipe(filter((route) => !!route), filter((route) => route.url[0]?.path.startsWith(ROUTER_ROUTE_SEARCH)), map$1((route) => route.queryParams), distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), map$1(expandQueryParams));
42086
+ this.routeMap = {
42087
+ dataset: ROUTER_ROUTE_DATASET,
42088
+ service: ROUTER_ROUTE_SERVICE,
42089
+ reuse: ROUTER_ROUTE_REUSE,
42090
+ };
41341
42091
  }
41342
42092
  goToMetadata(metadata) {
42093
+ const selectedRoute = this.routeMap[metadata.kind] || ROUTER_ROUTE_DATASET;
41343
42094
  this.pathParams$
41344
42095
  .pipe(take(1), filter((params) => params.metadataUuid !== metadata.uniqueIdentifier))
41345
42096
  .subscribe(() => {
41346
42097
  this.go({
41347
- path: `${ROUTER_ROUTE_DATASET}/${metadata.uniqueIdentifier}`,
42098
+ path: `${selectedRoute}/${metadata.uniqueIdentifier}`,
41348
42099
  });
41349
42100
  this.store.dispatch(setIncompleteMetadata({ incomplete: metadata }));
41350
42101
  });
@@ -41571,12 +42322,12 @@ class RouterEffects {
41571
42322
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
41572
42323
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
41573
42324
  }
41574
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, deps: [{ token: i1$c.Actions }, { token: i1$e.Router }, { token: i1$2.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
42325
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, deps: [{ token: i1$c.Actions }, { token: i1$d.Router }, { token: i1$2.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
41575
42326
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
41576
42327
  }
41577
42328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
41578
42329
  type: Injectable
41579
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$e.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
42330
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$d.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
41580
42331
  type: Inject,
41581
42332
  args: [ROUTER_CONFIG]
41582
42333
  }] }, { type: FieldsService }] });
@@ -41636,5 +42387,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41636
42387
  * Generated bundle index. Do not edit.
41637
42388
  */
41638
42389
 
41639
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InteractiveTableColumnComponent, InteractiveTableComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, 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, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
42390
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, 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, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
41640
42391
  //# sourceMappingURL=geonetwork-ui.mjs.map