geonetwork-ui 2.5.0 → 2.6.0-dev.025a2f85d

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 (278) 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-repository.mjs +18 -11
  7. package/esm2022/libs/api/repository/src/lib/gn4/gn4.provider.mjs +7 -1
  8. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  9. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +7 -3
  10. package/esm2022/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.mjs +2 -2
  11. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +2 -1
  12. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +7 -3
  13. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +2 -3
  14. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +1 -1
  15. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -5
  16. package/esm2022/libs/feature/map/src/lib/map-state-container/map-state-container.component.mjs +2 -2
  17. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +2 -4
  18. package/esm2022/libs/feature/record/src/index.mjs +1 -2
  19. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +5 -9
  20. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +7 -11
  21. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +45 -14
  22. package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +1 -1
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +8 -5
  24. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -6
  25. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +3 -1
  26. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  27. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +10 -2
  28. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -3
  29. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +8 -7
  30. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -15
  31. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -2
  32. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +26 -10
  33. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  34. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  35. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +27 -6
  36. package/esm2022/libs/ui/elements/src/lib/download-item/download-item.component.mjs +22 -6
  37. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  38. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +163 -0
  39. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +29 -7
  40. package/esm2022/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.mjs +3 -3
  41. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  42. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +8 -5
  43. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  44. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +3 -2
  45. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +161 -0
  46. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +16 -4
  47. package/esm2022/libs/ui/inputs/src/index.mjs +1 -2
  48. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +4 -3
  49. package/esm2022/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.mjs +43 -3
  50. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  51. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  52. package/esm2022/libs/ui/map/src/index.mjs +2 -1
  53. package/esm2022/libs/ui/map/src/lib/components/map-container/map-container.component.mjs +14 -3
  54. package/esm2022/libs/ui/map/src/lib/components/map-legend/map-legend.component.mjs +5 -1
  55. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +79 -0
  56. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  57. package/esm2022/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.mjs +3 -3
  58. package/esm2022/libs/util/data-fetcher/src/lib/data-fetcher.mjs +6 -2
  59. package/esm2022/libs/util/data-fetcher/src/lib/model.mjs +4 -1
  60. package/esm2022/libs/util/data-fetcher/src/lib/readers/wfs.mjs +30 -2
  61. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  62. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  63. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  64. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +33 -24
  65. package/esm2022/translations/de.json +34 -3
  66. package/esm2022/translations/en.json +35 -4
  67. package/esm2022/translations/es.json +34 -3
  68. package/esm2022/translations/fr.json +36 -5
  69. package/esm2022/translations/it.json +34 -4
  70. package/esm2022/translations/nl.json +34 -3
  71. package/esm2022/translations/pt.json +34 -3
  72. package/fesm2022/geonetwork-ui.mjs +1367 -531
  73. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  74. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  75. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  76. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  77. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +1 -0
  78. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  79. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  80. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +23 -4
  81. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  82. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  83. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  84. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +2 -2
  85. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
  86. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
  87. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +6 -6
  88. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  89. 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
  90. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  91. package/libs/feature/record/src/index.d.ts +0 -1
  92. package/libs/feature/record/src/index.d.ts.map +1 -1
  93. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  94. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  95. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  96. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  97. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  98. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  99. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +7 -2
  100. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  101. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  102. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  103. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  104. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  105. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  106. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  107. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  108. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  109. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  110. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  111. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  112. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  113. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  114. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  115. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -1
  116. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -1
  117. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  118. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  119. package/libs/ui/elements/src/index.d.ts +2 -0
  120. package/libs/ui/elements/src/index.d.ts.map +1 -1
  121. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts +9 -1
  122. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  123. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts +8 -1
  124. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts.map +1 -1
  125. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +43 -0
  126. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -0
  127. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +10 -2
  128. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  129. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  130. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  131. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  132. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  133. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  134. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +3 -1
  135. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  136. package/libs/ui/inputs/src/index.d.ts +0 -1
  137. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  138. package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts.map +1 -1
  139. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts +10 -3
  140. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts.map +1 -1
  141. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  142. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  143. package/libs/ui/map/src/index.d.ts +1 -0
  144. package/libs/ui/map/src/index.d.ts.map +1 -1
  145. package/libs/ui/map/src/lib/components/map-container/map-container.component.d.ts +4 -2
  146. package/libs/ui/map/src/lib/components/map-container/map-container.component.d.ts.map +1 -1
  147. package/libs/ui/map/src/lib/components/map-legend/map-legend.component.d.ts.map +1 -1
  148. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  149. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  150. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  151. package/libs/util/data-fetcher/src/lib/data-fetcher.d.ts.map +1 -1
  152. package/libs/util/data-fetcher/src/lib/model.d.ts +3 -2
  153. package/libs/util/data-fetcher/src/lib/model.d.ts.map +1 -1
  154. package/libs/util/data-fetcher/src/lib/readers/wfs.d.ts +1 -0
  155. package/libs/util/data-fetcher/src/lib/readers/wfs.d.ts.map +1 -1
  156. package/libs/util/shared/src/index.d.ts +1 -0
  157. package/libs/util/shared/src/index.d.ts.map +1 -1
  158. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  159. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  160. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  161. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  162. package/libs/util/shared/src/lib/links/link-utils.d.ts +30 -23
  163. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  164. package/package.json +1 -1
  165. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  166. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  167. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  168. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  169. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  170. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +8 -2
  171. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  172. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  173. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  174. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +20 -12
  175. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  176. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +22 -3
  177. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  178. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  179. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  180. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +18 -2
  181. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +1 -0
  182. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +4 -0
  183. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +1 -0
  184. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.html +10 -8
  185. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +4 -0
  186. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  187. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  188. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  189. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  190. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +1 -3
  191. package/src/libs/feature/record/src/index.ts +0 -1
  192. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  193. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  194. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +1 -0
  195. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +41 -7
  196. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  197. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  198. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  199. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  200. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  201. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  202. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  203. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +1 -7
  204. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +16 -8
  205. package/src/libs/feature/search/src/lib/feature-search.module.ts +0 -8
  206. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  207. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.css +6 -0
  208. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  209. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  210. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  211. package/src/libs/ui/elements/src/index.ts +2 -0
  212. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +64 -38
  213. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +26 -2
  214. package/src/libs/ui/elements/src/lib/download-item/download-item.component.html +17 -17
  215. package/src/libs/ui/elements/src/lib/download-item/download-item.component.ts +20 -2
  216. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +7 -6
  217. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +156 -0
  218. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +190 -0
  219. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +27 -29
  220. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +33 -3
  221. package/src/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.html +1 -1
  222. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  223. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  224. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  225. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  226. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +4 -2
  227. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +2 -1
  228. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.css +0 -0
  229. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  230. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  231. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -0
  232. package/src/libs/ui/inputs/src/index.ts +0 -1
  233. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +5 -5
  234. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.ts +2 -1
  235. package/src/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.ts +46 -2
  236. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +0 -4
  237. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  238. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  239. package/src/libs/ui/map/src/index.ts +1 -0
  240. package/src/libs/ui/map/src/lib/components/map-container/map-container.component.ts +14 -0
  241. package/src/libs/ui/map/src/lib/components/map-legend/map-legend.component.ts +3 -0
  242. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  243. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  244. 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
  245. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  246. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  247. package/src/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.html +2 -2
  248. package/src/libs/util/data-fetcher/src/lib/data-fetcher.ts +3 -1
  249. package/src/libs/util/data-fetcher/src/lib/model.ts +11 -1
  250. package/src/libs/util/data-fetcher/src/lib/readers/wfs.ts +29 -3
  251. package/src/libs/util/shared/src/index.ts +1 -0
  252. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  253. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  254. package/src/libs/util/shared/src/lib/links/link-utils.ts +50 -30
  255. package/tailwind.base.css +51 -13
  256. package/translations/de.json +34 -3
  257. package/translations/en.json +35 -4
  258. package/translations/es.json +34 -3
  259. package/translations/fr.json +36 -5
  260. package/translations/it.json +34 -4
  261. package/translations/nl.json +34 -3
  262. package/translations/pt.json +34 -3
  263. package/translations/sk.json +34 -3
  264. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  265. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  266. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +0 -16
  267. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  268. 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
  269. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  270. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  271. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts +0 -8
  272. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts.map +0 -1
  273. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  274. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  275. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +0 -3
  276. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +0 -9
  277. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.ts +0 -15
  278. /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,13 +78,7 @@ 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, 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
- import { transformExtent } from 'ol/proj';
82
82
  import * as TOML from '@ltd/j-toml';
83
83
  import { Style, Fill, Stroke, Circle } from 'ol/style';
84
84
  import CircleStyle from 'ol/style/Circle';
@@ -97,9 +97,8 @@ import * as i4 from '@angular/material/paginator';
97
97
  import { MatPaginatorIntl, MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
98
98
  import { LetDirective } from '@ngrx/component';
99
99
  import axios from 'axios';
100
- import * as i1$d from '@angular/platform-browser';
100
+ import * as i1$e from '@angular/platform-browser';
101
101
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
102
- import { Polygon } from 'ol/geom';
103
102
  import * as i4$1 from '@angular/material/radio';
104
103
  import { MatRadioModule } from '@angular/material/radio';
105
104
  import { MatIconModule } from '@angular/material/icon';
@@ -1352,8 +1351,8 @@ function extractServiceOnlineResources() {
1352
1351
  else {
1353
1352
  return {
1354
1353
  type: 'endpoint',
1355
- endpointUrl: url,
1356
- protocol,
1354
+ url: url,
1355
+ accessServiceProtocol: protocol,
1357
1356
  ...(description && { description }),
1358
1357
  translations,
1359
1358
  };
@@ -1852,7 +1851,7 @@ function writeLineage$1(record, rootEl) {
1852
1851
  pipe(findNestedChildOrCreate('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), writeLocalizedCharacterString(record.lineage, record.translations?.lineage, record.defaultLanguage))(rootEl);
1853
1852
  }
1854
1853
  function getServiceEndpointProtocol(endpoint) {
1855
- switch (endpoint.protocol.toLowerCase()) {
1854
+ switch (endpoint.accessServiceProtocol.toLowerCase()) {
1856
1855
  case 'wfs':
1857
1856
  return 'OGC:WFS';
1858
1857
  case 'wms':
@@ -1860,13 +1859,13 @@ function getServiceEndpointProtocol(endpoint) {
1860
1859
  case 'wps':
1861
1860
  return 'OGC:WPS';
1862
1861
  default:
1863
- return endpoint.protocol;
1862
+ return endpoint.accessServiceProtocol;
1864
1863
  }
1865
1864
  }
1866
1865
  function createOnlineResource(onlineResource) {
1867
1866
  let linkageUrl, functionCode, protocol;
1868
1867
  if (onlineResource.type === 'endpoint') {
1869
- linkageUrl = onlineResource.endpointUrl.toString();
1868
+ linkageUrl = onlineResource.url.toString();
1870
1869
  protocol = getServiceEndpointProtocol(onlineResource);
1871
1870
  functionCode = 'download';
1872
1871
  }
@@ -18603,6 +18602,7 @@ var records$6 = "Datensätze";
18603
18602
  var de = {
18604
18603
  "": "",
18605
18604
  "Add Layer As": "",
18605
+ "Enter to search": "",
18606
18606
  "button.login": "",
18607
18607
  "catalog.figures.datasets": "{count, plural, =0{Datensätze} one{Datensatz} other{Datensätze}}",
18608
18608
  "catalog.figures.organizations": "{count, plural, =0{Organisationen} one{Organisation} other{Organisationen}}",
@@ -18664,15 +18664,16 @@ var de = {
18664
18664
  "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
18665
18665
  "datahub.news.feed": "Nachrichtenfeed",
18666
18666
  "datahub.news.figures": "Indikatoren",
18667
- "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
18668
18667
  "datahub.search.back": "Zurück",
18669
18668
  "datahub.search.filter.all": "Alle",
18670
18669
  "datahub.search.filter.generatedByAPI": "Generiert durch eine API",
18671
18670
  "datahub.search.filter.generatedByWfs": "",
18672
18671
  "datahub.search.filter.others": "Andere",
18672
+ "dataset.error.forbidden": "Der Zugriff auf diese Ressource ist eingeschränkt",
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,15 +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",
19248
+ "dataset.error.forbidden": "Access to this resource is restricted",
19218
19249
  "dataset.error.http": "The data could not be loaded because of an HTTP error: \"{ info }\"",
19219
19250
  "dataset.error.network": "The data could not be loaded because of a network error or CORS limitations: \"{ info }\"",
19220
19251
  "dataset.error.parse": "The data was loaded but could not be parsed: \"{ info }\"",
19252
+ "dataset.error.restrictedAccess": "Access to this resource is restricted",
19221
19253
  "dataset.error.unknown": "The data cannot be displayed: \"{ info }\"",
19222
19254
  "dataset.error.unsupportedType": "The following content type is unsupported: \"{ info }\"",
19223
19255
  "domain.contact.role.author": "Author",
@@ -19378,6 +19410,7 @@ var en = {
19378
19410
  "editor.record.loadError.body": "The dataset could not be loaded:",
19379
19411
  "editor.record.loadError.closeMessage": "Understood",
19380
19412
  "editor.record.loadError.title": "Error loading dataset",
19413
+ "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
19381
19414
  "editor.record.lock.reason": "You are not an editor of the allowed groups",
19382
19415
  "editor.record.onlineResource.protocol.other": "Other",
19383
19416
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
@@ -19437,7 +19470,6 @@ var en = {
19437
19470
  "input.image.dropFileLabel": "or drop it here",
19438
19471
  "input.image.selectFileLabel": "Select an image",
19439
19472
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19440
- "input.image.uploadErrorRetry": "Retry",
19441
19473
  "input.image.uploadProgressCancel": "Cancel",
19442
19474
  "input.image.uploadProgressLabel": "Upload in progress...",
19443
19475
  "language.ca": "Catalan",
@@ -19477,6 +19509,7 @@ var en = {
19477
19509
  "map.wms.urlInput.hint": "Enter WMS service URL",
19478
19510
  "multiselect.filter.placeholder": "Search",
19479
19511
  "nav.back": "Back",
19512
+ "navbar.mobile.menuTitle": "Quick access",
19480
19513
  next: next$5,
19481
19514
  "ogc.unreachable.unknown": "The service could not be reached",
19482
19515
  "organisation.filter.placeholder": "Filter results",
@@ -19500,8 +19533,13 @@ var en = {
19500
19533
  "record.action.duplicating": "Duplicating...",
19501
19534
  "record.action.rollback": "Rollback",
19502
19535
  "record.action.view": "View",
19536
+ "record.card.metadata.contact": "Metadata Contact",
19503
19537
  "record.externalViewer.open": "Open in the external map viewer",
19504
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",
19505
19543
  "record.metadata.about": "Description",
19506
19544
  "record.metadata.api": "API",
19507
19545
  "record.metadata.api.form.closeButton": "Close",
@@ -19535,6 +19573,7 @@ var en = {
19535
19573
  "record.metadata.api.form.zoneTitle": "Zone",
19536
19574
  "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
19537
19575
  "record.metadata.api.gpfdl": "Data download",
19576
+ "record.metadata.capabilities": "Service capabilities",
19538
19577
  "record.metadata.catalog": "Catalog",
19539
19578
  "record.metadata.contact": "Contact",
19540
19579
  "record.metadata.creation": "Date of creation",
@@ -19571,11 +19610,12 @@ var en = {
19571
19610
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19572
19611
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19573
19612
  "record.metadata.related": "Related datasets",
19613
+ "record.metadata.related.contents": "Related content",
19614
+ "record.metadata.ressources.and.links": "Resources and links",
19574
19615
  "record.metadata.sheet": "Original metadata",
19575
19616
  "record.metadata.status": "Status",
19576
19617
  "record.metadata.status.notPublished": "Not published",
19577
19618
  "record.metadata.status.published": "Published",
19578
- "record.metadata.technical": "Technical information",
19579
19619
  "record.metadata.temporalExtent": "Temporal extent",
19580
19620
  "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
19581
19621
  "record.metadata.temporalExtent.sinceDate": "Since { start }",
@@ -19612,6 +19652,7 @@ var en = {
19612
19652
  "results.sortBy.popularity": "Popularity",
19613
19653
  "results.sortBy.qualityScore": "Quality score",
19614
19654
  "results.sortBy.relevancy": "Relevancy",
19655
+ "reuse.metadata.access": "Access the reuse",
19615
19656
  "search.autocomplete.error": "Suggestions could not be fetched:",
19616
19657
  "search.error.couldNotReachApi": "The API could not be reached",
19617
19658
  "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
@@ -19661,6 +19702,26 @@ var en = {
19661
19702
  "search.filters.useSpatialFilter": "Show datasets in the area of interest first",
19662
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.",
19663
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",
19664
19725
  "share.tab.permalink": "Share",
19665
19726
  "share.tab.webComponent": "Integrate",
19666
19727
  "table.loading.data": "Loading data...",
@@ -19693,6 +19754,7 @@ var records$4 = "";
19693
19754
  var es = {
19694
19755
  "": "",
19695
19756
  "Add Layer As": "",
19757
+ "Enter to search": "",
19696
19758
  "button.login": "",
19697
19759
  "catalog.figures.datasets": "conjuntos de datos",
19698
19760
  "catalog.figures.organizations": "organizaciones",
@@ -19754,15 +19816,16 @@ var es = {
19754
19816
  "datahub.news.contact.title": "",
19755
19817
  "datahub.news.feed": "",
19756
19818
  "datahub.news.figures": "",
19757
- "datahub.record.addToFavorites": "",
19758
19819
  "datahub.search.back": "",
19759
19820
  "datahub.search.filter.all": "",
19760
19821
  "datahub.search.filter.generatedByAPI": "",
19761
19822
  "datahub.search.filter.generatedByWfs": "",
19762
19823
  "datahub.search.filter.others": "",
19824
+ "dataset.error.forbidden": "El acceso a este recurso está restringido",
19763
19825
  "dataset.error.http": "",
19764
19826
  "dataset.error.network": "",
19765
19827
  "dataset.error.parse": "",
19828
+ "dataset.error.restrictedAccess": "",
19766
19829
  "dataset.error.unknown": "",
19767
19830
  "dataset.error.unsupportedType": "",
19768
19831
  "domain.contact.role.author": "",
@@ -19923,6 +19986,7 @@ var es = {
19923
19986
  "editor.record.loadError.body": "",
19924
19987
  "editor.record.loadError.closeMessage": "",
19925
19988
  "editor.record.loadError.title": "",
19989
+ "editor.record.lock.format": "",
19926
19990
  "editor.record.lock.reason": "",
19927
19991
  "editor.record.onlineResource.protocol.other": "",
19928
19992
  "editor.record.onlineResourceError.body": "",
@@ -19982,7 +20046,6 @@ var es = {
19982
20046
  "input.image.dropFileLabel": "",
19983
20047
  "input.image.selectFileLabel": "",
19984
20048
  "input.image.uploadErrorLabel": "",
19985
- "input.image.uploadErrorRetry": "",
19986
20049
  "input.image.uploadProgressCancel": "",
19987
20050
  "input.image.uploadProgressLabel": "",
19988
20051
  "language.ca": "Catalán",
@@ -20022,6 +20085,7 @@ var es = {
20022
20085
  "map.wms.urlInput.hint": "",
20023
20086
  "multiselect.filter.placeholder": "",
20024
20087
  "nav.back": "",
20088
+ "navbar.mobile.menuTitle": "Acceso rápido",
20025
20089
  next: next$4,
20026
20090
  "ogc.unreachable.unknown": "",
20027
20091
  "organisation.filter.placeholder": "",
@@ -20045,8 +20109,13 @@ var es = {
20045
20109
  "record.action.duplicating": "",
20046
20110
  "record.action.rollback": "",
20047
20111
  "record.action.view": "",
20112
+ "record.card.metadata.contact": "",
20048
20113
  "record.externalViewer.open": "",
20049
20114
  "record.feature.limit": "",
20115
+ "record.kind.data": "",
20116
+ "record.kind.dataset": "",
20117
+ "record.kind.reuse": "",
20118
+ "record.kind.service": "",
20050
20119
  "record.metadata.about": "",
20051
20120
  "record.metadata.api": "",
20052
20121
  "record.metadata.api.form.closeButton": "",
@@ -20080,6 +20149,7 @@ var es = {
20080
20149
  "record.metadata.api.form.zoneTitle": "",
20081
20150
  "record.metadata.api.form.zoneTooltip": "",
20082
20151
  "record.metadata.api.gpfdl": "",
20152
+ "record.metadata.capabilities": "",
20083
20153
  "record.metadata.catalog": "",
20084
20154
  "record.metadata.contact": "",
20085
20155
  "record.metadata.creation": "",
@@ -20116,11 +20186,12 @@ var es = {
20116
20186
  "record.metadata.quality.updateFrequency.failed": "",
20117
20187
  "record.metadata.quality.updateFrequency.success": "",
20118
20188
  "record.metadata.related": "",
20189
+ "record.metadata.related.contents": "",
20190
+ "record.metadata.ressources.and.links": "Recursos y enlaces",
20119
20191
  "record.metadata.sheet": "",
20120
20192
  "record.metadata.status": "",
20121
20193
  "record.metadata.status.notPublished": "",
20122
20194
  "record.metadata.status.published": "",
20123
- "record.metadata.technical": "",
20124
20195
  "record.metadata.temporalExtent": "",
20125
20196
  "record.metadata.temporalExtent.fromDateToDate": "",
20126
20197
  "record.metadata.temporalExtent.sinceDate": "",
@@ -20157,6 +20228,7 @@ var es = {
20157
20228
  "results.sortBy.popularity": "",
20158
20229
  "results.sortBy.qualityScore": "",
20159
20230
  "results.sortBy.relevancy": "",
20231
+ "reuse.metadata.access": "",
20160
20232
  "search.autocomplete.error": "",
20161
20233
  "search.error.couldNotReachApi": "",
20162
20234
  "search.error.organizationHasNoDataset": "",
@@ -20206,6 +20278,26 @@ var es = {
20206
20278
  "search.filters.useSpatialFilter": "",
20207
20279
  "search.filters.useSpatialFilterHelp": "",
20208
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": "",
20209
20301
  "share.tab.permalink": "",
20210
20302
  "share.tab.webComponent": "",
20211
20303
  "table.loading.data": "",
@@ -20238,6 +20330,7 @@ var records$3 = "Enregistrements";
20238
20330
  var fr = {
20239
20331
  "": "",
20240
20332
  "Add Layer As": "",
20333
+ "Enter to search": "",
20241
20334
  "button.login": "Se connecter",
20242
20335
  "catalog.figures.datasets": "{count, plural, =0{données} one{donnée} other{données}}",
20243
20336
  "catalog.figures.organizations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
@@ -20299,15 +20392,16 @@ var fr = {
20299
20392
  "datahub.news.contact.title": "Un besoin spécifique ?",
20300
20393
  "datahub.news.feed": "Fil d'activité",
20301
20394
  "datahub.news.figures": "Quelques chiffres",
20302
- "datahub.record.addToFavorites": "Ajouter aux favoris",
20303
20395
  "datahub.search.back": "Retour",
20304
20396
  "datahub.search.filter.all": "Tous",
20305
20397
  "datahub.search.filter.generatedByAPI": "généré par une API",
20306
20398
  "datahub.search.filter.generatedByWfs": "généré par un WFS",
20307
20399
  "datahub.search.filter.others": "Autres",
20400
+ "dataset.error.forbidden": "L’accès à cette ressource est restreint",
20308
20401
  "dataset.error.http": "Le chargement des données a échoué en raison d'une erreur HTTP: \"{ info }\"",
20309
20402
  "dataset.error.network": "Le chargement des données a échoué en raison d'une erreur réseau ou de limitations CORS: \"{ info }\"",
20310
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",
20311
20405
  "dataset.error.unknown": "Les données ne peuvent être affichées: \"{ info }\"",
20312
20406
  "dataset.error.unsupportedType": "Le type de contenu suivant n'est pas pris en charge: \"{ info }\"",
20313
20407
  "domain.contact.role.author": "Auteur",
@@ -20468,6 +20562,7 @@ var fr = {
20468
20562
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20469
20563
  "editor.record.loadError.closeMessage": "Compris",
20470
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",
20471
20566
  "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
20472
20567
  "editor.record.onlineResource.protocol.other": "Autre",
20473
20568
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
@@ -20527,7 +20622,6 @@ var fr = {
20527
20622
  "input.image.dropFileLabel": "ou glissez-la ici",
20528
20623
  "input.image.selectFileLabel": "Sélectionnez une image",
20529
20624
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20530
- "input.image.uploadErrorRetry": "Réessayer",
20531
20625
  "input.image.uploadProgressCancel": "Annuler",
20532
20626
  "input.image.uploadProgressLabel": "Chargement en cours...",
20533
20627
  "language.ca": "Catalan",
@@ -20567,6 +20661,7 @@ var fr = {
20567
20661
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20568
20662
  "multiselect.filter.placeholder": "Rechercher",
20569
20663
  "nav.back": "Retour",
20664
+ "navbar.mobile.menuTitle": "Navigation rapide",
20570
20665
  next: next$3,
20571
20666
  "ogc.unreachable.unknown": "Le service n'est pas accessible",
20572
20667
  "organisation.filter.placeholder": "Filtrer les résultats",
@@ -20590,9 +20685,14 @@ var fr = {
20590
20685
  "record.action.duplicating": "Duplication...",
20591
20686
  "record.action.rollback": "Restaurer",
20592
20687
  "record.action.view": "Voir",
20688
+ "record.card.metadata.contact": "Contact de la métadonnée ",
20593
20689
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
20594
20690
  "record.feature.limit": "L’aperçu a été désactivé en raison d’un trop grand nombre d'éléments",
20595
- "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",
20596
20696
  "record.metadata.api": "API",
20597
20697
  "record.metadata.api.form.closeButton": "Fermer",
20598
20698
  "record.metadata.api.form.closeForm": "Fermer le panneau de personnalisation",
@@ -20625,6 +20725,7 @@ var fr = {
20625
20725
  "record.metadata.api.form.zoneTitle": "Zone",
20626
20726
  "record.metadata.api.form.zoneTooltip": "Menu déroulant pour sélectionner une zone géographique",
20627
20727
  "record.metadata.api.gpfdl": "Téléchargement",
20728
+ "record.metadata.capabilities": "Capacités du service",
20628
20729
  "record.metadata.catalog": "Catalogue",
20629
20730
  "record.metadata.contact": "Contact",
20630
20731
  "record.metadata.creation": "Date de création",
@@ -20634,7 +20735,7 @@ var fr = {
20634
20735
  "record.metadata.keywords": "Mots-clés",
20635
20736
  "record.metadata.languages": "Langues",
20636
20737
  "record.metadata.lastUpdate": "Mis à jour le {date}",
20637
- "record.metadata.links": "Liens",
20738
+ "record.metadata.links": "Ressources & liens",
20638
20739
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20639
20740
  "record.metadata.otherConstraints": "Limitations d'usage",
20640
20741
  "record.metadata.owner": "Catalogue d'origine",
@@ -20661,11 +20762,12 @@ var fr = {
20661
20762
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20662
20763
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20663
20764
  "record.metadata.related": "Voir aussi",
20765
+ "record.metadata.related.contents": "Contenu associé",
20766
+ "record.metadata.ressources.and.links": "Ressources et liens",
20664
20767
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20665
20768
  "record.metadata.status": "Statut",
20666
20769
  "record.metadata.status.notPublished": "Non publié",
20667
20770
  "record.metadata.status.published": "Publié",
20668
- "record.metadata.technical": "Informations techniques",
20669
20771
  "record.metadata.temporalExtent": "Étendue temporelle",
20670
20772
  "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
20671
20773
  "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
@@ -20702,6 +20804,7 @@ var fr = {
20702
20804
  "results.sortBy.popularity": "Popularité",
20703
20805
  "results.sortBy.qualityScore": "Indicateur de qualité",
20704
20806
  "results.sortBy.relevancy": "Pertinence",
20807
+ "reuse.metadata.access": "Accéder à la réutilisation",
20705
20808
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
20706
20809
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
20707
20810
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
@@ -20751,6 +20854,26 @@ var fr = {
20751
20854
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
20752
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.",
20753
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",
20754
20877
  "share.tab.permalink": "Partager",
20755
20878
  "share.tab.webComponent": "Intégrer",
20756
20879
  "table.loading.data": "Chargement des données...",
@@ -20783,6 +20906,7 @@ var records$2 = "record";
20783
20906
  var it = {
20784
20907
  "": "",
20785
20908
  "Add Layer As": "",
20909
+ "Enter to search": "",
20786
20910
  "button.login": "Login",
20787
20911
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
20788
20912
  "catalog.figures.organizations": "{count, plural, =0{organizzazioni} one{organizzazione} other{organizzazioni}}",
@@ -20844,15 +20968,16 @@ var it = {
20844
20968
  "datahub.news.contact.title": "Ha un bisogno specifico?",
20845
20969
  "datahub.news.feed": "Feed di attività",
20846
20970
  "datahub.news.figures": "Alcune figure",
20847
- "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
20848
20971
  "datahub.search.back": "Ritorna",
20849
20972
  "datahub.search.filter.all": "Tutti",
20850
20973
  "datahub.search.filter.generatedByAPI": "generato da un'API",
20851
20974
  "datahub.search.filter.generatedByWfs": "generato da un WFS",
20852
20975
  "datahub.search.filter.others": "Altri",
20976
+ "dataset.error.forbidden": "L'accesso a questa risorsa è limitato",
20853
20977
  "dataset.error.http": "Il caricamento dei dati non è riuscito a causa di un errore HTTP: \"{info}\"",
20854
20978
  "dataset.error.network": "Il caricamento dei dati non è riuscito a causa di un errore di rete o di limitazioni CORS: \"{info}\"",
20855
20979
  "dataset.error.parse": "I dati sono stati caricati ma la decodifica non è riuscita: \"{info}\"",
20980
+ "dataset.error.restrictedAccess": "",
20856
20981
  "dataset.error.unknown": "Impossibile visualizzare i dati: \"{info}\"",
20857
20982
  "dataset.error.unsupportedType": "Il seguente tipo di contenuto non è supportato: \"{info}\"",
20858
20983
  "domain.contact.role.author": "Autore",
@@ -21013,6 +21138,7 @@ var it = {
21013
21138
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21014
21139
  "editor.record.loadError.closeMessage": "Capito",
21015
21140
  "editor.record.loadError.title": "Errore durante il caricamento",
21141
+ "editor.record.lock.format": "",
21016
21142
  "editor.record.lock.reason": "Non è un editore di uno dei gruppi autorizzati",
21017
21143
  "editor.record.onlineResource.protocol.other": "Altro",
21018
21144
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
@@ -21072,7 +21198,6 @@ var it = {
21072
21198
  "input.image.dropFileLabel": "oppure trascinalo qui",
21073
21199
  "input.image.selectFileLabel": "Seleziona un'immagine",
21074
21200
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21075
- "input.image.uploadErrorRetry": "Riprova",
21076
21201
  "input.image.uploadProgressCancel": "Annulla",
21077
21202
  "input.image.uploadProgressLabel": "Caricamento...",
21078
21203
  "language.ca": "Catalano",
@@ -21112,6 +21237,7 @@ var it = {
21112
21237
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21113
21238
  "multiselect.filter.placeholder": "Cerca",
21114
21239
  "nav.back": "Indietro",
21240
+ "navbar.mobile.menuTitle": "",
21115
21241
  next: next$2,
21116
21242
  "ogc.unreachable.unknown": "Il servizio non è accessibile",
21117
21243
  "organisation.filter.placeholder": "Filtra i risultati",
@@ -21135,8 +21261,13 @@ var it = {
21135
21261
  "record.action.duplicating": "Duplicazione",
21136
21262
  "record.action.rollback": "Annulla",
21137
21263
  "record.action.view": "Visualizza",
21264
+ "record.card.metadata.contact": "",
21138
21265
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
21139
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": "",
21140
21271
  "record.metadata.about": "Descrizione",
21141
21272
  "record.metadata.api": "API",
21142
21273
  "record.metadata.api.form.closeButton": "Chiude",
@@ -21170,6 +21301,7 @@ var it = {
21170
21301
  "record.metadata.api.form.zoneTitle": "Zona",
21171
21302
  "record.metadata.api.form.zoneTooltip": "Menu a discesa per selezionare una zona geografica",
21172
21303
  "record.metadata.api.gpfdl": "Scarica",
21304
+ "record.metadata.capabilities": "",
21173
21305
  "record.metadata.catalog": "Catalogo",
21174
21306
  "record.metadata.contact": "Contatto",
21175
21307
  "record.metadata.creation": "Data di creazione",
@@ -21206,11 +21338,12 @@ var it = {
21206
21338
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21207
21339
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21208
21340
  "record.metadata.related": "Vedi anche",
21341
+ "record.metadata.related.contents": "",
21342
+ "record.metadata.ressources.and.links": "Risorse e collegamenti",
21209
21343
  "record.metadata.sheet": "Origine del metadata",
21210
21344
  "record.metadata.status": "Stato",
21211
21345
  "record.metadata.status.notPublished": "Non pubblicato",
21212
21346
  "record.metadata.status.published": "Pubblicato",
21213
- "record.metadata.technical": "Informazioni tecniche",
21214
21347
  "record.metadata.temporalExtent": "Periodo di tempo",
21215
21348
  "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
21216
21349
  "record.metadata.temporalExtent.sinceDate": "Dal {start}",
@@ -21247,6 +21380,7 @@ var it = {
21247
21380
  "results.sortBy.popularity": "Popolarità",
21248
21381
  "results.sortBy.qualityScore": "Indicatore di qualità",
21249
21382
  "results.sortBy.relevancy": "Rilevanza",
21383
+ "reuse.metadata.access": "",
21250
21384
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
21251
21385
  "search.error.couldNotReachApi": "Problema di connessione all'API",
21252
21386
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora dati.",
@@ -21296,6 +21430,26 @@ var it = {
21296
21430
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
21297
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.",
21298
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": "",
21299
21453
  "share.tab.permalink": "Condividere",
21300
21454
  "share.tab.webComponent": "Incorporare",
21301
21455
  "table.loading.data": "Caricamento dei dati...",
@@ -21313,7 +21467,6 @@ var it = {
21313
21467
  "tooltip.url.open": "Aprire l'URL",
21314
21468
  "ui.readLess": "Ridurre",
21315
21469
  "ui.readMore": "Leggere di più",
21316
- "wfs.aggregations.notsupported": "Aggregazioni non supportate per i servizi WFS",
21317
21470
  "wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
21318
21471
  "wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
21319
21472
  "wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
@@ -21329,6 +21482,7 @@ var records$1 = "";
21329
21482
  var nl = {
21330
21483
  "": "",
21331
21484
  "Add Layer As": "",
21485
+ "Enter to search": "",
21332
21486
  "button.login": "",
21333
21487
  "catalog.figures.datasets": "datasets",
21334
21488
  "catalog.figures.organizations": "organisaties",
@@ -21390,15 +21544,16 @@ var nl = {
21390
21544
  "datahub.news.contact.title": "",
21391
21545
  "datahub.news.feed": "",
21392
21546
  "datahub.news.figures": "",
21393
- "datahub.record.addToFavorites": "",
21394
21547
  "datahub.search.back": "",
21395
21548
  "datahub.search.filter.all": "",
21396
21549
  "datahub.search.filter.generatedByAPI": "",
21397
21550
  "datahub.search.filter.generatedByWfs": "",
21398
21551
  "datahub.search.filter.others": "",
21552
+ "dataset.error.forbidden": "",
21399
21553
  "dataset.error.http": "",
21400
21554
  "dataset.error.network": "",
21401
21555
  "dataset.error.parse": "",
21556
+ "dataset.error.restrictedAccess": "",
21402
21557
  "dataset.error.unknown": "",
21403
21558
  "dataset.error.unsupportedType": "",
21404
21559
  "domain.contact.role.author": "",
@@ -21559,6 +21714,7 @@ var nl = {
21559
21714
  "editor.record.loadError.body": "",
21560
21715
  "editor.record.loadError.closeMessage": "",
21561
21716
  "editor.record.loadError.title": "",
21717
+ "editor.record.lock.format": "",
21562
21718
  "editor.record.lock.reason": "",
21563
21719
  "editor.record.onlineResource.protocol.other": "",
21564
21720
  "editor.record.onlineResourceError.body": "",
@@ -21618,7 +21774,6 @@ var nl = {
21618
21774
  "input.image.dropFileLabel": "",
21619
21775
  "input.image.selectFileLabel": "",
21620
21776
  "input.image.uploadErrorLabel": "",
21621
- "input.image.uploadErrorRetry": "",
21622
21777
  "input.image.uploadProgressCancel": "",
21623
21778
  "input.image.uploadProgressLabel": "",
21624
21779
  "language.ca": "Catalaans",
@@ -21658,6 +21813,7 @@ var nl = {
21658
21813
  "map.wms.urlInput.hint": "",
21659
21814
  "multiselect.filter.placeholder": "",
21660
21815
  "nav.back": "",
21816
+ "navbar.mobile.menuTitle": "",
21661
21817
  next: next$1,
21662
21818
  "ogc.unreachable.unknown": "",
21663
21819
  "organisation.filter.placeholder": "",
@@ -21681,8 +21837,13 @@ var nl = {
21681
21837
  "record.action.duplicating": "",
21682
21838
  "record.action.rollback": "",
21683
21839
  "record.action.view": "",
21840
+ "record.card.metadata.contact": "",
21684
21841
  "record.externalViewer.open": "",
21685
21842
  "record.feature.limit": "",
21843
+ "record.kind.data": "",
21844
+ "record.kind.dataset": "",
21845
+ "record.kind.reuse": "",
21846
+ "record.kind.service": "",
21686
21847
  "record.metadata.about": "",
21687
21848
  "record.metadata.api": "",
21688
21849
  "record.metadata.api.form.closeButton": "",
@@ -21716,6 +21877,7 @@ var nl = {
21716
21877
  "record.metadata.api.form.zoneTitle": "",
21717
21878
  "record.metadata.api.form.zoneTooltip": "",
21718
21879
  "record.metadata.api.gpfdl": "",
21880
+ "record.metadata.capabilities": "",
21719
21881
  "record.metadata.catalog": "",
21720
21882
  "record.metadata.contact": "",
21721
21883
  "record.metadata.creation": "",
@@ -21752,11 +21914,12 @@ var nl = {
21752
21914
  "record.metadata.quality.updateFrequency.failed": "",
21753
21915
  "record.metadata.quality.updateFrequency.success": "",
21754
21916
  "record.metadata.related": "",
21917
+ "record.metadata.related.contents": "",
21918
+ "record.metadata.ressources.and.links": "Bronnen en links",
21755
21919
  "record.metadata.sheet": "",
21756
21920
  "record.metadata.status": "",
21757
21921
  "record.metadata.status.notPublished": "",
21758
21922
  "record.metadata.status.published": "",
21759
- "record.metadata.technical": "",
21760
21923
  "record.metadata.temporalExtent": "",
21761
21924
  "record.metadata.temporalExtent.fromDateToDate": "",
21762
21925
  "record.metadata.temporalExtent.sinceDate": "",
@@ -21793,6 +21956,7 @@ var nl = {
21793
21956
  "results.sortBy.popularity": "",
21794
21957
  "results.sortBy.qualityScore": "",
21795
21958
  "results.sortBy.relevancy": "",
21959
+ "reuse.metadata.access": "",
21796
21960
  "search.autocomplete.error": "",
21797
21961
  "search.error.couldNotReachApi": "",
21798
21962
  "search.error.organizationHasNoDataset": "",
@@ -21842,6 +22006,26 @@ var nl = {
21842
22006
  "search.filters.useSpatialFilter": "",
21843
22007
  "search.filters.useSpatialFilterHelp": "",
21844
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": "",
21845
22029
  "share.tab.permalink": "",
21846
22030
  "share.tab.webComponent": "",
21847
22031
  "table.loading.data": "",
@@ -21874,6 +22058,7 @@ var records = "";
21874
22058
  var pt = {
21875
22059
  "": "",
21876
22060
  "Add Layer As": "",
22061
+ "Enter to search": "",
21877
22062
  "button.login": "",
21878
22063
  "catalog.figures.datasets": "conjuntos de dados",
21879
22064
  "catalog.figures.organizations": "organizações",
@@ -21935,15 +22120,16 @@ var pt = {
21935
22120
  "datahub.news.contact.title": "",
21936
22121
  "datahub.news.feed": "",
21937
22122
  "datahub.news.figures": "",
21938
- "datahub.record.addToFavorites": "",
21939
22123
  "datahub.search.back": "",
21940
22124
  "datahub.search.filter.all": "",
21941
22125
  "datahub.search.filter.generatedByAPI": "",
21942
22126
  "datahub.search.filter.generatedByWfs": "",
21943
22127
  "datahub.search.filter.others": "",
22128
+ "dataset.error.forbidden": "",
21944
22129
  "dataset.error.http": "",
21945
22130
  "dataset.error.network": "",
21946
22131
  "dataset.error.parse": "",
22132
+ "dataset.error.restrictedAccess": "",
21947
22133
  "dataset.error.unknown": "",
21948
22134
  "dataset.error.unsupportedType": "",
21949
22135
  "domain.contact.role.author": "",
@@ -22104,6 +22290,7 @@ var pt = {
22104
22290
  "editor.record.loadError.body": "",
22105
22291
  "editor.record.loadError.closeMessage": "",
22106
22292
  "editor.record.loadError.title": "",
22293
+ "editor.record.lock.format": "",
22107
22294
  "editor.record.lock.reason": "",
22108
22295
  "editor.record.onlineResource.protocol.other": "",
22109
22296
  "editor.record.onlineResourceError.body": "",
@@ -22163,7 +22350,6 @@ var pt = {
22163
22350
  "input.image.dropFileLabel": "",
22164
22351
  "input.image.selectFileLabel": "",
22165
22352
  "input.image.uploadErrorLabel": "",
22166
- "input.image.uploadErrorRetry": "",
22167
22353
  "input.image.uploadProgressCancel": "",
22168
22354
  "input.image.uploadProgressLabel": "",
22169
22355
  "language.ca": "Catalão",
@@ -22203,6 +22389,7 @@ var pt = {
22203
22389
  "map.wms.urlInput.hint": "",
22204
22390
  "multiselect.filter.placeholder": "",
22205
22391
  "nav.back": "",
22392
+ "navbar.mobile.menuTitle": "",
22206
22393
  next: next,
22207
22394
  "ogc.unreachable.unknown": "",
22208
22395
  "organisation.filter.placeholder": "",
@@ -22226,8 +22413,13 @@ var pt = {
22226
22413
  "record.action.duplicating": "",
22227
22414
  "record.action.rollback": "",
22228
22415
  "record.action.view": "",
22416
+ "record.card.metadata.contact": "",
22229
22417
  "record.externalViewer.open": "",
22230
22418
  "record.feature.limit": "",
22419
+ "record.kind.data": "",
22420
+ "record.kind.dataset": "",
22421
+ "record.kind.reuse": "",
22422
+ "record.kind.service": "",
22231
22423
  "record.metadata.about": "",
22232
22424
  "record.metadata.api": "",
22233
22425
  "record.metadata.api.form.closeButton": "",
@@ -22261,6 +22453,7 @@ var pt = {
22261
22453
  "record.metadata.api.form.zoneTitle": "",
22262
22454
  "record.metadata.api.form.zoneTooltip": "",
22263
22455
  "record.metadata.api.gpfdl": "",
22456
+ "record.metadata.capabilities": "",
22264
22457
  "record.metadata.catalog": "",
22265
22458
  "record.metadata.contact": "",
22266
22459
  "record.metadata.creation": "",
@@ -22297,11 +22490,12 @@ var pt = {
22297
22490
  "record.metadata.quality.updateFrequency.failed": "",
22298
22491
  "record.metadata.quality.updateFrequency.success": "",
22299
22492
  "record.metadata.related": "",
22493
+ "record.metadata.related.contents": "",
22494
+ "record.metadata.ressources.and.links": "Recursos e links",
22300
22495
  "record.metadata.sheet": "",
22301
22496
  "record.metadata.status": "",
22302
22497
  "record.metadata.status.notPublished": "",
22303
22498
  "record.metadata.status.published": "",
22304
- "record.metadata.technical": "",
22305
22499
  "record.metadata.temporalExtent": "",
22306
22500
  "record.metadata.temporalExtent.fromDateToDate": "",
22307
22501
  "record.metadata.temporalExtent.sinceDate": "",
@@ -22338,6 +22532,7 @@ var pt = {
22338
22532
  "results.sortBy.popularity": "",
22339
22533
  "results.sortBy.qualityScore": "",
22340
22534
  "results.sortBy.relevancy": "",
22535
+ "reuse.metadata.access": "",
22341
22536
  "search.autocomplete.error": "",
22342
22537
  "search.error.couldNotReachApi": "",
22343
22538
  "search.error.organizationHasNoDataset": "",
@@ -22387,6 +22582,26 @@ var pt = {
22387
22582
  "search.filters.useSpatialFilter": "",
22388
22583
  "search.filters.useSpatialFilterHelp": "",
22389
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": "",
22390
22605
  "share.tab.permalink": "",
22391
22606
  "share.tab.webComponent": "",
22392
22607
  "table.loading.data": "",
@@ -22690,6 +22905,10 @@ class Gn4FieldMapper {
22690
22905
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
22691
22906
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
22692
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');
22693
22912
  // no url: fail early
22694
22913
  if (url === null) {
22695
22914
  // TODO: collect errors at the record level?
@@ -22712,6 +22931,7 @@ class Gn4FieldMapper {
22712
22931
  type,
22713
22932
  url: url,
22714
22933
  accessServiceProtocol,
22934
+ accessRestricted: accessRestricted,
22715
22935
  };
22716
22936
  case 'link':
22717
22937
  return {
@@ -22730,8 +22950,8 @@ class Gn4FieldMapper {
22730
22950
  return {
22731
22951
  ...distribution,
22732
22952
  type,
22733
- endpointUrl: url,
22734
- protocol: accessServiceProtocol,
22953
+ url: url,
22954
+ accessServiceProtocol: accessServiceProtocol,
22735
22955
  };
22736
22956
  }
22737
22957
  };
@@ -23127,14 +23347,6 @@ class ElasticsearchService {
23127
23347
  }
23128
23348
  mustNotFilters() {
23129
23349
  return [
23130
- {
23131
- ...this.queryFilterOnValues('resourceType', [
23132
- 'service',
23133
- 'map',
23134
- 'map/static',
23135
- 'mapDigital',
23136
- ]),
23137
- },
23138
23350
  {
23139
23351
  query_string: {
23140
23352
  query: 'resourceType:featureCatalog AND !resourceType:dataset AND !cl_level.key:dataset',
@@ -23233,7 +23445,7 @@ class ElasticsearchService {
23233
23445
  must_not: this.mustNotFilters(),
23234
23446
  },
23235
23447
  },
23236
- _source: ['resourceTitleObject', 'uuid'],
23448
+ _source: ['resourceTitleObject', 'uuid', 'resourceType'],
23237
23449
  from: 0,
23238
23450
  size: 20,
23239
23451
  };
@@ -23450,18 +23662,25 @@ class Gn4Repository {
23450
23662
  .search('bucket', ['fcats'], JSON.stringify(this.gn4SearchHelper.getMetadataByIdPayload(uniqueIdentifier)))
23451
23663
  .pipe(map$1((results) => results.hits.hits[0]), switchMap((record) => record ? this.gn4Mapper.readRecord(record) : of(null)));
23452
23664
  }
23665
+ mapEmbeddedFeatureCatalog(featureTypes) {
23666
+ return {
23667
+ featureTypes: featureTypes.map((featureType) => ({
23668
+ name: featureType.typeName || '',
23669
+ definition: featureType.definition || '',
23670
+ attributes: Array.isArray(featureType.attributeTable)
23671
+ ? featureType.attributeTable.map((attr) => ({
23672
+ name: attr.name,
23673
+ title: attr.definition,
23674
+ }))
23675
+ : [],
23676
+ })),
23677
+ };
23678
+ }
23453
23679
  getFeatureCatalog(record, visited = new Set() // prevent looping
23454
23680
  ) {
23455
- if (record.extras &&
23456
- record.extras['featureTypes'] &&
23457
- record.extras['featureTypes'][0]?.attributeTable &&
23458
- Array.isArray(record.extras['featureTypes'][0].attributeTable)) {
23459
- return of({
23460
- attributes: record.extras['featureTypes'][0]?.attributeTable?.map((attr) => ({
23461
- name: attr.name,
23462
- title: attr.definition,
23463
- })),
23464
- });
23681
+ if (record.extras?.['featureTypes'] &&
23682
+ Array.isArray(record.extras['featureTypes'])) {
23683
+ return of(this.mapEmbeddedFeatureCatalog(record.extras['featureTypes']));
23465
23684
  }
23466
23685
  const featureCatalogIdentifier = record.extras['featureCatalogIdentifier'];
23467
23686
  if (featureCatalogIdentifier && !visited.has(featureCatalogIdentifier)) {
@@ -24752,7 +24971,7 @@ const FORMATS = {
24752
24971
  csv: {
24753
24972
  extensions: ['csv'],
24754
24973
  priority: 1,
24755
- color: '#a6d6c0',
24974
+ color: '#F6A924',
24756
24975
  mimeTypes: ['text/csv', 'application/csv'],
24757
24976
  },
24758
24977
  excel: {
@@ -24764,7 +24983,7 @@ const FORMATS = {
24764
24983
  'openxmlformats-officedocument',
24765
24984
  ],
24766
24985
  priority: 2,
24767
- color: '#acc5e4',
24986
+ color: '#FFDE10',
24768
24987
  mimeTypes: [
24769
24988
  'application/vnd.ms-excel',
24770
24989
  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
@@ -24773,31 +24992,31 @@ const FORMATS = {
24773
24992
  geojson: {
24774
24993
  extensions: ['geojson'],
24775
24994
  priority: 3,
24776
- color: '#b3cde8',
24995
+ color: '#293C6F',
24777
24996
  mimeTypes: ['application/geo+json', 'application/vnd.geo+json'],
24778
24997
  },
24779
24998
  json: {
24780
24999
  extensions: ['json'],
24781
25000
  priority: 3,
24782
- color: '#b3cde8',
25001
+ color: '#84D0F0',
24783
25002
  mimeTypes: ['application/json'],
24784
25003
  },
24785
25004
  shp: {
24786
25005
  extensions: ['shp', 'shape', 'zipped-shapefile'],
24787
25006
  priority: 4,
24788
- color: '#b2d8ba',
25007
+ color: '#009036',
24789
25008
  mimeTypes: ['x-gis/x-shapefile'],
24790
25009
  },
24791
25010
  gml: {
24792
25011
  extensions: ['gml'],
24793
25012
  priority: 5,
24794
- color: '#e3b3e5',
25013
+ color: '#E75113',
24795
25014
  mimeTypes: ['application/gml+xml', 'text/xml; subtype=gml'],
24796
25015
  },
24797
25016
  kml: {
24798
25017
  extensions: ['kml', 'kmz'],
24799
25018
  priority: 6,
24800
- color: '#c1e6a0',
25019
+ color: '#F4B5D0',
24801
25020
  mimeTypes: [
24802
25021
  'application/vnd.google-earth.kml+xml',
24803
25022
  'application/vnd.google-earth.kmz',
@@ -24806,55 +25025,55 @@ const FORMATS = {
24806
25025
  gpkg: {
24807
25026
  extensions: ['gpkg', 'geopackage'],
24808
25027
  priority: 7,
24809
- color: '#f7cce6',
25028
+ color: '#7D5D9F',
24810
25029
  mimeTypes: ['application/geopackage+sqlite3'],
24811
25030
  },
24812
25031
  zip: {
24813
25032
  extensions: ['zip', 'tar.gz'],
24814
25033
  priority: 8,
24815
- color: '#ffe7a3',
25034
+ color: '#B0CB52',
24816
25035
  mimeTypes: ['application/zip', 'application/x-zip'],
24817
25036
  },
24818
25037
  pdf: {
24819
25038
  extensions: ['pdf'],
24820
25039
  priority: 9,
24821
- color: '#f5b2a3',
25040
+ color: '#49579E',
24822
25041
  mimeTypes: ['application/pdf'],
24823
25042
  },
24824
25043
  jpg: {
24825
25044
  extensions: ['jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp'],
24826
25045
  priority: 9,
24827
- color: '#d1c1e9',
25046
+ color: '#C4A98F',
24828
25047
  mimeTypes: ['image/jpg'],
24829
25048
  },
24830
25049
  svg: {
24831
25050
  extensions: ['svg'],
24832
25051
  priority: 10,
24833
- color: '#f3c1c9',
25052
+ color: '#EB6D82',
24834
25053
  mimeTypes: ['image/svg+xml'],
24835
25054
  },
24836
25055
  dxf: {
24837
25056
  extensions: ['dxf'],
24838
25057
  priority: 11,
24839
- color: '#f6ceac',
25058
+ color: '#DCCD00',
24840
25059
  mimeTypes: ['application/x-dxf', 'image/x-dxf'],
24841
25060
  },
24842
25061
  html: {
24843
25062
  extensions: ['html', 'htm'],
24844
25063
  priority: 12,
24845
- color: '#FFF2CC',
25064
+ color: '#C0C9B6',
24846
25065
  mimeTypes: ['text/html'],
24847
25066
  },
24848
25067
  fgb: {
24849
25068
  extensions: ['fgb', 'flatgeobuf'],
24850
25069
  priority: 13,
24851
- color: '#ffe7a3',
25070
+ color: '#A8111C',
24852
25071
  mimeTypes: ['application/flatgeobuf'],
24853
25072
  },
24854
25073
  jsonfg: {
24855
25074
  extensions: ['jsonfg', 'jsonfgc'],
24856
25075
  priority: 14,
24857
- color: '#ffe7a3',
25076
+ color: '#009EE0',
24858
25077
  mimeTypes: [
24859
25078
  'application/vnd.ogc.fg+json',
24860
25079
  'application/vnd.ogc.fg+json;compatibility=geojson',
@@ -24925,9 +25144,11 @@ function mimeTypeToFormat(mimeType) {
24925
25144
  return null;
24926
25145
  }
24927
25146
  function checkFileFormat(link, format) {
24928
- 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())) ||
24929
25149
  ('url' in link &&
24930
- 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)));
24931
25152
  }
24932
25153
  function getBadgeColor(linkFormat) {
24933
25154
  for (const format in FORMATS) {
@@ -24962,7 +25183,7 @@ function getLinkLabel(link) {
24962
25183
  default:
24963
25184
  format = getFileFormat(link);
24964
25185
  }
24965
- const label = link.description || link.name;
25186
+ const label = link.description || ('name' in link ? link.name : '');
24966
25187
  return format ? `${label} (${format})` : label;
24967
25188
  }
24968
25189
  async function getLayers(url, serviceProtocol) {
@@ -24973,14 +25194,21 @@ async function getLayers(url, serviceProtocol) {
24973
25194
  }
24974
25195
  case 'wfs': {
24975
25196
  const endpointWfs = await new WfsEndpoint(url).isReady();
24976
- 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;
24977
25202
  }
24978
25203
  case 'wms': {
24979
25204
  const endpointWms = await new WmsEndpoint(url).isReady();
24980
- return endpointWms
25205
+ const layers = (await endpointWms
24981
25206
  .getLayers()
24982
25207
  .flatMap(wmsLayerFlatten)
24983
- .filter((l) => l.name);
25208
+ .filter((l) => l.name)).map((collection) => {
25209
+ return endpointWms.getLayerByName(collection.name);
25210
+ });
25211
+ return layers;
24984
25212
  }
24985
25213
  case 'wmts': {
24986
25214
  const endpointWmts = await new WmtsEndpoint(url).isReady();
@@ -25017,6 +25245,7 @@ var LinkUsage;
25017
25245
  class LinkClassifierService {
25018
25246
  getUsagesForLink(link) {
25019
25247
  switch (link.type) {
25248
+ case 'endpoint':
25020
25249
  case 'service': {
25021
25250
  switch (link.accessServiceProtocol) {
25022
25251
  case 'esriRest':
@@ -25065,6 +25294,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25065
25294
  }]
25066
25295
  }] });
25067
25296
 
25297
+ var name = "geonetwork-ui";
25298
+ var version = "2.6.0-dev.025a2f85d";
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
+
25068
25397
  const minApiVersion = '4.2.2';
25069
25398
  class Gn4PlatformService {
25070
25399
  constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService, httpClient, recordsApiService) {
@@ -25258,12 +25587,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25258
25587
  type: Injectable
25259
25588
  }], ctorParameters: () => [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }, { type: i1.HttpClient }, { type: RecordsApiService }] });
25260
25589
 
25590
+ class RecordsRepositoryInterface {
25591
+ }
25592
+
25261
25593
  function provideGn4() {
25262
25594
  return [
25263
25595
  {
25264
25596
  provide: PlatformServiceInterface,
25265
25597
  useClass: Gn4PlatformService,
25266
25598
  },
25599
+ {
25600
+ provide: RecordsRepositoryInterface,
25601
+ useClass: Gn4Repository,
25602
+ },
25267
25603
  Gn4PlatformMapper,
25268
25604
  ];
25269
25605
  }
@@ -25339,7 +25675,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25339
25675
 
25340
25676
  class AnchorLinkDirective {
25341
25677
  get elementClass() {
25342
- 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
+ }
25343
25687
  }
25344
25688
  constructor(changeDetector) {
25345
25689
  this.changeDetector = changeDetector;
@@ -25347,6 +25691,8 @@ class AnchorLinkDirective {
25347
25691
  this.observer = new MutationObserver(() => {
25348
25692
  this.refreshDisabledState();
25349
25693
  });
25694
+ this.inView = false;
25695
+ this.initialized = false;
25350
25696
  }
25351
25697
  ngOnInit() {
25352
25698
  this.observer.observe(document.body, {
@@ -25355,8 +25701,32 @@ class AnchorLinkDirective {
25355
25701
  });
25356
25702
  this.refreshDisabledState();
25357
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
+ }
25358
25725
  ngOnDestroy() {
25359
25726
  this.observer.disconnect();
25727
+ if (this.intersectionObserver) {
25728
+ this.intersectionObserver.disconnect();
25729
+ }
25360
25730
  }
25361
25731
  refreshDisabledState() {
25362
25732
  const targetNotPresent = !document.getElementById(this.targetId);
@@ -25375,7 +25745,7 @@ class AnchorLinkDirective {
25375
25745
  });
25376
25746
  }
25377
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 }); }
25378
- 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 }); }
25379
25749
  }
25380
25750
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, decorators: [{
25381
25751
  type: Directive,
@@ -25391,6 +25761,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25391
25761
  }], enabledClass: [{
25392
25762
  type: Input,
25393
25763
  args: ['gnUiAnchorLinkEnabledClass']
25764
+ }], inViewClass: [{
25765
+ type: Input,
25766
+ args: ['gnUiAnchorLinkInViewClass']
25767
+ }], outOfViewClass: [{
25768
+ type: Input,
25769
+ args: ['gnUiAnchorLinkOutOfViewClass']
25394
25770
  }], elementClass: [{
25395
25771
  type: HostBinding,
25396
25772
  args: ['class']
@@ -25480,11 +25856,11 @@ class CarouselComponent {
25480
25856
  .on('select', this.refreshSteps);
25481
25857
  }
25482
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 }); }
25483
- 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 }); }
25484
25860
  }
25485
25861
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, decorators: [{
25486
25862
  type: Component,
25487
- 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"] }]
25488
25864
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { carouselOverflowContainer: [{
25489
25865
  type: ViewChild,
25490
25866
  args: ['carouselOverflowContainer']
@@ -25655,6 +26031,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25655
26031
  type: Output
25656
26032
  }] } });
25657
26033
 
26034
+ marker('editor.record.lock.reason');
26035
+ marker('editor.record.lock.format');
25658
26036
  class InteractiveTableComponent {
25659
26037
  constructor() {
25660
26038
  this.items = [];
@@ -25672,15 +26050,24 @@ class InteractiveTableComponent {
25672
26050
  .join(' '),
25673
26051
  };
25674
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
+ }
25675
26062
  handleRowClick(item) {
25676
26063
  this.itemClick.emit(item);
25677
26064
  }
25678
26065
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25679
- 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 }); }
25680
26067
  }
25681
26068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
25682
26069
  type: Component,
25683
- 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"] }]
25684
26071
  }], propDecorators: { columns: [{
25685
26072
  type: ContentChildren,
25686
26073
  args: [InteractiveTableColumnComponent]
@@ -25924,11 +26311,11 @@ class ProgressBarComponent {
25924
26311
  }
25925
26312
  }
25926
26313
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25927
- 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 >\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]" }] }); }
25928
26315
  }
25929
26316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, decorators: [{
25930
26317
  type: Component,
25931
- 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 >\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"] }]
25932
26319
  }], propDecorators: { value: [{
25933
26320
  type: Input
25934
26321
  }], type: [{
@@ -27322,19 +27709,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27322
27709
  type: Input
27323
27710
  }] } });
27324
27711
 
27325
- class NavigationButtonComponent {
27326
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27327
- 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 }); }
27328
- }
27329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, decorators: [{
27330
- type: Component,
27331
- 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"] }]
27332
- }], propDecorators: { label: [{
27333
- type: Input
27334
- }], icon: [{
27335
- type: Input
27336
- }] } });
27337
-
27338
27712
  class SearchInputComponent {
27339
27713
  constructor() {
27340
27714
  this.value = '';
@@ -27393,11 +27767,11 @@ class StarToggleComponent {
27393
27767
  event.preventDefault();
27394
27768
  }
27395
27769
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27396
- 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 }); }
27397
27771
  }
27398
27772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, decorators: [{
27399
27773
  type: Component,
27400
- 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"] }]
27401
27775
  }], propDecorators: { toggled: [{
27402
27776
  type: Input
27403
27777
  }], disabled: [{
@@ -28444,7 +28818,7 @@ class MetadataQualityComponent {
28444
28818
  size: '1.2em',
28445
28819
  strokeWidth: '1.5px',
28446
28820
  }),
28447
- ], 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 }); }
28448
28822
  }
28449
28823
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataQualityComponent, decorators: [{
28450
28824
  type: Component,
@@ -28463,7 +28837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28463
28837
  size: '1.2em',
28464
28838
  strokeWidth: '1.5px',
28465
28839
  }),
28466
- ], 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"] }]
28467
28841
  }], propDecorators: { metadata: [{
28468
28842
  type: Input
28469
28843
  }], smaller: [{
@@ -28640,9 +29014,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28640
29014
 
28641
29015
  class ApiCardComponent {
28642
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 = '';
28643
29024
  this.currentlyActive = false;
28644
29025
  this.openRecordApiForm = new EventEmitter();
28645
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
+ }
28646
29039
  ngOnInit() {
28647
29040
  this.displayApiFormButton =
28648
29041
  this.link.accessServiceProtocol === 'ogcFeatures' ||
@@ -28660,9 +29053,9 @@ class ApiCardComponent {
28660
29053
  }
28661
29054
  }
28662
29055
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28663
- 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: [
28664
29057
  provideIcons({
28665
- matMoreHoriz,
29058
+ iconoirSettings,
28666
29059
  }),
28667
29060
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28668
29061
  }
@@ -28676,13 +29069,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28676
29069
  NgIcon,
28677
29070
  ], viewProviders: [
28678
29071
  provideIcons({
28679
- matMoreHoriz,
29072
+ iconoirSettings,
28680
29073
  }),
28681
- ], 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" }]
28682
29075
  }], propDecorators: { link: [{
28683
29076
  type: Input
28684
29077
  }], currentLink: [{
28685
29078
  type: Input
29079
+ }], size: [{
29080
+ type: Input
28686
29081
  }], openRecordApiForm: [{
28687
29082
  type: Output
28688
29083
  }] } });
@@ -28743,15 +29138,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28743
29138
 
28744
29139
  class DownloadItemComponent {
28745
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 = '';
28746
29148
  this.exportUrl = new EventEmitter();
28747
29149
  }
29150
+ set size(value) {
29151
+ this._size = value;
29152
+ this.cardClass = this.sizeClassMap[value];
29153
+ }
29154
+ get size() {
29155
+ return this._size;
29156
+ }
28748
29157
  openUrl() {
28749
29158
  this.exportUrl.emit(this.link.url.toString());
28750
29159
  }
28751
29160
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28752
- 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: [
28753
29162
  provideIcons({
28754
- matCloudDownloadOutline,
29163
+ iconoirDownload,
28755
29164
  }),
28756
29165
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28757
29166
  }
@@ -28759,9 +29168,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28759
29168
  type: Component,
28760
29169
  args: [{ selector: 'gn-ui-download-item', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, TranslateModule, NgIcon], standalone: true, viewProviders: [
28761
29170
  provideIcons({
28762
- matCloudDownloadOutline,
29171
+ iconoirDownload,
28763
29172
  }),
28764
- ], 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" }]
28765
29174
  }], propDecorators: { link: [{
28766
29175
  type: Input
28767
29176
  }], color: [{
@@ -28770,6 +29179,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28770
29179
  type: Input
28771
29180
  }], isFromApi: [{
28772
29181
  type: Input
29182
+ }], size: [{
29183
+ type: Input
28773
29184
  }], exportUrl: [{
28774
29185
  type: Output
28775
29186
  }] } });
@@ -28860,7 +29271,7 @@ class DownloadsListComponent {
28860
29271
  link.accessServiceProtocol === 'ogcFeatures'));
28861
29272
  }
28862
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 }); }
28863
- 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 }); }
28864
29275
  }
28865
29276
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadsListComponent, decorators: [{
28866
29277
  type: Component,
@@ -28869,7 +29280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28869
29280
  ButtonComponent,
28870
29281
  DownloadItemComponent,
28871
29282
  TranslateModule,
28872
- ], 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" }]
28873
29284
  }], ctorParameters: () => [{ type: i1$1.TranslateService }], propDecorators: { links: [{
28874
29285
  type: Input
28875
29286
  }] } });
@@ -29153,7 +29564,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29153
29564
 
29154
29565
  class LinkCardComponent {
29155
29566
  constructor() {
29156
- 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;
29157
29581
  }
29158
29582
  get title() {
29159
29583
  if (this.link.name && this.link.description) {
@@ -29161,25 +29585,31 @@ class LinkCardComponent {
29161
29585
  }
29162
29586
  return this.link.name || this.link.description || '';
29163
29587
  }
29588
+ getLinkFormat(link) {
29589
+ return getFileFormat(link);
29590
+ }
29591
+ getLinkColor(link) {
29592
+ return getBadgeColor(getFileFormat(link));
29593
+ }
29164
29594
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29165
- 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: [
29166
29596
  provideIcons({
29167
29597
  matOpenInNew,
29168
29598
  }),
29169
29599
  provideNgIconsConfig({ size: '1.5em' }),
29170
- ], 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 }); }
29171
29601
  }
29172
29602
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinkCardComponent, decorators: [{
29173
29603
  type: Component,
29174
- 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: [
29175
29605
  provideIcons({
29176
29606
  matOpenInNew,
29177
29607
  }),
29178
29608
  provideNgIconsConfig({ size: '1.5em' }),
29179
- ], 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" }]
29180
29610
  }], propDecorators: { link: [{
29181
29611
  type: Input
29182
- }], compact: [{
29612
+ }], size: [{
29183
29613
  type: Input
29184
29614
  }] } });
29185
29615
 
@@ -29221,11 +29651,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29221
29651
 
29222
29652
  class MetadataCatalogComponent {
29223
29653
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29224
- 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 }); }
29225
29655
  }
29226
29656
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataCatalogComponent, decorators: [{
29227
29657
  type: Component,
29228
- 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" }]
29229
29659
  }], propDecorators: { sourceLabel: [{
29230
29660
  type: Input
29231
29661
  }] } });
@@ -29253,7 +29683,7 @@ class MetadataContactComponent {
29253
29683
  this.organizationClick.emit(this.shownOrganization);
29254
29684
  }
29255
29685
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29256
- 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: [
29257
29687
  provideIcons({
29258
29688
  matOpenInNew,
29259
29689
  matCallOutline,
@@ -29273,7 +29703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29273
29703
  matPersonOutline,
29274
29704
  matLocationOnOutline,
29275
29705
  }),
29276
- ], 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" }]
29277
29707
  }], propDecorators: { metadata: [{
29278
29708
  type: Input
29279
29709
  }], organizationClick: [{
@@ -29358,6 +29788,316 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29358
29788
  }]
29359
29789
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] });
29360
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
+
29361
30101
  class MetadataInfoComponent {
29362
30102
  constructor(dateService) {
29363
30103
  this.dateService = dateService;
@@ -29410,7 +30150,7 @@ class MetadataInfoComponent {
29410
30150
  }
29411
30151
  }
29412
30152
  get temporalExtent() {
29413
- const temporalExtents = this.metadata.temporalExtents;
30153
+ const temporalExtents = this.metadata.kind === 'dataset' ? this.metadata.temporalExtents : [];
29414
30154
  return getTemporalRangeUnion(temporalExtents, this.dateService);
29415
30155
  }
29416
30156
  get shownOrganization() {
@@ -29432,7 +30172,7 @@ class MetadataInfoComponent {
29432
30172
  return this.dateService.formatDateTime(date);
29433
30173
  }
29434
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 }); }
29435
- 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: [
29436
30176
  provideIcons({
29437
30177
  matOpenInNew,
29438
30178
  matMailOutline: matMailOutline$1,
@@ -29453,12 +30193,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29453
30193
  CopyTextButtonComponent,
29454
30194
  NgIcon,
29455
30195
  GnUiLinkifyDirective,
30196
+ MapContainerComponent,
30197
+ SpatialExtentComponent,
29456
30198
  ], viewProviders: [
29457
30199
  provideIcons({
29458
30200
  matOpenInNew,
29459
30201
  matMailOutline: matMailOutline$1,
29460
30202
  }),
29461
- ], 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"] }]
29462
30204
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
29463
30205
  type: Input
29464
30206
  }], incomplete: [{
@@ -29626,7 +30368,7 @@ class RecordApiFormComponent {
29626
30368
  maxFeatures: limit !== '-1' ? Number(limit) : undefined,
29627
30369
  limit: limit !== '-1' ? Number(limit) : -1,
29628
30370
  offset: offset !== '' ? Number(offset) : undefined,
29629
- outputCrs: format === ('application/json' || 'geojson') ? 'EPSG:4326' : undefined,
30371
+ outputCrs: format.toLowerCase().indexOf('json') > -1 ? 'EPSG:4326' : undefined,
29630
30372
  };
29631
30373
  if (this.endpoint instanceof WfsEndpoint) {
29632
30374
  delete options.limit;
@@ -29634,6 +30376,7 @@ class RecordApiFormComponent {
29634
30376
  return this.endpoint.getFeatureUrl(this.apiFeatureType, options);
29635
30377
  }
29636
30378
  else {
30379
+ delete options.outputCrs;
29637
30380
  return await this.endpoint.getCollectionItemsUrl(this.apiFeatureType, options);
29638
30381
  }
29639
30382
  }
@@ -29829,6 +30572,302 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29829
30572
  type: Input
29830
30573
  }] } });
29831
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
+
29832
30871
  class UiElementsModule {
29833
30872
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
29834
30873
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, declarations: [AvatarComponent, UserPreviewComponent], imports: [CommonModule,
@@ -29847,12 +30886,16 @@ class UiElementsModule {
29847
30886
  MaxLinesComponent,
29848
30887
  TextInputComponent,
29849
30888
  ImageInputComponent,
29850
- ApplicationBannerComponent], exports: [ThumbnailComponent,
30889
+ ApplicationBannerComponent,
30890
+ InternalLinkCardComponent,
30891
+ ServiceCapabilitiesComponent], exports: [ThumbnailComponent,
29851
30892
  AvatarComponent,
29852
30893
  UserPreviewComponent,
29853
30894
  MarkdownParserComponent,
29854
30895
  ImageInputComponent,
29855
- ApplicationBannerComponent] }); }
30896
+ ApplicationBannerComponent,
30897
+ InternalLinkCardComponent,
30898
+ ServiceCapabilitiesComponent] }); }
29856
30899
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, providers: [
29857
30900
  provideNgIconsConfig({
29858
30901
  size: '1.5em',
@@ -29872,7 +30915,9 @@ class UiElementsModule {
29872
30915
  MaxLinesComponent,
29873
30916
  TextInputComponent,
29874
30917
  ImageInputComponent,
29875
- ApplicationBannerComponent] }); }
30918
+ ApplicationBannerComponent,
30919
+ InternalLinkCardComponent,
30920
+ ServiceCapabilitiesComponent] }); }
29876
30921
  }
29877
30922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
29878
30923
  type: NgModule,
@@ -29897,6 +30942,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29897
30942
  TextInputComponent,
29898
30943
  ImageInputComponent,
29899
30944
  ApplicationBannerComponent,
30945
+ InternalLinkCardComponent,
30946
+ ServiceCapabilitiesComponent,
29900
30947
  ],
29901
30948
  providers: [
29902
30949
  provideNgIconsConfig({
@@ -29911,6 +30958,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29911
30958
  MarkdownParserComponent,
29912
30959
  ImageInputComponent,
29913
30960
  ApplicationBannerComponent,
30961
+ InternalLinkCardComponent,
30962
+ ServiceCapabilitiesComponent,
29914
30963
  ],
29915
30964
  }]
29916
30965
  }] });
@@ -30251,8 +31300,9 @@ class ResultsTableComponent {
30251
31300
  return getBadgeColor(format);
30252
31301
  }
30253
31302
  handleRecordClick(item) {
30254
- if (item?.extras?.edit || this.isDraftPage)
31303
+ if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
30255
31304
  this.recordClick.emit(item);
31305
+ }
30256
31306
  }
30257
31307
  handleDuplicate(item) {
30258
31308
  this.duplicateRecord.emit(item);
@@ -30289,7 +31339,7 @@ class ResultsTableComponent {
30289
31339
  this.recordsSelectedChange.emit([[record], selected]);
30290
31340
  }
30291
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 }); }
30292
- 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"] }] }); }
30293
31343
  }
30294
31344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
30295
31345
  type: Component,
@@ -30303,7 +31353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30303
31353
  ActionMenuComponent,
30304
31354
  NgIconComponent,
30305
31355
  CdkOverlayOrigin,
30306
- ], 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" }]
30307
31357
  }], ctorParameters: () => [{ type: i1$9.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
30308
31358
  type: Input
30309
31359
  }], selectedRecordsIdentifiers: [{
@@ -31334,9 +32384,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31334
32384
  type: Injectable
31335
32385
  }], ctorParameters: () => [{ type: SearchFacade }] });
31336
32386
 
31337
- class RecordsRepositoryInterface {
31338
- }
31339
-
31340
32387
  class FuzzySearchComponent {
31341
32388
  constructor(searchFacade, searchService, recordsRepository) {
31342
32389
  this.searchFacade = searchFacade;
@@ -31475,7 +32522,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31475
32522
  }] }] });
31476
32523
 
31477
32524
  // expects the replacement key ${uuid}
31478
- 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');
31479
32528
 
31480
32529
  class FavoriteStarComponent {
31481
32530
  set record(value) {
@@ -31502,9 +32551,10 @@ class FavoriteStarComponent {
31502
32551
  this.isAnonymous$ = this.platformService.isAnonymous();
31503
32552
  this.loading = false;
31504
32553
  this.loginUrl = this.authService.loginUrl;
31505
- 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', {
31506
32556
  link: this.loginUrl,
31507
- });
32557
+ })));
31508
32558
  }
31509
32559
  ngAfterViewInit() {
31510
32560
  this.subscription = this.isAnonymous$
@@ -31560,11 +32610,11 @@ class FavoriteStarComponent {
31560
32610
  });
31561
32611
  }
31562
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 }); }
31563
- 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 }); }
31564
32614
  }
31565
32615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, decorators: [{
31566
32616
  type: Component,
31567
- 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" }]
31568
32618
  }], ctorParameters: () => [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }], propDecorators: { displayCount: [{
31569
32619
  type: Input
31570
32620
  }], record: [{
@@ -31575,10 +32625,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31575
32625
  }] } });
31576
32626
 
31577
32627
  class ResultsListContainerComponent {
31578
- constructor(facade, resultsLayoutConfig, recordUrlTemplate) {
32628
+ constructor(facade, resultsLayoutConfig, recordDatasetUrlTemplate, recordServiceUrlTemplate, recordReuseUrlTemplate) {
31579
32629
  this.facade = facade;
31580
32630
  this.resultsLayoutConfig = resultsLayoutConfig;
31581
- this.recordUrlTemplate = recordUrlTemplate;
32631
+ this.recordDatasetUrlTemplate = recordDatasetUrlTemplate;
32632
+ this.recordServiceUrlTemplate = recordServiceUrlTemplate;
32633
+ this.recordReuseUrlTemplate = recordReuseUrlTemplate;
31582
32634
  this.showMore = 'auto';
31583
32635
  this.mdSelect = new EventEmitter();
31584
32636
  this.errorTypes = ErrorType;
@@ -31610,16 +32662,24 @@ class ResultsListContainerComponent {
31610
32662
  this.facade.scroll();
31611
32663
  }
31612
32664
  getRecordUrl(metadata) {
31613
- 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)
31614
32673
  return null;
31615
- return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
32674
+ const urlKind = tokenMap[metadata.kind];
32675
+ return urlKind.replace('${uuid}', metadata.uniqueIdentifier);
31616
32676
  }
31617
- 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 }); }
31618
- 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" }] }); }
31619
32679
  }
31620
32680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
31621
32681
  type: Component,
31622
- 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"] }]
31623
32683
  }], ctorParameters: () => [{ type: SearchFacade }, { type: undefined, decorators: [{
31624
32684
  type: Inject,
31625
32685
  args: [RESULTS_LAYOUT_CONFIG]
@@ -31627,7 +32687,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31627
32687
  type: Optional
31628
32688
  }, {
31629
32689
  type: Inject,
31630
- 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]
31631
32697
  }] }], propDecorators: { metadataQualityDisplay: [{
31632
32698
  type: Input
31633
32699
  }], layout: [{
@@ -32379,12 +33445,7 @@ class FeatureSearchModule {
32379
33445
  FacetsModule,
32380
33446
  SearchStateContainerDirective,
32381
33447
  FilterDropdownComponent] }); }
32382
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, providers: [
32383
- {
32384
- provide: RecordsRepositoryInterface,
32385
- useClass: Gn4Repository,
32386
- },
32387
- ], imports: [CommonModule,
33448
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, imports: [CommonModule,
32388
33449
  TranslateModule.forChild(),
32389
33450
  StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
32390
33451
  initialState,
@@ -32446,12 +33507,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32446
33507
  SearchStateContainerDirective,
32447
33508
  FilterDropdownComponent,
32448
33509
  ],
32449
- providers: [
32450
- {
32451
- provide: RecordsRepositoryInterface,
32452
- useClass: Gn4Repository,
32453
- },
32454
- ],
32455
33510
  }]
32456
33511
  }] });
32457
33512
 
@@ -32939,232 +33994,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32939
33994
  }]
32940
33995
  }] });
32941
33996
 
32942
- const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
32943
- const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
32944
- const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
32945
- factory: () => ({}),
32946
- });
32947
- const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
32948
- factory: () => ({
32949
- fill: { color: 'rgba(255, 255, 255, 0.2)' },
32950
- stroke: { color: '#ffcc33', width: 2 },
32951
- }),
32952
- });
32953
-
32954
- const DEFAULT_BASEMAP_LAYER = {
32955
- type: 'xyz',
32956
- url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
32957
- attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
32958
- };
32959
- const DEFAULT_VIEW = {
32960
- center: [0, 15],
32961
- zoom: 2,
32962
- };
32963
- class MapContainerComponent {
32964
- get featuresClick() {
32965
- if (!this._featuresClick) {
32966
- this.openlayersMap.then((olMap) => {
32967
- listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
32968
- });
32969
- this._featuresClick = new EventEmitter();
32970
- }
32971
- return this._featuresClick;
32972
- }
32973
- get featuresHover() {
32974
- if (!this._featuresHover) {
32975
- this.openlayersMap.then((olMap) => {
32976
- listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
32977
- });
32978
- this._featuresHover = new EventEmitter();
32979
- }
32980
- return this._featuresHover;
32981
- }
32982
- get mapClick() {
32983
- if (!this._mapClick) {
32984
- this.openlayersMap.then((olMap) => {
32985
- listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
32986
- });
32987
- this._mapClick = new EventEmitter();
32988
- }
32989
- return this._mapClick;
32990
- }
32991
- constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
32992
- this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
32993
- this.basemapLayers = basemapLayers;
32994
- this.mapViewConstraints = mapViewConstraints;
32995
- this.openlayersMap = new Promise((resolve) => {
32996
- this.olMapResolver = resolve;
32997
- });
32998
- }
32999
- async ngAfterViewInit() {
33000
- this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
33001
- 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
33002
- ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
33003
- : of(false)));
33004
- this.olMapResolver(this.olMap);
33005
- }
33006
- async ngOnChanges(changes) {
33007
- if ('context' in changes && !changes['context'].isFirstChange()) {
33008
- const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
33009
- await applyContextDiffToMap(this.olMap, diff);
33010
- }
33011
- }
33012
- // This will apply basemap layers & view constraints
33013
- processContext(context) {
33014
- const processed = context
33015
- ? { ...context, view: context.view ?? DEFAULT_VIEW }
33016
- : { layers: [], view: DEFAULT_VIEW };
33017
- if (this.basemapLayers.length) {
33018
- processed.layers = [...this.basemapLayers, ...processed.layers];
33019
- }
33020
- if (!this.doNotUseDefaultBasemap) {
33021
- processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
33022
- }
33023
- if (this.mapViewConstraints.maxZoom) {
33024
- processed.view = {
33025
- maxZoom: this.mapViewConstraints.maxZoom,
33026
- ...processed.view,
33027
- };
33028
- }
33029
- if (this.mapViewConstraints.maxExtent) {
33030
- processed.view = {
33031
- maxExtent: this.mapViewConstraints.maxExtent,
33032
- ...processed.view,
33033
- };
33034
- }
33035
- if (processed.view &&
33036
- !('zoom' in processed.view) &&
33037
- !('center' in processed.view)) {
33038
- if (this.mapViewConstraints.maxExtent) {
33039
- processed.view = {
33040
- extent: this.mapViewConstraints.maxExtent,
33041
- ...processed.view,
33042
- };
33043
- }
33044
- else {
33045
- processed.view = { ...DEFAULT_VIEW, ...processed.view };
33046
- }
33047
- }
33048
- return processed;
33049
- }
33050
- 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 }); }
33051
- 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" }, providers: [
33052
- provideIcons({ matSwipeOutline }),
33053
- provideNgIconsConfig({
33054
- size: '1.5em',
33055
- }),
33056
- ], 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 }); }
33057
- }
33058
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
33059
- type: Component,
33060
- args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
33061
- provideIcons({ matSwipeOutline }),
33062
- provideNgIconsConfig({
33063
- size: '1.5em',
33064
- }),
33065
- ], 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" }]
33066
- }], ctorParameters: () => [{ type: undefined, decorators: [{
33067
- type: Inject,
33068
- args: [DO_NOT_USE_DEFAULT_BASEMAP]
33069
- }] }, { type: undefined, decorators: [{
33070
- type: Inject,
33071
- args: [BASEMAP_LAYERS]
33072
- }] }, { type: undefined, decorators: [{
33073
- type: Inject,
33074
- args: [MAP_VIEW_CONSTRAINTS]
33075
- }] }], propDecorators: { context: [{
33076
- type: Input
33077
- }], featuresClick: [{
33078
- type: Output
33079
- }], featuresHover: [{
33080
- type: Output
33081
- }], mapClick: [{
33082
- type: Output
33083
- }], container: [{
33084
- type: ViewChild,
33085
- args: ['map']
33086
- }] } });
33087
-
33088
- const geometryKeys = ['geometry', 'the_geom'];
33089
- class FeatureDetailComponent {
33090
- get properties() {
33091
- if (!this.feature)
33092
- return [];
33093
- return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
33094
- }
33095
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33096
- 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 }); }
33097
- }
33098
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
33099
- type: Component,
33100
- 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"] }]
33101
- }], propDecorators: { feature: [{
33102
- type: Input
33103
- }] } });
33104
-
33105
- class MapLegendComponent {
33106
- constructor() {
33107
- this.legendStatusChange = new EventEmitter();
33108
- }
33109
- async ngOnChanges(changes) {
33110
- if ('context' in changes) {
33111
- const mapContext = changes['context'].currentValue;
33112
- if (mapContext.layers && mapContext.layers.length > 0) {
33113
- const mapContextLayer = mapContext.layers[0];
33114
- this.legendHTML = await createLegendFromLayer(mapContextLayer);
33115
- if (this.legendHTML) {
33116
- this.legendStatusChange.emit(true);
33117
- }
33118
- }
33119
- }
33120
- }
33121
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33122
- 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 }); }
33123
- }
33124
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
33125
- type: Component,
33126
- 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"] }]
33127
- }], propDecorators: { context: [{
33128
- type: Input
33129
- }], legendStatusChange: [{
33130
- type: Output
33131
- }] } });
33132
-
33133
- function prioritizePageScroll(interactions) {
33134
- interactions.clear();
33135
- interactions.extend(defaults({
33136
- // remove rotate interactions
33137
- altShiftDragRotate: false,
33138
- pinchRotate: false,
33139
- // replace drag and zoom interactions
33140
- dragPan: false,
33141
- mouseWheelZoom: false,
33142
- })
33143
- .extend([
33144
- new DragPan({
33145
- condition: dragPanCondition,
33146
- }),
33147
- new MouseWheelZoom({
33148
- condition: mouseWheelZoomCondition,
33149
- }),
33150
- ])
33151
- .getArray());
33152
- }
33153
- function dragPanCondition(event) {
33154
- const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
33155
- if (!dragPanCondition) {
33156
- this.getMap().dispatchEvent('mapmuted');
33157
- }
33158
- // combine the condition with the default DragPan conditions
33159
- return dragPanCondition && noModifierKeys(event) && primaryAction(event);
33160
- }
33161
- function mouseWheelZoomCondition(event) {
33162
- if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
33163
- this.getMap().dispatchEvent('mapmuted');
33164
- }
33165
- return platformModifierKeyOnly(event);
33166
- }
33167
-
33168
33997
  class MapStateContainerComponent {
33169
33998
  constructor(mapFacade) {
33170
33999
  this.mapFacade = mapFacade;
@@ -33178,7 +34007,7 @@ class MapStateContainerComponent {
33178
34007
  this.mapFacade.selectFeatures(features);
33179
34008
  }
33180
34009
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapStateContainerComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
33181
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapStateContainerComponent, isStandalone: true, selector: "gn-ui-map-state-container", ngImport: i0, template: "<gn-ui-map-container\n [context]=\"context$ | async\"\n (featuresClick)=\"handleFeaturesClicked($event)\"\n></gn-ui-map-container>\n", styles: [""], dependencies: [{ kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34010
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapStateContainerComponent, isStandalone: true, selector: "gn-ui-map-state-container", ngImport: i0, template: "<gn-ui-map-container\n [context]=\"context$ | async\"\n (featuresClick)=\"handleFeaturesClicked($event)\"\n></gn-ui-map-container>\n", styles: [""], dependencies: [{ kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33182
34011
  }
33183
34012
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapStateContainerComponent, decorators: [{
33184
34013
  type: Component,
@@ -33194,7 +34023,7 @@ class MapUtilsService {
33194
34023
  return null;
33195
34024
  }
33196
34025
  // extend all the spatial extents into an including bbox
33197
- const totalExtent = record.spatialExtents.reduce((prev, curr) => {
34026
+ return record.spatialExtents.reduce((prev, curr) => {
33198
34027
  if ('bbox' in curr)
33199
34028
  return extend(prev, curr.bbox);
33200
34029
  else if ('geometry' in curr) {
@@ -33203,7 +34032,6 @@ class MapUtilsService {
33203
34032
  }
33204
34033
  return prev;
33205
34034
  }, [Infinity, Infinity, -Infinity, -Infinity]);
33206
- return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857');
33207
34035
  }
33208
34036
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapUtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
33209
34037
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapUtilsService, providedIn: 'root' }); }
@@ -34921,6 +35749,9 @@ ${body}`
34921
35749
  : `${code}`;
34922
35750
  return new FetchError('http', info, code);
34923
35751
  }
35752
+ static forbidden(code) {
35753
+ return new FetchError('forbidden', '', code);
35754
+ }
34924
35755
  static corsOrNetwork(message) {
34925
35756
  return new FetchError('network', message, 0);
34926
35757
  }
@@ -35520,6 +36351,33 @@ class GmlReader extends BaseFileReader {
35520
36351
  }
35521
36352
  }
35522
36353
 
36354
+ async function getWfsEndpoint(wfsUrl) {
36355
+ try {
36356
+ return await new WfsEndpoint(wfsUrl).isReady();
36357
+ }
36358
+ catch (e) {
36359
+ if (e instanceof Error &&
36360
+ 'isCrossOriginRelated' in e &&
36361
+ 'httpStatus' in e) {
36362
+ const error = e;
36363
+ if (error.isCrossOriginRelated === true) {
36364
+ throw new Error(`wfs.unreachable.cors`);
36365
+ }
36366
+ if (error.httpStatus === 401 || error.httpStatus === 403) {
36367
+ throw FetchError.forbidden(error.httpStatus);
36368
+ }
36369
+ else if (error.httpStatus === 400 || error.httpStatus > 403) {
36370
+ throw FetchError.http(error.httpStatus);
36371
+ }
36372
+ else {
36373
+ throw FetchError.unknownType();
36374
+ }
36375
+ }
36376
+ else {
36377
+ throw FetchError.unknownType();
36378
+ }
36379
+ }
36380
+ }
35523
36381
  class WfsReader extends BaseCacheReader {
35524
36382
  constructor(url, wfsEndpoint, featureTypeName, cacheActive) {
35525
36383
  super(url, cacheActive);
@@ -35548,7 +36406,7 @@ class WfsReader extends BaseCacheReader {
35548
36406
  }));
35549
36407
  }
35550
36408
  static async createReader(wfsUrlEndpoint, featureTypeName) {
35551
- const wfsEndpoint = await new WfsEndpoint(wfsUrlEndpoint).isReady();
36409
+ const wfsEndpoint = await getWfsEndpoint(wfsUrlEndpoint);
35552
36410
  const featureTypes = wfsEndpoint.getFeatureTypes();
35553
36411
  const featureType = wfsEndpoint.getFeatureTypeSummary(featureTypes.length === 1 && !featureTypeName
35554
36412
  ? featureTypes[0].name
@@ -35647,7 +36505,11 @@ async function openDataset(url, typeHint, options, cacheActive) {
35647
36505
  return reader;
35648
36506
  }
35649
36507
  catch (e) {
35650
- throw FetchError.parsingFailed(e.message);
36508
+ //WfsReader may already raise a FetchError
36509
+ if (e instanceof FetchError)
36510
+ throw e;
36511
+ else
36512
+ throw FetchError.parsingFailed(e.message);
35651
36513
  }
35652
36514
  }
35653
36515
  /**
@@ -35677,6 +36539,7 @@ function readDatasetHeaders(url) {
35677
36539
 
35678
36540
  marker('wfs.unreachable.cors');
35679
36541
  marker('wfs.unreachable.http');
36542
+ marker('dataset.error.forbidden');
35680
36543
  marker('wfs.unreachable.unknown');
35681
36544
  marker('wfs.featuretype.notfound');
35682
36545
  marker('wfs.geojsongml.notsupported');
@@ -36446,6 +37309,10 @@ class ChartViewComponent {
36446
37309
  this.dataset$ = this.currentLink$.pipe(filter((link) => !!link), switchMap$1((link) => {
36447
37310
  this.error = null;
36448
37311
  this.loading = true;
37312
+ if (link.accessRestricted) {
37313
+ this.handleError('dataset.error.restrictedAccess');
37314
+ return EMPTY;
37315
+ }
36449
37316
  return this.dataService.getDataset(link, this.cacheActive).pipe(catchError((error) => {
36450
37317
  this.handleError(error);
36451
37318
  return EMPTY;
@@ -36515,7 +37382,7 @@ class ChartViewComponent {
36515
37382
  this.changeDetector.detectChanges();
36516
37383
  }
36517
37384
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChartViewComponent, deps: [{ token: DataService }, { token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
36518
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n *ngIf=\"!isCountAggregation\"\n [choices]=\"yChoices$ | async\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\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: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37385
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n *ngIf=\"!isCountAggregation\"\n [choices]=\"yChoices$ | async\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-chart\n *ngIf=\"!error\"\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\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: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36519
37386
  }
36520
37387
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChartViewComponent, decorators: [{
36521
37388
  type: Component,
@@ -36526,7 +37393,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
36526
37393
  ChartComponent,
36527
37394
  LoadingMaskComponent,
36528
37395
  PopupAlertComponent,
36529
- ], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n *ngIf=\"!isCountAggregation\"\n [choices]=\"yChoices$ | async\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n" }]
37396
+ ], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n *ngIf=\"!isCountAggregation\"\n [choices]=\"yChoices$ | async\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-chart\n *ngIf=\"!error\"\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n" }]
36530
37397
  }], ctorParameters: () => [{ type: DataService }, { type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { cacheActive: [{
36531
37398
  type: Input
36532
37399
  }], link: [{
@@ -36680,7 +37547,7 @@ class GeoTableViewComponent {
36680
37547
  this.subscription.unsubscribe();
36681
37548
  }
36682
37549
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GeoTableViewComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
36683
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeoTableViewComponent, isStandalone: true, selector: "gn-ui-geo-table-view", inputs: { dataset: "dataset" }, viewQueries: [{ propertyName: "uiTable", first: true, predicate: ["table"], descendants: true }, { propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-row h-full overflow-auto\">\n <gn-ui-data-table\n #table\n class=\"w-1/2 overflow-auto\"\n [dataset]=\"dataset\"\n [activeId]=\"selectionId\"\n (selected)=\"onTableSelect($event)\"\n ></gn-ui-data-table>\n <gn-ui-map-container\n #mapContainer\n class=\"w-1/2 h-full\"\n [context]=\"mapContext\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n ></gn-ui-map-container>\n <gn-ui-feature-detail\n style=\"width: 300px\"\n class=\"p-3 shrink-0 overflow-auto\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: DataTableComponent, selector: "gn-ui-data-table", inputs: ["dataset", "activeId"], outputs: ["selected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37550
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeoTableViewComponent, isStandalone: true, selector: "gn-ui-geo-table-view", inputs: { dataset: "dataset" }, viewQueries: [{ propertyName: "uiTable", first: true, predicate: ["table"], descendants: true }, { propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-row h-full overflow-auto\">\n <gn-ui-data-table\n #table\n class=\"w-1/2 overflow-auto\"\n [dataset]=\"dataset\"\n [activeId]=\"selectionId\"\n (selected)=\"onTableSelect($event)\"\n ></gn-ui-data-table>\n <gn-ui-map-container\n #mapContainer\n class=\"w-1/2 h-full\"\n [context]=\"mapContext\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n ></gn-ui-map-container>\n <gn-ui-feature-detail\n style=\"width: 300px\"\n class=\"p-3 shrink-0 overflow-auto\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: DataTableComponent, selector: "gn-ui-data-table", inputs: ["dataset", "activeId"], outputs: ["selected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36684
37551
  }
36685
37552
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GeoTableViewComponent, decorators: [{
36686
37553
  type: Component,
@@ -36710,6 +37577,10 @@ class TableViewComponent {
36710
37577
  this.error = null;
36711
37578
  if (!link)
36712
37579
  return of(undefined);
37580
+ if (link.accessRestricted) {
37581
+ this.handleError('dataset.error.restrictedAccess');
37582
+ return of([]);
37583
+ }
36713
37584
  this.loading = true;
36714
37585
  return this.getDatasetReader(link).pipe(catchError((error) => {
36715
37586
  this.handleError(error);
@@ -36743,7 +37614,7 @@ class TableViewComponent {
36743
37614
  this.loading = false;
36744
37615
  }
36745
37616
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableViewComponent, deps: [{ token: DataService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
36746
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableViewComponent, isStandalone: true, selector: "gn-ui-table-view", inputs: { cacheActive: "cacheActive", link: "link" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div class=\"relative h-full\">\n <gn-ui-data-table\n *ngIf=\"tableData$ | async as dataset\"\n class=\"overflow-auto grow\"\n [dataset]=\"dataset\"\n (selected)=\"onTableSelect($event)\"\n ></gn-ui-data-table>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'table.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "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: DataTableComponent, selector: "gn-ui-data-table", inputs: ["dataset", "activeId"], outputs: ["selected"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37617
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableViewComponent, isStandalone: true, selector: "gn-ui-table-view", inputs: { cacheActive: "cacheActive", link: "link" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div class=\"relative h-full\">\n <gn-ui-data-table\n *ngIf=\"tableData$ | async as dataset\"\n class=\"overflow-auto grow\"\n [dataset]=\"dataset\"\n (selected)=\"onTableSelect($event)\"\n ></gn-ui-data-table>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'table.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <ng-content *ngIf=\"error\">\n <div class=\"border border-gray-300 rounded-lg bg-white h-full\"></div>\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </ng-content>\n </div>\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: DataTableComponent, selector: "gn-ui-data-table", inputs: ["dataset", "activeId"], outputs: ["selected"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36747
37618
  }
36748
37619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableViewComponent, decorators: [{
36749
37620
  type: Component,
@@ -36753,7 +37624,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
36753
37624
  LoadingMaskComponent,
36754
37625
  PopupAlertComponent,
36755
37626
  TranslateModule,
36756
- ], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div class=\"relative h-full\">\n <gn-ui-data-table\n *ngIf=\"tableData$ | async as dataset\"\n class=\"overflow-auto grow\"\n [dataset]=\"dataset\"\n (selected)=\"onTableSelect($event)\"\n ></gn-ui-data-table>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'table.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n" }]
37627
+ ], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div class=\"relative h-full\">\n <gn-ui-data-table\n *ngIf=\"tableData$ | async as dataset\"\n class=\"overflow-auto grow\"\n [dataset]=\"dataset\"\n (selected)=\"onTableSelect($event)\"\n ></gn-ui-data-table>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'table.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <ng-content *ngIf=\"error\">\n <div class=\"border border-gray-300 rounded-lg bg-white h-full\"></div>\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </ng-content>\n </div>\n</div>\n" }]
36757
37628
  }], ctorParameters: () => [{ type: DataService }, { type: i1$1.TranslateService }], propDecorators: { cacheActive: [{
36758
37629
  type: Input
36759
37630
  }], link: [{
@@ -36787,15 +37658,13 @@ class MdViewFacade {
36787
37658
  this.error$ = this.store.pipe(select(getMetadataError));
36788
37659
  this.related$ = this.store.pipe(select(getRelated));
36789
37660
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
36790
- this.allLinks$ = this.metadata$.pipe(map$1((record) => record.kind === 'dataset' && 'onlineResources' in record
36791
- ? record.onlineResources
36792
- : []));
37661
+ this.allLinks$ = this.metadata$.pipe(map$1((record) => ('onlineResources' in record ? record.onlineResources : [])));
36793
37662
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links
36794
37663
  .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
36795
37664
  // Put links to IGN Géoplateforme first
36796
37665
  .sort((dd1, dd2) => {
36797
- return dd2.accessServiceProtocol ===
36798
- 'GPFDL'
37666
+ return dd2
37667
+ .accessServiceProtocol === 'GPFDL'
36799
37668
  ? 1
36800
37669
  : undefined; // do not change the sorting otherwise
36801
37670
  })));
@@ -36866,15 +37735,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
36866
37735
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }, { type: DataService }] });
36867
37736
 
36868
37737
  class MdViewEffects {
36869
- constructor(actions$, recordsRepository, platformServiceInterface) {
37738
+ constructor(actions$, recordsRepository, platformServiceInterface, router) {
36870
37739
  this.actions$ = actions$;
36871
37740
  this.recordsRepository = recordsRepository;
36872
37741
  this.platformServiceInterface = platformServiceInterface;
37742
+ this.router = router;
36873
37743
  /*
36874
37744
  Metadata effects
36875
37745
  */
36876
37746
  this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getRecord(uuid)), map$1((record) => {
36877
- if (record === null) {
37747
+ if (record === null || !this.router.url.includes(record.kind)) {
36878
37748
  return loadFullMetadataFailure({ notFound: true });
36879
37749
  }
36880
37750
  return loadFullMetadataSuccess({ full: record });
@@ -36909,12 +37779,12 @@ class MdViewEffects {
36909
37779
  }));
36910
37780
  })))));
36911
37781
  }
36912
- 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 }); }
37782
+ 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 }); }
36913
37783
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects }); }
36914
37784
  }
36915
37785
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, decorators: [{
36916
37786
  type: Injectable
36917
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }] });
37787
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }, { type: i1$d.Router }] });
36918
37788
 
36919
37789
  class CatalogTitleComponent {
36920
37790
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CatalogTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -36971,11 +37841,11 @@ class LanguageSwitcherComponent {
36971
37841
  this.translate.use(value);
36972
37842
  }
36973
37843
  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 }); }
36974
- 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"] }] }); }
37844
+ 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"] }] }); }
36975
37845
  }
36976
37846
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
36977
37847
  type: Component,
36978
- 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" }]
37848
+ 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" }]
36979
37849
  }], ctorParameters: () => [{ type: undefined, decorators: [{
36980
37850
  type: Optional
36981
37851
  }, {
@@ -37397,17 +38267,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37397
38267
  }]
37398
38268
  }] });
37399
38269
 
37400
- const GN_UI_VERSION = new InjectionToken('gnUiVersion');
37401
-
37402
38270
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
37403
38271
  class DataViewPermalinkComponent {
37404
38272
  set viewType(value) {
37405
38273
  this.viewType$.next(value);
37406
38274
  }
37407
- constructor(config, wcEmbedderBaseUrl, version, facade) {
38275
+ constructor(config, wcEmbedderBaseUrl, facade) {
37408
38276
  this.config = config;
37409
38277
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
37410
- this.version = version;
37411
38278
  this.facade = facade;
37412
38279
  this.viewType$ = new BehaviorSubject('map');
37413
38280
  this.permalinkUrl$ = combineLatest([
@@ -37416,7 +38283,7 @@ class DataViewPermalinkComponent {
37416
38283
  this.facade.metadata$,
37417
38284
  ]).pipe(map$2(([viewType, config, metadata]) => {
37418
38285
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
37419
- url.searchParams.set('v', `${this.version}`);
38286
+ url.searchParams.set('v', `${GEONETWORK_UI_TAG_NAME}`);
37420
38287
  if (viewType === 'chart') {
37421
38288
  if (config) {
37422
38289
  const { aggregation, xProperty, yProperty, chartType } = config;
@@ -37447,7 +38314,7 @@ class DataViewPermalinkComponent {
37447
38314
  return url.toString();
37448
38315
  }));
37449
38316
  }
37450
- 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 }); }
38317
+ 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 }); }
37451
38318
  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 }); }
37452
38319
  }
37453
38320
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
@@ -37461,9 +38328,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37461
38328
  }, {
37462
38329
  type: Inject,
37463
38330
  args: [WEB_COMPONENT_EMBEDDER_URL]
37464
- }] }, { type: undefined, decorators: [{
37465
- type: Inject,
37466
- args: [GN_UI_VERSION]
37467
38331
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37468
38332
  type: Input
37469
38333
  }] } });
@@ -37542,16 +38406,15 @@ class DataViewWebComponentComponent {
37542
38406
  set viewType(value) {
37543
38407
  this.viewType$.next(value);
37544
38408
  }
37545
- constructor(config, version, facade) {
38409
+ constructor(config, facade) {
37546
38410
  this.config = config;
37547
- this.version = version;
37548
38411
  this.facade = facade;
37549
38412
  this.viewType$ = new BehaviorSubject('map');
37550
38413
  this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
37551
38414
  if (viewType === 'chart') {
37552
38415
  if (config) {
37553
38416
  const { aggregation, xProperty, yProperty, chartType } = config;
37554
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38417
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37555
38418
  <gn-dataset-view-chart
37556
38419
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37557
38420
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37570,7 +38433,7 @@ class DataViewWebComponentComponent {
37570
38433
  return '';
37571
38434
  }
37572
38435
  else if (viewType === 'table') {
37573
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38436
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37574
38437
  <gn-dataset-view-table
37575
38438
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37576
38439
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37583,7 +38446,7 @@ class DataViewWebComponentComponent {
37583
38446
  ></gn-dataset-view-table>`;
37584
38447
  }
37585
38448
  else {
37586
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38449
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37587
38450
  <gn-dataset-view-map
37588
38451
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37589
38452
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37597,7 +38460,7 @@ class DataViewWebComponentComponent {
37597
38460
  }
37598
38461
  }));
37599
38462
  }
37600
- 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 }); }
38463
+ 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 }); }
37601
38464
  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 }); }
37602
38465
  }
37603
38466
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
@@ -37606,9 +38469,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37606
38469
  }], ctorParameters: () => [{ type: Configuration, decorators: [{
37607
38470
  type: Inject,
37608
38471
  args: [Configuration]
37609
- }] }, { type: undefined, decorators: [{
37610
- type: Inject,
37611
- args: [GN_UI_VERSION]
37612
38472
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37613
38473
  type: Input
37614
38474
  }] } });
@@ -37704,6 +38564,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37704
38564
 
37705
38565
  marker('map.dropdown.placeholder');
37706
38566
  marker('wfs.feature.limit');
38567
+ marker('dataset.error.restrictedAccess');
37707
38568
  class MapViewComponent {
37708
38569
  set exceedsLimit(value) {
37709
38570
  this.excludeWfs$.next(value);
@@ -37713,15 +38574,13 @@ class MapViewComponent {
37713
38574
  }
37714
38575
  onLegendStatusChange(status) {
37715
38576
  this.legendExists = status;
37716
- if (!status) {
37717
- this.showLegend = false;
37718
- }
37719
38577
  }
37720
- constructor(mdViewFacade, mapUtils, dataService, changeRef) {
38578
+ constructor(mdViewFacade, mapUtils, dataService, changeRef, translateService) {
37721
38579
  this.mdViewFacade = mdViewFacade;
37722
38580
  this.mapUtils = mapUtils;
37723
38581
  this.dataService = dataService;
37724
38582
  this.changeRef = changeRef;
38583
+ this.translateService = translateService;
37725
38584
  this.displaySource = true;
37726
38585
  this.excludeWfs$ = new BehaviorSubject(false);
37727
38586
  this.hidePreview = false;
@@ -37757,9 +38616,12 @@ class MapViewComponent {
37757
38616
  this.hidePreview = false;
37758
38617
  this.loading = true;
37759
38618
  this.error = null;
38619
+ if (link.accessRestricted) {
38620
+ this.handleError('dataset.error.restrictedAccess');
38621
+ return of([]);
38622
+ }
37760
38623
  return this.getLayerFromLink(link).pipe(map$1((layer) => [layer]), catchError((e) => {
37761
- this.error = e.message;
37762
- console.warn(e.stack || e.message);
38624
+ this.handleError(e);
37763
38625
  return of([]);
37764
38626
  }), finalize(() => (this.loading = false)));
37765
38627
  }));
@@ -37796,6 +38658,16 @@ class MapViewComponent {
37796
38658
  }
37797
38659
  this.changeRef.detectChanges();
37798
38660
  }
38661
+ onSourceLoadError(error) {
38662
+ if (error.httpStatus === 403 || error.httpStatus === 401) {
38663
+ this.error = this.translateService.instant(`dataset.error.forbidden`);
38664
+ }
38665
+ else {
38666
+ this.error = this.translateService.instant(`dataset.error.http`, {
38667
+ info: error.httpStatus,
38668
+ });
38669
+ }
38670
+ }
37799
38671
  resetSelection() {
37800
38672
  if (this.selection) {
37801
38673
  // FIXME: restore styling of selected feature
@@ -37835,8 +38707,26 @@ class MapViewComponent {
37835
38707
  selectLinkToDisplay(link) {
37836
38708
  this.selectedLinkIndex$.next(link);
37837
38709
  }
37838
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapUtilsService }, { token: DataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
37839
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", displaySource: "displaySource" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end\">\n <gn-ui-dropdown-selector\n [ngClass]=\"{ hidden: !displaySource }\"\n class=\"truncate p-1 -mx-1 mb-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\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: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { 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: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }], viewProviders: [provideIcons({ matClose })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
38710
+ handleError(error) {
38711
+ if (error instanceof FetchError) {
38712
+ this.error = this.translateService.instant(`dataset.error.${error.type}`, {
38713
+ info: error.info,
38714
+ });
38715
+ console.warn(error.message);
38716
+ }
38717
+ else if (error instanceof Error) {
38718
+ this.error = this.translateService.instant(error.message);
38719
+ console.warn(error.stack || error);
38720
+ }
38721
+ else {
38722
+ this.error = this.translateService.instant(error);
38723
+ console.warn(error);
38724
+ }
38725
+ this.loading = false;
38726
+ this.changeRef.detectChanges();
38727
+ }
38728
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapUtilsService }, { token: DataService }, { token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
38729
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", displaySource: "displaySource" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end\">\n <gn-ui-dropdown-selector\n [ngClass]=\"{ hidden: !displaySource }\"\n class=\"truncate p-1 -mx-1 mb-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\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: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { 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: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }], viewProviders: [provideIcons({ matClose })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37840
38730
  }
37841
38731
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapViewComponent, decorators: [{
37842
38732
  type: Component,
@@ -37852,8 +38742,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37852
38742
  ExternalViewerButtonComponent,
37853
38743
  ButtonComponent,
37854
38744
  MapLegendComponent,
37855
- ], viewProviders: [provideIcons({ matClose })], template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end\">\n <gn-ui-dropdown-selector\n [ngClass]=\"{ hidden: !displaySource }\"\n class=\"truncate p-1 -mx-1 mb-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\n</div>\n" }]
37856
- }], ctorParameters: () => [{ type: MdViewFacade }, { type: MapUtilsService }, { type: DataService }, { type: i0.ChangeDetectorRef }], propDecorators: { exceedsLimit: [{
38745
+ ], viewProviders: [provideIcons({ matClose })], template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end\">\n <gn-ui-dropdown-selector\n [ngClass]=\"{ hidden: !displaySource }\"\n class=\"truncate p-1 -mx-1 mb-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\n</div>\n" }]
38746
+ }], ctorParameters: () => [{ type: MdViewFacade }, { type: MapUtilsService }, { type: DataService }, { type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { exceedsLimit: [{
37857
38747
  type: Input
37858
38748
  }], displaySource: [{
37859
38749
  type: Input
@@ -38079,7 +38969,7 @@ class RecordMetaComponent {
38079
38969
  this.meta.removeTag('property="og:url"');
38080
38970
  this.meta.removeTag('property="og:title"');
38081
38971
  }
38082
- 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 }); }
38972
+ 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 }); }
38083
38973
  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 }); }
38084
38974
  }
38085
38975
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, decorators: [{
@@ -38090,7 +38980,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
38090
38980
  changeDetection: ChangeDetectionStrategy.OnPush,
38091
38981
  standalone: true,
38092
38982
  }]
38093
- }], ctorParameters: () => [{ type: i1$d.Meta }], propDecorators: { metadata: [{
38983
+ }], ctorParameters: () => [{ type: i1$e.Meta }], propDecorators: { metadata: [{
38094
38984
  type: Input
38095
38985
  }] } });
38096
38986
 
@@ -39138,7 +40028,7 @@ class ImportRecordComponent {
39138
40028
  },
39139
40029
  });
39140
40030
  }
39141
- 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 }); }
40031
+ 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 }); }
39142
40032
  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: [
39143
40033
  provideIcons({
39144
40034
  iconoirImport,
@@ -39169,7 +40059,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39169
40059
  size: '1.5em',
39170
40060
  }),
39171
40061
  ], 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" }]
39172
- }], ctorParameters: () => [{ type: i1$e.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
40062
+ }], ctorParameters: () => [{ type: i1$d.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
39173
40063
  type: Output
39174
40064
  }] } });
39175
40065
 
@@ -39533,75 +40423,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39533
40423
  args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-array works!</p>\n" }]
39534
40424
  }] });
39535
40425
 
39536
- class FormFieldMapContainerComponent {
39537
- constructor() {
39538
- this.spatialExtents$ = new BehaviorSubject([]);
39539
- this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
39540
- if (extents.length === 0) {
39541
- return null; // null extent means default view
39542
- }
39543
- const featureCollection = {
39544
- type: 'FeatureCollection',
39545
- features: [],
39546
- };
39547
- extents.forEach((extent) => {
39548
- if (extent.geometry) {
39549
- featureCollection.features.push({
39550
- type: 'Feature',
39551
- properties: {},
39552
- geometry: extent.geometry,
39553
- });
39554
- }
39555
- else if (extent.bbox?.length >= 0) {
39556
- featureCollection.features.push({
39557
- type: 'Feature',
39558
- properties: {},
39559
- geometry: this.bboxCoordsToGeometry(extent.bbox),
39560
- });
39561
- }
39562
- });
39563
- const layer = {
39564
- type: 'geojson',
39565
- data: featureCollection,
39566
- label: 'Spatial extents',
39567
- style: {
39568
- 'stroke-color': 'black',
39569
- 'stroke-width': 2,
39570
- },
39571
- };
39572
- const view = await createViewFromLayer(layer);
39573
- return {
39574
- view,
39575
- layers: [layer],
39576
- };
39577
- }));
39578
- this.error = '';
39579
- }
39580
- set spatialExtents(value) {
39581
- this.spatialExtents$.next(value);
39582
- }
39583
- bboxCoordsToGeometry(bbox) {
39584
- const geometry = new Polygon([
39585
- [
39586
- [bbox[0], bbox[1]],
39587
- [bbox[0], bbox[3]],
39588
- [bbox[2], bbox[3]],
39589
- [bbox[2], bbox[1]],
39590
- [bbox[0], bbox[1]],
39591
- ],
39592
- ]);
39593
- return new GeoJSON().writeGeometryObject(geometry);
39594
- }
39595
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39596
- 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39597
- }
39598
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, decorators: [{
39599
- type: Component,
39600
- 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" }]
39601
- }], propDecorators: { spatialExtents: [{
39602
- type: Input
39603
- }] } });
39604
-
39605
40426
  /**
39606
40427
  * This form field is not like the others, as it will read directly from the state to handle both spatial extents
39607
40428
  * and place keywords.
@@ -39698,16 +40519,16 @@ class FormFieldSpatialExtentComponent {
39698
40519
  this.editorFacade.updateRecordField('spatialExtents', spatialExtents);
39699
40520
  }
39700
40521
  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 }); }
39701
- 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 }); }
40522
+ 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 }); }
39702
40523
  }
39703
40524
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
39704
40525
  type: Component,
39705
40526
  args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
39706
40527
  CommonModule,
39707
40528
  GenericKeywordsComponent,
39708
- FormFieldMapContainerComponent,
39709
40529
  TranslateModule,
39710
- ], 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" }]
40530
+ SpatialExtentComponent,
40531
+ ], 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" }]
39711
40532
  }], ctorParameters: () => [{ type: PlatformServiceInterface }, { type: EditorFacade }, { type: i1$1.TranslateService }] });
39712
40533
 
39713
40534
  class ContactCardComponent {
@@ -39965,9 +40786,8 @@ class OnlineResourceCardComponent {
39965
40786
  get subtitle() {
39966
40787
  switch (this.onlineResource.type) {
39967
40788
  case 'service':
39968
- return `${this.onlineResource.accessServiceProtocol}`;
39969
40789
  case 'endpoint':
39970
- return `${this.onlineResource.protocol}`;
40790
+ return `${this.onlineResource.accessServiceProtocol}`;
39971
40791
  case 'link':
39972
40792
  case 'download':
39973
40793
  return this.getFormat(this.onlineResource);
@@ -41124,6 +41944,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41124
41944
  const ROUTER_STATE_KEY = 'router';
41125
41945
  const ROUTER_ROUTE_SEARCH = 'search';
41126
41946
  const ROUTER_ROUTE_DATASET = 'dataset';
41947
+ const ROUTER_ROUTE_SERVICE = 'service';
41948
+ const ROUTER_ROUTE_REUSE = 'reuse';
41127
41949
  const ROUTER_ROUTE_ORGANIZATION = 'organization';
41128
41950
  var ROUTE_PARAMS;
41129
41951
  (function (ROUTE_PARAMS) {
@@ -41156,6 +41978,14 @@ class RouterService {
41156
41978
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
41157
41979
  component: this.routerConfig.recordRouteComponent,
41158
41980
  },
41981
+ {
41982
+ path: `${ROUTER_ROUTE_SERVICE}/:metadataUuid`,
41983
+ component: this.routerConfig.recordRouteComponent,
41984
+ },
41985
+ {
41986
+ path: `${ROUTER_ROUTE_REUSE}/:metadataUuid`,
41987
+ component: this.routerConfig.recordRouteComponent,
41988
+ },
41159
41989
  {
41160
41990
  path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
41161
41991
  component: this.routerConfig.organizationRouteComponent,
@@ -41168,7 +41998,7 @@ class RouterService {
41168
41998
  getOrganizationPageRoute() {
41169
41999
  return ROUTER_ROUTE_ORGANIZATION;
41170
42000
  }
41171
- 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 }); }
42001
+ 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 }); }
41172
42002
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
41173
42003
  }
41174
42004
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, decorators: [{
@@ -41179,7 +42009,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41179
42009
  }], ctorParameters: () => [{ type: undefined, decorators: [{
41180
42010
  type: Inject,
41181
42011
  args: [ROUTER_CONFIG]
41182
- }] }, { type: i1$e.Router }] });
42012
+ }] }, { type: i1$d.Router }] });
41183
42013
 
41184
42014
  const goAction = createAction('[Router] Go', props());
41185
42015
  const backAction = createAction('[Router] Back');
@@ -41251,13 +42081,19 @@ class RouterFacade {
41251
42081
  this.currentRoute$ = this.store.pipe(select(selectCurrentRoute));
41252
42082
  this.pathParams$ = this.store.pipe(select(selectRouteParams));
41253
42083
  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));
42084
+ this.routeMap = {
42085
+ dataset: ROUTER_ROUTE_DATASET,
42086
+ service: ROUTER_ROUTE_SERVICE,
42087
+ reuse: ROUTER_ROUTE_REUSE,
42088
+ };
41254
42089
  }
41255
42090
  goToMetadata(metadata) {
42091
+ const selectedRoute = this.routeMap[metadata.kind] || ROUTER_ROUTE_DATASET;
41256
42092
  this.pathParams$
41257
42093
  .pipe(take(1), filter((params) => params.metadataUuid !== metadata.uniqueIdentifier))
41258
42094
  .subscribe(() => {
41259
42095
  this.go({
41260
- path: `${ROUTER_ROUTE_DATASET}/${metadata.uniqueIdentifier}`,
42096
+ path: `${selectedRoute}/${metadata.uniqueIdentifier}`,
41261
42097
  });
41262
42098
  this.store.dispatch(setIncompleteMetadata({ incomplete: metadata }));
41263
42099
  });
@@ -41484,12 +42320,12 @@ class RouterEffects {
41484
42320
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
41485
42321
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
41486
42322
  }
41487
- 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 }); }
42323
+ 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 }); }
41488
42324
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
41489
42325
  }
41490
42326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
41491
42327
  type: Injectable
41492
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$e.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
42328
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$d.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
41493
42329
  type: Inject,
41494
42330
  args: [ROUTER_CONFIG]
41495
42331
  }] }, { type: FieldsService }] });
@@ -41549,5 +42385,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41549
42385
  * Generated bundle index. Do not edit.
41550
42386
  */
41551
42387
 
41552
- 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 };
42388
+ 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 };
41553
42389
  //# sourceMappingURL=geonetwork-ui.mjs.map