geonetwork-ui 2.6.0-dev.582b4530a → 2.6.0-dev.70b25ba3b

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 (305) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +1 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/common/resource-types.mjs +17 -15
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -4
  7. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -10
  8. package/esm2022/libs/api/repository/src/lib/gn4/gn4.provider.mjs +7 -1
  9. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +2 -3
  11. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +1 -1
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -5
  13. package/esm2022/libs/feature/record/src/index.mjs +1 -2
  14. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +5 -9
  15. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +7 -11
  16. package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +1 -1
  17. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +8 -5
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -6
  19. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +3 -1
  20. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  21. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +10 -2
  22. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -3
  23. package/esm2022/libs/feature/search/src/index.mjs +2 -2
  24. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +8 -7
  25. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +13 -19
  26. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -2
  27. package/esm2022/libs/feature/search/src/lib/results-hits/results-hits.container.component.mjs +41 -0
  28. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +26 -10
  29. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +70 -1
  30. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +4 -3
  31. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  32. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  33. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  34. package/esm2022/libs/ui/elements/src/lib/download-item/download-item.component.mjs +3 -3
  35. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +18 -7
  36. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +3 -3
  37. package/esm2022/libs/ui/elements/src/lib/kind-badge/kind-badge.component.mjs +51 -0
  38. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +3 -3
  39. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  40. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +8 -5
  41. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +161 -0
  42. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +16 -4
  43. package/esm2022/libs/ui/inputs/src/index.mjs +2 -2
  44. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  45. package/esm2022/libs/ui/inputs/src/lib/inline-filter/inline-filter.component.mjs +42 -0
  46. package/esm2022/libs/ui/inputs/src/lib/inline-filter/inline-filter.model.mjs +2 -0
  47. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +4 -3
  48. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +7 -2
  49. package/esm2022/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.mjs +43 -3
  50. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +48 -11
  51. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  52. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  53. package/esm2022/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +6 -6
  54. package/esm2022/libs/ui/map/src/index.mjs +2 -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/index.mjs +2 -1
  57. package/esm2022/libs/ui/search/src/lib/results-hits-number/results-hits-number.component.mjs +3 -3
  58. package/esm2022/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.mjs +53 -0
  59. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  60. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +11 -3
  61. package/esm2022/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.mjs +3 -3
  62. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +2 -1
  63. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  64. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  65. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  66. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  67. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +13 -6
  68. package/esm2022/translations/de.json +31 -5
  69. package/esm2022/translations/en.json +32 -6
  70. package/esm2022/translations/es.json +31 -5
  71. package/esm2022/translations/fr.json +32 -6
  72. package/esm2022/translations/it.json +31 -5
  73. package/esm2022/translations/nl.json +31 -5
  74. package/esm2022/translations/pt.json +31 -5
  75. package/fesm2022/geonetwork-ui.mjs +1342 -566
  76. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  77. package/libs/api/metadata-converter/src/index.d.ts +1 -0
  78. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  79. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  80. package/libs/api/metadata-converter/src/lib/common/resource-types.d.ts +21 -0
  81. package/libs/api/metadata-converter/src/lib/common/resource-types.d.ts.map +1 -1
  82. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  83. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  84. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -2
  85. package/libs/common/domain/src/lib/model/record/metadata.model.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/record/src/index.d.ts +0 -1
  91. package/libs/feature/record/src/index.d.ts.map +1 -1
  92. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  93. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  94. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  95. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  96. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  97. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  98. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  99. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  100. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  101. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  102. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  103. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  104. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  105. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  106. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  107. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  108. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  109. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  110. package/libs/feature/search/src/index.d.ts +1 -1
  111. package/libs/feature/search/src/index.d.ts.map +1 -1
  112. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  113. package/libs/feature/search/src/lib/feature-search.module.d.ts +4 -2
  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-hits/results-hits.container.component.d.ts +21 -0
  118. package/libs/feature/search/src/lib/results-hits/results-hits.container.component.d.ts.map +1 -0
  119. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  120. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  121. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -0
  122. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  123. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  124. package/libs/ui/elements/src/index.d.ts +2 -0
  125. package/libs/ui/elements/src/index.d.ts.map +1 -1
  126. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts +1 -1
  127. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts.map +1 -1
  128. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +7 -1
  129. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts.map +1 -1
  130. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts +11 -0
  131. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts.map +1 -0
  132. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +1 -1
  133. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  134. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  135. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  136. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  137. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  138. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +3 -1
  139. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  140. package/libs/ui/inputs/src/index.d.ts +1 -1
  141. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  142. package/libs/ui/inputs/src/lib/inline-filter/inline-filter.component.d.ts +14 -0
  143. package/libs/ui/inputs/src/lib/inline-filter/inline-filter.component.d.ts.map +1 -0
  144. package/libs/ui/inputs/src/lib/inline-filter/inline-filter.model.d.ts +6 -0
  145. package/libs/ui/inputs/src/lib/inline-filter/inline-filter.model.d.ts.map +1 -0
  146. package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts.map +1 -1
  147. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +25 -24
  148. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  149. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts +10 -3
  150. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts.map +1 -1
  151. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +9 -2
  152. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -1
  153. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  154. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  155. package/libs/ui/map/src/index.d.ts +1 -0
  156. package/libs/ui/map/src/index.d.ts.map +1 -1
  157. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  158. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  159. package/libs/ui/search/src/index.d.ts +1 -0
  160. package/libs/ui/search/src/index.d.ts.map +1 -1
  161. package/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.d.ts +17 -0
  162. package/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.d.ts.map +1 -0
  163. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  164. package/libs/ui/search/src/lib/ui-search.module.d.ts +21 -19
  165. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  166. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  167. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  168. package/libs/util/shared/src/index.d.ts +1 -0
  169. package/libs/util/shared/src/index.d.ts.map +1 -1
  170. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  171. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  172. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  173. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  174. package/libs/util/shared/src/lib/links/link-utils.d.ts +14 -7
  175. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  176. package/package.json +1 -1
  177. package/src/libs/api/metadata-converter/src/index.ts +1 -0
  178. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  179. package/src/libs/api/metadata-converter/src/lib/common/resource-types.ts +29 -15
  180. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  181. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  182. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  183. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  184. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  185. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  186. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  187. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  188. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  189. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -2
  190. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  191. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  192. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  193. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  194. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  195. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  196. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  197. package/src/libs/feature/record/src/index.ts +0 -1
  198. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  199. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  200. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  201. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  202. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  203. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  204. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  205. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  206. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  207. package/src/libs/feature/search/src/index.ts +1 -1
  208. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +0 -6
  209. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +16 -8
  210. package/src/libs/feature/search/src/lib/feature-search.module.ts +9 -10
  211. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  212. package/src/libs/feature/search/src/lib/results-hits/results-hits.container.component.html +16 -0
  213. package/src/libs/feature/search/src/lib/results-hits/results-hits.container.component.ts +59 -0
  214. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.css +6 -0
  215. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  216. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  217. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +4 -5
  218. package/src/libs/feature/search/src/lib/utils/service/fields.ts +99 -0
  219. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  220. package/src/libs/ui/elements/src/index.ts +2 -0
  221. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +4 -4
  222. package/src/libs/ui/elements/src/lib/download-item/download-item.component.html +8 -5
  223. package/src/libs/ui/elements/src/lib/download-item/download-item.component.ts +2 -2
  224. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +38 -7
  225. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +29 -2
  226. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +2 -2
  227. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.css +6 -0
  228. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.html +9 -0
  229. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.ts +51 -0
  230. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +5 -2
  231. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +3 -7
  232. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  233. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  234. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  235. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  236. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.css +0 -0
  237. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  238. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  239. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -0
  240. package/src/libs/ui/inputs/src/index.ts +1 -1
  241. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  242. package/src/libs/ui/inputs/src/lib/inline-filter/inline-filter.component.html +23 -0
  243. package/src/libs/ui/inputs/src/lib/inline-filter/inline-filter.component.ts +44 -0
  244. package/src/libs/ui/inputs/src/lib/inline-filter/inline-filter.model.ts +5 -0
  245. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +5 -5
  246. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.ts +2 -1
  247. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  248. package/src/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.ts +46 -2
  249. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +22 -0
  250. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +2 -2
  251. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +43 -5
  252. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +0 -1
  253. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -1
  254. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  255. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  256. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.html +17 -5
  257. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.ts +3 -3
  258. package/src/libs/ui/map/src/index.ts +1 -0
  259. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  260. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  261. 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
  262. package/src/libs/ui/search/src/index.ts +1 -0
  263. package/src/libs/ui/search/src/lib/results-hits-number/results-hits-number.component.html +1 -1
  264. package/src/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.html +24 -0
  265. package/src/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.ts +53 -0
  266. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  267. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  268. package/src/libs/ui/search/src/lib/ui-search.module.ts +5 -0
  269. package/src/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.html +2 -1
  270. package/src/libs/util/app-config/src/lib/app-config.ts +1 -0
  271. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  272. package/src/libs/util/shared/src/index.ts +1 -0
  273. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  274. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  275. package/src/libs/util/shared/src/lib/links/link-utils.ts +30 -12
  276. package/tailwind.base.config.js +3 -0
  277. package/tailwind.base.css +19 -26
  278. package/translations/de.json +31 -5
  279. package/translations/en.json +32 -6
  280. package/translations/es.json +31 -5
  281. package/translations/fr.json +32 -6
  282. package/translations/it.json +31 -5
  283. package/translations/nl.json +31 -5
  284. package/translations/pt.json +31 -5
  285. package/translations/sk.json +31 -5
  286. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  287. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  288. package/esm2022/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.mjs +0 -18
  289. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +0 -16
  290. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  291. 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
  292. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  293. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  294. package/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.d.ts +0 -9
  295. package/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.d.ts.map +0 -1
  296. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts +0 -8
  297. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts.map +0 -1
  298. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  299. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  300. package/src/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.html +0 -4
  301. package/src/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.ts +0 -10
  302. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +0 -3
  303. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +0 -9
  304. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.ts +0 -15
  305. /package/src/libs/feature/{editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.css → search/src/lib/results-hits/results-hits.container.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, NgClass, NgIf, 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, 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, startWith as startWith$1, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$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, 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';
29
+ import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirNavArrowDown, iconoirNavArrowUp, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirAppleWallet, iconoirAppleShortcuts, iconoirCode, iconoirCreditCard, 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, matArrowBackIos, matArrowForwardIos, 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, matComputerOutline, matCallOutline, matLocationOnOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matLocationSearchingOutline, matEmailOutline, matPhoneOutline, matSendOutline, matMapOutline, matCloudDownloadOutline, matHomeWorkOutline, matSwipeOutline, matLayersOutline, matAddCircleOutlineOutline } from '@ng-icons/material-icons/outline';
44
+ import { matErrorOutlineOutline, matInfoOutline, matComputerOutline, matCallOutline, matLocationOnOutline, matSwipeOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matLocationSearchingOutline, matEmailOutline, matPhoneOutline, matSendOutline, matMapOutline, matCloudDownloadOutline, matHomeWorkOutline, matLayersOutline, matAddCircleOutlineOutline } from '@ng-icons/material-icons/outline';
45
45
  import * as i2 from '@angular/material/core';
46
46
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
47
47
  import * as i1$7 from '@angular/material/checkbox';
@@ -58,11 +58,17 @@ import * as i1$b from '@angular/material/dialog';
58
58
  import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
59
59
  import * as i2$3 from '@angular/material/tabs';
60
60
  import { MatTabsModule } from '@angular/material/tabs';
61
- import * as i1$e from '@angular/router';
61
+ import * as i1$d from '@angular/router';
62
62
  import { RouterLink, RouterModule, RouteReuseStrategy } from '@angular/router';
63
63
  import { marked } from 'marked';
64
64
  import Duration from 'duration-relativetimeformat';
65
65
  import * as basicLightbox from 'basiclightbox';
66
+ import { FeaturesClickEventType, FeaturesHoverEventType, MapClickEventType, SourceLoadErrorType, computeMapContextDiff, createViewFromLayer } from '@geospatial-sdk/core';
67
+ import { listen, createMapFromContext, applyContextDiffToMap } from '@geospatial-sdk/openlayers';
68
+ import { createLegendFromLayer } from '@geospatial-sdk/legend';
69
+ import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
70
+ import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
71
+ import { Polygon } from 'ol/geom';
66
72
  import { formatDistance } from 'date-fns/formatDistance';
67
73
  import { enUS, sk, pt as pt$1, nl as nl$1, it as it$1, es as es$1, de as de$1, fr as fr$1 } from 'date-fns/locale';
68
74
  import { MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
@@ -72,11 +78,6 @@ import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
72
78
  import { valid as valid$1 } from 'geojson-validation';
73
79
  import { trigger, transition, animate, keyframes, style } from '@angular/animations';
74
80
  import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
75
- import { FeaturesClickEventType, FeaturesHoverEventType, MapClickEventType, SourceLoadErrorType, computeMapContextDiff, createViewFromLayer } from '@geospatial-sdk/core';
76
- import { listen, createMapFromContext, applyContextDiffToMap } from '@geospatial-sdk/openlayers';
77
- import { createLegendFromLayer } from '@geospatial-sdk/legend';
78
- import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
79
- import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
80
81
  import { extend } from 'ol/extent';
81
82
  import * as TOML from '@ltd/j-toml';
82
83
  import { Style, Fill, Stroke, Circle } from 'ol/style';
@@ -96,9 +97,8 @@ import * as i4 from '@angular/material/paginator';
96
97
  import { MatPaginatorIntl, MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
97
98
  import { LetDirective } from '@ngrx/component';
98
99
  import axios from 'axios';
99
- import * as i1$d from '@angular/platform-browser';
100
+ import * as i1$e from '@angular/platform-browser';
100
101
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
101
- import { Polygon } from 'ol/geom';
102
102
  import * as i4$1 from '@angular/material/radio';
103
103
  import { MatRadioModule } from '@angular/material/radio';
104
104
  import { MatIconModule } from '@angular/material/icon';
@@ -929,21 +929,23 @@ const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce((mapperObje
929
929
  return { ...mapperObject, [langEntry[1]]: langEntry[0] };
930
930
  }, {});
931
931
 
932
+ const PossibleResourceTypes = {
933
+ application: 'reuse',
934
+ dataset: 'dataset',
935
+ interactiveMap: 'reuse',
936
+ map: 'reuse',
937
+ 'map/static': 'reuse', // old index field
938
+ 'map/interactive': 'reuse', // old index field
939
+ 'map-interactive': 'reuse', // new index field since Oct 10, 2024
940
+ 'map-static': 'reuse', // new index field
941
+ mapDigital: 'reuse',
942
+ series: 'dataset',
943
+ service: 'service',
944
+ staticMap: 'reuse',
945
+ };
946
+ const PossibleResourceTypesDefinition = Object.entries(PossibleResourceTypes).reduce((acc, [key, val]) => ((acc[val] ??= []).push(key), acc), {});
932
947
  function getResourceType(type) {
933
- const possibleResourceTypes = {
934
- application: 'reuse',
935
- dataset: 'dataset',
936
- map: 'reuse',
937
- 'map/static': 'reuse', // old index field
938
- 'map/interactive': 'reuse', // old index field
939
- 'map-interactive': 'reuse', // new index field since Oct 10, 2024
940
- 'map-static': 'reuse', // new index field
941
- mapDigital: 'reuse',
942
- interactiveMap: 'reuse',
943
- staticMap: 'reuse',
944
- service: 'service',
945
- };
946
- return (possibleResourceTypes[type] ||
948
+ return (PossibleResourceTypes[type] ||
947
949
  'dataset');
948
950
  }
949
951
  function getReuseType(type) {
@@ -1351,8 +1353,8 @@ function extractServiceOnlineResources() {
1351
1353
  else {
1352
1354
  return {
1353
1355
  type: 'endpoint',
1354
- endpointUrl: url,
1355
- protocol,
1356
+ url: url,
1357
+ accessServiceProtocol: protocol,
1356
1358
  ...(description && { description }),
1357
1359
  translations,
1358
1360
  };
@@ -1851,7 +1853,7 @@ function writeLineage$1(record, rootEl) {
1851
1853
  pipe(findNestedChildOrCreate('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), writeLocalizedCharacterString(record.lineage, record.translations?.lineage, record.defaultLanguage))(rootEl);
1852
1854
  }
1853
1855
  function getServiceEndpointProtocol(endpoint) {
1854
- switch (endpoint.protocol.toLowerCase()) {
1856
+ switch (endpoint.accessServiceProtocol.toLowerCase()) {
1855
1857
  case 'wfs':
1856
1858
  return 'OGC:WFS';
1857
1859
  case 'wms':
@@ -1859,13 +1861,13 @@ function getServiceEndpointProtocol(endpoint) {
1859
1861
  case 'wps':
1860
1862
  return 'OGC:WPS';
1861
1863
  default:
1862
- return endpoint.protocol;
1864
+ return endpoint.accessServiceProtocol;
1863
1865
  }
1864
1866
  }
1865
1867
  function createOnlineResource(onlineResource) {
1866
1868
  let linkageUrl, functionCode, protocol;
1867
1869
  if (onlineResource.type === 'endpoint') {
1868
- linkageUrl = onlineResource.endpointUrl.toString();
1870
+ linkageUrl = onlineResource.url.toString();
1869
1871
  protocol = getServiceEndpointProtocol(onlineResource);
1870
1872
  functionCode = 'download';
1871
1873
  }
@@ -18652,7 +18654,7 @@ var de = {
18652
18654
  "datafeeder.month.september": "September",
18653
18655
  "datafeeder.wizardSummarize.createdAt": "Erstellt am",
18654
18656
  "datafeeder.wizardSummarize.scale": "Maßstab",
18655
- "datahub.header.datasets": "Datensätze",
18657
+ "datahub.header.datasets": "Katalog",
18656
18658
  "datahub.header.lastRecords": "Die neuesten",
18657
18659
  "datahub.header.myfavorites": "Meine Favoriten",
18658
18660
  "datahub.header.news": "Startseite",
@@ -18664,7 +18666,6 @@ var de = {
18664
18666
  "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
18665
18667
  "datahub.news.feed": "Nachrichtenfeed",
18666
18668
  "datahub.news.figures": "Indikatoren",
18667
- "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
18668
18669
  "datahub.search.back": "Zurück",
18669
18670
  "datahub.search.filter.all": "Alle",
18670
18671
  "datahub.search.filter.generatedByAPI": "Generiert durch eine API",
@@ -18835,6 +18836,7 @@ var de = {
18835
18836
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18836
18837
  "editor.record.loadError.closeMessage": "Verstanden",
18837
18838
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18839
+ "editor.record.lock.format": "",
18838
18840
  "editor.record.lock.reason": "",
18839
18841
  "editor.record.onlineResource.protocol.other": "",
18840
18842
  "editor.record.onlineResourceError.body": "",
@@ -18894,7 +18896,6 @@ var de = {
18894
18896
  "input.image.dropFileLabel": "",
18895
18897
  "input.image.selectFileLabel": "",
18896
18898
  "input.image.uploadErrorLabel": "",
18897
- "input.image.uploadErrorRetry": "",
18898
18899
  "input.image.uploadProgressCancel": "",
18899
18900
  "input.image.uploadProgressLabel": "",
18900
18901
  "language.ca": "Katalanisch",
@@ -18934,6 +18935,7 @@ var de = {
18934
18935
  "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
18935
18936
  "multiselect.filter.placeholder": "Suche",
18936
18937
  "nav.back": "Zurück",
18938
+ "navbar.mobile.menuTitle": "Schnellzugriff",
18937
18939
  next: next$6,
18938
18940
  "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
18939
18941
  "organisation.filter.placeholder": "Ergebnisse filtern",
@@ -18960,6 +18962,7 @@ var de = {
18960
18962
  "record.card.metadata.contact": "",
18961
18963
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
18962
18964
  "record.feature.limit": "Die Vorschau wurde aufgrund zu vieler Elemente deaktiviert",
18965
+ "record.kind.data": "",
18963
18966
  "record.kind.dataset": "",
18964
18967
  "record.kind.reuse": "",
18965
18968
  "record.kind.service": "",
@@ -18996,6 +18999,7 @@ var de = {
18996
18999
  "record.metadata.api.form.zoneTitle": "",
18997
19000
  "record.metadata.api.form.zoneTooltip": "",
18998
19001
  "record.metadata.api.gpfdl": "",
19002
+ "record.metadata.capabilities": "",
18999
19003
  "record.metadata.catalog": "Katalog",
19000
19004
  "record.metadata.contact": "Kontakt",
19001
19005
  "record.metadata.creation": "Erstellungsdatum",
@@ -19032,13 +19036,12 @@ var de = {
19032
19036
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19033
19037
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19034
19038
  "record.metadata.related": "Ähnliche Datensätze",
19035
- "record.metadata.related.contents": "Verwandte Inhalte",
19039
+ "record.metadata.related.contents": "",
19036
19040
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19037
19041
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19038
19042
  "record.metadata.status": "Status",
19039
19043
  "record.metadata.status.notPublished": "",
19040
19044
  "record.metadata.status.published": "",
19041
- "record.metadata.technical": "Technische Informationen",
19042
19045
  "record.metadata.temporalExtent": "Zeitlicher Umfang",
19043
19046
  "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
19044
19047
  "record.metadata.temporalExtent.sinceDate": "Seit {start}",
@@ -19067,6 +19070,10 @@ var de = {
19067
19070
  "results.layout.selectOne": "Layout auswählen",
19068
19071
  "results.records.hits.displayedOn": "{displayed, plural, =0{Kein Datensatz.} one{1 Datensatz} other{{displayed} Datensätze }} {hits, plural, other{angezeigt von {hits} insgesamt.}}",
19069
19072
  "results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie es mit anderen Worten</li><li>Beschränken Sie die Suchwörter</li></ul>",
19073
+ "search.filters.recordKind.all": "Alle",
19074
+ "search.filters.recordKind.dataset": "Datensätze",
19075
+ "search.filters.recordKind.reuse": "Wiederverwendungen",
19076
+ "search.filters.recordKind.service": "Dienste",
19070
19077
  "results.records.hits.found": "{hits, plural, =0{Keine Dokumente entsprechen der angegebenen Suche.} one{1 Datensatz gefunden.} other{{hits} Datensätze gefunden.}}",
19071
19078
  "results.records.hits.selected": "{ amount } ausgewählt",
19072
19079
  "results.showMore": "Mehr Ergebnisse anzeigen...",
@@ -19075,6 +19082,7 @@ var de = {
19075
19082
  "results.sortBy.popularity": "Beliebtheit",
19076
19083
  "results.sortBy.qualityScore": "Qualitätsbewertung",
19077
19084
  "results.sortBy.relevancy": "Relevanz",
19085
+ "reuse.metadata.access": "",
19078
19086
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
19079
19087
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
19080
19088
  "search.error.organizationHasNoDataset": "",
@@ -19124,6 +19132,26 @@ var de = {
19124
19132
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
19125
19133
  "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.",
19126
19134
  "search.filters.user": "Editor",
19135
+ "service.metadata.capabilities": "",
19136
+ "service.metadata.capabilities.abstract": "",
19137
+ "service.metadata.capabilities.attribution": "",
19138
+ "service.metadata.capabilities.availableCrs": "",
19139
+ "service.metadata.capabilities.defaultCrs": "",
19140
+ "service.metadata.capabilities.geometryName": "",
19141
+ "service.metadata.capabilities.geometryType": "",
19142
+ "service.metadata.capabilities.keywords": "",
19143
+ "service.metadata.capabilities.name": "",
19144
+ "service.metadata.capabilities.objectCount": "",
19145
+ "service.metadata.capabilities.otherCrs": "",
19146
+ "service.metadata.capabilities.outputFormats": "",
19147
+ "service.metadata.capabilities.resourceLinks": "",
19148
+ "service.metadata.capabilities.title": "",
19149
+ "service.metadata.filter": "",
19150
+ "service.metadata.filter.noLayers": "",
19151
+ "service.metadata.other": "",
19152
+ "service.metadata.question": "",
19153
+ "service.metadata.search": "",
19154
+ "service.metadata.spatialExtent": "",
19127
19155
  "share.tab.permalink": "Teilen",
19128
19156
  "share.tab.webComponent": "Integrieren",
19129
19157
  "table.loading.data": "Daten werden geladen...",
@@ -19206,7 +19234,7 @@ var en = {
19206
19234
  "datafeeder.month.september": "September",
19207
19235
  "datafeeder.wizardSummarize.createdAt": "Created at",
19208
19236
  "datafeeder.wizardSummarize.scale": "Scale",
19209
- "datahub.header.datasets": "Datasets",
19237
+ "datahub.header.datasets": "Catalog",
19210
19238
  "datahub.header.lastRecords": "The latest",
19211
19239
  "datahub.header.myfavorites": "My favorites",
19212
19240
  "datahub.header.news": "Home",
@@ -19218,7 +19246,6 @@ var en = {
19218
19246
  "datahub.news.contact.title": "A specific need?",
19219
19247
  "datahub.news.feed": "News feed",
19220
19248
  "datahub.news.figures": "Indicators",
19221
- "datahub.record.addToFavorites": "Add to favorites",
19222
19249
  "datahub.search.back": "Back",
19223
19250
  "datahub.search.filter.all": "All",
19224
19251
  "datahub.search.filter.generatedByAPI": "Generated by an API",
@@ -19389,6 +19416,7 @@ var en = {
19389
19416
  "editor.record.loadError.body": "The dataset could not be loaded:",
19390
19417
  "editor.record.loadError.closeMessage": "Understood",
19391
19418
  "editor.record.loadError.title": "Error loading dataset",
19419
+ "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
19392
19420
  "editor.record.lock.reason": "You are not an editor of the allowed groups",
19393
19421
  "editor.record.onlineResource.protocol.other": "Other",
19394
19422
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
@@ -19448,7 +19476,6 @@ var en = {
19448
19476
  "input.image.dropFileLabel": "or drop it here",
19449
19477
  "input.image.selectFileLabel": "Select an image",
19450
19478
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19451
- "input.image.uploadErrorRetry": "Retry",
19452
19479
  "input.image.uploadProgressCancel": "Cancel",
19453
19480
  "input.image.uploadProgressLabel": "Upload in progress...",
19454
19481
  "language.ca": "Catalan",
@@ -19488,6 +19515,7 @@ var en = {
19488
19515
  "map.wms.urlInput.hint": "Enter WMS service URL",
19489
19516
  "multiselect.filter.placeholder": "Search",
19490
19517
  "nav.back": "Back",
19518
+ "navbar.mobile.menuTitle": "Quick access",
19491
19519
  next: next$5,
19492
19520
  "ogc.unreachable.unknown": "The service could not be reached",
19493
19521
  "organisation.filter.placeholder": "Filter results",
@@ -19514,7 +19542,8 @@ var en = {
19514
19542
  "record.card.metadata.contact": "Metadata Contact",
19515
19543
  "record.externalViewer.open": "Open in the external map viewer",
19516
19544
  "record.feature.limit": "Preview disabled due to too many elements",
19517
- "record.kind.dataset": "Data",
19545
+ "record.kind.data": "Data",
19546
+ "record.kind.dataset": "Dataset",
19518
19547
  "record.kind.reuse": "Reuse",
19519
19548
  "record.kind.service": "Service",
19520
19549
  "record.metadata.about": "Description",
@@ -19550,6 +19579,7 @@ var en = {
19550
19579
  "record.metadata.api.form.zoneTitle": "Zone",
19551
19580
  "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
19552
19581
  "record.metadata.api.gpfdl": "Data download",
19582
+ "record.metadata.capabilities": "Service capabilities",
19553
19583
  "record.metadata.catalog": "Catalog",
19554
19584
  "record.metadata.contact": "Contact",
19555
19585
  "record.metadata.creation": "Date of creation",
@@ -19586,13 +19616,12 @@ var en = {
19586
19616
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19587
19617
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19588
19618
  "record.metadata.related": "Related datasets",
19589
- "record.metadata.related.contents": "Related contents",
19619
+ "record.metadata.related.contents": "Related content",
19590
19620
  "record.metadata.ressources.and.links": "Resources and links",
19591
19621
  "record.metadata.sheet": "Original metadata",
19592
19622
  "record.metadata.status": "Status",
19593
19623
  "record.metadata.status.notPublished": "Not published",
19594
19624
  "record.metadata.status.published": "Published",
19595
- "record.metadata.technical": "Technical information",
19596
19625
  "record.metadata.temporalExtent": "Temporal extent",
19597
19626
  "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
19598
19627
  "record.metadata.temporalExtent.sinceDate": "Since { start }",
@@ -19621,6 +19650,10 @@ var en = {
19621
19650
  "results.layout.selectOne": "Results layout",
19622
19651
  "results.records.hits.displayedOn": "{displayed, plural, =0{No dataset.} one{1 } other{{displayed} }} {hits, plural, other{displayed on {hits} total.}}",
19623
19652
  "results.records.hits.empty.help.html": "Suggestions: <ul class='list-disc list-inside'><li>Try other words</li><li>Specify fewer words</li></ul>",
19653
+ "search.filters.recordKind.all": "All",
19654
+ "search.filters.recordKind.dataset": "Datasets",
19655
+ "search.filters.recordKind.reuse": "Reuses",
19656
+ "search.filters.recordKind.service": "Services",
19624
19657
  "results.records.hits.found": "{hits, plural, =0{No datasets match the specified search.} one{1 dataset found.} other{{hits} datasets found.}}",
19625
19658
  "results.records.hits.selected": "{ amount } selected",
19626
19659
  "results.showMore": "Show more results...",
@@ -19629,6 +19662,7 @@ var en = {
19629
19662
  "results.sortBy.popularity": "Popularity",
19630
19663
  "results.sortBy.qualityScore": "Quality score",
19631
19664
  "results.sortBy.relevancy": "Relevancy",
19665
+ "reuse.metadata.access": "Access the reuse",
19632
19666
  "search.autocomplete.error": "Suggestions could not be fetched:",
19633
19667
  "search.error.couldNotReachApi": "The API could not be reached",
19634
19668
  "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
@@ -19678,6 +19712,26 @@ var en = {
19678
19712
  "search.filters.useSpatialFilter": "Show datasets in the area of interest first",
19679
19713
  "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.",
19680
19714
  "search.filters.user": "Editor",
19715
+ "service.metadata.capabilities": "Technical information",
19716
+ "service.metadata.capabilities.abstract": "Abstract",
19717
+ "service.metadata.capabilities.attribution": "Attribution",
19718
+ "service.metadata.capabilities.availableCrs": "Available CRS",
19719
+ "service.metadata.capabilities.defaultCrs": "Default CRS",
19720
+ "service.metadata.capabilities.geometryName": "Geometry name",
19721
+ "service.metadata.capabilities.geometryType": "Geometry type",
19722
+ "service.metadata.capabilities.keywords": "Keywords",
19723
+ "service.metadata.capabilities.name": "Name",
19724
+ "service.metadata.capabilities.objectCount": "Object count",
19725
+ "service.metadata.capabilities.otherCrs": "Other CRS",
19726
+ "service.metadata.capabilities.outputFormats": "Output formats",
19727
+ "service.metadata.capabilities.resourceLinks": "Resource links",
19728
+ "service.metadata.capabilities.title": "Title",
19729
+ "service.metadata.filter": "Layers will be filtered by title and abstract",
19730
+ "service.metadata.filter.noLayers": "No layer matches your search",
19731
+ "service.metadata.other": "Other information",
19732
+ "service.metadata.question": "Ask a question",
19733
+ "service.metadata.search": "Search through the layer list",
19734
+ "service.metadata.spatialExtent": "Spatial extent",
19681
19735
  "share.tab.permalink": "Share",
19682
19736
  "share.tab.webComponent": "Integrate",
19683
19737
  "table.loading.data": "Loading data...",
@@ -19760,7 +19814,7 @@ var es = {
19760
19814
  "datafeeder.month.september": "",
19761
19815
  "datafeeder.wizardSummarize.createdAt": "",
19762
19816
  "datafeeder.wizardSummarize.scale": "",
19763
- "datahub.header.datasets": "",
19817
+ "datahub.header.datasets": "Catálogo",
19764
19818
  "datahub.header.lastRecords": "",
19765
19819
  "datahub.header.myfavorites": "",
19766
19820
  "datahub.header.news": "",
@@ -19772,7 +19826,6 @@ var es = {
19772
19826
  "datahub.news.contact.title": "",
19773
19827
  "datahub.news.feed": "",
19774
19828
  "datahub.news.figures": "",
19775
- "datahub.record.addToFavorites": "",
19776
19829
  "datahub.search.back": "",
19777
19830
  "datahub.search.filter.all": "",
19778
19831
  "datahub.search.filter.generatedByAPI": "",
@@ -19943,6 +19996,7 @@ var es = {
19943
19996
  "editor.record.loadError.body": "",
19944
19997
  "editor.record.loadError.closeMessage": "",
19945
19998
  "editor.record.loadError.title": "",
19999
+ "editor.record.lock.format": "",
19946
20000
  "editor.record.lock.reason": "",
19947
20001
  "editor.record.onlineResource.protocol.other": "",
19948
20002
  "editor.record.onlineResourceError.body": "",
@@ -20002,7 +20056,6 @@ var es = {
20002
20056
  "input.image.dropFileLabel": "",
20003
20057
  "input.image.selectFileLabel": "",
20004
20058
  "input.image.uploadErrorLabel": "",
20005
- "input.image.uploadErrorRetry": "",
20006
20059
  "input.image.uploadProgressCancel": "",
20007
20060
  "input.image.uploadProgressLabel": "",
20008
20061
  "language.ca": "Catalán",
@@ -20042,6 +20095,7 @@ var es = {
20042
20095
  "map.wms.urlInput.hint": "",
20043
20096
  "multiselect.filter.placeholder": "",
20044
20097
  "nav.back": "",
20098
+ "navbar.mobile.menuTitle": "Acceso rápido",
20045
20099
  next: next$4,
20046
20100
  "ogc.unreachable.unknown": "",
20047
20101
  "organisation.filter.placeholder": "",
@@ -20068,6 +20122,7 @@ var es = {
20068
20122
  "record.card.metadata.contact": "",
20069
20123
  "record.externalViewer.open": "",
20070
20124
  "record.feature.limit": "",
20125
+ "record.kind.data": "",
20071
20126
  "record.kind.dataset": "",
20072
20127
  "record.kind.reuse": "",
20073
20128
  "record.kind.service": "",
@@ -20104,6 +20159,7 @@ var es = {
20104
20159
  "record.metadata.api.form.zoneTitle": "",
20105
20160
  "record.metadata.api.form.zoneTooltip": "",
20106
20161
  "record.metadata.api.gpfdl": "",
20162
+ "record.metadata.capabilities": "",
20107
20163
  "record.metadata.catalog": "",
20108
20164
  "record.metadata.contact": "",
20109
20165
  "record.metadata.creation": "",
@@ -20140,13 +20196,12 @@ var es = {
20140
20196
  "record.metadata.quality.updateFrequency.failed": "",
20141
20197
  "record.metadata.quality.updateFrequency.success": "",
20142
20198
  "record.metadata.related": "",
20143
- "record.metadata.related.contents": "Contenidos relacionados",
20199
+ "record.metadata.related.contents": "",
20144
20200
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20145
20201
  "record.metadata.sheet": "",
20146
20202
  "record.metadata.status": "",
20147
20203
  "record.metadata.status.notPublished": "",
20148
20204
  "record.metadata.status.published": "",
20149
- "record.metadata.technical": "",
20150
20205
  "record.metadata.temporalExtent": "",
20151
20206
  "record.metadata.temporalExtent.fromDateToDate": "",
20152
20207
  "record.metadata.temporalExtent.sinceDate": "",
@@ -20175,6 +20230,10 @@ var es = {
20175
20230
  "results.layout.selectOne": "",
20176
20231
  "results.records.hits.displayedOn": "",
20177
20232
  "results.records.hits.empty.help.html": "",
20233
+ "search.filters.recordKind.all": "Todos",
20234
+ "search.filters.recordKind.dataset": "",
20235
+ "search.filters.recordKind.reuse": "",
20236
+ "search.filters.recordKind.service": "",
20178
20237
  "results.records.hits.found": "",
20179
20238
  "results.records.hits.selected": "",
20180
20239
  "results.showMore": "",
@@ -20183,6 +20242,7 @@ var es = {
20183
20242
  "results.sortBy.popularity": "",
20184
20243
  "results.sortBy.qualityScore": "",
20185
20244
  "results.sortBy.relevancy": "",
20245
+ "reuse.metadata.access": "",
20186
20246
  "search.autocomplete.error": "",
20187
20247
  "search.error.couldNotReachApi": "",
20188
20248
  "search.error.organizationHasNoDataset": "",
@@ -20232,6 +20292,26 @@ var es = {
20232
20292
  "search.filters.useSpatialFilter": "",
20233
20293
  "search.filters.useSpatialFilterHelp": "",
20234
20294
  "search.filters.user": "",
20295
+ "service.metadata.capabilities": "",
20296
+ "service.metadata.capabilities.abstract": "",
20297
+ "service.metadata.capabilities.attribution": "",
20298
+ "service.metadata.capabilities.availableCrs": "",
20299
+ "service.metadata.capabilities.defaultCrs": "",
20300
+ "service.metadata.capabilities.geometryName": "",
20301
+ "service.metadata.capabilities.geometryType": "",
20302
+ "service.metadata.capabilities.keywords": "",
20303
+ "service.metadata.capabilities.name": "",
20304
+ "service.metadata.capabilities.objectCount": "",
20305
+ "service.metadata.capabilities.otherCrs": "",
20306
+ "service.metadata.capabilities.outputFormats": "",
20307
+ "service.metadata.capabilities.resourceLinks": "",
20308
+ "service.metadata.capabilities.title": "",
20309
+ "service.metadata.filter": "",
20310
+ "service.metadata.filter.noLayers": "",
20311
+ "service.metadata.other": "",
20312
+ "service.metadata.question": "",
20313
+ "service.metadata.search": "",
20314
+ "service.metadata.spatialExtent": "",
20235
20315
  "share.tab.permalink": "",
20236
20316
  "share.tab.webComponent": "",
20237
20317
  "table.loading.data": "",
@@ -20314,7 +20394,7 @@ var fr = {
20314
20394
  "datafeeder.month.september": "Septembre",
20315
20395
  "datafeeder.wizardSummarize.createdAt": "Créée le",
20316
20396
  "datafeeder.wizardSummarize.scale": "Échelle",
20317
- "datahub.header.datasets": "Données",
20397
+ "datahub.header.datasets": "Catalogue",
20318
20398
  "datahub.header.lastRecords": "Les plus récentes",
20319
20399
  "datahub.header.myfavorites": "Mes favoris",
20320
20400
  "datahub.header.news": "Accueil",
@@ -20326,7 +20406,6 @@ var fr = {
20326
20406
  "datahub.news.contact.title": "Un besoin spécifique ?",
20327
20407
  "datahub.news.feed": "Fil d'activité",
20328
20408
  "datahub.news.figures": "Quelques chiffres",
20329
- "datahub.record.addToFavorites": "Ajouter aux favoris",
20330
20409
  "datahub.search.back": "Retour",
20331
20410
  "datahub.search.filter.all": "Tous",
20332
20411
  "datahub.search.filter.generatedByAPI": "généré par une API",
@@ -20497,6 +20576,7 @@ var fr = {
20497
20576
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20498
20577
  "editor.record.loadError.closeMessage": "Compris",
20499
20578
  "editor.record.loadError.title": "Erreur lors du chargement",
20579
+ "editor.record.lock.format": "Les jeux de données de type 'service' et 'reuse' ne sont pas éditables",
20500
20580
  "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
20501
20581
  "editor.record.onlineResource.protocol.other": "Autre",
20502
20582
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
@@ -20556,7 +20636,6 @@ var fr = {
20556
20636
  "input.image.dropFileLabel": "ou glissez-la ici",
20557
20637
  "input.image.selectFileLabel": "Sélectionnez une image",
20558
20638
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20559
- "input.image.uploadErrorRetry": "Réessayer",
20560
20639
  "input.image.uploadProgressCancel": "Annuler",
20561
20640
  "input.image.uploadProgressLabel": "Chargement en cours...",
20562
20641
  "language.ca": "Catalan",
@@ -20596,6 +20675,7 @@ var fr = {
20596
20675
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20597
20676
  "multiselect.filter.placeholder": "Rechercher",
20598
20677
  "nav.back": "Retour",
20678
+ "navbar.mobile.menuTitle": "Navigation rapide",
20599
20679
  next: next$3,
20600
20680
  "ogc.unreachable.unknown": "Le service n'est pas accessible",
20601
20681
  "organisation.filter.placeholder": "Filtrer les résultats",
@@ -20622,10 +20702,11 @@ var fr = {
20622
20702
  "record.card.metadata.contact": "Contact de la métadonnée ",
20623
20703
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
20624
20704
  "record.feature.limit": "L’aperçu a été désactivé en raison d’un trop grand nombre d'éléments",
20705
+ "record.kind.data": "Donnée",
20625
20706
  "record.kind.dataset": "Donnée",
20626
20707
  "record.kind.reuse": "Réutilisation",
20627
20708
  "record.kind.service": "Service",
20628
- "record.metadata.about": "Description",
20709
+ "record.metadata.about": "A propos",
20629
20710
  "record.metadata.api": "API",
20630
20711
  "record.metadata.api.form.closeButton": "Fermer",
20631
20712
  "record.metadata.api.form.closeForm": "Fermer le panneau de personnalisation",
@@ -20658,6 +20739,7 @@ var fr = {
20658
20739
  "record.metadata.api.form.zoneTitle": "Zone",
20659
20740
  "record.metadata.api.form.zoneTooltip": "Menu déroulant pour sélectionner une zone géographique",
20660
20741
  "record.metadata.api.gpfdl": "Téléchargement",
20742
+ "record.metadata.capabilities": "Capacités du service",
20661
20743
  "record.metadata.catalog": "Catalogue",
20662
20744
  "record.metadata.contact": "Contact",
20663
20745
  "record.metadata.creation": "Date de création",
@@ -20694,13 +20776,12 @@ var fr = {
20694
20776
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20695
20777
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20696
20778
  "record.metadata.related": "Voir aussi",
20697
- "record.metadata.related.contents": "Contenus associés",
20779
+ "record.metadata.related.contents": "Contenu associé",
20698
20780
  "record.metadata.ressources.and.links": "Ressources et liens",
20699
20781
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20700
20782
  "record.metadata.status": "Statut",
20701
20783
  "record.metadata.status.notPublished": "Non publié",
20702
20784
  "record.metadata.status.published": "Publié",
20703
- "record.metadata.technical": "Informations techniques",
20704
20785
  "record.metadata.temporalExtent": "Étendue temporelle",
20705
20786
  "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
20706
20787
  "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
@@ -20729,6 +20810,10 @@ var fr = {
20729
20810
  "results.layout.selectOne": "Affichage des résultats",
20730
20811
  "results.records.hits.displayedOn": "{displayed, plural, =0{Aucun jeu de données} one{1 affiché} other{{displayed} affichés}} {hits, plural, other{sur {hits} au total.}}",
20731
20812
  "results.records.hits.empty.help.html": "Suggestions : <ul class='list-disc list-inside'><li>Essayez d'autres mots-clés</li><li>Cherchez moins de mots</li></ul>",
20813
+ "search.filters.recordKind.all": "Tous",
20814
+ "search.filters.recordKind.dataset": "Jeux de données",
20815
+ "search.filters.recordKind.reuse": "Réutilisations",
20816
+ "search.filters.recordKind.service": "Services",
20732
20817
  "results.records.hits.found": "{hits, plural, =0{Aucune correspondance.} one{1 jeu de données trouvé.} other{{hits} jeux de données.}}",
20733
20818
  "results.records.hits.selected": "{amount, plural, one{1 selectionné} other{{ amount } sélectionnés}}",
20734
20819
  "results.showMore": "Plus de résultats...",
@@ -20737,6 +20822,7 @@ var fr = {
20737
20822
  "results.sortBy.popularity": "Popularité",
20738
20823
  "results.sortBy.qualityScore": "Indicateur de qualité",
20739
20824
  "results.sortBy.relevancy": "Pertinence",
20825
+ "reuse.metadata.access": "Accéder à la réutilisation",
20740
20826
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
20741
20827
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
20742
20828
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
@@ -20786,6 +20872,26 @@ var fr = {
20786
20872
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
20787
20873
  "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.",
20788
20874
  "search.filters.user": "Éditeur",
20875
+ "service.metadata.capabilities": "Informations techniques",
20876
+ "service.metadata.capabilities.abstract": "Description",
20877
+ "service.metadata.capabilities.attribution": "Attribution",
20878
+ "service.metadata.capabilities.availableCrs": "CRS disponibles",
20879
+ "service.metadata.capabilities.defaultCrs": "CRS par défaut",
20880
+ "service.metadata.capabilities.geometryName": "Nom de la géométrie",
20881
+ "service.metadata.capabilities.geometryType": "Type de géométrie",
20882
+ "service.metadata.capabilities.keywords": "Mots-clés",
20883
+ "service.metadata.capabilities.name": "Nom",
20884
+ "service.metadata.capabilities.objectCount": "Nombre d'objets",
20885
+ "service.metadata.capabilities.otherCrs": "Autres CRS",
20886
+ "service.metadata.capabilities.outputFormats": "Formats de sortie",
20887
+ "service.metadata.capabilities.resourceLinks": "Liens vers les ressources",
20888
+ "service.metadata.capabilities.title": "Titre",
20889
+ "service.metadata.filter": "Les couches seront filtrées par titre et description",
20890
+ "service.metadata.filter.noLayers": "Aucune couche ne correspond à votre recherche",
20891
+ "service.metadata.other": "Autres informations",
20892
+ "service.metadata.question": "Poser une question",
20893
+ "service.metadata.search": "Rechercher dans la liste des couches",
20894
+ "service.metadata.spatialExtent": "Etendue spatiale",
20789
20895
  "share.tab.permalink": "Partager",
20790
20896
  "share.tab.webComponent": "Intégrer",
20791
20897
  "table.loading.data": "Chargement des données...",
@@ -20868,7 +20974,7 @@ var it = {
20868
20974
  "datafeeder.month.september": "Settembre",
20869
20975
  "datafeeder.wizardSummarize.createdAt": "Creato il",
20870
20976
  "datafeeder.wizardSummarize.scale": "Scala",
20871
- "datahub.header.datasets": "Dati",
20977
+ "datahub.header.datasets": "Catalogo",
20872
20978
  "datahub.header.lastRecords": "Ultimi",
20873
20979
  "datahub.header.myfavorites": "Miei preferiti",
20874
20980
  "datahub.header.news": "Home",
@@ -20880,7 +20986,6 @@ var it = {
20880
20986
  "datahub.news.contact.title": "Ha un bisogno specifico?",
20881
20987
  "datahub.news.feed": "Feed di attività",
20882
20988
  "datahub.news.figures": "Alcune figure",
20883
- "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
20884
20989
  "datahub.search.back": "Ritorna",
20885
20990
  "datahub.search.filter.all": "Tutti",
20886
20991
  "datahub.search.filter.generatedByAPI": "generato da un'API",
@@ -21051,6 +21156,7 @@ var it = {
21051
21156
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21052
21157
  "editor.record.loadError.closeMessage": "Capito",
21053
21158
  "editor.record.loadError.title": "Errore durante il caricamento",
21159
+ "editor.record.lock.format": "",
21054
21160
  "editor.record.lock.reason": "Non è un editore di uno dei gruppi autorizzati",
21055
21161
  "editor.record.onlineResource.protocol.other": "Altro",
21056
21162
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
@@ -21110,7 +21216,6 @@ var it = {
21110
21216
  "input.image.dropFileLabel": "oppure trascinalo qui",
21111
21217
  "input.image.selectFileLabel": "Seleziona un'immagine",
21112
21218
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21113
- "input.image.uploadErrorRetry": "Riprova",
21114
21219
  "input.image.uploadProgressCancel": "Annulla",
21115
21220
  "input.image.uploadProgressLabel": "Caricamento...",
21116
21221
  "language.ca": "Catalano",
@@ -21150,6 +21255,7 @@ var it = {
21150
21255
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21151
21256
  "multiselect.filter.placeholder": "Cerca",
21152
21257
  "nav.back": "Indietro",
21258
+ "navbar.mobile.menuTitle": "",
21153
21259
  next: next$2,
21154
21260
  "ogc.unreachable.unknown": "Il servizio non è accessibile",
21155
21261
  "organisation.filter.placeholder": "Filtra i risultati",
@@ -21176,6 +21282,7 @@ var it = {
21176
21282
  "record.card.metadata.contact": "",
21177
21283
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
21178
21284
  "record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
21285
+ "record.kind.data": "",
21179
21286
  "record.kind.dataset": "",
21180
21287
  "record.kind.reuse": "",
21181
21288
  "record.kind.service": "",
@@ -21212,6 +21319,7 @@ var it = {
21212
21319
  "record.metadata.api.form.zoneTitle": "Zona",
21213
21320
  "record.metadata.api.form.zoneTooltip": "Menu a discesa per selezionare una zona geografica",
21214
21321
  "record.metadata.api.gpfdl": "Scarica",
21322
+ "record.metadata.capabilities": "",
21215
21323
  "record.metadata.catalog": "Catalogo",
21216
21324
  "record.metadata.contact": "Contatto",
21217
21325
  "record.metadata.creation": "Data di creazione",
@@ -21248,13 +21356,12 @@ var it = {
21248
21356
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21249
21357
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21250
21358
  "record.metadata.related": "Vedi anche",
21251
- "record.metadata.related.contents": "Contenuti correlati",
21359
+ "record.metadata.related.contents": "",
21252
21360
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21253
21361
  "record.metadata.sheet": "Origine del metadata",
21254
21362
  "record.metadata.status": "Stato",
21255
21363
  "record.metadata.status.notPublished": "Non pubblicato",
21256
21364
  "record.metadata.status.published": "Pubblicato",
21257
- "record.metadata.technical": "Informazioni tecniche",
21258
21365
  "record.metadata.temporalExtent": "Periodo di tempo",
21259
21366
  "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
21260
21367
  "record.metadata.temporalExtent.sinceDate": "Dal {start}",
@@ -21283,6 +21390,10 @@ var it = {
21283
21390
  "results.layout.selectOne": "Mostra risultati",
21284
21391
  "results.records.hits.displayedOn": "{displayed, plural, =0{Nessun record} one{1 record visualizzato} other{{displayed} records visualizzati}} {hits, plural, other{su {hits} in totale.}}",
21285
21392
  "results.records.hits.empty.help.html": "Suggerimenti: <ul class='list-disc list-inside'><li>Prova con altre parole chiave</li><li>Cerca con meno parole</li></ul>",
21393
+ "search.filters.recordKind.all": "Tutti",
21394
+ "search.filters.recordKind.dataset": "Dataset",
21395
+ "search.filters.recordKind.reuse": "Riutilizzi",
21396
+ "search.filters.recordKind.service": "Servizi",
21286
21397
  "results.records.hits.found": "{hits, plural, =0{Nessuna corrispondenza.} one{1 record trovato.} other{{hits} risultati.}}",
21287
21398
  "results.records.hits.selected": "{amount, plural, one{1 selezionato} other{{ amount } selezionati}}",
21288
21399
  "results.showMore": "Altri risultati...",
@@ -21291,6 +21402,7 @@ var it = {
21291
21402
  "results.sortBy.popularity": "Popolarità",
21292
21403
  "results.sortBy.qualityScore": "Indicatore di qualità",
21293
21404
  "results.sortBy.relevancy": "Rilevanza",
21405
+ "reuse.metadata.access": "",
21294
21406
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
21295
21407
  "search.error.couldNotReachApi": "Problema di connessione all'API",
21296
21408
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora dati.",
@@ -21340,6 +21452,26 @@ var it = {
21340
21452
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
21341
21453
  "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.",
21342
21454
  "search.filters.user": "Editore",
21455
+ "service.metadata.capabilities": "Informazioni tecniche",
21456
+ "service.metadata.capabilities.abstract": "",
21457
+ "service.metadata.capabilities.attribution": "",
21458
+ "service.metadata.capabilities.availableCrs": "",
21459
+ "service.metadata.capabilities.defaultCrs": "",
21460
+ "service.metadata.capabilities.geometryName": "",
21461
+ "service.metadata.capabilities.geometryType": "",
21462
+ "service.metadata.capabilities.keywords": "",
21463
+ "service.metadata.capabilities.name": "",
21464
+ "service.metadata.capabilities.objectCount": "",
21465
+ "service.metadata.capabilities.otherCrs": "",
21466
+ "service.metadata.capabilities.outputFormats": "",
21467
+ "service.metadata.capabilities.resourceLinks": "",
21468
+ "service.metadata.capabilities.title": "",
21469
+ "service.metadata.filter": "",
21470
+ "service.metadata.filter.noLayers": "",
21471
+ "service.metadata.other": "",
21472
+ "service.metadata.question": "",
21473
+ "service.metadata.search": "",
21474
+ "service.metadata.spatialExtent": "",
21343
21475
  "share.tab.permalink": "Condividere",
21344
21476
  "share.tab.webComponent": "Incorporare",
21345
21477
  "table.loading.data": "Caricamento dei dati...",
@@ -21422,7 +21554,7 @@ var nl = {
21422
21554
  "datafeeder.month.september": "",
21423
21555
  "datafeeder.wizardSummarize.createdAt": "",
21424
21556
  "datafeeder.wizardSummarize.scale": "",
21425
- "datahub.header.datasets": "",
21557
+ "datahub.header.datasets": "Catalog",
21426
21558
  "datahub.header.lastRecords": "",
21427
21559
  "datahub.header.myfavorites": "",
21428
21560
  "datahub.header.news": "",
@@ -21434,7 +21566,6 @@ var nl = {
21434
21566
  "datahub.news.contact.title": "",
21435
21567
  "datahub.news.feed": "",
21436
21568
  "datahub.news.figures": "",
21437
- "datahub.record.addToFavorites": "",
21438
21569
  "datahub.search.back": "",
21439
21570
  "datahub.search.filter.all": "",
21440
21571
  "datahub.search.filter.generatedByAPI": "",
@@ -21605,6 +21736,7 @@ var nl = {
21605
21736
  "editor.record.loadError.body": "",
21606
21737
  "editor.record.loadError.closeMessage": "",
21607
21738
  "editor.record.loadError.title": "",
21739
+ "editor.record.lock.format": "",
21608
21740
  "editor.record.lock.reason": "",
21609
21741
  "editor.record.onlineResource.protocol.other": "",
21610
21742
  "editor.record.onlineResourceError.body": "",
@@ -21664,7 +21796,6 @@ var nl = {
21664
21796
  "input.image.dropFileLabel": "",
21665
21797
  "input.image.selectFileLabel": "",
21666
21798
  "input.image.uploadErrorLabel": "",
21667
- "input.image.uploadErrorRetry": "",
21668
21799
  "input.image.uploadProgressCancel": "",
21669
21800
  "input.image.uploadProgressLabel": "",
21670
21801
  "language.ca": "Catalaans",
@@ -21704,6 +21835,7 @@ var nl = {
21704
21835
  "map.wms.urlInput.hint": "",
21705
21836
  "multiselect.filter.placeholder": "",
21706
21837
  "nav.back": "",
21838
+ "navbar.mobile.menuTitle": "",
21707
21839
  next: next$1,
21708
21840
  "ogc.unreachable.unknown": "",
21709
21841
  "organisation.filter.placeholder": "",
@@ -21730,6 +21862,7 @@ var nl = {
21730
21862
  "record.card.metadata.contact": "",
21731
21863
  "record.externalViewer.open": "",
21732
21864
  "record.feature.limit": "",
21865
+ "record.kind.data": "",
21733
21866
  "record.kind.dataset": "",
21734
21867
  "record.kind.reuse": "",
21735
21868
  "record.kind.service": "",
@@ -21766,6 +21899,7 @@ var nl = {
21766
21899
  "record.metadata.api.form.zoneTitle": "",
21767
21900
  "record.metadata.api.form.zoneTooltip": "",
21768
21901
  "record.metadata.api.gpfdl": "",
21902
+ "record.metadata.capabilities": "",
21769
21903
  "record.metadata.catalog": "",
21770
21904
  "record.metadata.contact": "",
21771
21905
  "record.metadata.creation": "",
@@ -21802,13 +21936,12 @@ var nl = {
21802
21936
  "record.metadata.quality.updateFrequency.failed": "",
21803
21937
  "record.metadata.quality.updateFrequency.success": "",
21804
21938
  "record.metadata.related": "",
21805
- "record.metadata.related.contents": "Gerelateerde inhoud",
21939
+ "record.metadata.related.contents": "",
21806
21940
  "record.metadata.ressources.and.links": "Bronnen en links",
21807
21941
  "record.metadata.sheet": "",
21808
21942
  "record.metadata.status": "",
21809
21943
  "record.metadata.status.notPublished": "",
21810
21944
  "record.metadata.status.published": "",
21811
- "record.metadata.technical": "",
21812
21945
  "record.metadata.temporalExtent": "",
21813
21946
  "record.metadata.temporalExtent.fromDateToDate": "",
21814
21947
  "record.metadata.temporalExtent.sinceDate": "",
@@ -21837,6 +21970,10 @@ var nl = {
21837
21970
  "results.layout.selectOne": "",
21838
21971
  "results.records.hits.displayedOn": "",
21839
21972
  "results.records.hits.empty.help.html": "",
21973
+ "search.filters.recordKind.all": "Alles",
21974
+ "search.filters.recordKind.dataset": "",
21975
+ "search.filters.recordKind.reuse": "",
21976
+ "search.filters.recordKind.service": "",
21840
21977
  "results.records.hits.found": "",
21841
21978
  "results.records.hits.selected": "",
21842
21979
  "results.showMore": "",
@@ -21845,6 +21982,7 @@ var nl = {
21845
21982
  "results.sortBy.popularity": "",
21846
21983
  "results.sortBy.qualityScore": "",
21847
21984
  "results.sortBy.relevancy": "",
21985
+ "reuse.metadata.access": "",
21848
21986
  "search.autocomplete.error": "",
21849
21987
  "search.error.couldNotReachApi": "",
21850
21988
  "search.error.organizationHasNoDataset": "",
@@ -21894,6 +22032,26 @@ var nl = {
21894
22032
  "search.filters.useSpatialFilter": "",
21895
22033
  "search.filters.useSpatialFilterHelp": "",
21896
22034
  "search.filters.user": "",
22035
+ "service.metadata.capabilities": "",
22036
+ "service.metadata.capabilities.abstract": "",
22037
+ "service.metadata.capabilities.attribution": "",
22038
+ "service.metadata.capabilities.availableCrs": "",
22039
+ "service.metadata.capabilities.defaultCrs": "",
22040
+ "service.metadata.capabilities.geometryName": "",
22041
+ "service.metadata.capabilities.geometryType": "",
22042
+ "service.metadata.capabilities.keywords": "",
22043
+ "service.metadata.capabilities.name": "",
22044
+ "service.metadata.capabilities.objectCount": "",
22045
+ "service.metadata.capabilities.otherCrs": "",
22046
+ "service.metadata.capabilities.outputFormats": "",
22047
+ "service.metadata.capabilities.resourceLinks": "",
22048
+ "service.metadata.capabilities.title": "",
22049
+ "service.metadata.filter": "",
22050
+ "service.metadata.filter.noLayers": "",
22051
+ "service.metadata.other": "",
22052
+ "service.metadata.question": "",
22053
+ "service.metadata.search": "",
22054
+ "service.metadata.spatialExtent": "",
21897
22055
  "share.tab.permalink": "",
21898
22056
  "share.tab.webComponent": "",
21899
22057
  "table.loading.data": "",
@@ -21976,7 +22134,7 @@ var pt = {
21976
22134
  "datafeeder.month.september": "",
21977
22135
  "datafeeder.wizardSummarize.createdAt": "",
21978
22136
  "datafeeder.wizardSummarize.scale": "",
21979
- "datahub.header.datasets": "",
22137
+ "datahub.header.datasets": "Catálogo",
21980
22138
  "datahub.header.lastRecords": "",
21981
22139
  "datahub.header.myfavorites": "",
21982
22140
  "datahub.header.news": "",
@@ -21988,7 +22146,6 @@ var pt = {
21988
22146
  "datahub.news.contact.title": "",
21989
22147
  "datahub.news.feed": "",
21990
22148
  "datahub.news.figures": "",
21991
- "datahub.record.addToFavorites": "",
21992
22149
  "datahub.search.back": "",
21993
22150
  "datahub.search.filter.all": "",
21994
22151
  "datahub.search.filter.generatedByAPI": "",
@@ -22159,6 +22316,7 @@ var pt = {
22159
22316
  "editor.record.loadError.body": "",
22160
22317
  "editor.record.loadError.closeMessage": "",
22161
22318
  "editor.record.loadError.title": "",
22319
+ "editor.record.lock.format": "",
22162
22320
  "editor.record.lock.reason": "",
22163
22321
  "editor.record.onlineResource.protocol.other": "",
22164
22322
  "editor.record.onlineResourceError.body": "",
@@ -22218,7 +22376,6 @@ var pt = {
22218
22376
  "input.image.dropFileLabel": "",
22219
22377
  "input.image.selectFileLabel": "",
22220
22378
  "input.image.uploadErrorLabel": "",
22221
- "input.image.uploadErrorRetry": "",
22222
22379
  "input.image.uploadProgressCancel": "",
22223
22380
  "input.image.uploadProgressLabel": "",
22224
22381
  "language.ca": "Catalão",
@@ -22258,6 +22415,7 @@ var pt = {
22258
22415
  "map.wms.urlInput.hint": "",
22259
22416
  "multiselect.filter.placeholder": "",
22260
22417
  "nav.back": "",
22418
+ "navbar.mobile.menuTitle": "",
22261
22419
  next: next,
22262
22420
  "ogc.unreachable.unknown": "",
22263
22421
  "organisation.filter.placeholder": "",
@@ -22284,6 +22442,7 @@ var pt = {
22284
22442
  "record.card.metadata.contact": "",
22285
22443
  "record.externalViewer.open": "",
22286
22444
  "record.feature.limit": "",
22445
+ "record.kind.data": "",
22287
22446
  "record.kind.dataset": "",
22288
22447
  "record.kind.reuse": "",
22289
22448
  "record.kind.service": "",
@@ -22320,6 +22479,7 @@ var pt = {
22320
22479
  "record.metadata.api.form.zoneTitle": "",
22321
22480
  "record.metadata.api.form.zoneTooltip": "",
22322
22481
  "record.metadata.api.gpfdl": "",
22482
+ "record.metadata.capabilities": "",
22323
22483
  "record.metadata.catalog": "",
22324
22484
  "record.metadata.contact": "",
22325
22485
  "record.metadata.creation": "",
@@ -22356,13 +22516,12 @@ var pt = {
22356
22516
  "record.metadata.quality.updateFrequency.failed": "",
22357
22517
  "record.metadata.quality.updateFrequency.success": "",
22358
22518
  "record.metadata.related": "",
22359
- "record.metadata.related.contents": "Conteúdos relacionados",
22519
+ "record.metadata.related.contents": "",
22360
22520
  "record.metadata.ressources.and.links": "Recursos e links",
22361
22521
  "record.metadata.sheet": "",
22362
22522
  "record.metadata.status": "",
22363
22523
  "record.metadata.status.notPublished": "",
22364
22524
  "record.metadata.status.published": "",
22365
- "record.metadata.technical": "",
22366
22525
  "record.metadata.temporalExtent": "",
22367
22526
  "record.metadata.temporalExtent.fromDateToDate": "",
22368
22527
  "record.metadata.temporalExtent.sinceDate": "",
@@ -22391,6 +22550,10 @@ var pt = {
22391
22550
  "results.layout.selectOne": "",
22392
22551
  "results.records.hits.displayedOn": "",
22393
22552
  "results.records.hits.empty.help.html": "",
22553
+ "search.filters.recordKind.all": "Todos",
22554
+ "search.filters.recordKind.dataset": "",
22555
+ "search.filters.recordKind.reuse": "",
22556
+ "search.filters.recordKind.service": "",
22394
22557
  "results.records.hits.found": "",
22395
22558
  "results.records.hits.selected": "",
22396
22559
  "results.showMore": "",
@@ -22399,6 +22562,7 @@ var pt = {
22399
22562
  "results.sortBy.popularity": "",
22400
22563
  "results.sortBy.qualityScore": "",
22401
22564
  "results.sortBy.relevancy": "",
22565
+ "reuse.metadata.access": "",
22402
22566
  "search.autocomplete.error": "",
22403
22567
  "search.error.couldNotReachApi": "",
22404
22568
  "search.error.organizationHasNoDataset": "",
@@ -22448,6 +22612,26 @@ var pt = {
22448
22612
  "search.filters.useSpatialFilter": "",
22449
22613
  "search.filters.useSpatialFilterHelp": "",
22450
22614
  "search.filters.user": "",
22615
+ "service.metadata.capabilities": "",
22616
+ "service.metadata.capabilities.abstract": "",
22617
+ "service.metadata.capabilities.attribution": "",
22618
+ "service.metadata.capabilities.availableCrs": "",
22619
+ "service.metadata.capabilities.defaultCrs": "",
22620
+ "service.metadata.capabilities.geometryName": "",
22621
+ "service.metadata.capabilities.geometryType": "",
22622
+ "service.metadata.capabilities.keywords": "",
22623
+ "service.metadata.capabilities.name": "",
22624
+ "service.metadata.capabilities.objectCount": "",
22625
+ "service.metadata.capabilities.otherCrs": "",
22626
+ "service.metadata.capabilities.outputFormats": "",
22627
+ "service.metadata.capabilities.resourceLinks": "",
22628
+ "service.metadata.capabilities.title": "",
22629
+ "service.metadata.filter": "",
22630
+ "service.metadata.filter.noLayers": "",
22631
+ "service.metadata.other": "",
22632
+ "service.metadata.question": "",
22633
+ "service.metadata.search": "",
22634
+ "service.metadata.spatialExtent": "",
22451
22635
  "share.tab.permalink": "",
22452
22636
  "share.tab.webComponent": "",
22453
22637
  "table.loading.data": "",
@@ -22796,8 +22980,8 @@ class Gn4FieldMapper {
22796
22980
  return {
22797
22981
  ...distribution,
22798
22982
  type,
22799
- endpointUrl: url,
22800
- protocol: accessServiceProtocol,
22983
+ url: url,
22984
+ accessServiceProtocol: accessServiceProtocol,
22801
22985
  };
22802
22986
  }
22803
22987
  };
@@ -23193,14 +23377,6 @@ class ElasticsearchService {
23193
23377
  }
23194
23378
  mustNotFilters() {
23195
23379
  return [
23196
- {
23197
- ...this.queryFilterOnValues('resourceType', [
23198
- 'service',
23199
- 'map',
23200
- 'map/static',
23201
- 'mapDigital',
23202
- ]),
23203
- },
23204
23380
  {
23205
23381
  query_string: {
23206
23382
  query: 'resourceType:featureCatalog AND !resourceType:dataset AND !cl_level.key:dataset',
@@ -23299,7 +23475,7 @@ class ElasticsearchService {
23299
23475
  must_not: this.mustNotFilters(),
23300
23476
  },
23301
23477
  },
23302
- _source: ['resourceTitleObject', 'uuid'],
23478
+ _source: ['resourceTitleObject', 'uuid', 'resourceType'],
23303
23479
  from: 0,
23304
23480
  size: 20,
23305
23481
  };
@@ -25037,7 +25213,7 @@ function getLinkLabel(link) {
25037
25213
  default:
25038
25214
  format = getFileFormat(link);
25039
25215
  }
25040
- const label = link.description || link.name;
25216
+ const label = link.description || ('name' in link ? link.name : '');
25041
25217
  return format ? `${label} (${format})` : label;
25042
25218
  }
25043
25219
  async function getLayers(url, serviceProtocol) {
@@ -25048,14 +25224,21 @@ async function getLayers(url, serviceProtocol) {
25048
25224
  }
25049
25225
  case 'wfs': {
25050
25226
  const endpointWfs = await new WfsEndpoint(url).isReady();
25051
- return endpointWfs.getFeatureTypes();
25227
+ const featureTypes = await endpointWfs.getFeatureTypes();
25228
+ const layers = await Promise.all(featureTypes.map(async (collection) => {
25229
+ return await endpointWfs.getFeatureTypeFull(collection.name);
25230
+ }));
25231
+ return layers;
25052
25232
  }
25053
25233
  case 'wms': {
25054
25234
  const endpointWms = await new WmsEndpoint(url).isReady();
25055
- return endpointWms
25235
+ const layers = (await endpointWms
25056
25236
  .getLayers()
25057
25237
  .flatMap(wmsLayerFlatten)
25058
- .filter((l) => l.name);
25238
+ .filter((l) => l.name)).map((collection) => {
25239
+ return endpointWms.getLayerByName(collection.name);
25240
+ });
25241
+ return layers;
25059
25242
  }
25060
25243
  case 'wmts': {
25061
25244
  const endpointWmts = await new WmtsEndpoint(url).isReady();
@@ -25092,6 +25275,7 @@ var LinkUsage;
25092
25275
  class LinkClassifierService {
25093
25276
  getUsagesForLink(link) {
25094
25277
  switch (link.type) {
25278
+ case 'endpoint':
25095
25279
  case 'service': {
25096
25280
  switch (link.accessServiceProtocol) {
25097
25281
  case 'esriRest':
@@ -25140,6 +25324,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25140
25324
  }]
25141
25325
  }] });
25142
25326
 
25327
+ var name = "geonetwork-ui";
25328
+ var version = "2.6.0-dev.70b25ba3b";
25329
+ var engines = {
25330
+ node: ">=20"
25331
+ };
25332
+ var main = "./index.ts";
25333
+ var type = "module";
25334
+ var exports = {
25335
+ "./tailwind.base.config.js": "./tailwind.base.config.js",
25336
+ "./style.css": "./style.css"
25337
+ };
25338
+ var repository = {
25339
+ url: "https://github.com/geonetwork/geonetwork-ui"
25340
+ };
25341
+ var peerDependencies = {
25342
+ "@angular/animations": "17.x || 18.x || 19.x",
25343
+ "@angular/cdk": "17.x || 18.x || 19.x",
25344
+ "@angular/common": "17.x || 18.x || 19.x",
25345
+ "@angular/compiler": "17.x || 18.x || 19.x",
25346
+ "@angular/core": "17.x || 18.x || 19.x",
25347
+ "@angular/forms": "17.x || 18.x || 19.x",
25348
+ "@angular/material": "17.x || 18.x || 19.x",
25349
+ "@angular/material-moment-adapter": "17.x || 18.x || 19.x",
25350
+ "@angular/platform-browser": "17.x || 18.x || 19.x",
25351
+ "@angular/platform-browser-dynamic": "17.x || 18.x || 19.x",
25352
+ "@angular/router": "17.x || 18.x || 19.x",
25353
+ "@ngrx/component": "17.x || 18.x || 19.x",
25354
+ "@ngrx/effects": "17.x || 18.x || 19.x",
25355
+ "@ngrx/router-store": "17.x || 18.x || 19.x",
25356
+ "@ngrx/store": "17.x || 18.x || 19.x",
25357
+ "@ngrx/store-devtools": "17.x || 18.x || 19.x",
25358
+ "@ngrx/operators": "18.x",
25359
+ "@ngx-translate/core": "15.x",
25360
+ "@ngx-translate/http-loader": "16.x",
25361
+ rxjs: "7.x",
25362
+ "zone.js": "*",
25363
+ tailwindcss: "3.x"
25364
+ };
25365
+ var dependencies = {
25366
+ "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
25367
+ "@camptocamp/ogc-client": "1.1.1-dev.3e2d3cc",
25368
+ "@geospatial-sdk/core": "0.0.5-dev.31",
25369
+ "@geospatial-sdk/geocoding": "0.0.5-dev.31",
25370
+ "@geospatial-sdk/legend": "0.0.5-dev.31",
25371
+ "@geospatial-sdk/openlayers": "0.0.5-dev.31",
25372
+ "@ltd/j-toml": "~1.35.2",
25373
+ "@messageformat/core": "^3.0.1",
25374
+ "@ng-icons/core": "29.10.0",
25375
+ "@ng-icons/iconoir": "29.10.0",
25376
+ "@ng-icons/material-icons": "29.10.0",
25377
+ "@ng-icons/tabler-icons": "29.10.0",
25378
+ "@nx/angular": "20.2.2",
25379
+ "@rgrove/parse-xml": "4.2.0",
25380
+ alasql: "4.6.0",
25381
+ axios: "1.7.9",
25382
+ basiclightbox: "^5.0.4",
25383
+ "chart.js": "4.4.7",
25384
+ "chroma-js": "3.1.2",
25385
+ "date-fns": "4.1.0",
25386
+ "document-register-element": "^1.14.10",
25387
+ "duration-relativetimeformat": "^2.0.4",
25388
+ "embla-carousel": "8.5.1",
25389
+ express: "^4.21.1",
25390
+ "geojson-validation": "^1.0.2",
25391
+ marked: "15.0.4",
25392
+ moment: "2.30.1",
25393
+ "ng-table-virtual-scroll": "1.6.1",
25394
+ "ngx-chips": "3.0.0",
25395
+ "ngx-dropzone": "3.1.0",
25396
+ "ngx-translate-messageformat-compiler": "7.0.0",
25397
+ ol: "^8.2.0",
25398
+ papaparse: "5.4.1",
25399
+ pg: "^8.9.0",
25400
+ proj4: "^2.9.2",
25401
+ rdflib: "^2.2.35",
25402
+ "reflect-metadata": "^0.1.13",
25403
+ semver: "7.6.3",
25404
+ "tippy.js": "6.3.7",
25405
+ tslib: "^2.3.0",
25406
+ typeorm: "^0.3.14",
25407
+ "whatwg-fetch": "^3.6.2",
25408
+ xlsx: "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz"
25409
+ };
25410
+ var packageJson = {
25411
+ name: name,
25412
+ version: version,
25413
+ engines: engines,
25414
+ main: main,
25415
+ type: type,
25416
+ exports: exports,
25417
+ repository: repository,
25418
+ peerDependencies: peerDependencies,
25419
+ dependencies: dependencies
25420
+ };
25421
+
25422
+ const GEONETWORK_UI_VERSION = packageJson.version;
25423
+ const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1] === 'dev'
25424
+ ? 'main'
25425
+ : `v${packageJson.version}`;
25426
+
25143
25427
  const minApiVersion = '4.2.2';
25144
25428
  class Gn4PlatformService {
25145
25429
  constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService, httpClient, recordsApiService) {
@@ -25333,12 +25617,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25333
25617
  type: Injectable
25334
25618
  }], ctorParameters: () => [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }, { type: i1.HttpClient }, { type: RecordsApiService }] });
25335
25619
 
25620
+ class RecordsRepositoryInterface {
25621
+ }
25622
+
25336
25623
  function provideGn4() {
25337
25624
  return [
25338
25625
  {
25339
25626
  provide: PlatformServiceInterface,
25340
25627
  useClass: Gn4PlatformService,
25341
25628
  },
25629
+ {
25630
+ provide: RecordsRepositoryInterface,
25631
+ useClass: Gn4Repository,
25632
+ },
25342
25633
  Gn4PlatformMapper,
25343
25634
  ];
25344
25635
  }
@@ -25414,7 +25705,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25414
25705
 
25415
25706
  class AnchorLinkDirective {
25416
25707
  get elementClass() {
25417
- return this.disabled ? this.disabledClass : this.enabledClass;
25708
+ if (this.disabled) {
25709
+ return this.disabledClass;
25710
+ }
25711
+ if (this.inView) {
25712
+ return `${this.inViewClass} ${this.enabledClass}`;
25713
+ }
25714
+ else {
25715
+ return `${this.outOfViewClass} ${this.enabledClass}`;
25716
+ }
25418
25717
  }
25419
25718
  constructor(changeDetector) {
25420
25719
  this.changeDetector = changeDetector;
@@ -25422,6 +25721,8 @@ class AnchorLinkDirective {
25422
25721
  this.observer = new MutationObserver(() => {
25423
25722
  this.refreshDisabledState();
25424
25723
  });
25724
+ this.inView = false;
25725
+ this.initialized = false;
25425
25726
  }
25426
25727
  ngOnInit() {
25427
25728
  this.observer.observe(document.body, {
@@ -25430,8 +25731,32 @@ class AnchorLinkDirective {
25430
25731
  });
25431
25732
  this.refreshDisabledState();
25432
25733
  }
25734
+ ngAfterViewChecked() {
25735
+ if (!this.initialized && !this.disabled) {
25736
+ const target = document.getElementById(this.targetId);
25737
+ if (target) {
25738
+ this.initializeIntersectionObserver(target);
25739
+ this.initialized = true;
25740
+ }
25741
+ }
25742
+ }
25743
+ initializeIntersectionObserver(target) {
25744
+ this.intersectionObserver = new IntersectionObserver((entries) => {
25745
+ entries.forEach((entry) => {
25746
+ this.inView = entry.isIntersecting;
25747
+ this.changeDetector.detectChanges();
25748
+ });
25749
+ }, {
25750
+ root: null,
25751
+ rootMargin: '-30% 0% -60% 0%',
25752
+ });
25753
+ this.intersectionObserver.observe(target);
25754
+ }
25433
25755
  ngOnDestroy() {
25434
25756
  this.observer.disconnect();
25757
+ if (this.intersectionObserver) {
25758
+ this.intersectionObserver.disconnect();
25759
+ }
25435
25760
  }
25436
25761
  refreshDisabledState() {
25437
25762
  const targetNotPresent = !document.getElementById(this.targetId);
@@ -25450,7 +25775,7 @@ class AnchorLinkDirective {
25450
25775
  });
25451
25776
  }
25452
25777
  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 }); }
25453
- 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 }); }
25778
+ 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 }); }
25454
25779
  }
25455
25780
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, decorators: [{
25456
25781
  type: Directive,
@@ -25466,6 +25791,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25466
25791
  }], enabledClass: [{
25467
25792
  type: Input,
25468
25793
  args: ['gnUiAnchorLinkEnabledClass']
25794
+ }], inViewClass: [{
25795
+ type: Input,
25796
+ args: ['gnUiAnchorLinkInViewClass']
25797
+ }], outOfViewClass: [{
25798
+ type: Input,
25799
+ args: ['gnUiAnchorLinkOutOfViewClass']
25469
25800
  }], elementClass: [{
25470
25801
  type: HostBinding,
25471
25802
  args: ['class']
@@ -25555,11 +25886,11 @@ class CarouselComponent {
25555
25886
  .on('select', this.refreshSteps);
25556
25887
  }
25557
25888
  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 }); }
25558
- 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 }); }
25889
+ 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 block\">\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}\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 }); }
25559
25890
  }
25560
25891
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, decorators: [{
25561
25892
  type: Component,
25562
- 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"] }]
25893
+ args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div #carouselOverflowContainer class=\"w-full block\">\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}\n"] }]
25563
25894
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { carouselOverflowContainer: [{
25564
25895
  type: ViewChild,
25565
25896
  args: ['carouselOverflowContainer']
@@ -25730,6 +26061,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25730
26061
  type: Output
25731
26062
  }] } });
25732
26063
 
26064
+ marker('editor.record.lock.reason');
26065
+ marker('editor.record.lock.format');
25733
26066
  class InteractiveTableComponent {
25734
26067
  constructor() {
25735
26068
  this.items = [];
@@ -25747,15 +26080,24 @@ class InteractiveTableComponent {
25747
26080
  .join(' '),
25748
26081
  };
25749
26082
  }
26083
+ getItemTitle(item) {
26084
+ if (!item.extras?.edit && !this.isDraftPage && item.kind === 'dataset') {
26085
+ return 'editor.record.lock.reason';
26086
+ }
26087
+ else if (item.kind !== 'dataset') {
26088
+ return 'editor.record.lock.format';
26089
+ }
26090
+ return '';
26091
+ }
25750
26092
  handleRowClick(item) {
25751
26093
  this.itemClick.emit(item);
25752
26094
  }
25753
26095
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25754
- 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 }); }
26096
+ 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 }); }
25755
26097
  }
25756
26098
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
25757
26099
  type: Component,
25758
- 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"] }]
26100
+ 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"] }]
25759
26101
  }], propDecorators: { columns: [{
25760
26102
  type: ContentChildren,
25761
26103
  args: [InteractiveTableColumnComponent]
@@ -25856,14 +26198,16 @@ class BlockListComponent {
25856
26198
  return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
25857
26199
  }
25858
26200
  get currentPage() {
25859
- return this.currentPage_ + 1; // this is 1-based
26201
+ return this.currentPage_ + 1;
25860
26202
  }
25861
26203
  constructor(changeDetector) {
25862
26204
  this.changeDetector = changeDetector;
25863
- this.pageSize = 5;
26205
+ this.pageSize = 4;
25864
26206
  this.containerClass = '';
25865
26207
  this.paginationContainerClass = 'w-full bottom-0 top-auto';
25866
26208
  this.minHeight = 0;
26209
+ this.listChanges = new EventEmitter();
26210
+ this.subComponentSize = 'M';
25867
26211
  this.currentPage_ = 0;
25868
26212
  this.refreshBlocksVisibility = () => {
25869
26213
  this.blocks.forEach((block, index) => {
@@ -25876,13 +26220,48 @@ class BlockListComponent {
25876
26220
  };
25877
26221
  }
25878
26222
  ngAfterViewInit() {
25879
- this.blocks.changes.subscribe(this.refreshBlocksVisibility);
26223
+ this.blocks.changes.subscribe(() => {
26224
+ this.updateSizes();
26225
+ this.refreshBlocksVisibility();
26226
+ this.goToPage(1);
26227
+ this.changeDetector.detectChanges();
26228
+ this.listChanges.emit(this);
26229
+ });
26230
+ this.updateSizes();
25880
26231
  this.refreshBlocksVisibility();
25881
26232
  // we store the first height as the min-height of the list container
25882
26233
  this.minHeight = this.blockContainer.nativeElement.clientHeight;
25883
26234
  this.changeDetector.detectChanges();
26235
+ this.listChanges.emit(this);
26236
+ }
26237
+ updateSizes() {
26238
+ this.subComponentSize = this.computeSubComponentSize();
26239
+ this.pageSize = this.computePageSize();
26240
+ }
26241
+ computeSubComponentSize() {
26242
+ if (!this.blocks)
26243
+ return 'M';
26244
+ const subComponentsCount = this.blocks.length;
26245
+ if (subComponentsCount <= 3)
26246
+ return 'L';
26247
+ if (subComponentsCount <= 12)
26248
+ return 'M';
26249
+ if (subComponentsCount <= 18)
26250
+ return 'S';
26251
+ return 'XS';
26252
+ }
26253
+ computePageSize() {
26254
+ switch (this.subComponentSize) {
26255
+ case 'L':
26256
+ return 3;
26257
+ case 'S':
26258
+ return 6;
26259
+ case 'XS':
26260
+ return 8;
26261
+ default:
26262
+ return 4;
26263
+ }
25884
26264
  }
25885
- // pageIndex is 1-based
25886
26265
  goToPage(pageIndex) {
25887
26266
  this.currentPage_ = Math.max(Math.min(pageIndex - 1, this.pagesCount - 1), 0);
25888
26267
  this.changeDetector.detectChanges();
@@ -25899,14 +26278,12 @@ class BlockListComponent {
25899
26278
  this.goToPage(this.currentPage + 1);
25900
26279
  }
25901
26280
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25902
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BlockListComponent, isStandalone: true, selector: "gn-ui-block-list", inputs: { pageSize: "pageSize", containerClass: "containerClass", paginationContainerClass: "paginationContainerClass" }, queries: [{ propertyName: "blocks", predicate: ["block"], read: ElementRef }], viewQueries: [{ propertyName: "blockContainer", first: true, predicate: ["blockContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"block-list-container flex flex-col\"\n #blockContainer\n [ngClass]=\"containerClass\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26281
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BlockListComponent, isStandalone: true, selector: "gn-ui-block-list", inputs: { containerClass: "containerClass", paginationContainerClass: "paginationContainerClass" }, outputs: { listChanges: "listChanges" }, queries: [{ propertyName: "blocks", predicate: ["block"], read: ElementRef }], viewQueries: [{ propertyName: "blockContainer", first: true, predicate: ["blockContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"grid gap-4 w-full md:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25903
26282
  }
25904
26283
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, decorators: [{
25905
26284
  type: Component,
25906
- args: [{ selector: 'gn-ui-block-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div\n class=\"block-list-container flex flex-col\"\n #blockContainer\n [ngClass]=\"containerClass\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}\n"] }]
25907
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { pageSize: [{
25908
- type: Input
25909
- }], containerClass: [{
26285
+ args: [{ selector: 'gn-ui-block-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div\n class=\"grid gap-4 w-full md:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"] }]
26286
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerClass: [{
25910
26287
  type: Input
25911
26288
  }], paginationContainerClass: [{
25912
26289
  type: Input
@@ -25916,6 +26293,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25916
26293
  }], blockContainer: [{
25917
26294
  type: ViewChild,
25918
26295
  args: ['blockContainer']
26296
+ }], listChanges: [{
26297
+ type: Output
25919
26298
  }] } });
25920
26299
 
25921
26300
  class ColorScaleComponent {
@@ -25999,11 +26378,11 @@ class ProgressBarComponent {
25999
26378
  }
26000
26379
  }
26001
26380
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26002
- 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]" }] }); }
26381
+ 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 }} font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"], dependencies: [{ kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
26003
26382
  }
26004
26383
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, decorators: [{
26005
26384
  type: Component,
26006
- 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"] }]
26385
+ 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 }} font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
26007
26386
  }], propDecorators: { value: [{
26008
26387
  type: Input
26009
26388
  }], type: [{
@@ -26885,11 +27264,11 @@ class DropdownMultiselectComponent {
26885
27264
  this.setFocus();
26886
27265
  }
26887
27266
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$9.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
26888
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"gn-ui-multiselect-counter shrink-0 rounded-full font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <ng-icon\n name=\"matClose\"\n class=\"!h-[12px] !w-[11px] text-[12px]\"\n ></ng-icon>\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <ng-icon class=\"!h-[10px] !w-[12px] text-[12px]\" name=\"matClose\">\n </ng-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$9.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$9.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: i2$2.NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27267
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"gn-ui-multiselect-counter shrink-0 rounded-full font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row gap-[2px] flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <ng-icon\n name=\"matClose\"\n class=\"!h-[12px] !w-[11px] text-[12px]\"\n ></ng-icon>\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <ng-icon class=\"!h-[10px] !w-[12px] text-[12px]\" name=\"matClose\">\n </ng-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$9.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$9.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: i2$2.NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26889
27268
  }
26890
27269
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
26891
27270
  type: Component,
26892
- args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"gn-ui-multiselect-counter shrink-0 rounded-full font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <ng-icon\n name=\"matClose\"\n class=\"!h-[12px] !w-[11px] text-[12px]\"\n ></ng-icon>\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <ng-icon class=\"!h-[10px] !w-[12px] text-[12px]\" name=\"matClose\">\n </ng-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
27271
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"gn-ui-multiselect-counter shrink-0 rounded-full font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row gap-[2px] flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <ng-icon\n name=\"matClose\"\n class=\"!h-[12px] !w-[11px] text-[12px]\"\n ></ng-icon>\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <ng-icon class=\"!h-[10px] !w-[12px] text-[12px]\" name=\"matClose\">\n </ng-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
26893
27272
  }], ctorParameters: () => [{ type: i1$9.ScrollStrategyOptions }], propDecorators: { title: [{
26894
27273
  type: Input
26895
27274
  }], choices: [{
@@ -27397,17 +27776,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27397
27776
  type: Input
27398
27777
  }] } });
27399
27778
 
27400
- class NavigationButtonComponent {
27401
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27402
- 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 }); }
27779
+ class InlineFilterComponent {
27780
+ constructor() {
27781
+ this.selected = [];
27782
+ this.selectValues = new EventEmitter();
27783
+ }
27784
+ isSelected(choice) {
27785
+ return (this.selected.indexOf(choice.value) > -1 ||
27786
+ (this.selected.length === 0 && choice.value === 'all'));
27787
+ }
27788
+ select(choice, selected) {
27789
+ if (choice.value === 'all' && selected) {
27790
+ this.selected = [choice.value];
27791
+ }
27792
+ else {
27793
+ this.selected = selected
27794
+ ? [...this.selected.filter((v) => v !== choice.value), choice.value]
27795
+ : this.selected.filter((v) => v !== choice.value);
27796
+ // If any value selected, unselect all
27797
+ this.selected = this.selected.filter((v) => v !== 'all');
27798
+ }
27799
+ this.selectValues.emit(this.selected);
27800
+ }
27801
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InlineFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27802
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InlineFilterComponent, selector: "gn-ui-inline-filter", inputs: { choices: "choices", selected: "selected" }, outputs: { selectValues: "selectValues" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0, template: "<ul class=\"flex flex-wrap list-none gap-2\">\n <li *ngFor=\"let choice of choices\">\n <label\n class=\"\"\n [ngClass]=\"{\n selected: isSelected(choice),\n }\"\n >\n <input\n class=\"hidden\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n [attr.data-cy]=\"'inlineFilter-' + choice.value\"\n />\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: choice }\"\n >\n </ng-container>\n </label>\n </li>\n</ul>\n", dependencies: [{ 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
27403
27803
  }
27404
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, decorators: [{
27804
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InlineFilterComponent, decorators: [{
27405
27805
  type: Component,
27406
- 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"] }]
27407
- }], propDecorators: { label: [{
27806
+ args: [{ selector: 'gn-ui-inline-filter', template: "<ul class=\"flex flex-wrap list-none gap-2\">\n <li *ngFor=\"let choice of choices\">\n <label\n class=\"\"\n [ngClass]=\"{\n selected: isSelected(choice),\n }\"\n >\n <input\n class=\"hidden\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n [attr.data-cy]=\"'inlineFilter-' + choice.value\"\n />\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: choice }\"\n >\n </ng-container>\n </label>\n </li>\n</ul>\n" }]
27807
+ }], propDecorators: { choices: [{
27408
27808
  type: Input
27409
- }], icon: [{
27809
+ }], selected: [{
27410
27810
  type: Input
27811
+ }], selectValues: [{
27812
+ type: Output
27813
+ }], itemTemplate: [{
27814
+ type: ContentChild,
27815
+ args: [TemplateRef]
27411
27816
  }] } });
27412
27817
 
27413
27818
  class SearchInputComponent {
@@ -27468,11 +27873,11 @@ class StarToggleComponent {
27468
27873
  event.preventDefault();
27469
27874
  }
27470
27875
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27471
- 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 }); }
27876
+ 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 }); }
27472
27877
  }
27473
27878
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, decorators: [{
27474
27879
  type: Component,
27475
- 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"] }]
27880
+ 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"] }]
27476
27881
  }], propDecorators: { toggled: [{
27477
27882
  type: Input
27478
27883
  }], disabled: [{
@@ -27646,7 +28051,8 @@ class UiInputsModule {
27646
28051
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiInputsModule, declarations: [DragAndDropFileInputComponent,
27647
28052
  DropdownMultiselectComponent,
27648
28053
  ViewportIntersectorComponent,
27649
- CheckboxComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
28054
+ CheckboxComponent,
28055
+ InlineFilterComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
27650
28056
  FormsModule,
27651
28057
  ReactiveFormsModule,
27652
28058
  TagInputModule,
@@ -27677,6 +28083,7 @@ class UiInputsModule {
27677
28083
  CheckboxComponent,
27678
28084
  DateRangePickerComponent,
27679
28085
  EditableLabelDirective,
28086
+ InlineFilterComponent,
27680
28087
  BadgeComponent] }); }
27681
28088
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiInputsModule, providers: [
27682
28089
  provideIcons({
@@ -27718,6 +28125,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27718
28125
  DropdownMultiselectComponent,
27719
28126
  ViewportIntersectorComponent,
27720
28127
  CheckboxComponent,
28128
+ InlineFilterComponent,
27721
28129
  ],
27722
28130
  imports: [
27723
28131
  CommonModule,
@@ -27766,6 +28174,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27766
28174
  CheckboxComponent,
27767
28175
  DateRangePickerComponent,
27768
28176
  EditableLabelDirective,
28177
+ InlineFilterComponent,
27769
28178
  BadgeComponent,
27770
28179
  ],
27771
28180
  }]
@@ -27911,20 +28320,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27911
28320
  class PreviousNextButtonsComponent {
27912
28321
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PreviousNextButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27913
28322
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PreviousNextButtonsComponent, isStandalone: true, selector: "gn-ui-previous-next-buttons", inputs: { listComponent: "listComponent" }, providers: [
27914
- provideIcons({ matArrowForward, matArrowBack }),
28323
+ provideIcons({ matArrowBackIos, matArrowForwardIos }),
27915
28324
  provideNgIconsConfig({
27916
28325
  size: '0.875em',
27917
28326
  }),
27918
- ], ngImport: i0, template: "<div class=\"flex flex-row gap-x-4 items-center\">\n <gn-ui-button\n data-test=\"previousButton\"\n type=\"outline\"\n [disabled]=\"listComponent.isFirstPage\"\n (buttonClick)=\"listComponent.goToPrevPage()\"\n >\n <ng-icon name=\"matArrowBack\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n data-test=\"nextButton\"\n type=\"outline\"\n [disabled]=\"listComponent.isLastPage\"\n (buttonClick)=\"listComponent.goToNextPage()\"\n >\n <ng-icon name=\"matArrowForward\"></ng-icon>\n </gn-ui-button>\n</div>\n", styles: [":host{--gn-ui-button-rounded: 100%;--gn-ui-button-width: 8px;--gn-ui-button-height: 8px;--gn-ui-button-padding: 12px}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }] }); }
28327
+ ], ngImport: i0, template: "<div class=\"flex flex-row gap-x-1 items-center\">\n <gn-ui-button\n data-test=\"previousButton\"\n type=\"light\"\n [extraClass]=\"\n 'w-10 h-8 px-2 py-1 rounded-lg ' +\n (!listComponent.isFirstPage\n ? 'border border-gray-300'\n : 'border border-gray-100')\n \"\n [disabled]=\"listComponent.isFirstPage\"\n (buttonClick)=\"listComponent.goToPrevPage()\"\n >\n <ng-icon name=\"matArrowBackIos\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n data-test=\"nextButton\"\n type=\"light\"\n [extraClass]=\"\n 'w-10 h-8 px-2 py-1 rounded-lg ' +\n (!listComponent.isLastPage\n ? 'border border-gray-300'\n : 'border border-gray-100')\n \"\n [disabled]=\"listComponent.isLastPage\"\n (buttonClick)=\"listComponent.goToNextPage()\"\n >\n <ng-icon name=\"matArrowForwardIos\"></ng-icon>\n </gn-ui-button>\n</div>\n", styles: [":host{--gn-ui-button-rounded: 100%;--gn-ui-button-width: 8px;--gn-ui-button-height: 8px;--gn-ui-button-padding: 12px}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }] }); }
27919
28328
  }
27920
28329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PreviousNextButtonsComponent, decorators: [{
27921
28330
  type: Component,
27922
28331
  args: [{ selector: 'gn-ui-previous-next-buttons', standalone: true, imports: [ButtonComponent, NgIconComponent], providers: [
27923
- provideIcons({ matArrowForward, matArrowBack }),
28332
+ provideIcons({ matArrowBackIos, matArrowForwardIos }),
27924
28333
  provideNgIconsConfig({
27925
28334
  size: '0.875em',
27926
28335
  }),
27927
- ], template: "<div class=\"flex flex-row gap-x-4 items-center\">\n <gn-ui-button\n data-test=\"previousButton\"\n type=\"outline\"\n [disabled]=\"listComponent.isFirstPage\"\n (buttonClick)=\"listComponent.goToPrevPage()\"\n >\n <ng-icon name=\"matArrowBack\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n data-test=\"nextButton\"\n type=\"outline\"\n [disabled]=\"listComponent.isLastPage\"\n (buttonClick)=\"listComponent.goToNextPage()\"\n >\n <ng-icon name=\"matArrowForward\"></ng-icon>\n </gn-ui-button>\n</div>\n", styles: [":host{--gn-ui-button-rounded: 100%;--gn-ui-button-width: 8px;--gn-ui-button-height: 8px;--gn-ui-button-padding: 12px}\n"] }]
28336
+ ], template: "<div class=\"flex flex-row gap-x-1 items-center\">\n <gn-ui-button\n data-test=\"previousButton\"\n type=\"light\"\n [extraClass]=\"\n 'w-10 h-8 px-2 py-1 rounded-lg ' +\n (!listComponent.isFirstPage\n ? 'border border-gray-300'\n : 'border border-gray-100')\n \"\n [disabled]=\"listComponent.isFirstPage\"\n (buttonClick)=\"listComponent.goToPrevPage()\"\n >\n <ng-icon name=\"matArrowBackIos\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n data-test=\"nextButton\"\n type=\"light\"\n [extraClass]=\"\n 'w-10 h-8 px-2 py-1 rounded-lg ' +\n (!listComponent.isLastPage\n ? 'border border-gray-300'\n : 'border border-gray-100')\n \"\n [disabled]=\"listComponent.isLastPage\"\n (buttonClick)=\"listComponent.goToNextPage()\"\n >\n <ng-icon name=\"matArrowForwardIos\"></ng-icon>\n </gn-ui-button>\n</div>\n", styles: [":host{--gn-ui-button-rounded: 100%;--gn-ui-button-width: 8px;--gn-ui-button-height: 8px;--gn-ui-button-padding: 12px}\n"] }]
27928
28337
  }], propDecorators: { listComponent: [{
27929
28338
  type: Input
27930
28339
  }] } });
@@ -28580,17 +28989,104 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28580
28989
 
28581
28990
  class ResultsHitsNumberComponent {
28582
28991
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsNumberComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28583
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsHitsNumberComponent, selector: "gn-ui-results-hits-number", inputs: { hits: "hits", loading: "loading" }, ngImport: i0, template: "<div *ngIf=\"!loading\" class=\"w-full\">\n <span translate [translateParams]=\"{ hits: hits }\"\n >results.records.hits.found</span\n >\n <p\n *ngIf=\"hits === 0\"\n class=\"mt-4\"\n [innerHtml]=\"'results.records.hits.empty.help.html' | translate\"\n ></p>\n</div>\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: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28992
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsHitsNumberComponent, selector: "gn-ui-results-hits-number", inputs: { hits: "hits", loading: "loading" }, ngImport: i0, template: "<div *ngIf=\"!loading\" class=\"w-full\">\n <span data-cy=\"resultsHitsFound\" translate [translateParams]=\"{ hits: hits }\"\n >results.records.hits.found</span\n >\n <p\n *ngIf=\"hits === 0\"\n class=\"mt-4\"\n [innerHtml]=\"'results.records.hits.empty.help.html' | translate\"\n ></p>\n</div>\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: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
28584
28993
  }
28585
28994
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsNumberComponent, decorators: [{
28586
28995
  type: Component,
28587
- args: [{ selector: 'gn-ui-results-hits-number', template: "<div *ngIf=\"!loading\" class=\"w-full\">\n <span translate [translateParams]=\"{ hits: hits }\"\n >results.records.hits.found</span\n >\n <p\n *ngIf=\"hits === 0\"\n class=\"mt-4\"\n [innerHtml]=\"'results.records.hits.empty.help.html' | translate\"\n ></p>\n</div>\n" }]
28996
+ args: [{ selector: 'gn-ui-results-hits-number', template: "<div *ngIf=\"!loading\" class=\"w-full\">\n <span data-cy=\"resultsHitsFound\" translate [translateParams]=\"{ hits: hits }\"\n >results.records.hits.found</span\n >\n <p\n *ngIf=\"hits === 0\"\n class=\"mt-4\"\n [innerHtml]=\"'results.records.hits.empty.help.html' | translate\"\n ></p>\n</div>\n" }]
28588
28997
  }], propDecorators: { hits: [{
28589
28998
  type: Input
28590
28999
  }], loading: [{
28591
29000
  type: Input
28592
29001
  }] } });
28593
29002
 
29003
+ var KindConfig;
29004
+ (function (KindConfig) {
29005
+ KindConfig["all"] = "iconoirAppleWallet";
29006
+ KindConfig["dataset"] = "iconoirAppleShortcuts";
29007
+ KindConfig["service"] = "iconoirCode";
29008
+ KindConfig["reuse"] = "iconoirCreditCard";
29009
+ })(KindConfig || (KindConfig = {}));
29010
+ class KindBadgeComponent {
29011
+ constructor() {
29012
+ this.hasProjectedContent = false;
29013
+ }
29014
+ get iconKind() {
29015
+ return KindConfig[this.kind] || KindConfig.dataset;
29016
+ }
29017
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KindBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29018
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: KindBadgeComponent, isStandalone: true, selector: "gn-ui-kind-badge", inputs: { contentTemplate: "contentTemplate", kind: "kind" }, ngImport: i0, template: "<ng-icon [name]=\"iconKind\" class=\"mr-1\"></ng-icon>\n\n<ng-container *ngIf=\"contentTemplate; else defaultContent\">\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\n</ng-container>\n\n<ng-template #defaultContent>\n {{ kind | translate }}\n</ng-template>\n", styles: [":host gn-ui-badge ng-icon{font-size:1.2rem;width:1.2rem;height:1.2rem;transform:translateY(-2px)}\n"], dependencies: [{ kind: "ngmodule", type: NgIconsModule }, { kind: "component", type: i2$2.NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], viewProviders: [
29019
+ provideIcons({
29020
+ iconoirAppleWallet,
29021
+ iconoirAppleShortcuts,
29022
+ iconoirCode,
29023
+ iconoirCreditCard,
29024
+ }),
29025
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29026
+ }
29027
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KindBadgeComponent, decorators: [{
29028
+ type: Component,
29029
+ args: [{ selector: 'gn-ui-kind-badge', viewProviders: [
29030
+ provideIcons({
29031
+ iconoirAppleWallet,
29032
+ iconoirAppleShortcuts,
29033
+ iconoirCode,
29034
+ iconoirCreditCard,
29035
+ }),
29036
+ ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIconsModule, CommonModule, BadgeComponent, TranslateModule], template: "<ng-icon [name]=\"iconKind\" class=\"mr-1\"></ng-icon>\n\n<ng-container *ngIf=\"contentTemplate; else defaultContent\">\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\n</ng-container>\n\n<ng-template #defaultContent>\n {{ kind | translate }}\n</ng-template>\n", styles: [":host gn-ui-badge ng-icon{font-size:1.2rem;width:1.2rem;height:1.2rem;transform:translateY(-2px)}\n"] }]
29037
+ }], propDecorators: { contentTemplate: [{
29038
+ type: Input
29039
+ }], kind: [{
29040
+ type: Input
29041
+ }] } });
29042
+
29043
+ class ResultsHitsSearchKindComponent {
29044
+ constructor() {
29045
+ this.selected = [];
29046
+ this.choices = [];
29047
+ this.selectionChanged = new EventEmitter();
29048
+ this.availableChoices = [];
29049
+ }
29050
+ ngOnChanges(changes) {
29051
+ if (changes.choices && changes.choices.currentValue) {
29052
+ this.availableChoices = this.buildFilterChoices(this.choices);
29053
+ }
29054
+ }
29055
+ buildFilterChoices(availableValues) {
29056
+ return [
29057
+ ...[
29058
+ {
29059
+ label: 'all',
29060
+ value: 'all',
29061
+ },
29062
+ ],
29063
+ ...availableValues,
29064
+ ];
29065
+ }
29066
+ onSelectedValues(values) {
29067
+ const selectedValues = values.includes('all') ? [] : values;
29068
+ this.selectionChanged.emit(selectedValues);
29069
+ }
29070
+ isSelectedChoice(choiceValue) {
29071
+ return this.selected.includes(choiceValue);
29072
+ }
29073
+ isAllChoice(choiceValue) {
29074
+ return this.selected.length === 0 && choiceValue === 'all';
29075
+ }
29076
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsSearchKindComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29077
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsHitsSearchKindComponent, selector: "gn-ui-results-hits-search-kind", inputs: { selected: "selected", choices: "choices" }, outputs: { selectionChanged: "selectionChanged" }, usesOnChanges: true, ngImport: i0, template: "<gn-ui-inline-filter\n [choices]=\"availableChoices\"\n [selected]=\"selected\"\n (selectValues)=\"onSelectedValues($event)\"\n>\n <ng-template let-choice>\n <gn-ui-kind-badge\n [kind]=\"choice.value\"\n [contentTemplate]=\"customTemplate\"\n class=\"gn-ui-btn-outline rounded-md py-2 px-2 border-gray-400 cursor-pointer focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors bg-transparent hover:text-primary-darker focus:text-primary-darker active:text-primary-black\"\n [ngClass]=\"{\n '!bg-primary-lightest hover:bg-primary-lightest':\n isSelectedChoice(choice.value) || isAllChoice(choice.value),\n }\"\n >\n <ng-template #customTemplate>\n {{ 'search.filters.recordKind.' + choice.value | translate\n }}<span class=\"ml-1\" *ngIf=\"isSelectedChoice(choice.value)\"\n >({{ choice.count }})</span\n >\n </ng-template>\n </gn-ui-kind-badge>\n </ng-template>\n</gn-ui-inline-filter>\n", dependencies: [{ 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: InlineFilterComponent, selector: "gn-ui-inline-filter", inputs: ["choices", "selected"], outputs: ["selectValues"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["contentTemplate", "kind"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29078
+ }
29079
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsSearchKindComponent, decorators: [{
29080
+ type: Component,
29081
+ args: [{ selector: 'gn-ui-results-hits-search-kind', template: "<gn-ui-inline-filter\n [choices]=\"availableChoices\"\n [selected]=\"selected\"\n (selectValues)=\"onSelectedValues($event)\"\n>\n <ng-template let-choice>\n <gn-ui-kind-badge\n [kind]=\"choice.value\"\n [contentTemplate]=\"customTemplate\"\n class=\"gn-ui-btn-outline rounded-md py-2 px-2 border-gray-400 cursor-pointer focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors bg-transparent hover:text-primary-darker focus:text-primary-darker active:text-primary-black\"\n [ngClass]=\"{\n '!bg-primary-lightest hover:bg-primary-lightest':\n isSelectedChoice(choice.value) || isAllChoice(choice.value),\n }\"\n >\n <ng-template #customTemplate>\n {{ 'search.filters.recordKind.' + choice.value | translate\n }}<span class=\"ml-1\" *ngIf=\"isSelectedChoice(choice.value)\"\n >({{ choice.count }})</span\n >\n </ng-template>\n </gn-ui-kind-badge>\n </ng-template>\n</gn-ui-inline-filter>\n" }]
29082
+ }], propDecorators: { selected: [{
29083
+ type: Input
29084
+ }], choices: [{
29085
+ type: Input
29086
+ }], selectionChanged: [{
29087
+ type: Output
29088
+ }] } });
29089
+
28594
29090
  marker('record.was.created.time');
28595
29091
  class RecordPreviewFeedComponent extends RecordPreviewComponent {
28596
29092
  constructor(elementRef, translate) {
@@ -28754,7 +29250,7 @@ class ApiCardComponent {
28754
29250
  }
28755
29251
  }
28756
29252
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28757
- 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: [
29253
+ 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 card-shadow\"\n [ngClass]=\"cardClass\"\n>\n <ng-container *ngIf=\"size !== 'S'\">\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\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 class=\"flex-1 min-w-0\">\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: [
28758
29254
  provideIcons({
28759
29255
  iconoirSettings,
28760
29256
  }),
@@ -28772,7 +29268,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28772
29268
  provideIcons({
28773
29269
  iconoirSettings,
28774
29270
  }),
28775
- ], 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" }]
29271
+ ], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n <ng-container *ngIf=\"size !== 'S'\">\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\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 class=\"flex-1 min-w-0\">\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" }]
28776
29272
  }], propDecorators: { link: [{
28777
29273
  type: Input
28778
29274
  }], currentLink: [{
@@ -28859,7 +29355,7 @@ class DownloadItemComponent {
28859
29355
  this.exportUrl.emit(this.link.url.toString());
28860
29356
  }
28861
29357
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28862
- 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: [
29358
+ 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 w-full\"\n rel=\"noopener\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-col flex-1 justify-between min-w-0\">\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 min-w-0\">\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 whitespace-nowrap\"\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\n class=\"flex min-w-[32px] flex-shrink-0\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\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: [
28863
29359
  provideIcons({
28864
29360
  iconoirDownload,
28865
29361
  }),
@@ -28871,7 +29367,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28871
29367
  provideIcons({
28872
29368
  iconoirDownload,
28873
29369
  }),
28874
- ], 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" }]
29370
+ ], template: "<a\n href=\"{{ link.url }}\"\n target=\"_blank\"\n class=\"group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden w-full\"\n rel=\"noopener\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-col flex-1 justify-between min-w-0\">\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 min-w-0\">\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 whitespace-nowrap\"\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\n class=\"flex min-w-[32px] flex-shrink-0\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\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" }]
28875
29371
  }], propDecorators: { link: [{
28876
29372
  type: Input
28877
29373
  }], color: [{
@@ -28890,10 +29386,18 @@ marker('datahub.search.filter.all');
28890
29386
  marker('datahub.search.filter.others');
28891
29387
  const FILTER_FORMATS = ['all', 'csv', 'excel', 'json', 'shp', 'others'];
28892
29388
  class DownloadsListComponent {
28893
- constructor(translateService) {
29389
+ constructor(translateService, changeDetector) {
28894
29390
  this.translateService = translateService;
29391
+ this.changeDetector = changeDetector;
28895
29392
  this.activeFilterFormats = ['all'];
28896
29393
  }
29394
+ get linksCount() {
29395
+ return this.filteredLinks?.length || 0;
29396
+ }
29397
+ updateList($event) {
29398
+ this._list = $event;
29399
+ this.changeDetector.detectChanges();
29400
+ }
28897
29401
  removeDuplicateFormats(links) {
28898
29402
  const preferredLinks = new Map();
28899
29403
  links.forEach((link) => {
@@ -28971,18 +29475,20 @@ class DownloadsListComponent {
28971
29475
  (link.accessServiceProtocol === 'wfs' ||
28972
29476
  link.accessServiceProtocol === 'ogcFeatures'));
28973
29477
  }
28974
- 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 }); }
28975
- 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 }); }
29478
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
29479
+ 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 class=\"flex flex-row items-center gap-x-4\">\n <div>\n <span\n class=\"font-title text-xl text-title font-medium text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </span>\n <span class=\"px-3\">({{ linksCount }})</span>\n </div>\n <gn-ui-previous-next-buttons\n class=\"md:block hidden\"\n *ngIf=\"_list?.pagesCount > 1\"\n [listComponent]=\"_list\"\n ></gn-ui-previous-next-buttons>\n </div>\n\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\n<ng-container>\n <gn-ui-block-list\n class=\"md:block hidden\"\n #blockList\n (listChanges)=\"updateList($event)\"\n containerClass=\"gap-4 pt-5 pb-7\"\n >\n <gn-ui-download-item\n #block\n *ngFor=\"let link of filteredLinks\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n [size]=\"blockList.subComponentSize\"\n ></gn-ui-download-item>\n </gn-ui-block-list>\n</ng-container>\n\n<div class=\"mb-5 md:hidden block\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n size=\"M\"\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: BlockListComponent, selector: "gn-ui-block-list", inputs: ["containerClass", "paginationContainerClass"], outputs: ["listChanges"] }, { 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"] }, { kind: "component", type: PreviousNextButtonsComponent, selector: "gn-ui-previous-next-buttons", inputs: ["listComponent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28976
29480
  }
28977
29481
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadsListComponent, decorators: [{
28978
29482
  type: Component,
28979
29483
  args: [{ selector: 'gn-ui-downloads-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
28980
29484
  CommonModule,
28981
29485
  ButtonComponent,
29486
+ BlockListComponent,
28982
29487
  DownloadItemComponent,
28983
29488
  TranslateModule,
28984
- ], 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" }]
28985
- }], ctorParameters: () => [{ type: i1$1.TranslateService }], propDecorators: { links: [{
29489
+ PreviousNextButtonsComponent,
29490
+ ], template: "<div\n class=\"flex flex-wrap justify-between items-center pb-4\"\n *ngIf=\"links && links.length > 0\"\n>\n <div class=\"flex flex-row items-center gap-x-4\">\n <div>\n <span\n class=\"font-title text-xl text-title font-medium text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </span>\n <span class=\"px-3\">({{ linksCount }})</span>\n </div>\n <gn-ui-previous-next-buttons\n class=\"md:block hidden\"\n *ngIf=\"_list?.pagesCount > 1\"\n [listComponent]=\"_list\"\n ></gn-ui-previous-next-buttons>\n </div>\n\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\n<ng-container>\n <gn-ui-block-list\n class=\"md:block hidden\"\n #blockList\n (listChanges)=\"updateList($event)\"\n containerClass=\"gap-4 pt-5 pb-7\"\n >\n <gn-ui-download-item\n #block\n *ngFor=\"let link of filteredLinks\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n [size]=\"blockList.subComponentSize\"\n ></gn-ui-download-item>\n </gn-ui-block-list>\n</ng-container>\n\n<div class=\"mb-5 md:hidden block\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n size=\"M\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
29491
+ }], ctorParameters: () => [{ type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { links: [{
28986
29492
  type: Input
28987
29493
  }] } });
28988
29494
 
@@ -29298,7 +29804,7 @@ class LinkCardComponent {
29298
29804
  matOpenInNew,
29299
29805
  }),
29300
29806
  provideNgIconsConfig({ size: '1.5em' }),
29301
- ], 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 }); }
29807
+ ], 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 flex-1 min-w-0\">\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\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\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 }); }
29302
29808
  }
29303
29809
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinkCardComponent, decorators: [{
29304
29810
  type: Component,
@@ -29307,7 +29813,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29307
29813
  matOpenInNew,
29308
29814
  }),
29309
29815
  provideNgIconsConfig({ size: '1.5em' }),
29310
- ], 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" }]
29816
+ ], 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 flex-1 min-w-0\">\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\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\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" }]
29311
29817
  }], propDecorators: { link: [{
29312
29818
  type: Input
29313
29819
  }], size: [{
@@ -29384,7 +29890,7 @@ class MetadataContactComponent {
29384
29890
  this.organizationClick.emit(this.shownOrganization);
29385
29891
  }
29386
29892
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29387
- 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: [
29893
+ 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: [
29388
29894
  provideIcons({
29389
29895
  matOpenInNew,
29390
29896
  matCallOutline,
@@ -29404,7 +29910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29404
29910
  matPersonOutline,
29405
29911
  matLocationOnOutline,
29406
29912
  }),
29407
- ], 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" }]
29913
+ ], 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" }]
29408
29914
  }], propDecorators: { metadata: [{
29409
29915
  type: Input
29410
29916
  }], organizationClick: [{
@@ -29489,6 +29995,316 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29489
29995
  }]
29490
29996
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] });
29491
29997
 
29998
+ const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
29999
+ const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
30000
+ const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
30001
+ factory: () => ({}),
30002
+ });
30003
+ const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
30004
+ factory: () => ({
30005
+ fill: { color: 'rgba(255, 255, 255, 0.2)' },
30006
+ stroke: { color: '#ffcc33', width: 2 },
30007
+ }),
30008
+ });
30009
+
30010
+ const DEFAULT_BASEMAP_LAYER = {
30011
+ type: 'xyz',
30012
+ url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
30013
+ attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
30014
+ };
30015
+ const DEFAULT_VIEW = {
30016
+ center: [0, 15],
30017
+ zoom: 2,
30018
+ };
30019
+ class MapContainerComponent {
30020
+ get featuresClick() {
30021
+ if (!this._featuresClick) {
30022
+ this.openlayersMap.then((olMap) => {
30023
+ listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
30024
+ });
30025
+ this._featuresClick = new EventEmitter();
30026
+ }
30027
+ return this._featuresClick;
30028
+ }
30029
+ get featuresHover() {
30030
+ if (!this._featuresHover) {
30031
+ this.openlayersMap.then((olMap) => {
30032
+ listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
30033
+ });
30034
+ this._featuresHover = new EventEmitter();
30035
+ }
30036
+ return this._featuresHover;
30037
+ }
30038
+ get mapClick() {
30039
+ if (!this._mapClick) {
30040
+ this.openlayersMap.then((olMap) => {
30041
+ listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
30042
+ });
30043
+ this._mapClick = new EventEmitter();
30044
+ }
30045
+ return this._mapClick;
30046
+ }
30047
+ get sourceLoadError() {
30048
+ if (!this._sourceLoadError) {
30049
+ this.openlayersMap.then((olMap) => {
30050
+ listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
30051
+ });
30052
+ this._sourceLoadError = new EventEmitter();
30053
+ }
30054
+ return this._sourceLoadError;
30055
+ }
30056
+ constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
30057
+ this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
30058
+ this.basemapLayers = basemapLayers;
30059
+ this.mapViewConstraints = mapViewConstraints;
30060
+ this.openlayersMap = new Promise((resolve) => {
30061
+ this.olMapResolver = resolve;
30062
+ });
30063
+ }
30064
+ async ngAfterViewInit() {
30065
+ this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
30066
+ 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
30067
+ ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
30068
+ : of(false)));
30069
+ this.olMapResolver(this.olMap);
30070
+ }
30071
+ async ngOnChanges(changes) {
30072
+ if ('context' in changes && !changes['context'].isFirstChange()) {
30073
+ const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
30074
+ await applyContextDiffToMap(this.olMap, diff);
30075
+ }
30076
+ }
30077
+ // This will apply basemap layers & view constraints
30078
+ processContext(context) {
30079
+ const processed = context
30080
+ ? { ...context, view: context.view ?? DEFAULT_VIEW }
30081
+ : { layers: [], view: DEFAULT_VIEW };
30082
+ if (this.basemapLayers.length) {
30083
+ processed.layers = [...this.basemapLayers, ...processed.layers];
30084
+ }
30085
+ if (!this.doNotUseDefaultBasemap) {
30086
+ processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
30087
+ }
30088
+ if (this.mapViewConstraints.maxZoom) {
30089
+ processed.view = {
30090
+ maxZoom: this.mapViewConstraints.maxZoom,
30091
+ ...processed.view,
30092
+ };
30093
+ }
30094
+ if (this.mapViewConstraints.maxExtent) {
30095
+ processed.view = {
30096
+ maxExtent: this.mapViewConstraints.maxExtent,
30097
+ ...processed.view,
30098
+ };
30099
+ }
30100
+ if (processed.view &&
30101
+ !('zoom' in processed.view) &&
30102
+ !('center' in processed.view)) {
30103
+ if (this.mapViewConstraints.maxExtent) {
30104
+ processed.view = {
30105
+ extent: this.mapViewConstraints.maxExtent,
30106
+ ...processed.view,
30107
+ };
30108
+ }
30109
+ else {
30110
+ processed.view = { ...DEFAULT_VIEW, ...processed.view };
30111
+ }
30112
+ }
30113
+ return processed;
30114
+ }
30115
+ 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 }); }
30116
+ 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: [
30117
+ provideIcons({ matSwipeOutline }),
30118
+ provideNgIconsConfig({
30119
+ size: '1.5em',
30120
+ }),
30121
+ ], 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 }); }
30122
+ }
30123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
30124
+ type: Component,
30125
+ args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
30126
+ provideIcons({ matSwipeOutline }),
30127
+ provideNgIconsConfig({
30128
+ size: '1.5em',
30129
+ }),
30130
+ ], 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" }]
30131
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
30132
+ type: Inject,
30133
+ args: [DO_NOT_USE_DEFAULT_BASEMAP]
30134
+ }] }, { type: undefined, decorators: [{
30135
+ type: Inject,
30136
+ args: [BASEMAP_LAYERS]
30137
+ }] }, { type: undefined, decorators: [{
30138
+ type: Inject,
30139
+ args: [MAP_VIEW_CONSTRAINTS]
30140
+ }] }], propDecorators: { context: [{
30141
+ type: Input
30142
+ }], featuresClick: [{
30143
+ type: Output
30144
+ }], featuresHover: [{
30145
+ type: Output
30146
+ }], mapClick: [{
30147
+ type: Output
30148
+ }], sourceLoadError: [{
30149
+ type: Output
30150
+ }], container: [{
30151
+ type: ViewChild,
30152
+ args: ['map']
30153
+ }] } });
30154
+
30155
+ const geometryKeys = ['geometry', 'the_geom'];
30156
+ class FeatureDetailComponent {
30157
+ get properties() {
30158
+ if (!this.feature)
30159
+ return [];
30160
+ return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
30161
+ }
30162
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30163
+ 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 }); }
30164
+ }
30165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
30166
+ type: Component,
30167
+ 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"] }]
30168
+ }], propDecorators: { feature: [{
30169
+ type: Input
30170
+ }] } });
30171
+
30172
+ class MapLegendComponent {
30173
+ constructor() {
30174
+ this.legendStatusChange = new EventEmitter();
30175
+ }
30176
+ async ngOnChanges(changes) {
30177
+ if ('context' in changes) {
30178
+ const mapContext = changes['context'].currentValue;
30179
+ if (mapContext.layers && mapContext.layers.length > 0) {
30180
+ const mapContextLayer = mapContext.layers[0];
30181
+ this.legendHTML = await createLegendFromLayer(mapContextLayer);
30182
+ if (this.legendHTML) {
30183
+ this.legendStatusChange.emit(true);
30184
+ }
30185
+ }
30186
+ else {
30187
+ this.legendHTML = false;
30188
+ this.legendStatusChange.emit(false);
30189
+ }
30190
+ }
30191
+ }
30192
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30193
+ 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 }); }
30194
+ }
30195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
30196
+ type: Component,
30197
+ 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"] }]
30198
+ }], propDecorators: { context: [{
30199
+ type: Input
30200
+ }], legendStatusChange: [{
30201
+ type: Output
30202
+ }] } });
30203
+
30204
+ function prioritizePageScroll(interactions) {
30205
+ interactions.clear();
30206
+ interactions.extend(defaults({
30207
+ // remove rotate interactions
30208
+ altShiftDragRotate: false,
30209
+ pinchRotate: false,
30210
+ // replace drag and zoom interactions
30211
+ dragPan: false,
30212
+ mouseWheelZoom: false,
30213
+ })
30214
+ .extend([
30215
+ new DragPan({
30216
+ condition: dragPanCondition,
30217
+ }),
30218
+ new MouseWheelZoom({
30219
+ condition: mouseWheelZoomCondition,
30220
+ }),
30221
+ ])
30222
+ .getArray());
30223
+ }
30224
+ function dragPanCondition(event) {
30225
+ const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
30226
+ if (!dragPanCondition) {
30227
+ this.getMap().dispatchEvent('mapmuted');
30228
+ }
30229
+ // combine the condition with the default DragPan conditions
30230
+ return dragPanCondition && noModifierKeys(event) && primaryAction(event);
30231
+ }
30232
+ function mouseWheelZoomCondition(event) {
30233
+ if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
30234
+ this.getMap().dispatchEvent('mapmuted');
30235
+ }
30236
+ return platformModifierKeyOnly(event);
30237
+ }
30238
+
30239
+ class SpatialExtentComponent {
30240
+ constructor() {
30241
+ this.spatialExtents$ = new BehaviorSubject([]);
30242
+ this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
30243
+ if (extents.length === 0) {
30244
+ return null; // null extent means default view
30245
+ }
30246
+ const featureCollection = {
30247
+ type: 'FeatureCollection',
30248
+ features: [],
30249
+ };
30250
+ extents.forEach((extent) => {
30251
+ if (extent.geometry) {
30252
+ featureCollection.features.push({
30253
+ type: 'Feature',
30254
+ properties: {},
30255
+ geometry: extent.geometry,
30256
+ });
30257
+ }
30258
+ else if (extent.bbox?.length >= 0) {
30259
+ featureCollection.features.push({
30260
+ type: 'Feature',
30261
+ properties: {},
30262
+ geometry: this.bboxCoordsToGeometry(extent.bbox),
30263
+ });
30264
+ }
30265
+ });
30266
+ const layer = {
30267
+ type: 'geojson',
30268
+ data: featureCollection,
30269
+ label: 'Spatial extents',
30270
+ style: {
30271
+ 'stroke-color': 'black',
30272
+ 'stroke-width': 2,
30273
+ },
30274
+ };
30275
+ const view = await createViewFromLayer(layer);
30276
+ return {
30277
+ view,
30278
+ layers: [layer],
30279
+ };
30280
+ }));
30281
+ this.error = '';
30282
+ }
30283
+ set spatialExtents(value) {
30284
+ this.spatialExtents$.next(value);
30285
+ }
30286
+ bboxCoordsToGeometry(bbox) {
30287
+ const geometry = new Polygon([
30288
+ [
30289
+ [bbox[0], bbox[1]],
30290
+ [bbox[0], bbox[3]],
30291
+ [bbox[2], bbox[3]],
30292
+ [bbox[2], bbox[1]],
30293
+ [bbox[0], bbox[1]],
30294
+ ],
30295
+ ]);
30296
+ return new GeoJSON().writeGeometryObject(geometry);
30297
+ }
30298
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialExtentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30299
+ 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"] }] }); }
30300
+ }
30301
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialExtentComponent, decorators: [{
30302
+ type: Component,
30303
+ 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" }]
30304
+ }], propDecorators: { spatialExtents: [{
30305
+ type: Input
30306
+ }] } });
30307
+
29492
30308
  class MetadataInfoComponent {
29493
30309
  constructor(dateService) {
29494
30310
  this.dateService = dateService;
@@ -29541,7 +30357,7 @@ class MetadataInfoComponent {
29541
30357
  }
29542
30358
  }
29543
30359
  get temporalExtent() {
29544
- const temporalExtents = this.metadata.temporalExtents;
30360
+ const temporalExtents = this.metadata.kind === 'dataset' ? this.metadata.temporalExtents : [];
29545
30361
  return getTemporalRangeUnion(temporalExtents, this.dateService);
29546
30362
  }
29547
30363
  get shownOrganization() {
@@ -29563,7 +30379,7 @@ class MetadataInfoComponent {
29563
30379
  return this.dateService.formatDateTime(date);
29564
30380
  }
29565
30381
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataInfoComponent, deps: [{ token: DateService }], target: i0.ɵɵFactoryTarget.Component }); }
29566
- 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: [
30382
+ 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: [
29567
30383
  provideIcons({
29568
30384
  matOpenInNew,
29569
30385
  matMailOutline: matMailOutline$1,
@@ -29584,12 +30400,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29584
30400
  CopyTextButtonComponent,
29585
30401
  NgIcon,
29586
30402
  GnUiLinkifyDirective,
30403
+ MapContainerComponent,
30404
+ SpatialExtentComponent,
29587
30405
  ], viewProviders: [
29588
30406
  provideIcons({
29589
30407
  matOpenInNew,
29590
30408
  matMailOutline: matMailOutline$1,
29591
30409
  }),
29592
- ], 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"] }]
30410
+ ], 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"] }]
29593
30411
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
29594
30412
  type: Input
29595
30413
  }], incomplete: [{
@@ -29961,7 +30779,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29961
30779
  type: Input
29962
30780
  }] } });
29963
30781
 
29964
- marker('record.kind.dataset');
30782
+ marker('record.kind.data');
29965
30783
  marker('record.kind.reuse');
29966
30784
  marker('record.kind.service');
29967
30785
  class InternalLinkCardComponent {
@@ -30041,7 +30859,7 @@ class InternalLinkCardComponent {
30041
30859
  return { text: '', icon: '' };
30042
30860
  switch (this.record.kind.toLowerCase()) {
30043
30861
  case 'dataset':
30044
- return { text: 'record.kind.dataset', icon: 'iconoirDatabase' };
30862
+ return { text: 'record.kind.data', icon: 'iconoirDatabase' };
30045
30863
  case 'reuse':
30046
30864
  return { text: 'record.kind.reuse', icon: 'iconoirMap' };
30047
30865
  case 'service':
@@ -30109,6 +30927,154 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30109
30927
  type: Output
30110
30928
  }] } });
30111
30929
 
30930
+ marker(`service.metadata.search`);
30931
+ marker(`service.metadata.capabilities.title`);
30932
+ marker(`service.metadata.capabilities.abstract`);
30933
+ marker(`service.metadata.capabilities.name`);
30934
+ marker(`service.metadata.capabilities.defaultCrs`);
30935
+ marker(`service.metadata.capabilities.availableCrs`);
30936
+ marker(`service.metadata.capabilities.otherCrs`);
30937
+ marker(`service.metadata.capabilities.objectCount`);
30938
+ marker(`service.metadata.capabilities.geometryName`);
30939
+ marker(`service.metadata.capabilities.geometryType`);
30940
+ marker(`service.metadata.capabilities.keywords`);
30941
+ marker(`service.metadata.capabilities.outputFormats`);
30942
+ marker(`service.metadata.capabilities.resourceLinks`);
30943
+ marker(`service.metadata.capabilities.attribution`);
30944
+ class ServiceCapabilitiesComponent {
30945
+ constructor(cdr, translateService) {
30946
+ this.cdr = cdr;
30947
+ this.translateService = translateService;
30948
+ this.apiLinks = [];
30949
+ this.availableLayers = [];
30950
+ this.filteredLayers = [];
30951
+ this.selectedLayer = null;
30952
+ this.layerInformation = [];
30953
+ this.searchQuery = '';
30954
+ this.loading = false;
30955
+ this.capabilitiesKeys = [
30956
+ 'title',
30957
+ 'abstract',
30958
+ 'name',
30959
+ 'defaultCrs',
30960
+ 'availableCrs',
30961
+ 'otherCrs',
30962
+ 'objectCount',
30963
+ 'geometryName',
30964
+ 'geometryType',
30965
+ 'keywords',
30966
+ 'outputFormats',
30967
+ 'resourceLinks',
30968
+ 'attribution',
30969
+ ];
30970
+ }
30971
+ ngOnInit() {
30972
+ this.loadLayers();
30973
+ }
30974
+ onSearchChange(event) {
30975
+ const input = event.target;
30976
+ this.searchQuery = input.value;
30977
+ if (!input.value) {
30978
+ this.searchActive = false;
30979
+ this.filteredLayers = this.availableLayers;
30980
+ }
30981
+ }
30982
+ onSearchEnter(event) {
30983
+ if (event.key === 'Enter') {
30984
+ this.searchActive = true;
30985
+ this.searchLayers();
30986
+ }
30987
+ }
30988
+ async loadLayers() {
30989
+ if (this.apiLinks.length > 0 &&
30990
+ this.apiLinks[0].accessServiceProtocol !== 'ogcFeatures') {
30991
+ this.loading = true;
30992
+ this.availableLayers = await getLayers(this.apiLinks[0].url.href, this.apiLinks[0].accessServiceProtocol);
30993
+ this.loading = false;
30994
+ this.cdr.detectChanges();
30995
+ this.filteredLayers = this.availableLayers;
30996
+ }
30997
+ else {
30998
+ this.availableLayers = [];
30999
+ }
31000
+ }
31001
+ selectLayer(layer) {
31002
+ if (layer === this.selectedLayer) {
31003
+ this.selectedLayer = null;
31004
+ this.layerInformation = [];
31005
+ return;
31006
+ }
31007
+ this.selectedLayer = layer;
31008
+ const filteredInfo = [];
31009
+ Object.keys(layer).map((key) => {
31010
+ if (this.capabilitiesKeys.includes(key)) {
31011
+ const displayName = this.translateService.instant(`service.metadata.capabilities.${key}`);
31012
+ if (key in layer && layer[key]?.length) {
31013
+ filteredInfo.push({ displayName, value: layer[key] });
31014
+ }
31015
+ }
31016
+ });
31017
+ this.layerInformation = filteredInfo;
31018
+ }
31019
+ isList(value) {
31020
+ return Array.isArray(value);
31021
+ }
31022
+ getExtraInputClass() {
31023
+ if (this.searchActive) {
31024
+ return 'h-14 border rounded-lg border-primary text-primary focus:border-primary hover:border-primary';
31025
+ }
31026
+ return 'h-14 border rounded-lg';
31027
+ }
31028
+ searchLayers() {
31029
+ this.searchActive = true;
31030
+ this.filteredLayers = this.availableLayers.filter((layer) => {
31031
+ const query = this.searchQuery.toLowerCase();
31032
+ if (layer.title) {
31033
+ return (layer.title.toLowerCase().includes(query) ||
31034
+ layer.abstract?.toLowerCase().includes(query));
31035
+ }
31036
+ else {
31037
+ return layer.name.toLowerCase().includes(query);
31038
+ }
31039
+ });
31040
+ if (!this.filteredLayers.includes(this.selectedLayer)) {
31041
+ this.selectedLayer = null;
31042
+ this.layerInformation = [];
31043
+ }
31044
+ }
31045
+ getExtraClass(layerItem) {
31046
+ return layerItem.title === this.selectedLayer?.title
31047
+ ? `h-8 rounded-lg bg-primary-darker text-white hover:text-primary-darker hover:bg-white`
31048
+ : `h-8 rounded-lg`;
31049
+ }
31050
+ 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 }); }
31051
+ 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: [
31052
+ provideIcons({
31053
+ iconoirSearch,
31054
+ matInfoOutline,
31055
+ }),
31056
+ ] }); }
31057
+ }
31058
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCapabilitiesComponent, decorators: [{
31059
+ type: Component,
31060
+ args: [{ selector: 'gn-ui-service-capabilities', standalone: true, imports: [
31061
+ CommonModule,
31062
+ TranslateModule,
31063
+ ButtonComponent,
31064
+ TextInputComponent,
31065
+ NgIcon,
31066
+ PopoverComponent,
31067
+ SpinningLoaderComponent,
31068
+ ], viewProviders: [
31069
+ provideIcons({
31070
+ iconoirSearch,
31071
+ matInfoOutline,
31072
+ }),
31073
+ ], 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" }]
31074
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { apiLinks: [{
31075
+ type: Input
31076
+ }] } });
31077
+
30112
31078
  class UiElementsModule {
30113
31079
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
30114
31080
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, declarations: [AvatarComponent, UserPreviewComponent], imports: [CommonModule,
@@ -30128,13 +31094,17 @@ class UiElementsModule {
30128
31094
  TextInputComponent,
30129
31095
  ImageInputComponent,
30130
31096
  ApplicationBannerComponent,
30131
- InternalLinkCardComponent], exports: [ThumbnailComponent,
31097
+ InternalLinkCardComponent,
31098
+ ServiceCapabilitiesComponent,
31099
+ KindBadgeComponent], exports: [ThumbnailComponent,
30132
31100
  AvatarComponent,
30133
31101
  UserPreviewComponent,
30134
31102
  MarkdownParserComponent,
30135
31103
  ImageInputComponent,
30136
31104
  ApplicationBannerComponent,
30137
- InternalLinkCardComponent] }); }
31105
+ InternalLinkCardComponent,
31106
+ ServiceCapabilitiesComponent,
31107
+ KindBadgeComponent] }); }
30138
31108
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, providers: [
30139
31109
  provideNgIconsConfig({
30140
31110
  size: '1.5em',
@@ -30155,7 +31125,9 @@ class UiElementsModule {
30155
31125
  TextInputComponent,
30156
31126
  ImageInputComponent,
30157
31127
  ApplicationBannerComponent,
30158
- InternalLinkCardComponent] }); }
31128
+ InternalLinkCardComponent,
31129
+ ServiceCapabilitiesComponent,
31130
+ KindBadgeComponent] }); }
30159
31131
  }
30160
31132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
30161
31133
  type: NgModule,
@@ -30181,6 +31153,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30181
31153
  ImageInputComponent,
30182
31154
  ApplicationBannerComponent,
30183
31155
  InternalLinkCardComponent,
31156
+ ServiceCapabilitiesComponent,
31157
+ KindBadgeComponent,
30184
31158
  ],
30185
31159
  providers: [
30186
31160
  provideNgIconsConfig({
@@ -30196,6 +31170,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30196
31170
  ImageInputComponent,
30197
31171
  ApplicationBannerComponent,
30198
31172
  InternalLinkCardComponent,
31173
+ ServiceCapabilitiesComponent,
31174
+ KindBadgeComponent,
30199
31175
  ],
30200
31176
  }]
30201
31177
  }] });
@@ -30277,6 +31253,7 @@ class UiSearchModule {
30277
31253
  RecordMetricComponent,
30278
31254
  ResultsListComponent,
30279
31255
  ResultsHitsNumberComponent,
31256
+ ResultsHitsSearchKindComponent,
30280
31257
  ResultsListItemComponent,
30281
31258
  RecordPreviewFeedComponent,
30282
31259
  RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
@@ -30290,7 +31267,8 @@ class UiSearchModule {
30290
31267
  UiElementsModule,
30291
31268
  MatCheckboxModule,
30292
31269
  RouterLink,
30293
- InteractiveTableComponent, i2$2.NgIconsModule, MetadataQualityComponent], exports: [RecordPreviewListComponent,
31270
+ InteractiveTableComponent, i2$2.NgIconsModule, KindBadgeComponent,
31271
+ MetadataQualityComponent], exports: [RecordPreviewListComponent,
30294
31272
  RecordPreviewCardComponent,
30295
31273
  RecordPreviewTextComponent,
30296
31274
  RecordPreviewTitleComponent,
@@ -30299,6 +31277,7 @@ class UiSearchModule {
30299
31277
  FacetsModule$1,
30300
31278
  RecordPreviewComponent,
30301
31279
  ResultsHitsNumberComponent,
31280
+ ResultsHitsSearchKindComponent,
30302
31281
  RecordPreviewFeedComponent,
30303
31282
  RecordPreviewRowComponent] }); }
30304
31283
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, providers: [
@@ -30326,6 +31305,7 @@ class UiSearchModule {
30326
31305
  matFace,
30327
31306
  matHomeWorkOutline,
30328
31307
  }),
31308
+ KindBadgeComponent,
30329
31309
  MetadataQualityComponent, FacetsModule$1] }); }
30330
31310
  }
30331
31311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, decorators: [{
@@ -30340,6 +31320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30340
31320
  RecordMetricComponent,
30341
31321
  ResultsListComponent,
30342
31322
  ResultsHitsNumberComponent,
31323
+ ResultsHitsSearchKindComponent,
30343
31324
  ResultsListItemComponent,
30344
31325
  RecordPreviewFeedComponent,
30345
31326
  RecordPreviewRowComponent,
@@ -30366,6 +31347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30366
31347
  matFace,
30367
31348
  matHomeWorkOutline,
30368
31349
  }),
31350
+ KindBadgeComponent,
30369
31351
  MetadataQualityComponent,
30370
31352
  ],
30371
31353
  exports: [
@@ -30378,6 +31360,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30378
31360
  FacetsModule$1,
30379
31361
  RecordPreviewComponent,
30380
31362
  ResultsHitsNumberComponent,
31363
+ ResultsHitsSearchKindComponent,
30381
31364
  RecordPreviewFeedComponent,
30382
31365
  RecordPreviewRowComponent,
30383
31366
  ],
@@ -30536,8 +31519,9 @@ class ResultsTableComponent {
30536
31519
  return getBadgeColor(format);
30537
31520
  }
30538
31521
  handleRecordClick(item) {
30539
- if (item?.extras?.edit || this.isDraftPage)
31522
+ if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
30540
31523
  this.recordClick.emit(item);
31524
+ }
30541
31525
  }
30542
31526
  handleDuplicate(item) {
30543
31527
  this.duplicateRecord.emit(item);
@@ -30574,7 +31558,7 @@ class ResultsTableComponent {
30574
31558
  this.recordsSelectedChange.emit([[record], selected]);
30575
31559
  }
30576
31560
  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 }); }
30577
- 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"] }] }); }
31561
+ 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"] }] }); }
30578
31562
  }
30579
31563
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
30580
31564
  type: Component,
@@ -30588,7 +31572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30588
31572
  ActionMenuComponent,
30589
31573
  NgIconComponent,
30590
31574
  CdkOverlayOrigin,
30591
- ], 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" }]
31575
+ ], 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" }]
30592
31576
  }], ctorParameters: () => [{ type: i1$9.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
30593
31577
  type: Input
30594
31578
  }], selectedRecordsIdentifiers: [{
@@ -31619,9 +32603,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31619
32603
  type: Injectable
31620
32604
  }], ctorParameters: () => [{ type: SearchFacade }] });
31621
32605
 
31622
- class RecordsRepositoryInterface {
31623
- }
31624
-
31625
32606
  class FuzzySearchComponent {
31626
32607
  constructor(searchFacade, searchService, recordsRepository) {
31627
32608
  this.searchFacade = searchFacade;
@@ -31760,7 +32741,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31760
32741
  }] }] });
31761
32742
 
31762
32743
  // expects the replacement key ${uuid}
31763
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
32744
+ const RECORD_DATASET_URL_TOKEN = new InjectionToken('record-dataset-url-token');
32745
+ const RECORD_SERVICE_URL_TOKEN = new InjectionToken('record-service-url-token');
32746
+ const RECORD_REUSE_URL_TOKEN = new InjectionToken('record-reuse-url-token');
31764
32747
 
31765
32748
  class FavoriteStarComponent {
31766
32749
  set record(value) {
@@ -31787,9 +32770,10 @@ class FavoriteStarComponent {
31787
32770
  this.isAnonymous$ = this.platformService.isAnonymous();
31788
32771
  this.loading = false;
31789
32772
  this.loginUrl = this.authService.loginUrl;
31790
- this.loginMessage$ = this.translateService.get('favorite.not.authenticated.tooltip', {
32773
+ this.loginMessage$ = this.translateService.onLangChange.pipe(startWith(null), // make sure to wait for translations to be loaded with and without language change
32774
+ switchMap$1(() => this.translateService.get('favorite.not.authenticated.tooltip', {
31791
32775
  link: this.loginUrl,
31792
- });
32776
+ })));
31793
32777
  }
31794
32778
  ngAfterViewInit() {
31795
32779
  this.subscription = this.isAnonymous$
@@ -31845,11 +32829,11 @@ class FavoriteStarComponent {
31845
32829
  });
31846
32830
  }
31847
32831
  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 }); }
31848
- 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 <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 }); }
32832
+ 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 }); }
31849
32833
  }
31850
32834
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, decorators: [{
31851
32835
  type: Component,
31852
- 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 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 <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" }]
32836
+ 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" }]
31853
32837
  }], ctorParameters: () => [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }], propDecorators: { displayCount: [{
31854
32838
  type: Input
31855
32839
  }], record: [{
@@ -31860,10 +32844,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31860
32844
  }] } });
31861
32845
 
31862
32846
  class ResultsListContainerComponent {
31863
- constructor(facade, resultsLayoutConfig, recordUrlTemplate) {
32847
+ constructor(facade, resultsLayoutConfig, recordDatasetUrlTemplate, recordServiceUrlTemplate, recordReuseUrlTemplate) {
31864
32848
  this.facade = facade;
31865
32849
  this.resultsLayoutConfig = resultsLayoutConfig;
31866
- this.recordUrlTemplate = recordUrlTemplate;
32850
+ this.recordDatasetUrlTemplate = recordDatasetUrlTemplate;
32851
+ this.recordServiceUrlTemplate = recordServiceUrlTemplate;
32852
+ this.recordReuseUrlTemplate = recordReuseUrlTemplate;
31867
32853
  this.showMore = 'auto';
31868
32854
  this.mdSelect = new EventEmitter();
31869
32855
  this.errorTypes = ErrorType;
@@ -31895,16 +32881,24 @@ class ResultsListContainerComponent {
31895
32881
  this.facade.scroll();
31896
32882
  }
31897
32883
  getRecordUrl(metadata) {
31898
- if (!this.recordUrlTemplate)
32884
+ const tokenMap = {
32885
+ dataset: this.recordDatasetUrlTemplate,
32886
+ service: this.recordServiceUrlTemplate,
32887
+ reuse: this.recordReuseUrlTemplate,
32888
+ };
32889
+ if (!this.recordDatasetUrlTemplate &&
32890
+ !this.recordServiceUrlTemplate &&
32891
+ !this.recordReuseUrlTemplate)
31899
32892
  return null;
31900
- return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
32893
+ const urlKind = tokenMap[metadata.kind];
32894
+ return urlKind.replace('${uuid}', metadata.uniqueIdentifier);
31901
32895
  }
31902
- 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 }); }
31903
- 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" }] }); }
32896
+ 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 }); }
32897
+ 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" }] }); }
31904
32898
  }
31905
32899
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
31906
32900
  type: Component,
31907
- 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" }]
32901
+ 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"] }]
31908
32902
  }], ctorParameters: () => [{ type: SearchFacade }, { type: undefined, decorators: [{
31909
32903
  type: Inject,
31910
32904
  args: [RESULTS_LAYOUT_CONFIG]
@@ -31912,7 +32906,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31912
32906
  type: Optional
31913
32907
  }, {
31914
32908
  type: Inject,
31915
- args: [RECORD_URL_TOKEN]
32909
+ args: [RECORD_DATASET_URL_TOKEN]
32910
+ }] }, { type: undefined, decorators: [{
32911
+ type: Inject,
32912
+ args: [RECORD_SERVICE_URL_TOKEN]
32913
+ }] }, { type: undefined, decorators: [{
32914
+ type: Inject,
32915
+ args: [RECORD_REUSE_URL_TOKEN]
31916
32916
  }] }], propDecorators: { metadataQualityDisplay: [{
31917
32917
  type: Input
31918
32918
  }], layout: [{
@@ -32110,41 +33110,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32110
33110
  args: [FILTER_GEOMETRY]
32111
33111
  }] }] });
32112
33112
 
32113
- class ResultsHitsContainerComponent {
32114
- constructor(facade) {
32115
- this.facade = facade;
32116
- }
32117
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsContainerComponent, deps: [{ token: SearchFacade }], target: i0.ɵɵFactoryTarget.Component }); }
32118
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsHitsContainerComponent, selector: "gn-ui-results-hits", ngImport: i0, template: "<gn-ui-results-hits-number\n [loading]=\"facade.isLoading$ | async\"\n [hits]=\"facade.resultsHits$ | async\"\n></gn-ui-results-hits-number>\n", dependencies: [{ kind: "component", type: ResultsHitsNumberComponent, selector: "gn-ui-results-hits-number", inputs: ["hits", "loading"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] }); }
32119
- }
32120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsContainerComponent, decorators: [{
32121
- type: Component,
32122
- args: [{ selector: 'gn-ui-results-hits', template: "<gn-ui-results-hits-number\n [loading]=\"facade.isLoading$ | async\"\n [hits]=\"facade.resultsHits$ | async\"\n></gn-ui-results-hits-number>\n" }]
32123
- }], ctorParameters: () => [{ type: SearchFacade }] });
32124
-
32125
- class SearchStateContainerDirective {
32126
- constructor(facade) {
32127
- this.facade = facade;
32128
- }
32129
- ngOnInit() {
32130
- this.facade.init(this.searchId);
32131
- }
32132
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchStateContainerDirective, deps: [{ token: SearchFacade, host: true }], target: i0.ɵɵFactoryTarget.Directive }); }
32133
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: SearchStateContainerDirective, selector: "[gnUiSearchStateContainer]", inputs: { searchId: ["gnUiSearchStateContainer", "searchId"] }, providers: [SearchFacade, SearchService], ngImport: i0 }); }
32134
- }
32135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchStateContainerDirective, decorators: [{
32136
- type: Directive,
32137
- args: [{
32138
- selector: '[gnUiSearchStateContainer]',
32139
- providers: [SearchFacade, SearchService],
32140
- }]
32141
- }], ctorParameters: () => [{ type: SearchFacade, decorators: [{
32142
- type: Host
32143
- }] }], propDecorators: { searchId: [{
32144
- type: Input,
32145
- args: ['gnUiSearchStateContainer']
32146
- }] } });
32147
-
32148
33113
  class AbstractSearchField {
32149
33114
  }
32150
33115
  class SimpleSearchField {
@@ -32175,6 +33140,7 @@ class SimpleSearchField {
32175
33140
  const bucketPromises = buckets.map(async (bucket) => ({
32176
33141
  label: `${await this.getBucketLabel(bucket)} (${bucket.count})`,
32177
33142
  value: bucket.term.toString(),
33143
+ count: bucket.count,
32178
33144
  }));
32179
33145
  return Promise.all(bucketPromises);
32180
33146
  }));
@@ -32500,6 +33466,73 @@ class AvailableServicesField extends SimpleSearchField {
32500
33466
  return of(values);
32501
33467
  }
32502
33468
  }
33469
+ /**
33470
+ * This class is meant to be used with the legacy filter on `resourceType` (now deprecated, the use of `recordKind` field is recommended).
33471
+ * Since creating filters on the same ES field is not possible, in order to make the resource type filter still working,
33472
+ * we create an ES on the fly: `resourceTypeLegacy` that references the `resourceType` under the hood.
33473
+ * @deprecated Use `recordKind` field instead.
33474
+ */
33475
+ class ResourceTypeLegacyField extends TranslatedSearchField {
33476
+ constructor(injector) {
33477
+ super('resourceTypeLegacy', injector, 'asc');
33478
+ // Ask ES to create a field on the fly: 'resourceTypeLegacy' that is in fact, 'resourceType'
33479
+ this.esService.registerRuntimeField('resourceTypeLegacy', `for (resourceType in doc.resourceType) { emit(resourceType) }`);
33480
+ }
33481
+ }
33482
+ class RecordKindField extends SimpleSearchField {
33483
+ constructor(injector) {
33484
+ super('resourceType', injector, 'asc');
33485
+ this.TYPE_MAPPING = {
33486
+ dataset: ['dataset', 'series', 'featureCatalog'],
33487
+ service: ['service'],
33488
+ reuse: Object.entries(PossibleResourceTypes)
33489
+ .filter(([_, v]) => v === 'reuse')
33490
+ .map(([k]) => k), // = ['application', 'map', 'staticMap', 'interactiveMap', ...]
33491
+ };
33492
+ }
33493
+ getAvailableValues() {
33494
+ return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), map$1((buckets) => {
33495
+ const counts = buckets.reduce((acc, { term, count }) => {
33496
+ const value = term.toString();
33497
+ const key = this.TYPE_MAPPING.reuse.includes(value)
33498
+ ? 'reuse'
33499
+ : this.TYPE_MAPPING.dataset.includes(value)
33500
+ ? 'dataset'
33501
+ : value;
33502
+ acc[key] = (acc[key] || 0) + count;
33503
+ return acc;
33504
+ }, {});
33505
+ return Object.keys(this.TYPE_MAPPING).map((type) => ({
33506
+ label: type,
33507
+ value: type,
33508
+ count: counts[type] ?? 0,
33509
+ }));
33510
+ }));
33511
+ }
33512
+ getFiltersForValues(values) {
33513
+ const filters = {
33514
+ [this.esFieldName]: values.reduce((acc, value) => {
33515
+ if (value === '')
33516
+ return { ...acc, [value]: true };
33517
+ const keysToAdd = this.TYPE_MAPPING[value] || [value];
33518
+ keysToAdd.forEach((key) => (acc[key] = true));
33519
+ return acc;
33520
+ }, {}),
33521
+ };
33522
+ return of(filters);
33523
+ }
33524
+ getValuesForFilter(filters) {
33525
+ const filter = filters[this.esFieldName];
33526
+ if (!filter)
33527
+ return of([]);
33528
+ const activeValues = Object.keys(filter).filter((v) => filter[v]);
33529
+ const activeTypes = Object.keys(this.TYPE_MAPPING).filter((type) => this.TYPE_MAPPING[type].every((t) => activeValues.includes(t)));
33530
+ // Allow unknown values eg. 'type=somethingnotexist' (for UI to select none)
33531
+ const allTypes = [].concat(...Object.values(this.TYPE_MAPPING));
33532
+ const unknownValues = activeValues.filter((value) => !allTypes.includes(value));
33533
+ return of([...activeTypes, ...unknownValues]);
33534
+ }
33535
+ }
32503
33536
 
32504
33537
  marker('search.filters.format');
32505
33538
  marker('search.filters.inspireKeyword');
@@ -32526,7 +33559,8 @@ class FieldsService {
32526
33559
  this.fields = {
32527
33560
  organization: new OrganizationSearchField(this.injector),
32528
33561
  format: new SimpleSearchField('format', this.injector, 'asc'),
32529
- resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
33562
+ resourceType: new ResourceTypeLegacyField(this.injector), // Deprecated, use `recordKind` instead
33563
+ recordKind: new RecordKindField(this.injector),
32530
33564
  representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
32531
33565
  publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
32532
33566
  topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
@@ -32584,6 +33618,57 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32584
33618
  }]
32585
33619
  }], ctorParameters: () => [{ type: i0.Injector }] });
32586
33620
 
33621
+ marker('search.filters.recordKind.all');
33622
+ marker('search.filters.recordKind.dataset');
33623
+ marker('search.filters.recordKind.service');
33624
+ marker('search.filters.recordKind.reuse');
33625
+ class ResultsHitsContainerComponent {
33626
+ constructor(searchFacade, searchService, fieldsService) {
33627
+ this.searchFacade = searchFacade;
33628
+ this.searchService = searchService;
33629
+ this.fieldsService = fieldsService;
33630
+ this.fieldName = 'recordKind';
33631
+ }
33632
+ ngOnInit() {
33633
+ this.selected$ = this.searchFacade.searchFilters$.pipe(switchMap((filters) => this.fieldsService.readFieldValuesFromFilters(filters)), map$2((fieldValues) => fieldValues[this.fieldName]), filter$1((selected) => !!selected), startWith$1([]), catchError$1(() => of([])));
33634
+ this.filterChoices$ = (this.fieldsService.getAvailableValues(this.fieldName));
33635
+ }
33636
+ onSelectionChanged(values) {
33637
+ this.fieldsService
33638
+ .buildFiltersFromFieldValues({ [this.fieldName]: values })
33639
+ .subscribe((filters) => this.searchService.updateFilters(filters));
33640
+ }
33641
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsContainerComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Component }); }
33642
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsHitsContainerComponent, selector: "gn-ui-results-hits", ngImport: i0, template: "<div\n class=\"flex flex-col gap-3 sm:flex-row justify-between\"\n [ngClass]=\"{\n 'sm:items-center': (searchFacade.resultsHits$ | async) !== 0,\n }\"\n>\n <gn-ui-results-hits-number\n [loading]=\"searchFacade.isLoading$ | async\"\n [hits]=\"searchFacade.resultsHits$ | async\"\n ></gn-ui-results-hits-number>\n <gn-ui-results-hits-search-kind\n (selectionChanged)=\"onSelectionChanged($event)\"\n [choices]=\"filterChoices$ | async\"\n [selected]=\"selected$ | async\"\n ></gn-ui-results-hits-search-kind>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ResultsHitsNumberComponent, selector: "gn-ui-results-hits-number", inputs: ["hits", "loading"] }, { kind: "component", type: ResultsHitsSearchKindComponent, selector: "gn-ui-results-hits-search-kind", inputs: ["selected", "choices"], outputs: ["selectionChanged"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] }); }
33643
+ }
33644
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsHitsContainerComponent, decorators: [{
33645
+ type: Component,
33646
+ args: [{ selector: 'gn-ui-results-hits', template: "<div\n class=\"flex flex-col gap-3 sm:flex-row justify-between\"\n [ngClass]=\"{\n 'sm:items-center': (searchFacade.resultsHits$ | async) !== 0,\n }\"\n>\n <gn-ui-results-hits-number\n [loading]=\"searchFacade.isLoading$ | async\"\n [hits]=\"searchFacade.resultsHits$ | async\"\n ></gn-ui-results-hits-number>\n <gn-ui-results-hits-search-kind\n (selectionChanged)=\"onSelectionChanged($event)\"\n [choices]=\"filterChoices$ | async\"\n [selected]=\"selected$ | async\"\n ></gn-ui-results-hits-search-kind>\n</div>\n" }]
33647
+ }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: FieldsService }] });
33648
+
33649
+ class SearchStateContainerDirective {
33650
+ constructor(facade) {
33651
+ this.facade = facade;
33652
+ }
33653
+ ngOnInit() {
33654
+ this.facade.init(this.searchId);
33655
+ }
33656
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchStateContainerDirective, deps: [{ token: SearchFacade, host: true }], target: i0.ɵɵFactoryTarget.Directive }); }
33657
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: SearchStateContainerDirective, selector: "[gnUiSearchStateContainer]", inputs: { searchId: ["gnUiSearchStateContainer", "searchId"] }, providers: [SearchFacade, SearchService], ngImport: i0 }); }
33658
+ }
33659
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchStateContainerDirective, decorators: [{
33660
+ type: Directive,
33661
+ args: [{
33662
+ selector: '[gnUiSearchStateContainer]',
33663
+ providers: [SearchFacade, SearchService],
33664
+ }]
33665
+ }], ctorParameters: () => [{ type: SearchFacade, decorators: [{
33666
+ type: Host
33667
+ }] }], propDecorators: { searchId: [{
33668
+ type: Input,
33669
+ args: ['gnUiSearchStateContainer']
33670
+ }] } });
33671
+
32587
33672
  class FilterDropdownComponent {
32588
33673
  onSelectedValues(values) {
32589
33674
  this.fieldsService
@@ -32655,7 +33740,9 @@ class FeatureSearchModule {
32655
33740
  SpinningLoaderComponent,
32656
33741
  ErrorComponent,
32657
33742
  FavoriteStarComponent,
32658
- DateRangeDropdownComponent], exports: [SortByComponent,
33743
+ DateRangeDropdownComponent,
33744
+ NgIconsModule,
33745
+ KindBadgeComponent], exports: [SortByComponent,
32659
33746
  ResultsLayoutComponent,
32660
33747
  FuzzySearchComponent,
32661
33748
  RecordsMetricsComponent,
@@ -32664,12 +33751,7 @@ class FeatureSearchModule {
32664
33751
  FacetsModule,
32665
33752
  SearchStateContainerDirective,
32666
33753
  FilterDropdownComponent] }); }
32667
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, providers: [
32668
- {
32669
- provide: RecordsRepositoryInterface,
32670
- useClass: Gn4Repository,
32671
- },
32672
- ], imports: [CommonModule,
33754
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, imports: [CommonModule,
32673
33755
  TranslateModule.forChild(),
32674
33756
  StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
32675
33757
  initialState,
@@ -32685,7 +33767,9 @@ class FeatureSearchModule {
32685
33767
  AutocompleteComponent,
32686
33768
  ErrorComponent,
32687
33769
  FavoriteStarComponent,
32688
- DateRangeDropdownComponent, FacetsModule] }); }
33770
+ DateRangeDropdownComponent,
33771
+ NgIconsModule,
33772
+ KindBadgeComponent, FacetsModule] }); }
32689
33773
  }
32690
33774
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, decorators: [{
32691
33775
  type: NgModule,
@@ -32719,6 +33803,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32719
33803
  ErrorComponent,
32720
33804
  FavoriteStarComponent,
32721
33805
  DateRangeDropdownComponent,
33806
+ NgIconsModule,
33807
+ KindBadgeComponent,
32722
33808
  ],
32723
33809
  exports: [
32724
33810
  SortByComponent,
@@ -32731,12 +33817,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32731
33817
  SearchStateContainerDirective,
32732
33818
  FilterDropdownComponent,
32733
33819
  ],
32734
- providers: [
32735
- {
32736
- provide: RecordsRepositoryInterface,
32737
- useClass: Gn4Repository,
32738
- },
32739
- ],
32740
33820
  }]
32741
33821
  }] });
32742
33822
 
@@ -33224,247 +34304,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33224
34304
  }]
33225
34305
  }] });
33226
34306
 
33227
- const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
33228
- const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
33229
- const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
33230
- factory: () => ({}),
33231
- });
33232
- const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
33233
- factory: () => ({
33234
- fill: { color: 'rgba(255, 255, 255, 0.2)' },
33235
- stroke: { color: '#ffcc33', width: 2 },
33236
- }),
33237
- });
33238
-
33239
- const DEFAULT_BASEMAP_LAYER = {
33240
- type: 'xyz',
33241
- url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
33242
- attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
33243
- };
33244
- const DEFAULT_VIEW = {
33245
- center: [0, 15],
33246
- zoom: 2,
33247
- };
33248
- class MapContainerComponent {
33249
- get featuresClick() {
33250
- if (!this._featuresClick) {
33251
- this.openlayersMap.then((olMap) => {
33252
- listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
33253
- });
33254
- this._featuresClick = new EventEmitter();
33255
- }
33256
- return this._featuresClick;
33257
- }
33258
- get featuresHover() {
33259
- if (!this._featuresHover) {
33260
- this.openlayersMap.then((olMap) => {
33261
- listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
33262
- });
33263
- this._featuresHover = new EventEmitter();
33264
- }
33265
- return this._featuresHover;
33266
- }
33267
- get mapClick() {
33268
- if (!this._mapClick) {
33269
- this.openlayersMap.then((olMap) => {
33270
- listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
33271
- });
33272
- this._mapClick = new EventEmitter();
33273
- }
33274
- return this._mapClick;
33275
- }
33276
- get sourceLoadError() {
33277
- if (!this._sourceLoadError) {
33278
- this.openlayersMap.then((olMap) => {
33279
- listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
33280
- });
33281
- this._sourceLoadError = new EventEmitter();
33282
- }
33283
- return this._sourceLoadError;
33284
- }
33285
- constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
33286
- this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
33287
- this.basemapLayers = basemapLayers;
33288
- this.mapViewConstraints = mapViewConstraints;
33289
- this.openlayersMap = new Promise((resolve) => {
33290
- this.olMapResolver = resolve;
33291
- });
33292
- }
33293
- async ngAfterViewInit() {
33294
- this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
33295
- 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
33296
- ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
33297
- : of(false)));
33298
- this.olMapResolver(this.olMap);
33299
- }
33300
- async ngOnChanges(changes) {
33301
- if ('context' in changes && !changes['context'].isFirstChange()) {
33302
- const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
33303
- await applyContextDiffToMap(this.olMap, diff);
33304
- }
33305
- }
33306
- // This will apply basemap layers & view constraints
33307
- processContext(context) {
33308
- const processed = context
33309
- ? { ...context, view: context.view ?? DEFAULT_VIEW }
33310
- : { layers: [], view: DEFAULT_VIEW };
33311
- if (this.basemapLayers.length) {
33312
- processed.layers = [...this.basemapLayers, ...processed.layers];
33313
- }
33314
- if (!this.doNotUseDefaultBasemap) {
33315
- processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
33316
- }
33317
- if (this.mapViewConstraints.maxZoom) {
33318
- processed.view = {
33319
- maxZoom: this.mapViewConstraints.maxZoom,
33320
- ...processed.view,
33321
- };
33322
- }
33323
- if (this.mapViewConstraints.maxExtent) {
33324
- processed.view = {
33325
- maxExtent: this.mapViewConstraints.maxExtent,
33326
- ...processed.view,
33327
- };
33328
- }
33329
- if (processed.view &&
33330
- !('zoom' in processed.view) &&
33331
- !('center' in processed.view)) {
33332
- if (this.mapViewConstraints.maxExtent) {
33333
- processed.view = {
33334
- extent: this.mapViewConstraints.maxExtent,
33335
- ...processed.view,
33336
- };
33337
- }
33338
- else {
33339
- processed.view = { ...DEFAULT_VIEW, ...processed.view };
33340
- }
33341
- }
33342
- return processed;
33343
- }
33344
- 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 }); }
33345
- 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: [
33346
- provideIcons({ matSwipeOutline }),
33347
- provideNgIconsConfig({
33348
- size: '1.5em',
33349
- }),
33350
- ], 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 }); }
33351
- }
33352
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
33353
- type: Component,
33354
- args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
33355
- provideIcons({ matSwipeOutline }),
33356
- provideNgIconsConfig({
33357
- size: '1.5em',
33358
- }),
33359
- ], 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" }]
33360
- }], ctorParameters: () => [{ type: undefined, decorators: [{
33361
- type: Inject,
33362
- args: [DO_NOT_USE_DEFAULT_BASEMAP]
33363
- }] }, { type: undefined, decorators: [{
33364
- type: Inject,
33365
- args: [BASEMAP_LAYERS]
33366
- }] }, { type: undefined, decorators: [{
33367
- type: Inject,
33368
- args: [MAP_VIEW_CONSTRAINTS]
33369
- }] }], propDecorators: { context: [{
33370
- type: Input
33371
- }], featuresClick: [{
33372
- type: Output
33373
- }], featuresHover: [{
33374
- type: Output
33375
- }], mapClick: [{
33376
- type: Output
33377
- }], sourceLoadError: [{
33378
- type: Output
33379
- }], container: [{
33380
- type: ViewChild,
33381
- args: ['map']
33382
- }] } });
33383
-
33384
- const geometryKeys = ['geometry', 'the_geom'];
33385
- class FeatureDetailComponent {
33386
- get properties() {
33387
- if (!this.feature)
33388
- return [];
33389
- return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
33390
- }
33391
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33392
- 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 }); }
33393
- }
33394
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
33395
- type: Component,
33396
- 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"] }]
33397
- }], propDecorators: { feature: [{
33398
- type: Input
33399
- }] } });
33400
-
33401
- class MapLegendComponent {
33402
- constructor() {
33403
- this.legendStatusChange = new EventEmitter();
33404
- }
33405
- async ngOnChanges(changes) {
33406
- if ('context' in changes) {
33407
- const mapContext = changes['context'].currentValue;
33408
- if (mapContext.layers && mapContext.layers.length > 0) {
33409
- const mapContextLayer = mapContext.layers[0];
33410
- this.legendHTML = await createLegendFromLayer(mapContextLayer);
33411
- if (this.legendHTML) {
33412
- this.legendStatusChange.emit(true);
33413
- }
33414
- }
33415
- else {
33416
- this.legendHTML = false;
33417
- this.legendStatusChange.emit(false);
33418
- }
33419
- }
33420
- }
33421
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33422
- 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 }); }
33423
- }
33424
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
33425
- type: Component,
33426
- 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"] }]
33427
- }], propDecorators: { context: [{
33428
- type: Input
33429
- }], legendStatusChange: [{
33430
- type: Output
33431
- }] } });
33432
-
33433
- function prioritizePageScroll(interactions) {
33434
- interactions.clear();
33435
- interactions.extend(defaults({
33436
- // remove rotate interactions
33437
- altShiftDragRotate: false,
33438
- pinchRotate: false,
33439
- // replace drag and zoom interactions
33440
- dragPan: false,
33441
- mouseWheelZoom: false,
33442
- })
33443
- .extend([
33444
- new DragPan({
33445
- condition: dragPanCondition,
33446
- }),
33447
- new MouseWheelZoom({
33448
- condition: mouseWheelZoomCondition,
33449
- }),
33450
- ])
33451
- .getArray());
33452
- }
33453
- function dragPanCondition(event) {
33454
- const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
33455
- if (!dragPanCondition) {
33456
- this.getMap().dispatchEvent('mapmuted');
33457
- }
33458
- // combine the condition with the default DragPan conditions
33459
- return dragPanCondition && noModifierKeys(event) && primaryAction(event);
33460
- }
33461
- function mouseWheelZoomCondition(event) {
33462
- if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
33463
- this.getMap().dispatchEvent('mapmuted');
33464
- }
33465
- return platformModifierKeyOnly(event);
33466
- }
33467
-
33468
34307
  class MapStateContainerComponent {
33469
34308
  constructor(mapFacade) {
33470
34309
  this.mapFacade = mapFacade;
@@ -34116,6 +34955,7 @@ function loadAppConfig() {
34116
34955
  'metadata_language',
34117
34956
  'login_url',
34118
34957
  'logout_url',
34958
+ 'settings_url',
34119
34959
  'web_component_embedder_url',
34120
34960
  'languages',
34121
34961
  'contact_email',
@@ -34266,6 +35106,7 @@ proxy_path = "/proxy/?url="
34266
35106
  metadata_language = "fre"
34267
35107
  login_url = "/cas/login?service="
34268
35108
  logout_url = "/geonetwork/signout"
35109
+ settings_url = "/geonetwork/settings"
34269
35110
  web_component_embedder_url = "/datahub/wc-embedder.html"
34270
35111
 
34271
35112
  [map]
@@ -37129,15 +37970,13 @@ class MdViewFacade {
37129
37970
  this.error$ = this.store.pipe(select(getMetadataError));
37130
37971
  this.related$ = this.store.pipe(select(getRelated));
37131
37972
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
37132
- this.allLinks$ = this.metadata$.pipe(map$1((record) => record.kind === 'dataset' && 'onlineResources' in record
37133
- ? record.onlineResources
37134
- : []));
37973
+ this.allLinks$ = this.metadata$.pipe(map$1((record) => ('onlineResources' in record ? record.onlineResources : [])));
37135
37974
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links
37136
37975
  .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
37137
37976
  // Put links to IGN Géoplateforme first
37138
37977
  .sort((dd1, dd2) => {
37139
- return dd2.accessServiceProtocol ===
37140
- 'GPFDL'
37978
+ return dd2
37979
+ .accessServiceProtocol === 'GPFDL'
37141
37980
  ? 1
37142
37981
  : undefined; // do not change the sorting otherwise
37143
37982
  })));
@@ -37208,15 +38047,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37208
38047
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }, { type: DataService }] });
37209
38048
 
37210
38049
  class MdViewEffects {
37211
- constructor(actions$, recordsRepository, platformServiceInterface) {
38050
+ constructor(actions$, recordsRepository, platformServiceInterface, router) {
37212
38051
  this.actions$ = actions$;
37213
38052
  this.recordsRepository = recordsRepository;
37214
38053
  this.platformServiceInterface = platformServiceInterface;
38054
+ this.router = router;
37215
38055
  /*
37216
38056
  Metadata effects
37217
38057
  */
37218
38058
  this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getRecord(uuid)), map$1((record) => {
37219
- if (record === null) {
38059
+ if (record === null || !this.router.url.includes(record.kind)) {
37220
38060
  return loadFullMetadataFailure({ notFound: true });
37221
38061
  }
37222
38062
  return loadFullMetadataSuccess({ full: record });
@@ -37251,12 +38091,12 @@ class MdViewEffects {
37251
38091
  }));
37252
38092
  })))));
37253
38093
  }
37254
- 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 }); }
38094
+ 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 }); }
37255
38095
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects }); }
37256
38096
  }
37257
38097
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, decorators: [{
37258
38098
  type: Injectable
37259
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }] });
38099
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }, { type: i1$d.Router }] });
37260
38100
 
37261
38101
  class CatalogTitleComponent {
37262
38102
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CatalogTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -37313,11 +38153,11 @@ class LanguageSwitcherComponent {
37313
38153
  this.translate.use(value);
37314
38154
  }
37315
38155
  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 }); }
37316
- 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"] }] }); }
38156
+ 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"] }] }); }
37317
38157
  }
37318
38158
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
37319
38159
  type: Component,
37320
- 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" }]
38160
+ 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" }]
37321
38161
  }], ctorParameters: () => [{ type: undefined, decorators: [{
37322
38162
  type: Optional
37323
38163
  }, {
@@ -37739,17 +38579,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37739
38579
  }]
37740
38580
  }] });
37741
38581
 
37742
- const GN_UI_VERSION = new InjectionToken('gnUiVersion');
37743
-
37744
38582
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
37745
38583
  class DataViewPermalinkComponent {
37746
38584
  set viewType(value) {
37747
38585
  this.viewType$.next(value);
37748
38586
  }
37749
- constructor(config, wcEmbedderBaseUrl, version, facade) {
38587
+ constructor(config, wcEmbedderBaseUrl, facade) {
37750
38588
  this.config = config;
37751
38589
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
37752
- this.version = version;
37753
38590
  this.facade = facade;
37754
38591
  this.viewType$ = new BehaviorSubject('map');
37755
38592
  this.permalinkUrl$ = combineLatest([
@@ -37758,7 +38595,7 @@ class DataViewPermalinkComponent {
37758
38595
  this.facade.metadata$,
37759
38596
  ]).pipe(map$2(([viewType, config, metadata]) => {
37760
38597
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
37761
- url.searchParams.set('v', `${this.version}`);
38598
+ url.searchParams.set('v', `${GEONETWORK_UI_TAG_NAME}`);
37762
38599
  if (viewType === 'chart') {
37763
38600
  if (config) {
37764
38601
  const { aggregation, xProperty, yProperty, chartType } = config;
@@ -37789,7 +38626,7 @@ class DataViewPermalinkComponent {
37789
38626
  return url.toString();
37790
38627
  }));
37791
38628
  }
37792
- 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 }); }
38629
+ 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 }); }
37793
38630
  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 }); }
37794
38631
  }
37795
38632
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
@@ -37803,9 +38640,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37803
38640
  }, {
37804
38641
  type: Inject,
37805
38642
  args: [WEB_COMPONENT_EMBEDDER_URL]
37806
- }] }, { type: undefined, decorators: [{
37807
- type: Inject,
37808
- args: [GN_UI_VERSION]
37809
38643
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37810
38644
  type: Input
37811
38645
  }] } });
@@ -37884,16 +38718,15 @@ class DataViewWebComponentComponent {
37884
38718
  set viewType(value) {
37885
38719
  this.viewType$.next(value);
37886
38720
  }
37887
- constructor(config, version, facade) {
38721
+ constructor(config, facade) {
37888
38722
  this.config = config;
37889
- this.version = version;
37890
38723
  this.facade = facade;
37891
38724
  this.viewType$ = new BehaviorSubject('map');
37892
38725
  this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
37893
38726
  if (viewType === 'chart') {
37894
38727
  if (config) {
37895
38728
  const { aggregation, xProperty, yProperty, chartType } = config;
37896
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38729
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37897
38730
  <gn-dataset-view-chart
37898
38731
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37899
38732
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37912,7 +38745,7 @@ class DataViewWebComponentComponent {
37912
38745
  return '';
37913
38746
  }
37914
38747
  else if (viewType === 'table') {
37915
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38748
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37916
38749
  <gn-dataset-view-table
37917
38750
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37918
38751
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37925,7 +38758,7 @@ class DataViewWebComponentComponent {
37925
38758
  ></gn-dataset-view-table>`;
37926
38759
  }
37927
38760
  else {
37928
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38761
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37929
38762
  <gn-dataset-view-map
37930
38763
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37931
38764
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37939,7 +38772,7 @@ class DataViewWebComponentComponent {
37939
38772
  }
37940
38773
  }));
37941
38774
  }
37942
- 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 }); }
38775
+ 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 }); }
37943
38776
  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 }); }
37944
38777
  }
37945
38778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
@@ -37948,9 +38781,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37948
38781
  }], ctorParameters: () => [{ type: Configuration, decorators: [{
37949
38782
  type: Inject,
37950
38783
  args: [Configuration]
37951
- }] }, { type: undefined, decorators: [{
37952
- type: Inject,
37953
- args: [GN_UI_VERSION]
37954
38784
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37955
38785
  type: Input
37956
38786
  }] } });
@@ -38451,7 +39281,7 @@ class RecordMetaComponent {
38451
39281
  this.meta.removeTag('property="og:url"');
38452
39282
  this.meta.removeTag('property="og:title"');
38453
39283
  }
38454
- 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 }); }
39284
+ 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 }); }
38455
39285
  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 }); }
38456
39286
  }
38457
39287
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, decorators: [{
@@ -38462,7 +39292,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
38462
39292
  changeDetection: ChangeDetectionStrategy.OnPush,
38463
39293
  standalone: true,
38464
39294
  }]
38465
- }], ctorParameters: () => [{ type: i1$d.Meta }], propDecorators: { metadata: [{
39295
+ }], ctorParameters: () => [{ type: i1$e.Meta }], propDecorators: { metadata: [{
38466
39296
  type: Input
38467
39297
  }] } });
38468
39298
 
@@ -39510,7 +40340,7 @@ class ImportRecordComponent {
39510
40340
  },
39511
40341
  });
39512
40342
  }
39513
- 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 }); }
40343
+ 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 }); }
39514
40344
  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: [
39515
40345
  provideIcons({
39516
40346
  iconoirImport,
@@ -39541,7 +40371,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39541
40371
  size: '1.5em',
39542
40372
  }),
39543
40373
  ], 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" }]
39544
- }], ctorParameters: () => [{ type: i1$e.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
40374
+ }], ctorParameters: () => [{ type: i1$d.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
39545
40375
  type: Output
39546
40376
  }] } });
39547
40377
 
@@ -39905,75 +40735,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39905
40735
  args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-array works!</p>\n" }]
39906
40736
  }] });
39907
40737
 
39908
- class FormFieldMapContainerComponent {
39909
- constructor() {
39910
- this.spatialExtents$ = new BehaviorSubject([]);
39911
- this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
39912
- if (extents.length === 0) {
39913
- return null; // null extent means default view
39914
- }
39915
- const featureCollection = {
39916
- type: 'FeatureCollection',
39917
- features: [],
39918
- };
39919
- extents.forEach((extent) => {
39920
- if (extent.geometry) {
39921
- featureCollection.features.push({
39922
- type: 'Feature',
39923
- properties: {},
39924
- geometry: extent.geometry,
39925
- });
39926
- }
39927
- else if (extent.bbox?.length >= 0) {
39928
- featureCollection.features.push({
39929
- type: 'Feature',
39930
- properties: {},
39931
- geometry: this.bboxCoordsToGeometry(extent.bbox),
39932
- });
39933
- }
39934
- });
39935
- const layer = {
39936
- type: 'geojson',
39937
- data: featureCollection,
39938
- label: 'Spatial extents',
39939
- style: {
39940
- 'stroke-color': 'black',
39941
- 'stroke-width': 2,
39942
- },
39943
- };
39944
- const view = await createViewFromLayer(layer);
39945
- return {
39946
- view,
39947
- layers: [layer],
39948
- };
39949
- }));
39950
- this.error = '';
39951
- }
39952
- set spatialExtents(value) {
39953
- this.spatialExtents$.next(value);
39954
- }
39955
- bboxCoordsToGeometry(bbox) {
39956
- const geometry = new Polygon([
39957
- [
39958
- [bbox[0], bbox[1]],
39959
- [bbox[0], bbox[3]],
39960
- [bbox[2], bbox[3]],
39961
- [bbox[2], bbox[1]],
39962
- [bbox[0], bbox[1]],
39963
- ],
39964
- ]);
39965
- return new GeoJSON().writeGeometryObject(geometry);
39966
- }
39967
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39968
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldMapContainerComponent, isStandalone: true, selector: "gn-ui-form-field-map-container", inputs: { spatialExtents: "spatialExtents" }, ngImport: i0, template: "<gn-ui-map-container [context]=\"mapContext$ | async\"></gn-ui-map-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39969
- }
39970
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, decorators: [{
39971
- type: Component,
39972
- 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" }]
39973
- }], propDecorators: { spatialExtents: [{
39974
- type: Input
39975
- }] } });
39976
-
39977
40738
  /**
39978
40739
  * This form field is not like the others, as it will read directly from the state to handle both spatial extents
39979
40740
  * and place keywords.
@@ -40070,16 +40831,16 @@ class FormFieldSpatialExtentComponent {
40070
40831
  this.editorFacade.updateRecordField('spatialExtents', spatialExtents);
40071
40832
  }
40072
40833
  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 }); }
40073
- 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 }); }
40834
+ 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 }); }
40074
40835
  }
40075
40836
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
40076
40837
  type: Component,
40077
40838
  args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
40078
40839
  CommonModule,
40079
40840
  GenericKeywordsComponent,
40080
- FormFieldMapContainerComponent,
40081
40841
  TranslateModule,
40082
- ], 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" }]
40842
+ SpatialExtentComponent,
40843
+ ], 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" }]
40083
40844
  }], ctorParameters: () => [{ type: PlatformServiceInterface }, { type: EditorFacade }, { type: i1$1.TranslateService }] });
40084
40845
 
40085
40846
  class ContactCardComponent {
@@ -40337,9 +41098,8 @@ class OnlineResourceCardComponent {
40337
41098
  get subtitle() {
40338
41099
  switch (this.onlineResource.type) {
40339
41100
  case 'service':
40340
- return `${this.onlineResource.accessServiceProtocol}`;
40341
41101
  case 'endpoint':
40342
- return `${this.onlineResource.protocol}`;
41102
+ return `${this.onlineResource.accessServiceProtocol}`;
40343
41103
  case 'link':
40344
41104
  case 'download':
40345
41105
  return this.getFormat(this.onlineResource);
@@ -41496,6 +42256,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41496
42256
  const ROUTER_STATE_KEY = 'router';
41497
42257
  const ROUTER_ROUTE_SEARCH = 'search';
41498
42258
  const ROUTER_ROUTE_DATASET = 'dataset';
42259
+ const ROUTER_ROUTE_SERVICE = 'service';
42260
+ const ROUTER_ROUTE_REUSE = 'reuse';
41499
42261
  const ROUTER_ROUTE_ORGANIZATION = 'organization';
41500
42262
  var ROUTE_PARAMS;
41501
42263
  (function (ROUTE_PARAMS) {
@@ -41528,6 +42290,14 @@ class RouterService {
41528
42290
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
41529
42291
  component: this.routerConfig.recordRouteComponent,
41530
42292
  },
42293
+ {
42294
+ path: `${ROUTER_ROUTE_SERVICE}/:metadataUuid`,
42295
+ component: this.routerConfig.recordRouteComponent,
42296
+ },
42297
+ {
42298
+ path: `${ROUTER_ROUTE_REUSE}/:metadataUuid`,
42299
+ component: this.routerConfig.recordRouteComponent,
42300
+ },
41531
42301
  {
41532
42302
  path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
41533
42303
  component: this.routerConfig.organizationRouteComponent,
@@ -41540,7 +42310,7 @@ class RouterService {
41540
42310
  getOrganizationPageRoute() {
41541
42311
  return ROUTER_ROUTE_ORGANIZATION;
41542
42312
  }
41543
- 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 }); }
42313
+ 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 }); }
41544
42314
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
41545
42315
  }
41546
42316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, decorators: [{
@@ -41551,7 +42321,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41551
42321
  }], ctorParameters: () => [{ type: undefined, decorators: [{
41552
42322
  type: Inject,
41553
42323
  args: [ROUTER_CONFIG]
41554
- }] }, { type: i1$e.Router }] });
42324
+ }] }, { type: i1$d.Router }] });
41555
42325
 
41556
42326
  const goAction = createAction('[Router] Go', props());
41557
42327
  const backAction = createAction('[Router] Back');
@@ -41623,13 +42393,19 @@ class RouterFacade {
41623
42393
  this.currentRoute$ = this.store.pipe(select(selectCurrentRoute));
41624
42394
  this.pathParams$ = this.store.pipe(select(selectRouteParams));
41625
42395
  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));
42396
+ this.routeMap = {
42397
+ dataset: ROUTER_ROUTE_DATASET,
42398
+ service: ROUTER_ROUTE_SERVICE,
42399
+ reuse: ROUTER_ROUTE_REUSE,
42400
+ };
41626
42401
  }
41627
42402
  goToMetadata(metadata) {
42403
+ const selectedRoute = this.routeMap[metadata.kind] || ROUTER_ROUTE_DATASET;
41628
42404
  this.pathParams$
41629
42405
  .pipe(take(1), filter((params) => params.metadataUuid !== metadata.uniqueIdentifier))
41630
42406
  .subscribe(() => {
41631
42407
  this.go({
41632
- path: `${ROUTER_ROUTE_DATASET}/${metadata.uniqueIdentifier}`,
42408
+ path: `${selectedRoute}/${metadata.uniqueIdentifier}`,
41633
42409
  });
41634
42410
  this.store.dispatch(setIncompleteMetadata({ incomplete: metadata }));
41635
42411
  });
@@ -41856,12 +42632,12 @@ class RouterEffects {
41856
42632
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
41857
42633
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
41858
42634
  }
41859
- 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 }); }
42635
+ 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 }); }
41860
42636
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
41861
42637
  }
41862
42638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
41863
42639
  type: Injectable
41864
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$e.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
42640
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$d.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
41865
42641
  type: Inject,
41866
42642
  args: [ROUTER_CONFIG]
41867
42643
  }] }, { type: FieldsService }] });
@@ -41921,5 +42697,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41921
42697
  * Generated bundle index. Do not edit.
41922
42698
  */
41923
42699
 
41924
- 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, 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, 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 };
42700
+ 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, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, 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, PossibleResourceTypes, PossibleResourceTypesDefinition, 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, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, 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, getResourceType, getReuseType, 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, kindToCodeListValue, 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 };
41925
42701
  //# sourceMappingURL=geonetwork-ui.mjs.map