geonetwork-ui 2.6.0-dev.0716b5712 → 2.6.0-dev.0739ca76d

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 (225) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +1 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +8 -3
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -4
  5. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -10
  6. package/esm2022/libs/api/repository/src/lib/gn4/gn4.provider.mjs +7 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  8. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +5 -1
  9. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +5 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +2 -3
  11. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +1 -1
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -5
  13. package/esm2022/libs/feature/record/src/index.mjs +1 -2
  14. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +5 -9
  15. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +7 -11
  16. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +6 -1
  17. package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +1 -1
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +8 -5
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -6
  20. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +3 -1
  21. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  22. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +10 -2
  23. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -3
  24. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +8 -7
  25. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -15
  26. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -2
  27. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +26 -10
  28. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  29. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  30. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +163 -0
  31. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  32. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +8 -5
  33. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  34. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +161 -0
  35. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +16 -4
  36. package/esm2022/libs/ui/inputs/src/index.mjs +1 -2
  37. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +4 -3
  38. package/esm2022/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.mjs +43 -3
  39. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  40. package/esm2022/libs/ui/map/src/index.mjs +2 -1
  41. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +79 -0
  42. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  43. package/esm2022/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.mjs +3 -3
  44. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +2 -1
  45. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  46. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  47. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  48. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  49. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +13 -6
  50. package/esm2022/translations/de.json +32 -4
  51. package/esm2022/translations/en.json +32 -4
  52. package/esm2022/translations/es.json +32 -4
  53. package/esm2022/translations/fr.json +34 -6
  54. package/esm2022/translations/it.json +32 -4
  55. package/esm2022/translations/nl.json +32 -4
  56. package/esm2022/translations/pt.json +32 -4
  57. package/fesm2022/geonetwork-ui.mjs +1160 -481
  58. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  59. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  60. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  61. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  62. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  63. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +5 -2
  64. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  65. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  66. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +1 -1
  67. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
  68. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
  69. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +6 -6
  70. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  71. 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
  72. package/libs/feature/record/src/index.d.ts +0 -1
  73. package/libs/feature/record/src/index.d.ts.map +1 -1
  74. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  75. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  76. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  77. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  78. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  79. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  80. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  81. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  82. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  83. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  84. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  85. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  86. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  87. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  88. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  89. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  90. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  91. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  92. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  93. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  94. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  95. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -1
  96. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -1
  97. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  98. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  99. package/libs/ui/elements/src/index.d.ts +2 -0
  100. package/libs/ui/elements/src/index.d.ts.map +1 -1
  101. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +43 -0
  102. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -0
  103. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  104. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  105. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  106. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  107. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +3 -1
  108. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  109. package/libs/ui/inputs/src/index.d.ts +0 -1
  110. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  111. package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts.map +1 -1
  112. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts +10 -3
  113. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts.map +1 -1
  114. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  115. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  116. package/libs/ui/map/src/index.d.ts +1 -0
  117. package/libs/ui/map/src/index.d.ts.map +1 -1
  118. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  119. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  120. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  121. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  122. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  123. package/libs/util/shared/src/index.d.ts +1 -0
  124. package/libs/util/shared/src/index.d.ts.map +1 -1
  125. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  126. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  127. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  128. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  129. package/libs/util/shared/src/lib/links/link-utils.d.ts +14 -7
  130. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  131. package/package.json +1 -1
  132. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  133. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  134. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  135. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  136. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  137. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +8 -2
  138. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  139. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  140. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  141. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  142. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +5 -2
  143. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  144. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  145. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  146. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +4 -0
  147. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +4 -0
  148. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  149. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  150. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  151. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  152. package/src/libs/feature/record/src/index.ts +0 -1
  153. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  154. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  155. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +5 -0
  156. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  157. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  158. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  159. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  160. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  161. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  162. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  163. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +1 -7
  164. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +16 -8
  165. package/src/libs/feature/search/src/lib/feature-search.module.ts +0 -8
  166. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  167. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.css +6 -0
  168. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  169. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  170. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  171. package/src/libs/ui/elements/src/index.ts +2 -0
  172. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +156 -0
  173. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +190 -0
  174. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  175. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  176. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  177. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  178. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +4 -2
  179. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.css +0 -0
  180. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  181. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  182. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -0
  183. package/src/libs/ui/inputs/src/index.ts +0 -1
  184. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +5 -5
  185. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.ts +2 -1
  186. package/src/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.ts +46 -2
  187. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  188. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  189. package/src/libs/ui/map/src/index.ts +1 -0
  190. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  191. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  192. 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
  193. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  194. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  195. package/src/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.html +2 -2
  196. package/src/libs/util/app-config/src/lib/app-config.ts +1 -0
  197. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  198. package/src/libs/util/shared/src/index.ts +1 -0
  199. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  200. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  201. package/src/libs/util/shared/src/lib/links/link-utils.ts +30 -12
  202. package/tailwind.base.css +18 -13
  203. package/translations/de.json +32 -4
  204. package/translations/en.json +32 -4
  205. package/translations/es.json +32 -4
  206. package/translations/fr.json +34 -6
  207. package/translations/it.json +32 -4
  208. package/translations/nl.json +32 -4
  209. package/translations/pt.json +32 -4
  210. package/translations/sk.json +32 -4
  211. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  212. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  213. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +0 -16
  214. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  215. 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
  216. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  217. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  218. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts +0 -8
  219. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts.map +0 -1
  220. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  221. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  222. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +0 -3
  223. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +0 -9
  224. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.ts +0 -15
  225. /package/src/libs/{feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.css → ui/elements/src/lib/internal-link-card/internal-link-card.component.css} +0 -0
@@ -7,17 +7,17 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker';
7
7
  import { format } from 'date-fns/format';
8
8
  import { Namespace, Literal, lit, parse as parse$2, sym, BlankNode, graph } from 'rdflib';
9
9
  import * as i0 from '@angular/core';
10
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, ContentChild, ContentChildren, TemplateRef, Host, ElementRef, ViewChildren, ViewContainerRef, Pipe, ViewEncapsulation, inject } from '@angular/core';
10
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, ContentChild, ContentChildren, TemplateRef, Host, ElementRef, ViewChildren, ViewContainerRef, ViewEncapsulation, Pipe, inject } from '@angular/core';
11
11
  import * as i1 from '@angular/common/http';
12
12
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpEventType, HttpClientXsrfModule } from '@angular/common/http';
13
13
  import * as i1$1 from '@ngx-translate/core';
14
14
  import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
15
15
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
16
16
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
17
- import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, first as first$1, share, pairwise, delay, defaultIfEmpty, toArray } from 'rxjs/operators';
17
+ import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, delay, first as first$1, share, pairwise, defaultIfEmpty, toArray } from 'rxjs/operators';
18
18
  import * as i1$2 from '@angular/common';
19
- import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgOptimizedImage, DatePipe, NgIf } from '@angular/common';
20
- import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, filter as filter$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, timer, takeUntil, EMPTY, mergeMap as mergeMap$1, startWith as startWith$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
19
+ import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgIf, NgClass, NgTemplateOutlet, NgOptimizedImage, DatePipe } from '@angular/common';
20
+ import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, timer, filter as filter$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$1, startWith as startWith$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
21
21
  import { lt, valid, coerce, satisfies, ltr } from 'semver';
22
22
  import chroma from 'chroma-js';
23
23
  import { WmtsEndpoint, WmsEndpoint, WfsEndpoint, OgcApiEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
@@ -26,8 +26,8 @@ import { createAction, props, createReducer, on, createFeatureSelector, createSe
26
26
  import EmblaCarousel from 'embla-carousel';
27
27
  import * as i2$2 from '@ng-icons/core';
28
28
  import { provideIcons, NgIcon, NgIconComponent, provideNgIconsConfig, NgIconsModule } from '@ng-icons/core';
29
- import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirNavArrowDown, iconoirNavArrowUp, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirUser, iconoirLock, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
30
- import { matExpandMore, matExpandLess, matAdd, matRemove, matClose, matContentCopy, matSearch, matStar, matStarBorder, matChevronLeft, matChevronRight, matArrowForward, matArrowBack, matCheck, matWarningAmber, matFace, matQuestionMark, matMoodBad, matZoomOutMap, matOpenInNew, matMailOutline, matPersonOutline, matCheckCircleOutline, matWarning, matMoreVert, matCorporateFare } from '@ng-icons/material-icons/baseline';
29
+ import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirNavArrowDown, iconoirNavArrowUp, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirDatabase, iconoirMap, iconoirInternet, iconoirUser, iconoirLock, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
30
+ import { matExpandMore, matExpandLess, matAdd, matRemove, matClose, matContentCopy, matSearch, matStar, matStarBorder, matChevronLeft, matChevronRight, matArrowForward, matArrowBack, matCheck, matWarningAmber, matFace, matQuestionMark, matMoodBad, matZoomOutMap, matOpenInNew, matMailOutline, matPersonOutline, matCheckCircleOutline, matWarning, matCode, matMoreVert, matCorporateFare } from '@ng-icons/material-icons/baseline';
31
31
  import * as i1$4 from '@angular/material/tooltip';
32
32
  import { MatTooltipModule } from '@angular/material/tooltip';
33
33
  import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
@@ -41,7 +41,7 @@ import { TagInputModule } from 'ngx-chips';
41
41
  import * as i1$5 from '@angular/material/progress-spinner';
42
42
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
43
43
  import tippy from 'tippy.js';
44
- import { matErrorOutlineOutline, matInfoOutline, matComputerOutline, matCallOutline, matLocationOnOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, 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';
@@ -1351,8 +1351,8 @@ function extractServiceOnlineResources() {
1351
1351
  else {
1352
1352
  return {
1353
1353
  type: 'endpoint',
1354
- endpointUrl: url,
1355
- protocol,
1354
+ url: url,
1355
+ accessServiceProtocol: protocol,
1356
1356
  ...(description && { description }),
1357
1357
  translations,
1358
1358
  };
@@ -1851,7 +1851,7 @@ function writeLineage$1(record, rootEl) {
1851
1851
  pipe(findNestedChildOrCreate('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), writeLocalizedCharacterString(record.lineage, record.translations?.lineage, record.defaultLanguage))(rootEl);
1852
1852
  }
1853
1853
  function getServiceEndpointProtocol(endpoint) {
1854
- switch (endpoint.protocol.toLowerCase()) {
1854
+ switch (endpoint.accessServiceProtocol.toLowerCase()) {
1855
1855
  case 'wfs':
1856
1856
  return 'OGC:WFS';
1857
1857
  case 'wms':
@@ -1859,13 +1859,13 @@ function getServiceEndpointProtocol(endpoint) {
1859
1859
  case 'wps':
1860
1860
  return 'OGC:WPS';
1861
1861
  default:
1862
- return endpoint.protocol;
1862
+ return endpoint.accessServiceProtocol;
1863
1863
  }
1864
1864
  }
1865
1865
  function createOnlineResource(onlineResource) {
1866
1866
  let linkageUrl, functionCode, protocol;
1867
1867
  if (onlineResource.type === 'endpoint') {
1868
- linkageUrl = onlineResource.endpointUrl.toString();
1868
+ linkageUrl = onlineResource.url.toString();
1869
1869
  protocol = getServiceEndpointProtocol(onlineResource);
1870
1870
  functionCode = 'download';
1871
1871
  }
@@ -18602,6 +18602,7 @@ var records$6 = "Datensätze";
18602
18602
  var de = {
18603
18603
  "": "",
18604
18604
  "Add Layer As": "",
18605
+ "Enter to search": "",
18605
18606
  "button.login": "",
18606
18607
  "catalog.figures.datasets": "{count, plural, =0{Datensätze} one{Datensatz} other{Datensätze}}",
18607
18608
  "catalog.figures.organizations": "{count, plural, =0{Organisationen} one{Organisation} other{Organisationen}}",
@@ -18663,7 +18664,6 @@ var de = {
18663
18664
  "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
18664
18665
  "datahub.news.feed": "Nachrichtenfeed",
18665
18666
  "datahub.news.figures": "Indikatoren",
18666
- "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
18667
18667
  "datahub.search.back": "Zurück",
18668
18668
  "datahub.search.filter.all": "Alle",
18669
18669
  "datahub.search.filter.generatedByAPI": "Generiert durch eine API",
@@ -18673,6 +18673,7 @@ var de = {
18673
18673
  "dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
18674
18674
  "dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
18675
18675
  "dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
18676
+ "dataset.error.restrictedAccess": "",
18676
18677
  "dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
18677
18678
  "dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
18678
18679
  "domain.contact.role.author": "",
@@ -18833,6 +18834,7 @@ var de = {
18833
18834
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18834
18835
  "editor.record.loadError.closeMessage": "Verstanden",
18835
18836
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18837
+ "editor.record.lock.format": "",
18836
18838
  "editor.record.lock.reason": "",
18837
18839
  "editor.record.onlineResource.protocol.other": "",
18838
18840
  "editor.record.onlineResourceError.body": "",
@@ -18892,7 +18894,6 @@ var de = {
18892
18894
  "input.image.dropFileLabel": "",
18893
18895
  "input.image.selectFileLabel": "",
18894
18896
  "input.image.uploadErrorLabel": "",
18895
- "input.image.uploadErrorRetry": "",
18896
18897
  "input.image.uploadProgressCancel": "",
18897
18898
  "input.image.uploadProgressLabel": "",
18898
18899
  "language.ca": "Katalanisch",
@@ -18932,6 +18933,7 @@ var de = {
18932
18933
  "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
18933
18934
  "multiselect.filter.placeholder": "Suche",
18934
18935
  "nav.back": "Zurück",
18936
+ "navbar.mobile.menuTitle": "Schnellzugriff",
18935
18937
  next: next$6,
18936
18938
  "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
18937
18939
  "organisation.filter.placeholder": "Ergebnisse filtern",
@@ -18955,8 +18957,13 @@ var de = {
18955
18957
  "record.action.duplicating": "",
18956
18958
  "record.action.rollback": "",
18957
18959
  "record.action.view": "Anzeigen",
18960
+ "record.card.metadata.contact": "",
18958
18961
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
18959
18962
  "record.feature.limit": "Die Vorschau wurde aufgrund zu vieler Elemente deaktiviert",
18963
+ "record.kind.data": "",
18964
+ "record.kind.dataset": "",
18965
+ "record.kind.reuse": "",
18966
+ "record.kind.service": "",
18960
18967
  "record.metadata.about": "Beschreibung",
18961
18968
  "record.metadata.api": "API",
18962
18969
  "record.metadata.api.form.closeButton": "Schließen",
@@ -18990,6 +18997,7 @@ var de = {
18990
18997
  "record.metadata.api.form.zoneTitle": "",
18991
18998
  "record.metadata.api.form.zoneTooltip": "",
18992
18999
  "record.metadata.api.gpfdl": "",
19000
+ "record.metadata.capabilities": "",
18993
19001
  "record.metadata.catalog": "Katalog",
18994
19002
  "record.metadata.contact": "Kontakt",
18995
19003
  "record.metadata.creation": "Erstellungsdatum",
@@ -19026,13 +19034,12 @@ var de = {
19026
19034
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19027
19035
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19028
19036
  "record.metadata.related": "Ähnliche Datensätze",
19029
- "record.metadata.related.contents": "Verwandte Inhalte",
19037
+ "record.metadata.related.contents": "",
19030
19038
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19031
19039
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19032
19040
  "record.metadata.status": "Status",
19033
19041
  "record.metadata.status.notPublished": "",
19034
19042
  "record.metadata.status.published": "",
19035
- "record.metadata.technical": "Technische Informationen",
19036
19043
  "record.metadata.temporalExtent": "Zeitlicher Umfang",
19037
19044
  "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
19038
19045
  "record.metadata.temporalExtent.sinceDate": "Seit {start}",
@@ -19069,6 +19076,7 @@ var de = {
19069
19076
  "results.sortBy.popularity": "Beliebtheit",
19070
19077
  "results.sortBy.qualityScore": "Qualitätsbewertung",
19071
19078
  "results.sortBy.relevancy": "Relevanz",
19079
+ "reuse.metadata.access": "",
19072
19080
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
19073
19081
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
19074
19082
  "search.error.organizationHasNoDataset": "",
@@ -19118,6 +19126,26 @@ var de = {
19118
19126
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
19119
19127
  "search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden Datensätze im Bereich des Katalogs zuerst angezeigt. Datensätze außerhalb dieses Bereichs werden nicht angezeigt.",
19120
19128
  "search.filters.user": "Editor",
19129
+ "service.metadata.capabilities": "",
19130
+ "service.metadata.capabilities.abstract": "",
19131
+ "service.metadata.capabilities.attribution": "",
19132
+ "service.metadata.capabilities.availableCrs": "",
19133
+ "service.metadata.capabilities.defaultCrs": "",
19134
+ "service.metadata.capabilities.geometryName": "",
19135
+ "service.metadata.capabilities.geometryType": "",
19136
+ "service.metadata.capabilities.keywords": "",
19137
+ "service.metadata.capabilities.name": "",
19138
+ "service.metadata.capabilities.objectCount": "",
19139
+ "service.metadata.capabilities.otherCrs": "",
19140
+ "service.metadata.capabilities.outputFormats": "",
19141
+ "service.metadata.capabilities.resourceLinks": "",
19142
+ "service.metadata.capabilities.title": "",
19143
+ "service.metadata.filter": "",
19144
+ "service.metadata.filter.noLayers": "",
19145
+ "service.metadata.other": "",
19146
+ "service.metadata.question": "",
19147
+ "service.metadata.search": "",
19148
+ "service.metadata.spatialExtent": "",
19121
19149
  "share.tab.permalink": "Teilen",
19122
19150
  "share.tab.webComponent": "Integrieren",
19123
19151
  "table.loading.data": "Daten werden geladen...",
@@ -19150,6 +19178,7 @@ var records$5 = "datasets";
19150
19178
  var en = {
19151
19179
  "": "",
19152
19180
  "Add Layer As": "",
19181
+ "Enter to search": "",
19153
19182
  "button.login": "Log in",
19154
19183
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
19155
19184
  "catalog.figures.organizations": "{count, plural, =0{organizations} one{organization} other{organizations}}",
@@ -19211,7 +19240,6 @@ var en = {
19211
19240
  "datahub.news.contact.title": "A specific need?",
19212
19241
  "datahub.news.feed": "News feed",
19213
19242
  "datahub.news.figures": "Indicators",
19214
- "datahub.record.addToFavorites": "Add to favorites",
19215
19243
  "datahub.search.back": "Back",
19216
19244
  "datahub.search.filter.all": "All",
19217
19245
  "datahub.search.filter.generatedByAPI": "Generated by an API",
@@ -19221,6 +19249,7 @@ var en = {
19221
19249
  "dataset.error.http": "The data could not be loaded because of an HTTP error: \"{ info }\"",
19222
19250
  "dataset.error.network": "The data could not be loaded because of a network error or CORS limitations: \"{ info }\"",
19223
19251
  "dataset.error.parse": "The data was loaded but could not be parsed: \"{ info }\"",
19252
+ "dataset.error.restrictedAccess": "Access to this resource is restricted",
19224
19253
  "dataset.error.unknown": "The data cannot be displayed: \"{ info }\"",
19225
19254
  "dataset.error.unsupportedType": "The following content type is unsupported: \"{ info }\"",
19226
19255
  "domain.contact.role.author": "Author",
@@ -19381,6 +19410,7 @@ var en = {
19381
19410
  "editor.record.loadError.body": "The dataset could not be loaded:",
19382
19411
  "editor.record.loadError.closeMessage": "Understood",
19383
19412
  "editor.record.loadError.title": "Error loading dataset",
19413
+ "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
19384
19414
  "editor.record.lock.reason": "You are not an editor of the allowed groups",
19385
19415
  "editor.record.onlineResource.protocol.other": "Other",
19386
19416
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
@@ -19440,7 +19470,6 @@ var en = {
19440
19470
  "input.image.dropFileLabel": "or drop it here",
19441
19471
  "input.image.selectFileLabel": "Select an image",
19442
19472
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19443
- "input.image.uploadErrorRetry": "Retry",
19444
19473
  "input.image.uploadProgressCancel": "Cancel",
19445
19474
  "input.image.uploadProgressLabel": "Upload in progress...",
19446
19475
  "language.ca": "Catalan",
@@ -19480,6 +19509,7 @@ var en = {
19480
19509
  "map.wms.urlInput.hint": "Enter WMS service URL",
19481
19510
  "multiselect.filter.placeholder": "Search",
19482
19511
  "nav.back": "Back",
19512
+ "navbar.mobile.menuTitle": "Quick access",
19483
19513
  next: next$5,
19484
19514
  "ogc.unreachable.unknown": "The service could not be reached",
19485
19515
  "organisation.filter.placeholder": "Filter results",
@@ -19503,8 +19533,13 @@ var en = {
19503
19533
  "record.action.duplicating": "Duplicating...",
19504
19534
  "record.action.rollback": "Rollback",
19505
19535
  "record.action.view": "View",
19536
+ "record.card.metadata.contact": "Metadata Contact",
19506
19537
  "record.externalViewer.open": "Open in the external map viewer",
19507
19538
  "record.feature.limit": "Preview disabled due to too many elements",
19539
+ "record.kind.data": "Data",
19540
+ "record.kind.dataset": "Dataset",
19541
+ "record.kind.reuse": "Reuse",
19542
+ "record.kind.service": "Service",
19508
19543
  "record.metadata.about": "Description",
19509
19544
  "record.metadata.api": "API",
19510
19545
  "record.metadata.api.form.closeButton": "Close",
@@ -19538,6 +19573,7 @@ var en = {
19538
19573
  "record.metadata.api.form.zoneTitle": "Zone",
19539
19574
  "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
19540
19575
  "record.metadata.api.gpfdl": "Data download",
19576
+ "record.metadata.capabilities": "Service capabilities",
19541
19577
  "record.metadata.catalog": "Catalog",
19542
19578
  "record.metadata.contact": "Contact",
19543
19579
  "record.metadata.creation": "Date of creation",
@@ -19574,13 +19610,12 @@ var en = {
19574
19610
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19575
19611
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19576
19612
  "record.metadata.related": "Related datasets",
19577
- "record.metadata.related.contents": "Related contents",
19613
+ "record.metadata.related.contents": "Related content",
19578
19614
  "record.metadata.ressources.and.links": "Resources and links",
19579
19615
  "record.metadata.sheet": "Original metadata",
19580
19616
  "record.metadata.status": "Status",
19581
19617
  "record.metadata.status.notPublished": "Not published",
19582
19618
  "record.metadata.status.published": "Published",
19583
- "record.metadata.technical": "Technical information",
19584
19619
  "record.metadata.temporalExtent": "Temporal extent",
19585
19620
  "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
19586
19621
  "record.metadata.temporalExtent.sinceDate": "Since { start }",
@@ -19617,6 +19652,7 @@ var en = {
19617
19652
  "results.sortBy.popularity": "Popularity",
19618
19653
  "results.sortBy.qualityScore": "Quality score",
19619
19654
  "results.sortBy.relevancy": "Relevancy",
19655
+ "reuse.metadata.access": "Access the reuse",
19620
19656
  "search.autocomplete.error": "Suggestions could not be fetched:",
19621
19657
  "search.error.couldNotReachApi": "The API could not be reached",
19622
19658
  "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
@@ -19666,6 +19702,26 @@ var en = {
19666
19702
  "search.filters.useSpatialFilter": "Show datasets in the area of interest first",
19667
19703
  "search.filters.useSpatialFilterHelp": "When this is enabled, datasets situated in the catalog's area of interest are shown first; records outside of this area will not show up.",
19668
19704
  "search.filters.user": "Editor",
19705
+ "service.metadata.capabilities": "Technical information",
19706
+ "service.metadata.capabilities.abstract": "Abstract",
19707
+ "service.metadata.capabilities.attribution": "Attribution",
19708
+ "service.metadata.capabilities.availableCrs": "Available CRS",
19709
+ "service.metadata.capabilities.defaultCrs": "Default CRS",
19710
+ "service.metadata.capabilities.geometryName": "Geometry name",
19711
+ "service.metadata.capabilities.geometryType": "Geometry type",
19712
+ "service.metadata.capabilities.keywords": "Keywords",
19713
+ "service.metadata.capabilities.name": "Name",
19714
+ "service.metadata.capabilities.objectCount": "Object count",
19715
+ "service.metadata.capabilities.otherCrs": "Other CRS",
19716
+ "service.metadata.capabilities.outputFormats": "Output formats",
19717
+ "service.metadata.capabilities.resourceLinks": "Resource links",
19718
+ "service.metadata.capabilities.title": "Title",
19719
+ "service.metadata.filter": "Layers will be filtered by title and abstract",
19720
+ "service.metadata.filter.noLayers": "No layer matches your search",
19721
+ "service.metadata.other": "Other information",
19722
+ "service.metadata.question": "Ask a question",
19723
+ "service.metadata.search": "Search through the layer list",
19724
+ "service.metadata.spatialExtent": "Spatial extent",
19669
19725
  "share.tab.permalink": "Share",
19670
19726
  "share.tab.webComponent": "Integrate",
19671
19727
  "table.loading.data": "Loading data...",
@@ -19698,6 +19754,7 @@ var records$4 = "";
19698
19754
  var es = {
19699
19755
  "": "",
19700
19756
  "Add Layer As": "",
19757
+ "Enter to search": "",
19701
19758
  "button.login": "",
19702
19759
  "catalog.figures.datasets": "conjuntos de datos",
19703
19760
  "catalog.figures.organizations": "organizaciones",
@@ -19759,7 +19816,6 @@ var es = {
19759
19816
  "datahub.news.contact.title": "",
19760
19817
  "datahub.news.feed": "",
19761
19818
  "datahub.news.figures": "",
19762
- "datahub.record.addToFavorites": "",
19763
19819
  "datahub.search.back": "",
19764
19820
  "datahub.search.filter.all": "",
19765
19821
  "datahub.search.filter.generatedByAPI": "",
@@ -19769,6 +19825,7 @@ var es = {
19769
19825
  "dataset.error.http": "",
19770
19826
  "dataset.error.network": "",
19771
19827
  "dataset.error.parse": "",
19828
+ "dataset.error.restrictedAccess": "",
19772
19829
  "dataset.error.unknown": "",
19773
19830
  "dataset.error.unsupportedType": "",
19774
19831
  "domain.contact.role.author": "",
@@ -19929,6 +19986,7 @@ var es = {
19929
19986
  "editor.record.loadError.body": "",
19930
19987
  "editor.record.loadError.closeMessage": "",
19931
19988
  "editor.record.loadError.title": "",
19989
+ "editor.record.lock.format": "",
19932
19990
  "editor.record.lock.reason": "",
19933
19991
  "editor.record.onlineResource.protocol.other": "",
19934
19992
  "editor.record.onlineResourceError.body": "",
@@ -19988,7 +20046,6 @@ var es = {
19988
20046
  "input.image.dropFileLabel": "",
19989
20047
  "input.image.selectFileLabel": "",
19990
20048
  "input.image.uploadErrorLabel": "",
19991
- "input.image.uploadErrorRetry": "",
19992
20049
  "input.image.uploadProgressCancel": "",
19993
20050
  "input.image.uploadProgressLabel": "",
19994
20051
  "language.ca": "Catalán",
@@ -20028,6 +20085,7 @@ var es = {
20028
20085
  "map.wms.urlInput.hint": "",
20029
20086
  "multiselect.filter.placeholder": "",
20030
20087
  "nav.back": "",
20088
+ "navbar.mobile.menuTitle": "Acceso rápido",
20031
20089
  next: next$4,
20032
20090
  "ogc.unreachable.unknown": "",
20033
20091
  "organisation.filter.placeholder": "",
@@ -20051,8 +20109,13 @@ var es = {
20051
20109
  "record.action.duplicating": "",
20052
20110
  "record.action.rollback": "",
20053
20111
  "record.action.view": "",
20112
+ "record.card.metadata.contact": "",
20054
20113
  "record.externalViewer.open": "",
20055
20114
  "record.feature.limit": "",
20115
+ "record.kind.data": "",
20116
+ "record.kind.dataset": "",
20117
+ "record.kind.reuse": "",
20118
+ "record.kind.service": "",
20056
20119
  "record.metadata.about": "",
20057
20120
  "record.metadata.api": "",
20058
20121
  "record.metadata.api.form.closeButton": "",
@@ -20086,6 +20149,7 @@ var es = {
20086
20149
  "record.metadata.api.form.zoneTitle": "",
20087
20150
  "record.metadata.api.form.zoneTooltip": "",
20088
20151
  "record.metadata.api.gpfdl": "",
20152
+ "record.metadata.capabilities": "",
20089
20153
  "record.metadata.catalog": "",
20090
20154
  "record.metadata.contact": "",
20091
20155
  "record.metadata.creation": "",
@@ -20122,13 +20186,12 @@ var es = {
20122
20186
  "record.metadata.quality.updateFrequency.failed": "",
20123
20187
  "record.metadata.quality.updateFrequency.success": "",
20124
20188
  "record.metadata.related": "",
20125
- "record.metadata.related.contents": "Contenidos relacionados",
20189
+ "record.metadata.related.contents": "",
20126
20190
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20127
20191
  "record.metadata.sheet": "",
20128
20192
  "record.metadata.status": "",
20129
20193
  "record.metadata.status.notPublished": "",
20130
20194
  "record.metadata.status.published": "",
20131
- "record.metadata.technical": "",
20132
20195
  "record.metadata.temporalExtent": "",
20133
20196
  "record.metadata.temporalExtent.fromDateToDate": "",
20134
20197
  "record.metadata.temporalExtent.sinceDate": "",
@@ -20165,6 +20228,7 @@ var es = {
20165
20228
  "results.sortBy.popularity": "",
20166
20229
  "results.sortBy.qualityScore": "",
20167
20230
  "results.sortBy.relevancy": "",
20231
+ "reuse.metadata.access": "",
20168
20232
  "search.autocomplete.error": "",
20169
20233
  "search.error.couldNotReachApi": "",
20170
20234
  "search.error.organizationHasNoDataset": "",
@@ -20214,6 +20278,26 @@ var es = {
20214
20278
  "search.filters.useSpatialFilter": "",
20215
20279
  "search.filters.useSpatialFilterHelp": "",
20216
20280
  "search.filters.user": "",
20281
+ "service.metadata.capabilities": "",
20282
+ "service.metadata.capabilities.abstract": "",
20283
+ "service.metadata.capabilities.attribution": "",
20284
+ "service.metadata.capabilities.availableCrs": "",
20285
+ "service.metadata.capabilities.defaultCrs": "",
20286
+ "service.metadata.capabilities.geometryName": "",
20287
+ "service.metadata.capabilities.geometryType": "",
20288
+ "service.metadata.capabilities.keywords": "",
20289
+ "service.metadata.capabilities.name": "",
20290
+ "service.metadata.capabilities.objectCount": "",
20291
+ "service.metadata.capabilities.otherCrs": "",
20292
+ "service.metadata.capabilities.outputFormats": "",
20293
+ "service.metadata.capabilities.resourceLinks": "",
20294
+ "service.metadata.capabilities.title": "",
20295
+ "service.metadata.filter": "",
20296
+ "service.metadata.filter.noLayers": "",
20297
+ "service.metadata.other": "",
20298
+ "service.metadata.question": "",
20299
+ "service.metadata.search": "",
20300
+ "service.metadata.spatialExtent": "",
20217
20301
  "share.tab.permalink": "",
20218
20302
  "share.tab.webComponent": "",
20219
20303
  "table.loading.data": "",
@@ -20246,6 +20330,7 @@ var records$3 = "Enregistrements";
20246
20330
  var fr = {
20247
20331
  "": "",
20248
20332
  "Add Layer As": "",
20333
+ "Enter to search": "",
20249
20334
  "button.login": "Se connecter",
20250
20335
  "catalog.figures.datasets": "{count, plural, =0{données} one{donnée} other{données}}",
20251
20336
  "catalog.figures.organizations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
@@ -20307,7 +20392,6 @@ var fr = {
20307
20392
  "datahub.news.contact.title": "Un besoin spécifique ?",
20308
20393
  "datahub.news.feed": "Fil d'activité",
20309
20394
  "datahub.news.figures": "Quelques chiffres",
20310
- "datahub.record.addToFavorites": "Ajouter aux favoris",
20311
20395
  "datahub.search.back": "Retour",
20312
20396
  "datahub.search.filter.all": "Tous",
20313
20397
  "datahub.search.filter.generatedByAPI": "généré par une API",
@@ -20317,6 +20401,7 @@ var fr = {
20317
20401
  "dataset.error.http": "Le chargement des données a échoué en raison d'une erreur HTTP: \"{ info }\"",
20318
20402
  "dataset.error.network": "Le chargement des données a échoué en raison d'une erreur réseau ou de limitations CORS: \"{ info }\"",
20319
20403
  "dataset.error.parse": "Les données ont été chargées mais leur décodage a échoué: \"{ info }\"",
20404
+ "dataset.error.restrictedAccess": "L’accès à cette ressource est restreint",
20320
20405
  "dataset.error.unknown": "Les données ne peuvent être affichées: \"{ info }\"",
20321
20406
  "dataset.error.unsupportedType": "Le type de contenu suivant n'est pas pris en charge: \"{ info }\"",
20322
20407
  "domain.contact.role.author": "Auteur",
@@ -20477,6 +20562,7 @@ var fr = {
20477
20562
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20478
20563
  "editor.record.loadError.closeMessage": "Compris",
20479
20564
  "editor.record.loadError.title": "Erreur lors du chargement",
20565
+ "editor.record.lock.format": "Les jeux de données de type 'service' et 'reuse' ne sont pas éditables",
20480
20566
  "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
20481
20567
  "editor.record.onlineResource.protocol.other": "Autre",
20482
20568
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
@@ -20536,7 +20622,6 @@ var fr = {
20536
20622
  "input.image.dropFileLabel": "ou glissez-la ici",
20537
20623
  "input.image.selectFileLabel": "Sélectionnez une image",
20538
20624
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20539
- "input.image.uploadErrorRetry": "Réessayer",
20540
20625
  "input.image.uploadProgressCancel": "Annuler",
20541
20626
  "input.image.uploadProgressLabel": "Chargement en cours...",
20542
20627
  "language.ca": "Catalan",
@@ -20576,6 +20661,7 @@ var fr = {
20576
20661
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20577
20662
  "multiselect.filter.placeholder": "Rechercher",
20578
20663
  "nav.back": "Retour",
20664
+ "navbar.mobile.menuTitle": "Navigation rapide",
20579
20665
  next: next$3,
20580
20666
  "ogc.unreachable.unknown": "Le service n'est pas accessible",
20581
20667
  "organisation.filter.placeholder": "Filtrer les résultats",
@@ -20599,9 +20685,14 @@ var fr = {
20599
20685
  "record.action.duplicating": "Duplication...",
20600
20686
  "record.action.rollback": "Restaurer",
20601
20687
  "record.action.view": "Voir",
20688
+ "record.card.metadata.contact": "Contact de la métadonnée ",
20602
20689
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
20603
20690
  "record.feature.limit": "L’aperçu a été désactivé en raison d’un trop grand nombre d'éléments",
20604
- "record.metadata.about": "Description",
20691
+ "record.kind.data": "Donnée",
20692
+ "record.kind.dataset": "Donnée",
20693
+ "record.kind.reuse": "Réutilisation",
20694
+ "record.kind.service": "Service",
20695
+ "record.metadata.about": "A propos",
20605
20696
  "record.metadata.api": "API",
20606
20697
  "record.metadata.api.form.closeButton": "Fermer",
20607
20698
  "record.metadata.api.form.closeForm": "Fermer le panneau de personnalisation",
@@ -20634,6 +20725,7 @@ var fr = {
20634
20725
  "record.metadata.api.form.zoneTitle": "Zone",
20635
20726
  "record.metadata.api.form.zoneTooltip": "Menu déroulant pour sélectionner une zone géographique",
20636
20727
  "record.metadata.api.gpfdl": "Téléchargement",
20728
+ "record.metadata.capabilities": "Capacités du service",
20637
20729
  "record.metadata.catalog": "Catalogue",
20638
20730
  "record.metadata.contact": "Contact",
20639
20731
  "record.metadata.creation": "Date de création",
@@ -20643,7 +20735,7 @@ var fr = {
20643
20735
  "record.metadata.keywords": "Mots-clés",
20644
20736
  "record.metadata.languages": "Langues",
20645
20737
  "record.metadata.lastUpdate": "Mis à jour le {date}",
20646
- "record.metadata.links": "Liens",
20738
+ "record.metadata.links": "Ressources & liens",
20647
20739
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20648
20740
  "record.metadata.otherConstraints": "Limitations d'usage",
20649
20741
  "record.metadata.owner": "Catalogue d'origine",
@@ -20670,13 +20762,12 @@ var fr = {
20670
20762
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20671
20763
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20672
20764
  "record.metadata.related": "Voir aussi",
20673
- "record.metadata.related.contents": "Contenus associés",
20765
+ "record.metadata.related.contents": "Contenu associé",
20674
20766
  "record.metadata.ressources.and.links": "Ressources et liens",
20675
20767
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20676
20768
  "record.metadata.status": "Statut",
20677
20769
  "record.metadata.status.notPublished": "Non publié",
20678
20770
  "record.metadata.status.published": "Publié",
20679
- "record.metadata.technical": "Informations techniques",
20680
20771
  "record.metadata.temporalExtent": "Étendue temporelle",
20681
20772
  "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
20682
20773
  "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
@@ -20713,6 +20804,7 @@ var fr = {
20713
20804
  "results.sortBy.popularity": "Popularité",
20714
20805
  "results.sortBy.qualityScore": "Indicateur de qualité",
20715
20806
  "results.sortBy.relevancy": "Pertinence",
20807
+ "reuse.metadata.access": "Accéder à la réutilisation",
20716
20808
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
20717
20809
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
20718
20810
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
@@ -20762,6 +20854,26 @@ var fr = {
20762
20854
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
20763
20855
  "search.filters.useSpatialFilterHelp": "Si cette option est activée, les jeux de données portant sur la zone d'intérêt du catalogue seront montrés en premier; les jeux de données situés en dehors de cette zone n'apparaîtront pas dans les résultats.",
20764
20856
  "search.filters.user": "Éditeur",
20857
+ "service.metadata.capabilities": "Informations techniques",
20858
+ "service.metadata.capabilities.abstract": "Description",
20859
+ "service.metadata.capabilities.attribution": "Attribution",
20860
+ "service.metadata.capabilities.availableCrs": "CRS disponibles",
20861
+ "service.metadata.capabilities.defaultCrs": "CRS par défaut",
20862
+ "service.metadata.capabilities.geometryName": "Nom de la géométrie",
20863
+ "service.metadata.capabilities.geometryType": "Type de géométrie",
20864
+ "service.metadata.capabilities.keywords": "Mots-clés",
20865
+ "service.metadata.capabilities.name": "Nom",
20866
+ "service.metadata.capabilities.objectCount": "Nombre d'objets",
20867
+ "service.metadata.capabilities.otherCrs": "Autres CRS",
20868
+ "service.metadata.capabilities.outputFormats": "Formats de sortie",
20869
+ "service.metadata.capabilities.resourceLinks": "Liens vers les ressources",
20870
+ "service.metadata.capabilities.title": "Titre",
20871
+ "service.metadata.filter": "Les couches seront filtrées par titre et description",
20872
+ "service.metadata.filter.noLayers": "Aucune couche ne correspond à votre recherche",
20873
+ "service.metadata.other": "Autres informations",
20874
+ "service.metadata.question": "Poser une question",
20875
+ "service.metadata.search": "Rechercher dans la liste des couches",
20876
+ "service.metadata.spatialExtent": "Etendue spatiale",
20765
20877
  "share.tab.permalink": "Partager",
20766
20878
  "share.tab.webComponent": "Intégrer",
20767
20879
  "table.loading.data": "Chargement des données...",
@@ -20794,6 +20906,7 @@ var records$2 = "record";
20794
20906
  var it = {
20795
20907
  "": "",
20796
20908
  "Add Layer As": "",
20909
+ "Enter to search": "",
20797
20910
  "button.login": "Login",
20798
20911
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
20799
20912
  "catalog.figures.organizations": "{count, plural, =0{organizzazioni} one{organizzazione} other{organizzazioni}}",
@@ -20855,7 +20968,6 @@ var it = {
20855
20968
  "datahub.news.contact.title": "Ha un bisogno specifico?",
20856
20969
  "datahub.news.feed": "Feed di attività",
20857
20970
  "datahub.news.figures": "Alcune figure",
20858
- "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
20859
20971
  "datahub.search.back": "Ritorna",
20860
20972
  "datahub.search.filter.all": "Tutti",
20861
20973
  "datahub.search.filter.generatedByAPI": "generato da un'API",
@@ -20865,6 +20977,7 @@ var it = {
20865
20977
  "dataset.error.http": "Il caricamento dei dati non è riuscito a causa di un errore HTTP: \"{info}\"",
20866
20978
  "dataset.error.network": "Il caricamento dei dati non è riuscito a causa di un errore di rete o di limitazioni CORS: \"{info}\"",
20867
20979
  "dataset.error.parse": "I dati sono stati caricati ma la decodifica non è riuscita: \"{info}\"",
20980
+ "dataset.error.restrictedAccess": "",
20868
20981
  "dataset.error.unknown": "Impossibile visualizzare i dati: \"{info}\"",
20869
20982
  "dataset.error.unsupportedType": "Il seguente tipo di contenuto non è supportato: \"{info}\"",
20870
20983
  "domain.contact.role.author": "Autore",
@@ -21025,6 +21138,7 @@ var it = {
21025
21138
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21026
21139
  "editor.record.loadError.closeMessage": "Capito",
21027
21140
  "editor.record.loadError.title": "Errore durante il caricamento",
21141
+ "editor.record.lock.format": "",
21028
21142
  "editor.record.lock.reason": "Non è un editore di uno dei gruppi autorizzati",
21029
21143
  "editor.record.onlineResource.protocol.other": "Altro",
21030
21144
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
@@ -21084,7 +21198,6 @@ var it = {
21084
21198
  "input.image.dropFileLabel": "oppure trascinalo qui",
21085
21199
  "input.image.selectFileLabel": "Seleziona un'immagine",
21086
21200
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21087
- "input.image.uploadErrorRetry": "Riprova",
21088
21201
  "input.image.uploadProgressCancel": "Annulla",
21089
21202
  "input.image.uploadProgressLabel": "Caricamento...",
21090
21203
  "language.ca": "Catalano",
@@ -21124,6 +21237,7 @@ var it = {
21124
21237
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21125
21238
  "multiselect.filter.placeholder": "Cerca",
21126
21239
  "nav.back": "Indietro",
21240
+ "navbar.mobile.menuTitle": "",
21127
21241
  next: next$2,
21128
21242
  "ogc.unreachable.unknown": "Il servizio non è accessibile",
21129
21243
  "organisation.filter.placeholder": "Filtra i risultati",
@@ -21147,8 +21261,13 @@ var it = {
21147
21261
  "record.action.duplicating": "Duplicazione",
21148
21262
  "record.action.rollback": "Annulla",
21149
21263
  "record.action.view": "Visualizza",
21264
+ "record.card.metadata.contact": "",
21150
21265
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
21151
21266
  "record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
21267
+ "record.kind.data": "",
21268
+ "record.kind.dataset": "",
21269
+ "record.kind.reuse": "",
21270
+ "record.kind.service": "",
21152
21271
  "record.metadata.about": "Descrizione",
21153
21272
  "record.metadata.api": "API",
21154
21273
  "record.metadata.api.form.closeButton": "Chiude",
@@ -21182,6 +21301,7 @@ var it = {
21182
21301
  "record.metadata.api.form.zoneTitle": "Zona",
21183
21302
  "record.metadata.api.form.zoneTooltip": "Menu a discesa per selezionare una zona geografica",
21184
21303
  "record.metadata.api.gpfdl": "Scarica",
21304
+ "record.metadata.capabilities": "",
21185
21305
  "record.metadata.catalog": "Catalogo",
21186
21306
  "record.metadata.contact": "Contatto",
21187
21307
  "record.metadata.creation": "Data di creazione",
@@ -21218,13 +21338,12 @@ var it = {
21218
21338
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21219
21339
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21220
21340
  "record.metadata.related": "Vedi anche",
21221
- "record.metadata.related.contents": "Contenuti correlati",
21341
+ "record.metadata.related.contents": "",
21222
21342
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21223
21343
  "record.metadata.sheet": "Origine del metadata",
21224
21344
  "record.metadata.status": "Stato",
21225
21345
  "record.metadata.status.notPublished": "Non pubblicato",
21226
21346
  "record.metadata.status.published": "Pubblicato",
21227
- "record.metadata.technical": "Informazioni tecniche",
21228
21347
  "record.metadata.temporalExtent": "Periodo di tempo",
21229
21348
  "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
21230
21349
  "record.metadata.temporalExtent.sinceDate": "Dal {start}",
@@ -21261,6 +21380,7 @@ var it = {
21261
21380
  "results.sortBy.popularity": "Popolarità",
21262
21381
  "results.sortBy.qualityScore": "Indicatore di qualità",
21263
21382
  "results.sortBy.relevancy": "Rilevanza",
21383
+ "reuse.metadata.access": "",
21264
21384
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
21265
21385
  "search.error.couldNotReachApi": "Problema di connessione all'API",
21266
21386
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora dati.",
@@ -21310,6 +21430,26 @@ var it = {
21310
21430
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
21311
21431
  "search.filters.useSpatialFilterHelp": "Se attivata, le schede relative all'area di interesse del catalogo saranno mostrate per prime; le schede al di fuori di questa area non appariranno nei risultati.",
21312
21432
  "search.filters.user": "Editore",
21433
+ "service.metadata.capabilities": "Informazioni tecniche",
21434
+ "service.metadata.capabilities.abstract": "",
21435
+ "service.metadata.capabilities.attribution": "",
21436
+ "service.metadata.capabilities.availableCrs": "",
21437
+ "service.metadata.capabilities.defaultCrs": "",
21438
+ "service.metadata.capabilities.geometryName": "",
21439
+ "service.metadata.capabilities.geometryType": "",
21440
+ "service.metadata.capabilities.keywords": "",
21441
+ "service.metadata.capabilities.name": "",
21442
+ "service.metadata.capabilities.objectCount": "",
21443
+ "service.metadata.capabilities.otherCrs": "",
21444
+ "service.metadata.capabilities.outputFormats": "",
21445
+ "service.metadata.capabilities.resourceLinks": "",
21446
+ "service.metadata.capabilities.title": "",
21447
+ "service.metadata.filter": "",
21448
+ "service.metadata.filter.noLayers": "",
21449
+ "service.metadata.other": "",
21450
+ "service.metadata.question": "",
21451
+ "service.metadata.search": "",
21452
+ "service.metadata.spatialExtent": "",
21313
21453
  "share.tab.permalink": "Condividere",
21314
21454
  "share.tab.webComponent": "Incorporare",
21315
21455
  "table.loading.data": "Caricamento dei dati...",
@@ -21342,6 +21482,7 @@ var records$1 = "";
21342
21482
  var nl = {
21343
21483
  "": "",
21344
21484
  "Add Layer As": "",
21485
+ "Enter to search": "",
21345
21486
  "button.login": "",
21346
21487
  "catalog.figures.datasets": "datasets",
21347
21488
  "catalog.figures.organizations": "organisaties",
@@ -21403,7 +21544,6 @@ var nl = {
21403
21544
  "datahub.news.contact.title": "",
21404
21545
  "datahub.news.feed": "",
21405
21546
  "datahub.news.figures": "",
21406
- "datahub.record.addToFavorites": "",
21407
21547
  "datahub.search.back": "",
21408
21548
  "datahub.search.filter.all": "",
21409
21549
  "datahub.search.filter.generatedByAPI": "",
@@ -21413,6 +21553,7 @@ var nl = {
21413
21553
  "dataset.error.http": "",
21414
21554
  "dataset.error.network": "",
21415
21555
  "dataset.error.parse": "",
21556
+ "dataset.error.restrictedAccess": "",
21416
21557
  "dataset.error.unknown": "",
21417
21558
  "dataset.error.unsupportedType": "",
21418
21559
  "domain.contact.role.author": "",
@@ -21573,6 +21714,7 @@ var nl = {
21573
21714
  "editor.record.loadError.body": "",
21574
21715
  "editor.record.loadError.closeMessage": "",
21575
21716
  "editor.record.loadError.title": "",
21717
+ "editor.record.lock.format": "",
21576
21718
  "editor.record.lock.reason": "",
21577
21719
  "editor.record.onlineResource.protocol.other": "",
21578
21720
  "editor.record.onlineResourceError.body": "",
@@ -21632,7 +21774,6 @@ var nl = {
21632
21774
  "input.image.dropFileLabel": "",
21633
21775
  "input.image.selectFileLabel": "",
21634
21776
  "input.image.uploadErrorLabel": "",
21635
- "input.image.uploadErrorRetry": "",
21636
21777
  "input.image.uploadProgressCancel": "",
21637
21778
  "input.image.uploadProgressLabel": "",
21638
21779
  "language.ca": "Catalaans",
@@ -21672,6 +21813,7 @@ var nl = {
21672
21813
  "map.wms.urlInput.hint": "",
21673
21814
  "multiselect.filter.placeholder": "",
21674
21815
  "nav.back": "",
21816
+ "navbar.mobile.menuTitle": "",
21675
21817
  next: next$1,
21676
21818
  "ogc.unreachable.unknown": "",
21677
21819
  "organisation.filter.placeholder": "",
@@ -21695,8 +21837,13 @@ var nl = {
21695
21837
  "record.action.duplicating": "",
21696
21838
  "record.action.rollback": "",
21697
21839
  "record.action.view": "",
21840
+ "record.card.metadata.contact": "",
21698
21841
  "record.externalViewer.open": "",
21699
21842
  "record.feature.limit": "",
21843
+ "record.kind.data": "",
21844
+ "record.kind.dataset": "",
21845
+ "record.kind.reuse": "",
21846
+ "record.kind.service": "",
21700
21847
  "record.metadata.about": "",
21701
21848
  "record.metadata.api": "",
21702
21849
  "record.metadata.api.form.closeButton": "",
@@ -21730,6 +21877,7 @@ var nl = {
21730
21877
  "record.metadata.api.form.zoneTitle": "",
21731
21878
  "record.metadata.api.form.zoneTooltip": "",
21732
21879
  "record.metadata.api.gpfdl": "",
21880
+ "record.metadata.capabilities": "",
21733
21881
  "record.metadata.catalog": "",
21734
21882
  "record.metadata.contact": "",
21735
21883
  "record.metadata.creation": "",
@@ -21766,13 +21914,12 @@ var nl = {
21766
21914
  "record.metadata.quality.updateFrequency.failed": "",
21767
21915
  "record.metadata.quality.updateFrequency.success": "",
21768
21916
  "record.metadata.related": "",
21769
- "record.metadata.related.contents": "Gerelateerde inhoud",
21917
+ "record.metadata.related.contents": "",
21770
21918
  "record.metadata.ressources.and.links": "Bronnen en links",
21771
21919
  "record.metadata.sheet": "",
21772
21920
  "record.metadata.status": "",
21773
21921
  "record.metadata.status.notPublished": "",
21774
21922
  "record.metadata.status.published": "",
21775
- "record.metadata.technical": "",
21776
21923
  "record.metadata.temporalExtent": "",
21777
21924
  "record.metadata.temporalExtent.fromDateToDate": "",
21778
21925
  "record.metadata.temporalExtent.sinceDate": "",
@@ -21809,6 +21956,7 @@ var nl = {
21809
21956
  "results.sortBy.popularity": "",
21810
21957
  "results.sortBy.qualityScore": "",
21811
21958
  "results.sortBy.relevancy": "",
21959
+ "reuse.metadata.access": "",
21812
21960
  "search.autocomplete.error": "",
21813
21961
  "search.error.couldNotReachApi": "",
21814
21962
  "search.error.organizationHasNoDataset": "",
@@ -21858,6 +22006,26 @@ var nl = {
21858
22006
  "search.filters.useSpatialFilter": "",
21859
22007
  "search.filters.useSpatialFilterHelp": "",
21860
22008
  "search.filters.user": "",
22009
+ "service.metadata.capabilities": "",
22010
+ "service.metadata.capabilities.abstract": "",
22011
+ "service.metadata.capabilities.attribution": "",
22012
+ "service.metadata.capabilities.availableCrs": "",
22013
+ "service.metadata.capabilities.defaultCrs": "",
22014
+ "service.metadata.capabilities.geometryName": "",
22015
+ "service.metadata.capabilities.geometryType": "",
22016
+ "service.metadata.capabilities.keywords": "",
22017
+ "service.metadata.capabilities.name": "",
22018
+ "service.metadata.capabilities.objectCount": "",
22019
+ "service.metadata.capabilities.otherCrs": "",
22020
+ "service.metadata.capabilities.outputFormats": "",
22021
+ "service.metadata.capabilities.resourceLinks": "",
22022
+ "service.metadata.capabilities.title": "",
22023
+ "service.metadata.filter": "",
22024
+ "service.metadata.filter.noLayers": "",
22025
+ "service.metadata.other": "",
22026
+ "service.metadata.question": "",
22027
+ "service.metadata.search": "",
22028
+ "service.metadata.spatialExtent": "",
21861
22029
  "share.tab.permalink": "",
21862
22030
  "share.tab.webComponent": "",
21863
22031
  "table.loading.data": "",
@@ -21890,6 +22058,7 @@ var records = "";
21890
22058
  var pt = {
21891
22059
  "": "",
21892
22060
  "Add Layer As": "",
22061
+ "Enter to search": "",
21893
22062
  "button.login": "",
21894
22063
  "catalog.figures.datasets": "conjuntos de dados",
21895
22064
  "catalog.figures.organizations": "organizações",
@@ -21951,7 +22120,6 @@ var pt = {
21951
22120
  "datahub.news.contact.title": "",
21952
22121
  "datahub.news.feed": "",
21953
22122
  "datahub.news.figures": "",
21954
- "datahub.record.addToFavorites": "",
21955
22123
  "datahub.search.back": "",
21956
22124
  "datahub.search.filter.all": "",
21957
22125
  "datahub.search.filter.generatedByAPI": "",
@@ -21961,6 +22129,7 @@ var pt = {
21961
22129
  "dataset.error.http": "",
21962
22130
  "dataset.error.network": "",
21963
22131
  "dataset.error.parse": "",
22132
+ "dataset.error.restrictedAccess": "",
21964
22133
  "dataset.error.unknown": "",
21965
22134
  "dataset.error.unsupportedType": "",
21966
22135
  "domain.contact.role.author": "",
@@ -22121,6 +22290,7 @@ var pt = {
22121
22290
  "editor.record.loadError.body": "",
22122
22291
  "editor.record.loadError.closeMessage": "",
22123
22292
  "editor.record.loadError.title": "",
22293
+ "editor.record.lock.format": "",
22124
22294
  "editor.record.lock.reason": "",
22125
22295
  "editor.record.onlineResource.protocol.other": "",
22126
22296
  "editor.record.onlineResourceError.body": "",
@@ -22180,7 +22350,6 @@ var pt = {
22180
22350
  "input.image.dropFileLabel": "",
22181
22351
  "input.image.selectFileLabel": "",
22182
22352
  "input.image.uploadErrorLabel": "",
22183
- "input.image.uploadErrorRetry": "",
22184
22353
  "input.image.uploadProgressCancel": "",
22185
22354
  "input.image.uploadProgressLabel": "",
22186
22355
  "language.ca": "Catalão",
@@ -22220,6 +22389,7 @@ var pt = {
22220
22389
  "map.wms.urlInput.hint": "",
22221
22390
  "multiselect.filter.placeholder": "",
22222
22391
  "nav.back": "",
22392
+ "navbar.mobile.menuTitle": "",
22223
22393
  next: next,
22224
22394
  "ogc.unreachable.unknown": "",
22225
22395
  "organisation.filter.placeholder": "",
@@ -22243,8 +22413,13 @@ var pt = {
22243
22413
  "record.action.duplicating": "",
22244
22414
  "record.action.rollback": "",
22245
22415
  "record.action.view": "",
22416
+ "record.card.metadata.contact": "",
22246
22417
  "record.externalViewer.open": "",
22247
22418
  "record.feature.limit": "",
22419
+ "record.kind.data": "",
22420
+ "record.kind.dataset": "",
22421
+ "record.kind.reuse": "",
22422
+ "record.kind.service": "",
22248
22423
  "record.metadata.about": "",
22249
22424
  "record.metadata.api": "",
22250
22425
  "record.metadata.api.form.closeButton": "",
@@ -22278,6 +22453,7 @@ var pt = {
22278
22453
  "record.metadata.api.form.zoneTitle": "",
22279
22454
  "record.metadata.api.form.zoneTooltip": "",
22280
22455
  "record.metadata.api.gpfdl": "",
22456
+ "record.metadata.capabilities": "",
22281
22457
  "record.metadata.catalog": "",
22282
22458
  "record.metadata.contact": "",
22283
22459
  "record.metadata.creation": "",
@@ -22314,13 +22490,12 @@ var pt = {
22314
22490
  "record.metadata.quality.updateFrequency.failed": "",
22315
22491
  "record.metadata.quality.updateFrequency.success": "",
22316
22492
  "record.metadata.related": "",
22317
- "record.metadata.related.contents": "Conteúdos relacionados",
22493
+ "record.metadata.related.contents": "",
22318
22494
  "record.metadata.ressources.and.links": "Recursos e links",
22319
22495
  "record.metadata.sheet": "",
22320
22496
  "record.metadata.status": "",
22321
22497
  "record.metadata.status.notPublished": "",
22322
22498
  "record.metadata.status.published": "",
22323
- "record.metadata.technical": "",
22324
22499
  "record.metadata.temporalExtent": "",
22325
22500
  "record.metadata.temporalExtent.fromDateToDate": "",
22326
22501
  "record.metadata.temporalExtent.sinceDate": "",
@@ -22357,6 +22532,7 @@ var pt = {
22357
22532
  "results.sortBy.popularity": "",
22358
22533
  "results.sortBy.qualityScore": "",
22359
22534
  "results.sortBy.relevancy": "",
22535
+ "reuse.metadata.access": "",
22360
22536
  "search.autocomplete.error": "",
22361
22537
  "search.error.couldNotReachApi": "",
22362
22538
  "search.error.organizationHasNoDataset": "",
@@ -22406,6 +22582,26 @@ var pt = {
22406
22582
  "search.filters.useSpatialFilter": "",
22407
22583
  "search.filters.useSpatialFilterHelp": "",
22408
22584
  "search.filters.user": "",
22585
+ "service.metadata.capabilities": "",
22586
+ "service.metadata.capabilities.abstract": "",
22587
+ "service.metadata.capabilities.attribution": "",
22588
+ "service.metadata.capabilities.availableCrs": "",
22589
+ "service.metadata.capabilities.defaultCrs": "",
22590
+ "service.metadata.capabilities.geometryName": "",
22591
+ "service.metadata.capabilities.geometryType": "",
22592
+ "service.metadata.capabilities.keywords": "",
22593
+ "service.metadata.capabilities.name": "",
22594
+ "service.metadata.capabilities.objectCount": "",
22595
+ "service.metadata.capabilities.otherCrs": "",
22596
+ "service.metadata.capabilities.outputFormats": "",
22597
+ "service.metadata.capabilities.resourceLinks": "",
22598
+ "service.metadata.capabilities.title": "",
22599
+ "service.metadata.filter": "",
22600
+ "service.metadata.filter.noLayers": "",
22601
+ "service.metadata.other": "",
22602
+ "service.metadata.question": "",
22603
+ "service.metadata.search": "",
22604
+ "service.metadata.spatialExtent": "",
22409
22605
  "share.tab.permalink": "",
22410
22606
  "share.tab.webComponent": "",
22411
22607
  "table.loading.data": "",
@@ -22709,6 +22905,10 @@ class Gn4FieldMapper {
22709
22905
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
22710
22906
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
22711
22907
  const description = selectFallback(selectTranslatedField(sourceLink, 'descriptionObject', this.lang3), selectField(sourceLink, 'description'));
22908
+ const descriptionLink = selectField(sourceLink, 'descriptionObject');
22909
+ const accessRestricted = descriptionLink &&
22910
+ 'link' in descriptionLink &&
22911
+ descriptionLink.link.toString().includes('#MD_RestrictionCode_restricted');
22712
22912
  // no url: fail early
22713
22913
  if (url === null) {
22714
22914
  // TODO: collect errors at the record level?
@@ -22731,6 +22931,7 @@ class Gn4FieldMapper {
22731
22931
  type,
22732
22932
  url: url,
22733
22933
  accessServiceProtocol,
22934
+ accessRestricted: accessRestricted,
22734
22935
  };
22735
22936
  case 'link':
22736
22937
  return {
@@ -22749,8 +22950,8 @@ class Gn4FieldMapper {
22749
22950
  return {
22750
22951
  ...distribution,
22751
22952
  type,
22752
- endpointUrl: url,
22753
- protocol: accessServiceProtocol,
22953
+ url: url,
22954
+ accessServiceProtocol: accessServiceProtocol,
22754
22955
  };
22755
22956
  }
22756
22957
  };
@@ -23146,14 +23347,6 @@ class ElasticsearchService {
23146
23347
  }
23147
23348
  mustNotFilters() {
23148
23349
  return [
23149
- {
23150
- ...this.queryFilterOnValues('resourceType', [
23151
- 'service',
23152
- 'map',
23153
- 'map/static',
23154
- 'mapDigital',
23155
- ]),
23156
- },
23157
23350
  {
23158
23351
  query_string: {
23159
23352
  query: 'resourceType:featureCatalog AND !resourceType:dataset AND !cl_level.key:dataset',
@@ -23252,7 +23445,7 @@ class ElasticsearchService {
23252
23445
  must_not: this.mustNotFilters(),
23253
23446
  },
23254
23447
  },
23255
- _source: ['resourceTitleObject', 'uuid'],
23448
+ _source: ['resourceTitleObject', 'uuid', 'resourceType'],
23256
23449
  from: 0,
23257
23450
  size: 20,
23258
23451
  };
@@ -24990,7 +25183,7 @@ function getLinkLabel(link) {
24990
25183
  default:
24991
25184
  format = getFileFormat(link);
24992
25185
  }
24993
- const label = link.description || link.name;
25186
+ const label = link.description || ('name' in link ? link.name : '');
24994
25187
  return format ? `${label} (${format})` : label;
24995
25188
  }
24996
25189
  async function getLayers(url, serviceProtocol) {
@@ -25001,14 +25194,21 @@ async function getLayers(url, serviceProtocol) {
25001
25194
  }
25002
25195
  case 'wfs': {
25003
25196
  const endpointWfs = await new WfsEndpoint(url).isReady();
25004
- return endpointWfs.getFeatureTypes();
25197
+ const featureTypes = await endpointWfs.getFeatureTypes();
25198
+ const layers = await Promise.all(featureTypes.map(async (collection) => {
25199
+ return await endpointWfs.getFeatureTypeFull(collection.name);
25200
+ }));
25201
+ return layers;
25005
25202
  }
25006
25203
  case 'wms': {
25007
25204
  const endpointWms = await new WmsEndpoint(url).isReady();
25008
- return endpointWms
25205
+ const layers = (await endpointWms
25009
25206
  .getLayers()
25010
25207
  .flatMap(wmsLayerFlatten)
25011
- .filter((l) => l.name);
25208
+ .filter((l) => l.name)).map((collection) => {
25209
+ return endpointWms.getLayerByName(collection.name);
25210
+ });
25211
+ return layers;
25012
25212
  }
25013
25213
  case 'wmts': {
25014
25214
  const endpointWmts = await new WmtsEndpoint(url).isReady();
@@ -25045,6 +25245,7 @@ var LinkUsage;
25045
25245
  class LinkClassifierService {
25046
25246
  getUsagesForLink(link) {
25047
25247
  switch (link.type) {
25248
+ case 'endpoint':
25048
25249
  case 'service': {
25049
25250
  switch (link.accessServiceProtocol) {
25050
25251
  case 'esriRest':
@@ -25093,6 +25294,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25093
25294
  }]
25094
25295
  }] });
25095
25296
 
25297
+ var name = "geonetwork-ui";
25298
+ var version = "2.6.0-dev.0739ca76d";
25299
+ var engines = {
25300
+ node: ">=20"
25301
+ };
25302
+ var main = "./index.ts";
25303
+ var type = "module";
25304
+ var exports = {
25305
+ "./tailwind.base.config.js": "./tailwind.base.config.js",
25306
+ "./style.css": "./style.css"
25307
+ };
25308
+ var repository = {
25309
+ url: "https://github.com/geonetwork/geonetwork-ui"
25310
+ };
25311
+ var peerDependencies = {
25312
+ "@angular/animations": "17.x || 18.x || 19.x",
25313
+ "@angular/cdk": "17.x || 18.x || 19.x",
25314
+ "@angular/common": "17.x || 18.x || 19.x",
25315
+ "@angular/compiler": "17.x || 18.x || 19.x",
25316
+ "@angular/core": "17.x || 18.x || 19.x",
25317
+ "@angular/forms": "17.x || 18.x || 19.x",
25318
+ "@angular/material": "17.x || 18.x || 19.x",
25319
+ "@angular/material-moment-adapter": "17.x || 18.x || 19.x",
25320
+ "@angular/platform-browser": "17.x || 18.x || 19.x",
25321
+ "@angular/platform-browser-dynamic": "17.x || 18.x || 19.x",
25322
+ "@angular/router": "17.x || 18.x || 19.x",
25323
+ "@ngrx/component": "17.x || 18.x || 19.x",
25324
+ "@ngrx/effects": "17.x || 18.x || 19.x",
25325
+ "@ngrx/router-store": "17.x || 18.x || 19.x",
25326
+ "@ngrx/store": "17.x || 18.x || 19.x",
25327
+ "@ngrx/store-devtools": "17.x || 18.x || 19.x",
25328
+ "@ngrx/operators": "18.x",
25329
+ "@ngx-translate/core": "15.x",
25330
+ "@ngx-translate/http-loader": "16.x",
25331
+ rxjs: "7.x",
25332
+ "zone.js": "*",
25333
+ tailwindcss: "3.x"
25334
+ };
25335
+ var dependencies = {
25336
+ "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
25337
+ "@camptocamp/ogc-client": "1.1.1-dev.3e2d3cc",
25338
+ "@geospatial-sdk/core": "0.0.5-dev.31",
25339
+ "@geospatial-sdk/geocoding": "0.0.5-dev.31",
25340
+ "@geospatial-sdk/legend": "0.0.5-dev.31",
25341
+ "@geospatial-sdk/openlayers": "0.0.5-dev.31",
25342
+ "@ltd/j-toml": "~1.35.2",
25343
+ "@messageformat/core": "^3.0.1",
25344
+ "@ng-icons/core": "29.10.0",
25345
+ "@ng-icons/iconoir": "29.10.0",
25346
+ "@ng-icons/material-icons": "29.10.0",
25347
+ "@ng-icons/tabler-icons": "29.10.0",
25348
+ "@nx/angular": "20.2.2",
25349
+ "@rgrove/parse-xml": "4.2.0",
25350
+ alasql: "4.6.0",
25351
+ axios: "1.7.9",
25352
+ basiclightbox: "^5.0.4",
25353
+ "chart.js": "4.4.7",
25354
+ "chroma-js": "3.1.2",
25355
+ "date-fns": "4.1.0",
25356
+ "document-register-element": "^1.14.10",
25357
+ "duration-relativetimeformat": "^2.0.4",
25358
+ "embla-carousel": "8.5.1",
25359
+ express: "^4.21.1",
25360
+ "geojson-validation": "^1.0.2",
25361
+ marked: "15.0.4",
25362
+ moment: "2.30.1",
25363
+ "ng-table-virtual-scroll": "1.6.1",
25364
+ "ngx-chips": "3.0.0",
25365
+ "ngx-dropzone": "3.1.0",
25366
+ "ngx-translate-messageformat-compiler": "7.0.0",
25367
+ ol: "^8.2.0",
25368
+ papaparse: "5.4.1",
25369
+ pg: "^8.9.0",
25370
+ proj4: "^2.9.2",
25371
+ rdflib: "^2.2.35",
25372
+ "reflect-metadata": "^0.1.13",
25373
+ semver: "7.6.3",
25374
+ "tippy.js": "6.3.7",
25375
+ tslib: "^2.3.0",
25376
+ typeorm: "^0.3.14",
25377
+ "whatwg-fetch": "^3.6.2",
25378
+ xlsx: "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz"
25379
+ };
25380
+ var packageJson = {
25381
+ name: name,
25382
+ version: version,
25383
+ engines: engines,
25384
+ main: main,
25385
+ type: type,
25386
+ exports: exports,
25387
+ repository: repository,
25388
+ peerDependencies: peerDependencies,
25389
+ dependencies: dependencies
25390
+ };
25391
+
25392
+ const GEONETWORK_UI_VERSION = packageJson.version;
25393
+ const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1] === 'dev'
25394
+ ? 'main'
25395
+ : `v${packageJson.version}`;
25396
+
25096
25397
  const minApiVersion = '4.2.2';
25097
25398
  class Gn4PlatformService {
25098
25399
  constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService, httpClient, recordsApiService) {
@@ -25286,12 +25587,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25286
25587
  type: Injectable
25287
25588
  }], ctorParameters: () => [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }, { type: i1.HttpClient }, { type: RecordsApiService }] });
25288
25589
 
25590
+ class RecordsRepositoryInterface {
25591
+ }
25592
+
25289
25593
  function provideGn4() {
25290
25594
  return [
25291
25595
  {
25292
25596
  provide: PlatformServiceInterface,
25293
25597
  useClass: Gn4PlatformService,
25294
25598
  },
25599
+ {
25600
+ provide: RecordsRepositoryInterface,
25601
+ useClass: Gn4Repository,
25602
+ },
25295
25603
  Gn4PlatformMapper,
25296
25604
  ];
25297
25605
  }
@@ -25367,7 +25675,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25367
25675
 
25368
25676
  class AnchorLinkDirective {
25369
25677
  get elementClass() {
25370
- return this.disabled ? this.disabledClass : this.enabledClass;
25678
+ if (this.disabled) {
25679
+ return this.disabledClass;
25680
+ }
25681
+ if (this.inView) {
25682
+ return `${this.inViewClass} ${this.enabledClass}`;
25683
+ }
25684
+ else {
25685
+ return `${this.outOfViewClass} ${this.enabledClass}`;
25686
+ }
25371
25687
  }
25372
25688
  constructor(changeDetector) {
25373
25689
  this.changeDetector = changeDetector;
@@ -25375,6 +25691,8 @@ class AnchorLinkDirective {
25375
25691
  this.observer = new MutationObserver(() => {
25376
25692
  this.refreshDisabledState();
25377
25693
  });
25694
+ this.inView = false;
25695
+ this.initialized = false;
25378
25696
  }
25379
25697
  ngOnInit() {
25380
25698
  this.observer.observe(document.body, {
@@ -25383,8 +25701,32 @@ class AnchorLinkDirective {
25383
25701
  });
25384
25702
  this.refreshDisabledState();
25385
25703
  }
25704
+ ngAfterViewChecked() {
25705
+ if (!this.initialized && !this.disabled) {
25706
+ const target = document.getElementById(this.targetId);
25707
+ if (target) {
25708
+ this.initializeIntersectionObserver(target);
25709
+ this.initialized = true;
25710
+ }
25711
+ }
25712
+ }
25713
+ initializeIntersectionObserver(target) {
25714
+ this.intersectionObserver = new IntersectionObserver((entries) => {
25715
+ entries.forEach((entry) => {
25716
+ this.inView = entry.isIntersecting;
25717
+ this.changeDetector.detectChanges();
25718
+ });
25719
+ }, {
25720
+ root: null,
25721
+ rootMargin: '-30% 0% -60% 0%',
25722
+ });
25723
+ this.intersectionObserver.observe(target);
25724
+ }
25386
25725
  ngOnDestroy() {
25387
25726
  this.observer.disconnect();
25727
+ if (this.intersectionObserver) {
25728
+ this.intersectionObserver.disconnect();
25729
+ }
25388
25730
  }
25389
25731
  refreshDisabledState() {
25390
25732
  const targetNotPresent = !document.getElementById(this.targetId);
@@ -25403,7 +25745,7 @@ class AnchorLinkDirective {
25403
25745
  });
25404
25746
  }
25405
25747
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
25406
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: AnchorLinkDirective, selector: "[gnUiAnchorLink]", inputs: { targetId: ["gnUiAnchorLink", "targetId"], disabledClass: ["gnUiAnchorLinkDisabledClass", "disabledClass"], enabledClass: ["gnUiAnchorLinkEnabledClass", "enabledClass"] }, host: { listeners: { "click": "scrollToTarget()" }, properties: { "class": "this.elementClass" } }, ngImport: i0 }); }
25748
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: AnchorLinkDirective, selector: "[gnUiAnchorLink]", inputs: { targetId: ["gnUiAnchorLink", "targetId"], disabledClass: ["gnUiAnchorLinkDisabledClass", "disabledClass"], enabledClass: ["gnUiAnchorLinkEnabledClass", "enabledClass"], inViewClass: ["gnUiAnchorLinkInViewClass", "inViewClass"], outOfViewClass: ["gnUiAnchorLinkOutOfViewClass", "outOfViewClass"] }, host: { listeners: { "click": "scrollToTarget()" }, properties: { "class": "this.elementClass" } }, ngImport: i0 }); }
25407
25749
  }
25408
25750
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, decorators: [{
25409
25751
  type: Directive,
@@ -25419,6 +25761,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25419
25761
  }], enabledClass: [{
25420
25762
  type: Input,
25421
25763
  args: ['gnUiAnchorLinkEnabledClass']
25764
+ }], inViewClass: [{
25765
+ type: Input,
25766
+ args: ['gnUiAnchorLinkInViewClass']
25767
+ }], outOfViewClass: [{
25768
+ type: Input,
25769
+ args: ['gnUiAnchorLinkOutOfViewClass']
25422
25770
  }], elementClass: [{
25423
25771
  type: HostBinding,
25424
25772
  args: ['class']
@@ -25683,6 +26031,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25683
26031
  type: Output
25684
26032
  }] } });
25685
26033
 
26034
+ marker('editor.record.lock.reason');
26035
+ marker('editor.record.lock.format');
25686
26036
  class InteractiveTableComponent {
25687
26037
  constructor() {
25688
26038
  this.items = [];
@@ -25700,15 +26050,24 @@ class InteractiveTableComponent {
25700
26050
  .join(' '),
25701
26051
  };
25702
26052
  }
26053
+ getItemTitle(item) {
26054
+ if (!item.extras?.edit && !this.isDraftPage && item.kind === 'dataset') {
26055
+ return 'editor.record.lock.reason';
26056
+ }
26057
+ else if (item.kind !== 'dataset') {
26058
+ return 'editor.record.lock.format';
26059
+ }
26060
+ return '';
26061
+ }
25703
26062
  handleRowClick(item) {
25704
26063
  this.itemClick.emit(item);
25705
26064
  }
25706
26065
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25707
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items", isDraftPage: "isDraftPage" }, outputs: { itemClick: "itemClick" }, providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"\n !item.extras?.edit && !isDraftPage\n ? ('editor.record.lock.reason' | translate)\n : ''\n \"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n !item.extras?.edit && !isDraftPage,\n 'group-hover:text-main group-hover:bg-gray-50':\n item.extras?.edit || isDraftPage,\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26066
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items", isDraftPage: "isDraftPage" }, outputs: { itemClick: "itemClick" }, providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"getItemTitle(item) | translate\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n 'group-hover:text-main group-hover:bg-gray-50':\n (item.extras?.edit || isDraftPage) && item.kind === 'dataset',\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25708
26067
  }
25709
26068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
25710
26069
  type: Component,
25711
- args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"\n !item.extras?.edit && !isDraftPage\n ? ('editor.record.lock.reason' | translate)\n : ''\n \"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n !item.extras?.edit && !isDraftPage,\n 'group-hover:text-main group-hover:bg-gray-50':\n item.extras?.edit || isDraftPage,\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"] }]
26070
+ args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"getItemTitle(item) | translate\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n 'group-hover:text-main group-hover:bg-gray-50':\n (item.extras?.edit || isDraftPage) && item.kind === 'dataset',\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"] }]
25712
26071
  }], propDecorators: { columns: [{
25713
26072
  type: ContentChildren,
25714
26073
  args: [InteractiveTableColumnComponent]
@@ -25952,11 +26311,11 @@ class ProgressBarComponent {
25952
26311
  }
25953
26312
  }
25954
26313
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25955
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[6px] w-full {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm h-full\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"], dependencies: [{ kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
26314
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"], dependencies: [{ kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
25956
26315
  }
25957
26316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, decorators: [{
25958
26317
  type: Component,
25959
- args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [NgSwitch, NgSwitchCase, NgSwitchDefault], template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[6px] w-full {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm h-full\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
26318
+ args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [NgSwitch, NgSwitchCase, NgSwitchDefault], template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
25960
26319
  }], propDecorators: { value: [{
25961
26320
  type: Input
25962
26321
  }], type: [{
@@ -27350,19 +27709,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27350
27709
  type: Input
27351
27710
  }] } });
27352
27711
 
27353
- class NavigationButtonComponent {
27354
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27355
- 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 }); }
27356
- }
27357
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, decorators: [{
27358
- type: Component,
27359
- 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"] }]
27360
- }], propDecorators: { label: [{
27361
- type: Input
27362
- }], icon: [{
27363
- type: Input
27364
- }] } });
27365
-
27366
27712
  class SearchInputComponent {
27367
27713
  constructor() {
27368
27714
  this.value = '';
@@ -27421,11 +27767,11 @@ class StarToggleComponent {
27421
27767
  event.preventDefault();
27422
27768
  }
27423
27769
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27424
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StarToggleComponent, isStandalone: true, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [provideIcons({ matStar, matStarBorder })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27770
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StarToggleComponent, isStandalone: true, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <gn-ui-button\n [type]=\"'outline'\"\n class=\"-m-[8px] p-[8px]\"\n (buttonClick)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n disabled: !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </gn-ui-button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], viewProviders: [provideIcons({ matStar, matStarBorder })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27425
27771
  }
27426
27772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, decorators: [{
27427
27773
  type: Component,
27428
- args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIcon], viewProviders: [provideIcons({ matStar, matStarBorder })], template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
27774
+ args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIcon, ButtonComponent], viewProviders: [provideIcons({ matStar, matStarBorder })], template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <gn-ui-button\n [type]=\"'outline'\"\n class=\"-m-[8px] p-[8px]\"\n (buttonClick)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n disabled: !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </gn-ui-button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
27429
27775
  }], propDecorators: { toggled: [{
27430
27776
  type: Input
27431
27777
  }], disabled: [{
@@ -28472,7 +28818,7 @@ class MetadataQualityComponent {
28472
28818
  size: '1.2em',
28473
28819
  strokeWidth: '1.5px',
28474
28820
  }),
28475
- ], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"smaller ? 'leading-[8px] min-w-[120px]' : 'min-w-[200px]'\"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28821
+ ], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"metadataQualityDisplay\" class=\"metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"\n smaller ? 'leading-[8px] min-w-[120px] m-h-[120px]' : 'min-w-[200px]'\n \"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28476
28822
  }
28477
28823
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataQualityComponent, decorators: [{
28478
28824
  type: Component,
@@ -28491,7 +28837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28491
28837
  size: '1.2em',
28492
28838
  strokeWidth: '1.5px',
28493
28839
  }),
28494
- ], template: "<div *ngIf=\"metadataQualityDisplay\" class=\"mb-6 metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"smaller ? 'leading-[8px] min-w-[120px]' : 'min-w-[200px]'\"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
28840
+ ], template: "<div *ngIf=\"metadataQualityDisplay\" class=\"metadata-quality\">\n <div\n class=\"flex items-center\"\n [class]=\"\n smaller ? 'leading-[8px] min-w-[120px] m-h-[120px]' : 'min-w-[200px]'\n \"\n >\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
28495
28841
  }], propDecorators: { metadata: [{
28496
28842
  type: Input
28497
28843
  }], smaller: [{
@@ -29337,7 +29683,7 @@ class MetadataContactComponent {
29337
29683
  this.organizationClick.emit(this.shownOrganization);
29338
29684
  }
29339
29685
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29340
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
29686
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
29341
29687
  provideIcons({
29342
29688
  matOpenInNew,
29343
29689
  matCallOutline,
@@ -29357,7 +29703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29357
29703
  matPersonOutline,
29358
29704
  matLocationOnOutline,
29359
29705
  }),
29360
- ], template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
29706
+ ], template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
29361
29707
  }], propDecorators: { metadata: [{
29362
29708
  type: Input
29363
29709
  }], organizationClick: [{
@@ -29442,6 +29788,316 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29442
29788
  }]
29443
29789
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] });
29444
29790
 
29791
+ const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
29792
+ const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
29793
+ const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
29794
+ factory: () => ({}),
29795
+ });
29796
+ const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
29797
+ factory: () => ({
29798
+ fill: { color: 'rgba(255, 255, 255, 0.2)' },
29799
+ stroke: { color: '#ffcc33', width: 2 },
29800
+ }),
29801
+ });
29802
+
29803
+ const DEFAULT_BASEMAP_LAYER = {
29804
+ type: 'xyz',
29805
+ url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
29806
+ attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
29807
+ };
29808
+ const DEFAULT_VIEW = {
29809
+ center: [0, 15],
29810
+ zoom: 2,
29811
+ };
29812
+ class MapContainerComponent {
29813
+ get featuresClick() {
29814
+ if (!this._featuresClick) {
29815
+ this.openlayersMap.then((olMap) => {
29816
+ listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
29817
+ });
29818
+ this._featuresClick = new EventEmitter();
29819
+ }
29820
+ return this._featuresClick;
29821
+ }
29822
+ get featuresHover() {
29823
+ if (!this._featuresHover) {
29824
+ this.openlayersMap.then((olMap) => {
29825
+ listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
29826
+ });
29827
+ this._featuresHover = new EventEmitter();
29828
+ }
29829
+ return this._featuresHover;
29830
+ }
29831
+ get mapClick() {
29832
+ if (!this._mapClick) {
29833
+ this.openlayersMap.then((olMap) => {
29834
+ listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
29835
+ });
29836
+ this._mapClick = new EventEmitter();
29837
+ }
29838
+ return this._mapClick;
29839
+ }
29840
+ get sourceLoadError() {
29841
+ if (!this._sourceLoadError) {
29842
+ this.openlayersMap.then((olMap) => {
29843
+ listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
29844
+ });
29845
+ this._sourceLoadError = new EventEmitter();
29846
+ }
29847
+ return this._sourceLoadError;
29848
+ }
29849
+ constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
29850
+ this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
29851
+ this.basemapLayers = basemapLayers;
29852
+ this.mapViewConstraints = mapViewConstraints;
29853
+ this.openlayersMap = new Promise((resolve) => {
29854
+ this.olMapResolver = resolve;
29855
+ });
29856
+ }
29857
+ async ngAfterViewInit() {
29858
+ this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
29859
+ this.displayMessage$ = merge(fromEvent(this.olMap, 'mapmuted').pipe(map$1(() => true)), fromEvent(this.olMap, 'movestart').pipe(map$1(() => false)), fromEvent(this.olMap, 'singleclick').pipe(map$1(() => false))).pipe(switchMap$1((muted) => muted
29860
+ ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
29861
+ : of(false)));
29862
+ this.olMapResolver(this.olMap);
29863
+ }
29864
+ async ngOnChanges(changes) {
29865
+ if ('context' in changes && !changes['context'].isFirstChange()) {
29866
+ const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
29867
+ await applyContextDiffToMap(this.olMap, diff);
29868
+ }
29869
+ }
29870
+ // This will apply basemap layers & view constraints
29871
+ processContext(context) {
29872
+ const processed = context
29873
+ ? { ...context, view: context.view ?? DEFAULT_VIEW }
29874
+ : { layers: [], view: DEFAULT_VIEW };
29875
+ if (this.basemapLayers.length) {
29876
+ processed.layers = [...this.basemapLayers, ...processed.layers];
29877
+ }
29878
+ if (!this.doNotUseDefaultBasemap) {
29879
+ processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
29880
+ }
29881
+ if (this.mapViewConstraints.maxZoom) {
29882
+ processed.view = {
29883
+ maxZoom: this.mapViewConstraints.maxZoom,
29884
+ ...processed.view,
29885
+ };
29886
+ }
29887
+ if (this.mapViewConstraints.maxExtent) {
29888
+ processed.view = {
29889
+ maxExtent: this.mapViewConstraints.maxExtent,
29890
+ ...processed.view,
29891
+ };
29892
+ }
29893
+ if (processed.view &&
29894
+ !('zoom' in processed.view) &&
29895
+ !('center' in processed.view)) {
29896
+ if (this.mapViewConstraints.maxExtent) {
29897
+ processed.view = {
29898
+ extent: this.mapViewConstraints.maxExtent,
29899
+ ...processed.view,
29900
+ };
29901
+ }
29902
+ else {
29903
+ processed.view = { ...DEFAULT_VIEW, ...processed.view };
29904
+ }
29905
+ }
29906
+ return processed;
29907
+ }
29908
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, deps: [{ token: DO_NOT_USE_DEFAULT_BASEMAP }, { token: BASEMAP_LAYERS }, { token: MAP_VIEW_CONSTRAINTS }], target: i0.ɵɵFactoryTarget.Component }); }
29909
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapContainerComponent, isStandalone: true, selector: "gn-ui-map-container", inputs: { context: "context" }, outputs: { featuresClick: "featuresClick", featuresHover: "featuresHover", mapClick: "mapClick", sourceLoadError: "sourceLoadError" }, providers: [
29910
+ provideIcons({ matSwipeOutline }),
29911
+ provideNgIconsConfig({
29912
+ size: '1.5em',
29913
+ }),
29914
+ ], viewQueries: [{ propertyName: "container", first: true, predicate: ["map"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29915
+ }
29916
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
29917
+ type: Component,
29918
+ args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
29919
+ provideIcons({ matSwipeOutline }),
29920
+ provideNgIconsConfig({
29921
+ size: '1.5em',
29922
+ }),
29923
+ ], template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n" }]
29924
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
29925
+ type: Inject,
29926
+ args: [DO_NOT_USE_DEFAULT_BASEMAP]
29927
+ }] }, { type: undefined, decorators: [{
29928
+ type: Inject,
29929
+ args: [BASEMAP_LAYERS]
29930
+ }] }, { type: undefined, decorators: [{
29931
+ type: Inject,
29932
+ args: [MAP_VIEW_CONSTRAINTS]
29933
+ }] }], propDecorators: { context: [{
29934
+ type: Input
29935
+ }], featuresClick: [{
29936
+ type: Output
29937
+ }], featuresHover: [{
29938
+ type: Output
29939
+ }], mapClick: [{
29940
+ type: Output
29941
+ }], sourceLoadError: [{
29942
+ type: Output
29943
+ }], container: [{
29944
+ type: ViewChild,
29945
+ args: ['map']
29946
+ }] } });
29947
+
29948
+ const geometryKeys = ['geometry', 'the_geom'];
29949
+ class FeatureDetailComponent {
29950
+ get properties() {
29951
+ if (!this.feature)
29952
+ return [];
29953
+ return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
29954
+ }
29955
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29956
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeatureDetailComponent, isStandalone: true, selector: "gn-ui-feature-detail", inputs: { feature: "feature" }, ngImport: i0, template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29957
+ }
29958
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
29959
+ type: Component,
29960
+ args: [{ selector: 'gn-ui-feature-detail', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"] }]
29961
+ }], propDecorators: { feature: [{
29962
+ type: Input
29963
+ }] } });
29964
+
29965
+ class MapLegendComponent {
29966
+ constructor() {
29967
+ this.legendStatusChange = new EventEmitter();
29968
+ }
29969
+ async ngOnChanges(changes) {
29970
+ if ('context' in changes) {
29971
+ const mapContext = changes['context'].currentValue;
29972
+ if (mapContext.layers && mapContext.layers.length > 0) {
29973
+ const mapContextLayer = mapContext.layers[0];
29974
+ this.legendHTML = await createLegendFromLayer(mapContextLayer);
29975
+ if (this.legendHTML) {
29976
+ this.legendStatusChange.emit(true);
29977
+ }
29978
+ }
29979
+ else {
29980
+ this.legendHTML = false;
29981
+ this.legendStatusChange.emit(false);
29982
+ }
29983
+ }
29984
+ }
29985
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29986
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapLegendComponent, isStandalone: true, selector: "gn-ui-map-legend", inputs: { context: "context" }, outputs: { legendStatusChange: "legendStatusChange" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
29987
+ }
29988
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
29989
+ type: Component,
29990
+ args: [{ selector: 'gn-ui-map-legend', standalone: true, encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"] }]
29991
+ }], propDecorators: { context: [{
29992
+ type: Input
29993
+ }], legendStatusChange: [{
29994
+ type: Output
29995
+ }] } });
29996
+
29997
+ function prioritizePageScroll(interactions) {
29998
+ interactions.clear();
29999
+ interactions.extend(defaults({
30000
+ // remove rotate interactions
30001
+ altShiftDragRotate: false,
30002
+ pinchRotate: false,
30003
+ // replace drag and zoom interactions
30004
+ dragPan: false,
30005
+ mouseWheelZoom: false,
30006
+ })
30007
+ .extend([
30008
+ new DragPan({
30009
+ condition: dragPanCondition,
30010
+ }),
30011
+ new MouseWheelZoom({
30012
+ condition: mouseWheelZoomCondition,
30013
+ }),
30014
+ ])
30015
+ .getArray());
30016
+ }
30017
+ function dragPanCondition(event) {
30018
+ const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
30019
+ if (!dragPanCondition) {
30020
+ this.getMap().dispatchEvent('mapmuted');
30021
+ }
30022
+ // combine the condition with the default DragPan conditions
30023
+ return dragPanCondition && noModifierKeys(event) && primaryAction(event);
30024
+ }
30025
+ function mouseWheelZoomCondition(event) {
30026
+ if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
30027
+ this.getMap().dispatchEvent('mapmuted');
30028
+ }
30029
+ return platformModifierKeyOnly(event);
30030
+ }
30031
+
30032
+ class SpatialExtentComponent {
30033
+ constructor() {
30034
+ this.spatialExtents$ = new BehaviorSubject([]);
30035
+ this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
30036
+ if (extents.length === 0) {
30037
+ return null; // null extent means default view
30038
+ }
30039
+ const featureCollection = {
30040
+ type: 'FeatureCollection',
30041
+ features: [],
30042
+ };
30043
+ extents.forEach((extent) => {
30044
+ if (extent.geometry) {
30045
+ featureCollection.features.push({
30046
+ type: 'Feature',
30047
+ properties: {},
30048
+ geometry: extent.geometry,
30049
+ });
30050
+ }
30051
+ else if (extent.bbox?.length >= 0) {
30052
+ featureCollection.features.push({
30053
+ type: 'Feature',
30054
+ properties: {},
30055
+ geometry: this.bboxCoordsToGeometry(extent.bbox),
30056
+ });
30057
+ }
30058
+ });
30059
+ const layer = {
30060
+ type: 'geojson',
30061
+ data: featureCollection,
30062
+ label: 'Spatial extents',
30063
+ style: {
30064
+ 'stroke-color': 'black',
30065
+ 'stroke-width': 2,
30066
+ },
30067
+ };
30068
+ const view = await createViewFromLayer(layer);
30069
+ return {
30070
+ view,
30071
+ layers: [layer],
30072
+ };
30073
+ }));
30074
+ this.error = '';
30075
+ }
30076
+ set spatialExtents(value) {
30077
+ this.spatialExtents$.next(value);
30078
+ }
30079
+ bboxCoordsToGeometry(bbox) {
30080
+ const geometry = new Polygon([
30081
+ [
30082
+ [bbox[0], bbox[1]],
30083
+ [bbox[0], bbox[3]],
30084
+ [bbox[2], bbox[3]],
30085
+ [bbox[2], bbox[1]],
30086
+ [bbox[0], bbox[1]],
30087
+ ],
30088
+ ]);
30089
+ return new GeoJSON().writeGeometryObject(geometry);
30090
+ }
30091
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialExtentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30092
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SpatialExtentComponent, isStandalone: true, selector: "gn-ui-spatial-extent", inputs: { spatialExtents: "spatialExtents" }, ngImport: i0, template: "<gn-ui-map-container\n class=\"h-full w-full\"\n [context]=\"mapContext$ | async\"\n></gn-ui-map-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }] }); }
30093
+ }
30094
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialExtentComponent, decorators: [{
30095
+ type: Component,
30096
+ args: [{ selector: 'gn-ui-spatial-extent', standalone: true, imports: [CommonModule, MapContainerComponent], template: "<gn-ui-map-container\n class=\"h-full w-full\"\n [context]=\"mapContext$ | async\"\n></gn-ui-map-container>\n" }]
30097
+ }], propDecorators: { spatialExtents: [{
30098
+ type: Input
30099
+ }] } });
30100
+
29445
30101
  class MetadataInfoComponent {
29446
30102
  constructor(dateService) {
29447
30103
  this.dateService = dateService;
@@ -29494,7 +30150,7 @@ class MetadataInfoComponent {
29494
30150
  }
29495
30151
  }
29496
30152
  get temporalExtent() {
29497
- const temporalExtents = this.metadata.temporalExtents;
30153
+ const temporalExtents = this.metadata.kind === 'dataset' ? this.metadata.temporalExtents : [];
29498
30154
  return getTemporalRangeUnion(temporalExtents, this.dateService);
29499
30155
  }
29500
30156
  get shownOrganization() {
@@ -29516,7 +30172,7 @@ class MetadataInfoComponent {
29516
30172
  return this.dateService.formatDateTime(date);
29517
30173
  }
29518
30174
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataInfoComponent, deps: [{ token: DateService }], target: i0.ɵɵFactoryTarget.Component }); }
29519
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataInfoComponent, isStandalone: true, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-primary text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }], viewProviders: [
30175
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataInfoComponent, isStandalone: true, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.kind !== 'dataset' && metadata.spatialExtents\"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: SpatialExtentComponent, selector: "gn-ui-spatial-extent", inputs: ["spatialExtents"] }], viewProviders: [
29520
30176
  provideIcons({
29521
30177
  matOpenInNew,
29522
30178
  matMailOutline: matMailOutline$1,
@@ -29537,12 +30193,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29537
30193
  CopyTextButtonComponent,
29538
30194
  NgIcon,
29539
30195
  GnUiLinkifyDirective,
30196
+ MapContainerComponent,
30197
+ SpatialExtentComponent,
29540
30198
  ], viewProviders: [
29541
30199
  provideIcons({
29542
30200
  matOpenInNew,
29543
30201
  matMailOutline: matMailOutline$1,
29544
30202
  }),
29545
- ], template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-primary text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}\n"] }]
30203
+ ], template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.kind !== 'dataset' && metadata.spatialExtents\"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"] }]
29546
30204
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
29547
30205
  type: Input
29548
30206
  }], incomplete: [{
@@ -29914,6 +30572,302 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29914
30572
  type: Input
29915
30573
  }] } });
29916
30574
 
30575
+ marker('record.kind.data');
30576
+ marker('record.kind.reuse');
30577
+ marker('record.kind.service');
30578
+ class InternalLinkCardComponent {
30579
+ set size(value) {
30580
+ this._size = value;
30581
+ this.cardClass = this.sizeClassMap[value] || '';
30582
+ this.thumbnailContainerClass = this.thumbnailSizeClassMap[value] || 'hidden';
30583
+ }
30584
+ get size() {
30585
+ return this._size;
30586
+ }
30587
+ constructor(elementRef) {
30588
+ this.elementRef = elementRef;
30589
+ this.linkHref = null;
30590
+ this.mdSelect = new EventEmitter();
30591
+ this.subscription = new Subscription();
30592
+ this.cardClass = '';
30593
+ this.thumbnailContainerClass = '';
30594
+ this._size = 'M';
30595
+ this.sizeClassMap = {
30596
+ L: 'min-h-[190px] md:w-[992px] py-3 px-3 flex items-start gap-5',
30597
+ M: 'min-h-[140px] md:w-[570px] py-3 px-3 flex items-start gap-4',
30598
+ S: 'min-h-[220px] md:w-[370px] py-3 px-3 flex gap-4',
30599
+ XS: 'min-h-[108px] md:w-[570px] py-3 px-3 flex gap-4',
30600
+ };
30601
+ this.thumbnailSizeClassMap = {
30602
+ L: 'w-[190px] h-[180px] rounded-lg overflow-hidden shrink-0',
30603
+ M: 'w-[110px] h-[140px] rounded-lg overflow-hidden shrink-0',
30604
+ S: 'hidden',
30605
+ XS: 'hidden',
30606
+ };
30607
+ this.titleClassMap = {
30608
+ L: 'text-xl line-clamp-2',
30609
+ M: 'text-base line-clamp-2',
30610
+ S: 'text-base line-clamp-3',
30611
+ XS: 'text-base mt-3 line-clamp-2',
30612
+ };
30613
+ }
30614
+ ngOnInit() {
30615
+ this.abstract = removeWhitespace(stripHtml(this.record?.abstract));
30616
+ this.subscription.add(fromEvent(this.elementRef.nativeElement, 'click').subscribe((event) => {
30617
+ event.preventDefault();
30618
+ propagateToDocumentOnly(event);
30619
+ this.mdSelect.emit(this.record);
30620
+ }));
30621
+ }
30622
+ get organization() {
30623
+ return this.record.ownerOrganization;
30624
+ }
30625
+ get contacts() {
30626
+ return ((this.record.kind === 'dataset'
30627
+ ? this.record.contactsForResource
30628
+ : this.record.contacts) || []);
30629
+ }
30630
+ getTitleClass() {
30631
+ return (this.titleClassMap[this._size] +
30632
+ ' ' +
30633
+ (this.record.ownerOrganization?.name ? '' : 'mt-3') || '');
30634
+ }
30635
+ openExternalUrl(event, url) {
30636
+ event.stopPropagation();
30637
+ window.open(url, '_blank');
30638
+ }
30639
+ openMailto(event, email) {
30640
+ event.stopPropagation();
30641
+ window.open(`mailto:${email}`, '_blank');
30642
+ }
30643
+ copyToClipboard(event, text) {
30644
+ event.stopPropagation();
30645
+ navigator.clipboard.writeText(text);
30646
+ }
30647
+ get shouldShowThumbnail() {
30648
+ return this.size === 'L' || this.size === 'M';
30649
+ }
30650
+ getKindInfo() {
30651
+ if (!this.record?.kind)
30652
+ return { text: '', icon: '' };
30653
+ switch (this.record.kind.toLowerCase()) {
30654
+ case 'dataset':
30655
+ return { text: 'record.kind.data', icon: 'iconoirDatabase' };
30656
+ case 'reuse':
30657
+ return { text: 'record.kind.reuse', icon: 'iconoirMap' };
30658
+ case 'service':
30659
+ return { text: 'record.kind.service', icon: 'matCode' };
30660
+ default:
30661
+ return { text: '', icon: '' };
30662
+ }
30663
+ }
30664
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
30665
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InternalLinkCardComponent, isStandalone: true, selector: "gn-ui-internal-link-card", inputs: { record: "record", metadataQualityDisplay: "metadataQualityDisplay", favoriteTemplate: "favoriteTemplate", linkHref: "linkHref", isGeodata: "isGeodata", size: "size" }, outputs: { mdSelect: "mdSelect" }, providers: [
30666
+ provideIcons({
30667
+ matLocationSearchingOutline,
30668
+ matCode,
30669
+ iconoirDatabase,
30670
+ iconoirMap,
30671
+ iconoirInternet,
30672
+ matEmailOutline,
30673
+ matPhoneOutline,
30674
+ matLocationOnOutline,
30675
+ }),
30676
+ provideNgIconsConfig({
30677
+ size: '1.2em',
30678
+ }),
30679
+ ], ngImport: i0, template: "<div\n class=\"rounded-lg group card-shadow cursor-pointer overflow-hidden hover:bg-gray-50\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-row justify-between w-full\">\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div\n class=\"flex flex-col flex-1 relative\"\n [ngClass]=\"{\n 'justify-between': record.ownerOrganization?.name && size !== 'XS',\n }\"\n >\n <div class=\"flex items-center space-x-2\">\n <span\n *ngIf=\"getKindInfo().text\"\n class=\"badge-btn text-white text-xs px-2 py-0.5 font-bold shrink-0 bg-primary leading-tight flex items-center justify-evenly h-6 min-h-6\"\n >\n <ng-icon\n class=\"text-[0.9em] text-white mr-1\"\n [name]=\"getKindInfo().icon\"\n ></ng-icon>\n <span class=\"font-medium text-white text-xs\" translate>\n {{ getKindInfo().text }}\n </span>\n </span>\n <span\n *ngIf=\"isGeodata\"\n class=\"badge-btn text-black text-xs px-2 py-0.5 font-bold shrink-0 bg-primary-white leading-tight flex items-center justify-evenly h-6 min-h-6\"\n [ngClass]=\"size === 'L' ? 'w-[164px]' : 'w-8'\"\n >\n <ng-icon\n class=\"text-[0.9em] text-primary-darkest\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <ng-container *ngIf=\"size === 'L'\">\n <span\n class=\"font-medium text-primary-darkest text-xs ml-1\"\n translate\n >\n record.metadata.type\n </span>\n </ng-container>\n </span>\n <div class=\"flex items-center\">\n <gn-ui-metadata-quality\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div class=\"absolute top-0 right-0 items-center\">\n <ng-container\n *ngIf=\"size !== 'XS'\"\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div\n class=\"font-medium text-title group-hover:text-primary overflow-hidden break-words\"\n [ngClass]=\"getTitleClass()\"\n >\n {{ record.title }}\n </div>\n <div\n *ngIf=\"size === 'L'\"\n class=\"mt-1 mb-2 font-normal text-xs text-gray-900 line-clamp-2 overflow-hidden\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n <div\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n >\n <div class=\"flex items-center flex-1 min-w-0\">\n <div\n class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\"\n >\n <gn-ui-thumbnail\n [thumbnailUrl]=\"\n record.ownerOrganization?.logoUrl?.toString() || ''\n \"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div class=\"text-xl text-primary-black font-medium truncate\">\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }] }); }
30680
+ }
30681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
30682
+ type: Component,
30683
+ args: [{ selector: 'gn-ui-internal-link-card', standalone: true, imports: [
30684
+ NgClass,
30685
+ NgIf,
30686
+ ThumbnailComponent,
30687
+ MetadataQualityComponent,
30688
+ NgTemplateOutlet,
30689
+ NgIconComponent,
30690
+ TranslateModule,
30691
+ MarkdownParserComponent,
30692
+ ], providers: [
30693
+ provideIcons({
30694
+ matLocationSearchingOutline,
30695
+ matCode,
30696
+ iconoirDatabase,
30697
+ iconoirMap,
30698
+ iconoirInternet,
30699
+ matEmailOutline,
30700
+ matPhoneOutline,
30701
+ matLocationOnOutline,
30702
+ }),
30703
+ provideNgIconsConfig({
30704
+ size: '1.2em',
30705
+ }),
30706
+ ], template: "<div\n class=\"rounded-lg group card-shadow cursor-pointer overflow-hidden hover:bg-gray-50\"\n [ngClass]=\"cardClass\"\n>\n <div class=\"flex flex-row justify-between w-full\">\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div\n class=\"flex flex-col flex-1 relative\"\n [ngClass]=\"{\n 'justify-between': record.ownerOrganization?.name && size !== 'XS',\n }\"\n >\n <div class=\"flex items-center space-x-2\">\n <span\n *ngIf=\"getKindInfo().text\"\n class=\"badge-btn text-white text-xs px-2 py-0.5 font-bold shrink-0 bg-primary leading-tight flex items-center justify-evenly h-6 min-h-6\"\n >\n <ng-icon\n class=\"text-[0.9em] text-white mr-1\"\n [name]=\"getKindInfo().icon\"\n ></ng-icon>\n <span class=\"font-medium text-white text-xs\" translate>\n {{ getKindInfo().text }}\n </span>\n </span>\n <span\n *ngIf=\"isGeodata\"\n class=\"badge-btn text-black text-xs px-2 py-0.5 font-bold shrink-0 bg-primary-white leading-tight flex items-center justify-evenly h-6 min-h-6\"\n [ngClass]=\"size === 'L' ? 'w-[164px]' : 'w-8'\"\n >\n <ng-icon\n class=\"text-[0.9em] text-primary-darkest\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <ng-container *ngIf=\"size === 'L'\">\n <span\n class=\"font-medium text-primary-darkest text-xs ml-1\"\n translate\n >\n record.metadata.type\n </span>\n </ng-container>\n </span>\n <div class=\"flex items-center\">\n <gn-ui-metadata-quality\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div class=\"absolute top-0 right-0 items-center\">\n <ng-container\n *ngIf=\"size !== 'XS'\"\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div\n class=\"font-medium text-title group-hover:text-primary overflow-hidden break-words\"\n [ngClass]=\"getTitleClass()\"\n >\n {{ record.title }}\n </div>\n <div\n *ngIf=\"size === 'L'\"\n class=\"mt-1 mb-2 font-normal text-xs text-gray-900 line-clamp-2 overflow-hidden\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n <div\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n >\n <div class=\"flex items-center flex-1 min-w-0\">\n <div\n class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\"\n >\n <gn-ui-thumbnail\n [thumbnailUrl]=\"\n record.ownerOrganization?.logoUrl?.toString() || ''\n \"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div class=\"text-xl text-primary-black font-medium truncate\">\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
30707
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { record: [{
30708
+ type: Input
30709
+ }], metadataQualityDisplay: [{
30710
+ type: Input
30711
+ }], favoriteTemplate: [{
30712
+ type: Input
30713
+ }], linkHref: [{
30714
+ type: Input
30715
+ }], isGeodata: [{
30716
+ type: Input
30717
+ }], size: [{
30718
+ type: Input
30719
+ }], mdSelect: [{
30720
+ type: Output
30721
+ }] } });
30722
+
30723
+ marker(`service.metadata.search`);
30724
+ marker(`service.metadata.capabilities.title`);
30725
+ marker(`service.metadata.capabilities.abstract`);
30726
+ marker(`service.metadata.capabilities.name`);
30727
+ marker(`service.metadata.capabilities.defaultCrs`);
30728
+ marker(`service.metadata.capabilities.availableCrs`);
30729
+ marker(`service.metadata.capabilities.otherCrs`);
30730
+ marker(`service.metadata.capabilities.objectCount`);
30731
+ marker(`service.metadata.capabilities.geometryName`);
30732
+ marker(`service.metadata.capabilities.geometryType`);
30733
+ marker(`service.metadata.capabilities.keywords`);
30734
+ marker(`service.metadata.capabilities.outputFormats`);
30735
+ marker(`service.metadata.capabilities.resourceLinks`);
30736
+ marker(`service.metadata.capabilities.attribution`);
30737
+ class ServiceCapabilitiesComponent {
30738
+ constructor(cdr, translateService) {
30739
+ this.cdr = cdr;
30740
+ this.translateService = translateService;
30741
+ this.apiLinks = [];
30742
+ this.availableLayers = [];
30743
+ this.filteredLayers = [];
30744
+ this.selectedLayer = null;
30745
+ this.layerInformation = [];
30746
+ this.searchQuery = '';
30747
+ this.loading = false;
30748
+ this.capabilitiesKeys = [
30749
+ 'title',
30750
+ 'abstract',
30751
+ 'name',
30752
+ 'defaultCrs',
30753
+ 'availableCrs',
30754
+ 'otherCrs',
30755
+ 'objectCount',
30756
+ 'geometryName',
30757
+ 'geometryType',
30758
+ 'keywords',
30759
+ 'outputFormats',
30760
+ 'resourceLinks',
30761
+ 'attribution',
30762
+ ];
30763
+ }
30764
+ ngOnInit() {
30765
+ this.loadLayers();
30766
+ }
30767
+ onSearchChange(event) {
30768
+ const input = event.target;
30769
+ this.searchQuery = input.value;
30770
+ if (!input.value) {
30771
+ this.searchActive = false;
30772
+ this.filteredLayers = this.availableLayers;
30773
+ }
30774
+ }
30775
+ onSearchEnter(event) {
30776
+ if (event.key === 'Enter') {
30777
+ this.searchActive = true;
30778
+ this.searchLayers();
30779
+ }
30780
+ }
30781
+ async loadLayers() {
30782
+ if (this.apiLinks.length > 0 &&
30783
+ this.apiLinks[0].accessServiceProtocol !== 'ogcFeatures') {
30784
+ this.loading = true;
30785
+ this.availableLayers = await getLayers(this.apiLinks[0].url.href, this.apiLinks[0].accessServiceProtocol);
30786
+ this.loading = false;
30787
+ this.cdr.detectChanges();
30788
+ this.filteredLayers = this.availableLayers;
30789
+ }
30790
+ else {
30791
+ this.availableLayers = [];
30792
+ }
30793
+ }
30794
+ selectLayer(layer) {
30795
+ if (layer === this.selectedLayer) {
30796
+ this.selectedLayer = null;
30797
+ this.layerInformation = [];
30798
+ return;
30799
+ }
30800
+ this.selectedLayer = layer;
30801
+ const filteredInfo = [];
30802
+ Object.keys(layer).map((key) => {
30803
+ if (this.capabilitiesKeys.includes(key)) {
30804
+ const displayName = this.translateService.instant(`service.metadata.capabilities.${key}`);
30805
+ if (key in layer && layer[key]?.length) {
30806
+ filteredInfo.push({ displayName, value: layer[key] });
30807
+ }
30808
+ }
30809
+ });
30810
+ this.layerInformation = filteredInfo;
30811
+ }
30812
+ isList(value) {
30813
+ return Array.isArray(value);
30814
+ }
30815
+ getExtraInputClass() {
30816
+ if (this.searchActive) {
30817
+ return 'h-14 border rounded-lg border-primary text-primary focus:border-primary hover:border-primary';
30818
+ }
30819
+ return 'h-14 border rounded-lg';
30820
+ }
30821
+ searchLayers() {
30822
+ this.searchActive = true;
30823
+ this.filteredLayers = this.availableLayers.filter((layer) => {
30824
+ const query = this.searchQuery.toLowerCase();
30825
+ if (layer.title) {
30826
+ return (layer.title.toLowerCase().includes(query) ||
30827
+ layer.abstract?.toLowerCase().includes(query));
30828
+ }
30829
+ else {
30830
+ return layer.name.toLowerCase().includes(query);
30831
+ }
30832
+ });
30833
+ if (!this.filteredLayers.includes(this.selectedLayer)) {
30834
+ this.selectedLayer = null;
30835
+ this.layerInformation = [];
30836
+ }
30837
+ }
30838
+ getExtraClass(layerItem) {
30839
+ return layerItem.title === this.selectedLayer?.title
30840
+ ? `h-8 rounded-lg bg-primary-darker text-white hover:text-primary-darker hover:bg-white`
30841
+ : `h-8 rounded-lg`;
30842
+ }
30843
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCapabilitiesComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30844
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "<div style=\"height: 652px\" id=\"preview\" *ngIf=\"apiLinks.length > 0\">\n <div class=\"bg-primary-opacity-10 overflow-visible\" style=\"height: 512px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n <div\n *ngIf=\"loading\"\n class=\"flex justify-center w-full h-[200px] items-center\"\n >\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n <div *ngIf=\"!loading\">\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div class=\"border-l absolute border-gray-200 right-0 h-14 w-14\">\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon name=\"matInfoOutline\" class=\"w-6 h-6 pt-0.5\"></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n <gn-ui-button\n *ngFor=\"let layerItem of filteredLayers\"\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n <span *ngIf=\"filteredLayers.length === 0\" class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n <div\n *ngFor=\"let item of layerInformation\"\n class=\"flex flex-row gap-4 border-b border-gray-200\"\n >\n <span class=\"font-semibold w-24\">{{ item.displayName }}</span>\n <div *ngIf=\"isList(item.value)\">\n <div\n *ngFor=\"let subItem of item.value\"\n class=\"flex flex-row break-words max-w-72\"\n >\n {{ subItem }}\n </div>\n </div>\n <div class=\"break-words max-w-72\" *ngIf=\"!isList(item.value)\">\n {{ item.value }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }], viewProviders: [
30845
+ provideIcons({
30846
+ iconoirSearch,
30847
+ matInfoOutline,
30848
+ }),
30849
+ ] }); }
30850
+ }
30851
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCapabilitiesComponent, decorators: [{
30852
+ type: Component,
30853
+ args: [{ selector: 'gn-ui-service-capabilities', standalone: true, imports: [
30854
+ CommonModule,
30855
+ TranslateModule,
30856
+ ButtonComponent,
30857
+ TextInputComponent,
30858
+ NgIcon,
30859
+ PopoverComponent,
30860
+ SpinningLoaderComponent,
30861
+ ], viewProviders: [
30862
+ provideIcons({
30863
+ iconoirSearch,
30864
+ matInfoOutline,
30865
+ }),
30866
+ ], template: "<div style=\"height: 652px\" id=\"preview\" *ngIf=\"apiLinks.length > 0\">\n <div class=\"bg-primary-opacity-10 overflow-visible\" style=\"height: 512px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n <div\n *ngIf=\"loading\"\n class=\"flex justify-center w-full h-[200px] items-center\"\n >\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n <div *ngIf=\"!loading\">\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div class=\"border-l absolute border-gray-200 right-0 h-14 w-14\">\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon name=\"matInfoOutline\" class=\"w-6 h-6 pt-0.5\"></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n <gn-ui-button\n *ngFor=\"let layerItem of filteredLayers\"\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n <span *ngIf=\"filteredLayers.length === 0\" class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n <div\n *ngFor=\"let item of layerInformation\"\n class=\"flex flex-row gap-4 border-b border-gray-200\"\n >\n <span class=\"font-semibold w-24\">{{ item.displayName }}</span>\n <div *ngIf=\"isList(item.value)\">\n <div\n *ngFor=\"let subItem of item.value\"\n class=\"flex flex-row break-words max-w-72\"\n >\n {{ subItem }}\n </div>\n </div>\n <div class=\"break-words max-w-72\" *ngIf=\"!isList(item.value)\">\n {{ item.value }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n" }]
30867
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { apiLinks: [{
30868
+ type: Input
30869
+ }] } });
30870
+
29917
30871
  class UiElementsModule {
29918
30872
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
29919
30873
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, declarations: [AvatarComponent, UserPreviewComponent], imports: [CommonModule,
@@ -29932,12 +30886,16 @@ class UiElementsModule {
29932
30886
  MaxLinesComponent,
29933
30887
  TextInputComponent,
29934
30888
  ImageInputComponent,
29935
- ApplicationBannerComponent], exports: [ThumbnailComponent,
30889
+ ApplicationBannerComponent,
30890
+ InternalLinkCardComponent,
30891
+ ServiceCapabilitiesComponent], exports: [ThumbnailComponent,
29936
30892
  AvatarComponent,
29937
30893
  UserPreviewComponent,
29938
30894
  MarkdownParserComponent,
29939
30895
  ImageInputComponent,
29940
- ApplicationBannerComponent] }); }
30896
+ ApplicationBannerComponent,
30897
+ InternalLinkCardComponent,
30898
+ ServiceCapabilitiesComponent] }); }
29941
30899
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, providers: [
29942
30900
  provideNgIconsConfig({
29943
30901
  size: '1.5em',
@@ -29957,7 +30915,9 @@ class UiElementsModule {
29957
30915
  MaxLinesComponent,
29958
30916
  TextInputComponent,
29959
30917
  ImageInputComponent,
29960
- ApplicationBannerComponent] }); }
30918
+ ApplicationBannerComponent,
30919
+ InternalLinkCardComponent,
30920
+ ServiceCapabilitiesComponent] }); }
29961
30921
  }
29962
30922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
29963
30923
  type: NgModule,
@@ -29982,6 +30942,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29982
30942
  TextInputComponent,
29983
30943
  ImageInputComponent,
29984
30944
  ApplicationBannerComponent,
30945
+ InternalLinkCardComponent,
30946
+ ServiceCapabilitiesComponent,
29985
30947
  ],
29986
30948
  providers: [
29987
30949
  provideNgIconsConfig({
@@ -29996,6 +30958,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29996
30958
  MarkdownParserComponent,
29997
30959
  ImageInputComponent,
29998
30960
  ApplicationBannerComponent,
30961
+ InternalLinkCardComponent,
30962
+ ServiceCapabilitiesComponent,
29999
30963
  ],
30000
30964
  }]
30001
30965
  }] });
@@ -30336,8 +31300,9 @@ class ResultsTableComponent {
30336
31300
  return getBadgeColor(format);
30337
31301
  }
30338
31302
  handleRecordClick(item) {
30339
- if (item?.extras?.edit || this.isDraftPage)
31303
+ if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
30340
31304
  this.recordClick.emit(item);
31305
+ }
30341
31306
  }
30342
31307
  handleDuplicate(item) {
30343
31308
  this.duplicateRecord.emit(item);
@@ -30374,7 +31339,7 @@ class ResultsTableComponent {
30374
31339
  this.recordsSelectedChange.emit([[record], selected]);
30375
31340
  }
30376
31341
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, deps: [{ token: i1$9.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: DateService }], target: i0.ɵɵFactoryTarget.Component }); }
30377
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete", isDraftPage: "isDraftPage", isDuplicating: "isDuplicating" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", rollbackDraft: "rollbackDraft", recordsSelectedChange: "recordsSelectedChange" }, providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"!item.extras?.edit && !isDraftPage\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"item.extras?.edit || isDraftPage\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"!item.extras?.edit && !isDraftPage\"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light': !item.extras?.edit && !isDraftPage,\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items", "isDraftPage"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "width", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "canDelete", "isDraftPage"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
31342
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete", isDraftPage: "isDraftPage", isDuplicating: "isDuplicating" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", rollbackDraft: "rollbackDraft", recordsSelectedChange: "recordsSelectedChange" }, providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"(item.extras?.edit || isDraftPage) && item.kind === 'dataset'\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\n \"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items", "isDraftPage"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "width", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "canDelete", "isDraftPage"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
30378
31343
  }
30379
31344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
30380
31345
  type: Component,
@@ -30388,7 +31353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30388
31353
  ActionMenuComponent,
30389
31354
  NgIconComponent,
30390
31355
  CdkOverlayOrigin,
30391
- ], providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"!item.extras?.edit && !isDraftPage\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"item.extras?.edit || isDraftPage\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"!item.extras?.edit && !isDraftPage\"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light': !item.extras?.edit && !isDraftPage,\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
31356
+ ], providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"(item.extras?.edit || isDraftPage) && item.kind === 'dataset'\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\n \"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
30392
31357
  }], ctorParameters: () => [{ type: i1$9.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
30393
31358
  type: Input
30394
31359
  }], selectedRecordsIdentifiers: [{
@@ -31419,9 +32384,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31419
32384
  type: Injectable
31420
32385
  }], ctorParameters: () => [{ type: SearchFacade }] });
31421
32386
 
31422
- class RecordsRepositoryInterface {
31423
- }
31424
-
31425
32387
  class FuzzySearchComponent {
31426
32388
  constructor(searchFacade, searchService, recordsRepository) {
31427
32389
  this.searchFacade = searchFacade;
@@ -31560,7 +32522,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31560
32522
  }] }] });
31561
32523
 
31562
32524
  // expects the replacement key ${uuid}
31563
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
32525
+ const RECORD_DATASET_URL_TOKEN = new InjectionToken('record-dataset-url-token');
32526
+ const RECORD_SERVICE_URL_TOKEN = new InjectionToken('record-service-url-token');
32527
+ const RECORD_REUSE_URL_TOKEN = new InjectionToken('record-reuse-url-token');
31564
32528
 
31565
32529
  class FavoriteStarComponent {
31566
32530
  set record(value) {
@@ -31587,9 +32551,10 @@ class FavoriteStarComponent {
31587
32551
  this.isAnonymous$ = this.platformService.isAnonymous();
31588
32552
  this.loading = false;
31589
32553
  this.loginUrl = this.authService.loginUrl;
31590
- this.loginMessage$ = this.translateService.get('favorite.not.authenticated.tooltip', {
32554
+ this.loginMessage$ = this.translateService.onLangChange.pipe(startWith(null), // make sure to wait for translations to be loaded with and without language change
32555
+ switchMap$1(() => this.translateService.get('favorite.not.authenticated.tooltip', {
31591
32556
  link: this.loginUrl,
31592
- });
32557
+ })));
31593
32558
  }
31594
32559
  ngAfterViewInit() {
31595
32560
  this.subscription = this.isAnonymous$
@@ -31645,11 +32610,11 @@ class FavoriteStarComponent {
31645
32610
  });
31646
32611
  }
31647
32612
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, deps: [{ token: FavoritesService }, { token: PlatformServiceInterface }, { token: i0.ChangeDetectorRef }, { token: AuthService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
31648
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FavoriteStarComponent, isStandalone: true, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32613
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FavoriteStarComponent, isStandalone: true, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 mt-0.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31649
32614
  }
31650
32615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, decorators: [{
31651
32616
  type: Component,
31652
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, StarToggleComponent], template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
32617
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, StarToggleComponent, TranslateModule], template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 mt-0.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n</div>\n" }]
31653
32618
  }], ctorParameters: () => [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }], propDecorators: { displayCount: [{
31654
32619
  type: Input
31655
32620
  }], record: [{
@@ -31660,10 +32625,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31660
32625
  }] } });
31661
32626
 
31662
32627
  class ResultsListContainerComponent {
31663
- constructor(facade, resultsLayoutConfig, recordUrlTemplate) {
32628
+ constructor(facade, resultsLayoutConfig, recordDatasetUrlTemplate, recordServiceUrlTemplate, recordReuseUrlTemplate) {
31664
32629
  this.facade = facade;
31665
32630
  this.resultsLayoutConfig = resultsLayoutConfig;
31666
- this.recordUrlTemplate = recordUrlTemplate;
32631
+ this.recordDatasetUrlTemplate = recordDatasetUrlTemplate;
32632
+ this.recordServiceUrlTemplate = recordServiceUrlTemplate;
32633
+ this.recordReuseUrlTemplate = recordReuseUrlTemplate;
31667
32634
  this.showMore = 'auto';
31668
32635
  this.mdSelect = new EventEmitter();
31669
32636
  this.errorTypes = ErrorType;
@@ -31695,16 +32662,24 @@ class ResultsListContainerComponent {
31695
32662
  this.facade.scroll();
31696
32663
  }
31697
32664
  getRecordUrl(metadata) {
31698
- if (!this.recordUrlTemplate)
32665
+ const tokenMap = {
32666
+ dataset: this.recordDatasetUrlTemplate,
32667
+ service: this.recordServiceUrlTemplate,
32668
+ reuse: this.recordReuseUrlTemplate,
32669
+ };
32670
+ if (!this.recordDatasetUrlTemplate &&
32671
+ !this.recordServiceUrlTemplate &&
32672
+ !this.recordReuseUrlTemplate)
31699
32673
  return null;
31700
- return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
32674
+ const urlKind = tokenMap[metadata.kind];
32675
+ return urlKind.replace('${uuid}', metadata.uniqueIdentifier);
31701
32676
  }
31702
- 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 }); }
31703
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ErrorComponent, selector: "gn-ui-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] }); }
32677
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }, { token: RECORD_DATASET_URL_TOKEN, optional: true }, { token: RECORD_SERVICE_URL_TOKEN }, { token: RECORD_REUSE_URL_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
32678
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n [style.--gn-ui-button-width]=\"!auto\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [":host{--gn-ui-button-height: 24px;--gn-ui-button-width: 24px;--gn-ui-button-color: var(--color-secondary);--gn-ui-button-border-width: 0px}\n"], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ErrorComponent, selector: "gn-ui-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] }); }
31704
32679
  }
31705
32680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
31706
32681
  type: Component,
31707
- args: [{ selector: 'gn-ui-results-list-container', template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n" }]
32682
+ args: [{ selector: 'gn-ui-results-list-container', template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n [style.--gn-ui-button-width]=\"!auto\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [":host{--gn-ui-button-height: 24px;--gn-ui-button-width: 24px;--gn-ui-button-color: var(--color-secondary);--gn-ui-button-border-width: 0px}\n"] }]
31708
32683
  }], ctorParameters: () => [{ type: SearchFacade }, { type: undefined, decorators: [{
31709
32684
  type: Inject,
31710
32685
  args: [RESULTS_LAYOUT_CONFIG]
@@ -31712,7 +32687,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31712
32687
  type: Optional
31713
32688
  }, {
31714
32689
  type: Inject,
31715
- args: [RECORD_URL_TOKEN]
32690
+ args: [RECORD_DATASET_URL_TOKEN]
32691
+ }] }, { type: undefined, decorators: [{
32692
+ type: Inject,
32693
+ args: [RECORD_SERVICE_URL_TOKEN]
32694
+ }] }, { type: undefined, decorators: [{
32695
+ type: Inject,
32696
+ args: [RECORD_REUSE_URL_TOKEN]
31716
32697
  }] }], propDecorators: { metadataQualityDisplay: [{
31717
32698
  type: Input
31718
32699
  }], layout: [{
@@ -32464,12 +33445,7 @@ class FeatureSearchModule {
32464
33445
  FacetsModule,
32465
33446
  SearchStateContainerDirective,
32466
33447
  FilterDropdownComponent] }); }
32467
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, providers: [
32468
- {
32469
- provide: RecordsRepositoryInterface,
32470
- useClass: Gn4Repository,
32471
- },
32472
- ], imports: [CommonModule,
33448
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, imports: [CommonModule,
32473
33449
  TranslateModule.forChild(),
32474
33450
  StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
32475
33451
  initialState,
@@ -32531,12 +33507,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32531
33507
  SearchStateContainerDirective,
32532
33508
  FilterDropdownComponent,
32533
33509
  ],
32534
- providers: [
32535
- {
32536
- provide: RecordsRepositoryInterface,
32537
- useClass: Gn4Repository,
32538
- },
32539
- ],
32540
33510
  }]
32541
33511
  }] });
32542
33512
 
@@ -33024,247 +33994,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33024
33994
  }]
33025
33995
  }] });
33026
33996
 
33027
- const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
33028
- const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
33029
- const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
33030
- factory: () => ({}),
33031
- });
33032
- const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
33033
- factory: () => ({
33034
- fill: { color: 'rgba(255, 255, 255, 0.2)' },
33035
- stroke: { color: '#ffcc33', width: 2 },
33036
- }),
33037
- });
33038
-
33039
- const DEFAULT_BASEMAP_LAYER = {
33040
- type: 'xyz',
33041
- url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
33042
- attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
33043
- };
33044
- const DEFAULT_VIEW = {
33045
- center: [0, 15],
33046
- zoom: 2,
33047
- };
33048
- class MapContainerComponent {
33049
- get featuresClick() {
33050
- if (!this._featuresClick) {
33051
- this.openlayersMap.then((olMap) => {
33052
- listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
33053
- });
33054
- this._featuresClick = new EventEmitter();
33055
- }
33056
- return this._featuresClick;
33057
- }
33058
- get featuresHover() {
33059
- if (!this._featuresHover) {
33060
- this.openlayersMap.then((olMap) => {
33061
- listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
33062
- });
33063
- this._featuresHover = new EventEmitter();
33064
- }
33065
- return this._featuresHover;
33066
- }
33067
- get mapClick() {
33068
- if (!this._mapClick) {
33069
- this.openlayersMap.then((olMap) => {
33070
- listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
33071
- });
33072
- this._mapClick = new EventEmitter();
33073
- }
33074
- return this._mapClick;
33075
- }
33076
- get sourceLoadError() {
33077
- if (!this._sourceLoadError) {
33078
- this.openlayersMap.then((olMap) => {
33079
- listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
33080
- });
33081
- this._sourceLoadError = new EventEmitter();
33082
- }
33083
- return this._sourceLoadError;
33084
- }
33085
- constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
33086
- this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
33087
- this.basemapLayers = basemapLayers;
33088
- this.mapViewConstraints = mapViewConstraints;
33089
- this.openlayersMap = new Promise((resolve) => {
33090
- this.olMapResolver = resolve;
33091
- });
33092
- }
33093
- async ngAfterViewInit() {
33094
- this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
33095
- 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
33096
- ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
33097
- : of(false)));
33098
- this.olMapResolver(this.olMap);
33099
- }
33100
- async ngOnChanges(changes) {
33101
- if ('context' in changes && !changes['context'].isFirstChange()) {
33102
- const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
33103
- await applyContextDiffToMap(this.olMap, diff);
33104
- }
33105
- }
33106
- // This will apply basemap layers & view constraints
33107
- processContext(context) {
33108
- const processed = context
33109
- ? { ...context, view: context.view ?? DEFAULT_VIEW }
33110
- : { layers: [], view: DEFAULT_VIEW };
33111
- if (this.basemapLayers.length) {
33112
- processed.layers = [...this.basemapLayers, ...processed.layers];
33113
- }
33114
- if (!this.doNotUseDefaultBasemap) {
33115
- processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
33116
- }
33117
- if (this.mapViewConstraints.maxZoom) {
33118
- processed.view = {
33119
- maxZoom: this.mapViewConstraints.maxZoom,
33120
- ...processed.view,
33121
- };
33122
- }
33123
- if (this.mapViewConstraints.maxExtent) {
33124
- processed.view = {
33125
- maxExtent: this.mapViewConstraints.maxExtent,
33126
- ...processed.view,
33127
- };
33128
- }
33129
- if (processed.view &&
33130
- !('zoom' in processed.view) &&
33131
- !('center' in processed.view)) {
33132
- if (this.mapViewConstraints.maxExtent) {
33133
- processed.view = {
33134
- extent: this.mapViewConstraints.maxExtent,
33135
- ...processed.view,
33136
- };
33137
- }
33138
- else {
33139
- processed.view = { ...DEFAULT_VIEW, ...processed.view };
33140
- }
33141
- }
33142
- return processed;
33143
- }
33144
- 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 }); }
33145
- 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: [
33146
- provideIcons({ matSwipeOutline }),
33147
- provideNgIconsConfig({
33148
- size: '1.5em',
33149
- }),
33150
- ], 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 }); }
33151
- }
33152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
33153
- type: Component,
33154
- args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
33155
- provideIcons({ matSwipeOutline }),
33156
- provideNgIconsConfig({
33157
- size: '1.5em',
33158
- }),
33159
- ], 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" }]
33160
- }], ctorParameters: () => [{ type: undefined, decorators: [{
33161
- type: Inject,
33162
- args: [DO_NOT_USE_DEFAULT_BASEMAP]
33163
- }] }, { type: undefined, decorators: [{
33164
- type: Inject,
33165
- args: [BASEMAP_LAYERS]
33166
- }] }, { type: undefined, decorators: [{
33167
- type: Inject,
33168
- args: [MAP_VIEW_CONSTRAINTS]
33169
- }] }], propDecorators: { context: [{
33170
- type: Input
33171
- }], featuresClick: [{
33172
- type: Output
33173
- }], featuresHover: [{
33174
- type: Output
33175
- }], mapClick: [{
33176
- type: Output
33177
- }], sourceLoadError: [{
33178
- type: Output
33179
- }], container: [{
33180
- type: ViewChild,
33181
- args: ['map']
33182
- }] } });
33183
-
33184
- const geometryKeys = ['geometry', 'the_geom'];
33185
- class FeatureDetailComponent {
33186
- get properties() {
33187
- if (!this.feature)
33188
- return [];
33189
- return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
33190
- }
33191
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33192
- 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 }); }
33193
- }
33194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
33195
- type: Component,
33196
- 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"] }]
33197
- }], propDecorators: { feature: [{
33198
- type: Input
33199
- }] } });
33200
-
33201
- class MapLegendComponent {
33202
- constructor() {
33203
- this.legendStatusChange = new EventEmitter();
33204
- }
33205
- async ngOnChanges(changes) {
33206
- if ('context' in changes) {
33207
- const mapContext = changes['context'].currentValue;
33208
- if (mapContext.layers && mapContext.layers.length > 0) {
33209
- const mapContextLayer = mapContext.layers[0];
33210
- this.legendHTML = await createLegendFromLayer(mapContextLayer);
33211
- if (this.legendHTML) {
33212
- this.legendStatusChange.emit(true);
33213
- }
33214
- }
33215
- else {
33216
- this.legendHTML = false;
33217
- this.legendStatusChange.emit(false);
33218
- }
33219
- }
33220
- }
33221
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33222
- 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 }); }
33223
- }
33224
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
33225
- type: Component,
33226
- 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"] }]
33227
- }], propDecorators: { context: [{
33228
- type: Input
33229
- }], legendStatusChange: [{
33230
- type: Output
33231
- }] } });
33232
-
33233
- function prioritizePageScroll(interactions) {
33234
- interactions.clear();
33235
- interactions.extend(defaults({
33236
- // remove rotate interactions
33237
- altShiftDragRotate: false,
33238
- pinchRotate: false,
33239
- // replace drag and zoom interactions
33240
- dragPan: false,
33241
- mouseWheelZoom: false,
33242
- })
33243
- .extend([
33244
- new DragPan({
33245
- condition: dragPanCondition,
33246
- }),
33247
- new MouseWheelZoom({
33248
- condition: mouseWheelZoomCondition,
33249
- }),
33250
- ])
33251
- .getArray());
33252
- }
33253
- function dragPanCondition(event) {
33254
- const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
33255
- if (!dragPanCondition) {
33256
- this.getMap().dispatchEvent('mapmuted');
33257
- }
33258
- // combine the condition with the default DragPan conditions
33259
- return dragPanCondition && noModifierKeys(event) && primaryAction(event);
33260
- }
33261
- function mouseWheelZoomCondition(event) {
33262
- if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
33263
- this.getMap().dispatchEvent('mapmuted');
33264
- }
33265
- return platformModifierKeyOnly(event);
33266
- }
33267
-
33268
33997
  class MapStateContainerComponent {
33269
33998
  constructor(mapFacade) {
33270
33999
  this.mapFacade = mapFacade;
@@ -33916,6 +34645,7 @@ function loadAppConfig() {
33916
34645
  'metadata_language',
33917
34646
  'login_url',
33918
34647
  'logout_url',
34648
+ 'settings_url',
33919
34649
  'web_component_embedder_url',
33920
34650
  'languages',
33921
34651
  'contact_email',
@@ -34066,6 +34796,7 @@ proxy_path = "/proxy/?url="
34066
34796
  metadata_language = "fre"
34067
34797
  login_url = "/cas/login?service="
34068
34798
  logout_url = "/geonetwork/signout"
34799
+ settings_url = "/geonetwork/settings"
34069
34800
  web_component_embedder_url = "/datahub/wc-embedder.html"
34070
34801
 
34071
34802
  [map]
@@ -36580,6 +37311,10 @@ class ChartViewComponent {
36580
37311
  this.dataset$ = this.currentLink$.pipe(filter((link) => !!link), switchMap$1((link) => {
36581
37312
  this.error = null;
36582
37313
  this.loading = true;
37314
+ if (link.accessRestricted) {
37315
+ this.handleError('dataset.error.restrictedAccess');
37316
+ return EMPTY;
37317
+ }
36583
37318
  return this.dataService.getDataset(link, this.cacheActive).pipe(catchError((error) => {
36584
37319
  this.handleError(error);
36585
37320
  return EMPTY;
@@ -36844,6 +37579,10 @@ class TableViewComponent {
36844
37579
  this.error = null;
36845
37580
  if (!link)
36846
37581
  return of(undefined);
37582
+ if (link.accessRestricted) {
37583
+ this.handleError('dataset.error.restrictedAccess');
37584
+ return of([]);
37585
+ }
36847
37586
  this.loading = true;
36848
37587
  return this.getDatasetReader(link).pipe(catchError((error) => {
36849
37588
  this.handleError(error);
@@ -36921,15 +37660,13 @@ class MdViewFacade {
36921
37660
  this.error$ = this.store.pipe(select(getMetadataError));
36922
37661
  this.related$ = this.store.pipe(select(getRelated));
36923
37662
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
36924
- this.allLinks$ = this.metadata$.pipe(map$1((record) => record.kind === 'dataset' && 'onlineResources' in record
36925
- ? record.onlineResources
36926
- : []));
37663
+ this.allLinks$ = this.metadata$.pipe(map$1((record) => ('onlineResources' in record ? record.onlineResources : [])));
36927
37664
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links
36928
37665
  .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
36929
37666
  // Put links to IGN Géoplateforme first
36930
37667
  .sort((dd1, dd2) => {
36931
- return dd2.accessServiceProtocol ===
36932
- 'GPFDL'
37668
+ return dd2
37669
+ .accessServiceProtocol === 'GPFDL'
36933
37670
  ? 1
36934
37671
  : undefined; // do not change the sorting otherwise
36935
37672
  })));
@@ -37000,15 +37737,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37000
37737
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }, { type: DataService }] });
37001
37738
 
37002
37739
  class MdViewEffects {
37003
- constructor(actions$, recordsRepository, platformServiceInterface) {
37740
+ constructor(actions$, recordsRepository, platformServiceInterface, router) {
37004
37741
  this.actions$ = actions$;
37005
37742
  this.recordsRepository = recordsRepository;
37006
37743
  this.platformServiceInterface = platformServiceInterface;
37744
+ this.router = router;
37007
37745
  /*
37008
37746
  Metadata effects
37009
37747
  */
37010
37748
  this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getRecord(uuid)), map$1((record) => {
37011
- if (record === null) {
37749
+ if (record === null || !this.router.url.includes(record.kind)) {
37012
37750
  return loadFullMetadataFailure({ notFound: true });
37013
37751
  }
37014
37752
  return loadFullMetadataSuccess({ full: record });
@@ -37043,12 +37781,12 @@ class MdViewEffects {
37043
37781
  }));
37044
37782
  })))));
37045
37783
  }
37046
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$c.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
37784
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$c.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }, { token: i1$d.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
37047
37785
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects }); }
37048
37786
  }
37049
37787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, decorators: [{
37050
37788
  type: Injectable
37051
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }] });
37789
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }, { type: i1$d.Router }] });
37052
37790
 
37053
37791
  class CatalogTitleComponent {
37054
37792
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CatalogTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -37105,11 +37843,11 @@ class LanguageSwitcherComponent {
37105
37843
  this.translate.use(value);
37106
37844
  }
37107
37845
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
37108
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LanguageSwitcherComponent, isStandalone: true, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }] }); }
37846
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LanguageSwitcherComponent, isStandalone: true, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1 rounded-lg\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }] }); }
37109
37847
  }
37110
37848
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
37111
37849
  type: Component,
37112
- args: [{ selector: 'gn-ui-language-switcher', imports: [DropdownSelectorComponent], standalone: true, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n" }]
37850
+ args: [{ selector: 'gn-ui-language-switcher', imports: [DropdownSelectorComponent], standalone: true, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1 rounded-lg\"\n>\n</gn-ui-dropdown-selector>\n" }]
37113
37851
  }], ctorParameters: () => [{ type: undefined, decorators: [{
37114
37852
  type: Optional
37115
37853
  }, {
@@ -37531,17 +38269,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37531
38269
  }]
37532
38270
  }] });
37533
38271
 
37534
- const GN_UI_VERSION = new InjectionToken('gnUiVersion');
37535
-
37536
38272
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
37537
38273
  class DataViewPermalinkComponent {
37538
38274
  set viewType(value) {
37539
38275
  this.viewType$.next(value);
37540
38276
  }
37541
- constructor(config, wcEmbedderBaseUrl, version, facade) {
38277
+ constructor(config, wcEmbedderBaseUrl, facade) {
37542
38278
  this.config = config;
37543
38279
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
37544
- this.version = version;
37545
38280
  this.facade = facade;
37546
38281
  this.viewType$ = new BehaviorSubject('map');
37547
38282
  this.permalinkUrl$ = combineLatest([
@@ -37550,7 +38285,7 @@ class DataViewPermalinkComponent {
37550
38285
  this.facade.metadata$,
37551
38286
  ]).pipe(map$2(([viewType, config, metadata]) => {
37552
38287
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
37553
- url.searchParams.set('v', `${this.version}`);
38288
+ url.searchParams.set('v', `${GEONETWORK_UI_TAG_NAME}`);
37554
38289
  if (viewType === 'chart') {
37555
38290
  if (config) {
37556
38291
  const { aggregation, xProperty, yProperty, chartType } = config;
@@ -37581,7 +38316,7 @@ class DataViewPermalinkComponent {
37581
38316
  return url.toString();
37582
38317
  }));
37583
38318
  }
37584
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, deps: [{ token: Configuration }, { token: WEB_COMPONENT_EMBEDDER_URL, optional: true }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
38319
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, deps: [{ token: Configuration }, { token: WEB_COMPONENT_EMBEDDER_URL, optional: true }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
37585
38320
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataViewPermalinkComponent, isStandalone: true, selector: "gn-ui-data-view-permalink", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n *ngIf=\"wcEmbedderBaseUrl\"\n [text]=\"permalinkUrl$ | async\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37586
38321
  }
37587
38322
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
@@ -37595,9 +38330,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37595
38330
  }, {
37596
38331
  type: Inject,
37597
38332
  args: [WEB_COMPONENT_EMBEDDER_URL]
37598
- }] }, { type: undefined, decorators: [{
37599
- type: Inject,
37600
- args: [GN_UI_VERSION]
37601
38333
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37602
38334
  type: Input
37603
38335
  }] } });
@@ -37676,16 +38408,15 @@ class DataViewWebComponentComponent {
37676
38408
  set viewType(value) {
37677
38409
  this.viewType$.next(value);
37678
38410
  }
37679
- constructor(config, version, facade) {
38411
+ constructor(config, facade) {
37680
38412
  this.config = config;
37681
- this.version = version;
37682
38413
  this.facade = facade;
37683
38414
  this.viewType$ = new BehaviorSubject('map');
37684
38415
  this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
37685
38416
  if (viewType === 'chart') {
37686
38417
  if (config) {
37687
38418
  const { aggregation, xProperty, yProperty, chartType } = config;
37688
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38419
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37689
38420
  <gn-dataset-view-chart
37690
38421
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37691
38422
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37704,7 +38435,7 @@ class DataViewWebComponentComponent {
37704
38435
  return '';
37705
38436
  }
37706
38437
  else if (viewType === 'table') {
37707
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38438
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37708
38439
  <gn-dataset-view-table
37709
38440
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37710
38441
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37717,7 +38448,7 @@ class DataViewWebComponentComponent {
37717
38448
  ></gn-dataset-view-table>`;
37718
38449
  }
37719
38450
  else {
37720
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38451
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37721
38452
  <gn-dataset-view-map
37722
38453
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37723
38454
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37731,7 +38462,7 @@ class DataViewWebComponentComponent {
37731
38462
  }
37732
38463
  }));
37733
38464
  }
37734
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, deps: [{ token: Configuration }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
38465
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, deps: [{ token: Configuration }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
37735
38466
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataViewWebComponentComponent, isStandalone: true, selector: "gn-ui-data-view-web-component", inputs: { viewType: "viewType" }, ngImport: i0, template: "<gn-ui-copy-text-button\n [text]=\"webComponentHtml$ | async\"\n [rows]=\"3\"\n [tooltipText]=\"'tooltip.html.copy' | translate\"\n></gn-ui-copy-text-button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37736
38467
  }
37737
38468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
@@ -37740,9 +38471,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37740
38471
  }], ctorParameters: () => [{ type: Configuration, decorators: [{
37741
38472
  type: Inject,
37742
38473
  args: [Configuration]
37743
- }] }, { type: undefined, decorators: [{
37744
- type: Inject,
37745
- args: [GN_UI_VERSION]
37746
38474
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37747
38475
  type: Input
37748
38476
  }] } });
@@ -37838,6 +38566,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37838
38566
 
37839
38567
  marker('map.dropdown.placeholder');
37840
38568
  marker('wfs.feature.limit');
38569
+ marker('dataset.error.restrictedAccess');
37841
38570
  class MapViewComponent {
37842
38571
  set exceedsLimit(value) {
37843
38572
  this.excludeWfs$.next(value);
@@ -37889,6 +38618,10 @@ class MapViewComponent {
37889
38618
  this.hidePreview = false;
37890
38619
  this.loading = true;
37891
38620
  this.error = null;
38621
+ if (link.accessRestricted) {
38622
+ this.handleError('dataset.error.restrictedAccess');
38623
+ return of([]);
38624
+ }
37892
38625
  return this.getLayerFromLink(link).pipe(map$1((layer) => [layer]), catchError((e) => {
37893
38626
  this.handleError(e);
37894
38627
  return of([]);
@@ -38238,7 +38971,7 @@ class RecordMetaComponent {
38238
38971
  this.meta.removeTag('property="og:url"');
38239
38972
  this.meta.removeTag('property="og:title"');
38240
38973
  }
38241
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, deps: [{ token: i1$d.Meta }], target: i0.ɵɵFactoryTarget.Component }); }
38974
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, deps: [{ token: i1$e.Meta }], target: i0.ɵɵFactoryTarget.Component }); }
38242
38975
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RecordMetaComponent, isStandalone: true, selector: "gn-ui-record-meta", inputs: { metadata: "metadata" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
38243
38976
  }
38244
38977
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, decorators: [{
@@ -38249,7 +38982,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
38249
38982
  changeDetection: ChangeDetectionStrategy.OnPush,
38250
38983
  standalone: true,
38251
38984
  }]
38252
- }], ctorParameters: () => [{ type: i1$d.Meta }], propDecorators: { metadata: [{
38985
+ }], ctorParameters: () => [{ type: i1$e.Meta }], propDecorators: { metadata: [{
38253
38986
  type: Input
38254
38987
  }] } });
38255
38988
 
@@ -39297,7 +40030,7 @@ class ImportRecordComponent {
39297
40030
  },
39298
40031
  });
39299
40032
  }
39300
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportRecordComponent, deps: [{ token: i1$e.Router }, { token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: NotificationsService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
40033
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportRecordComponent, deps: [{ token: i1$d.Router }, { token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: NotificationsService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
39301
40034
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ImportRecordComponent, isStandalone: true, selector: "gn-ui-import-record", outputs: { closeImportMenu: "closeImportMenu" }, providers: [
39302
40035
  provideIcons({
39303
40036
  iconoirImport,
@@ -39328,7 +40061,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39328
40061
  size: '1.5em',
39329
40062
  }),
39330
40063
  ], template: "<ng-container [ngSwitch]=\"sectionDisplayed\">\n <ng-container *ngSwitchCase=\"'mainMenu'\">\n <div\n data-test=\"importMenuMainSection\"\n class=\"mt-2 border border-gray-100 p-2 flex items-center bg-white shadow-2xl rounded-2xl\"\n >\n <ul class=\"flex flex-col gap-2 w-full\">\n <li *ngFor=\"let menuItem of importMenuItems\">\n <gn-ui-button\n [attr.data-test]=\"menuItem.dataTest\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"menuItem.action()\"\n [disabled]=\"menuItem.disabled\"\n [title]=\"\n (menuItem.disabled ? 'editor.temporary.disabled' : '') | translate\n \"\n ><ng-icon [name]=\"menuItem.icon\"></ng-icon\n ><span>{{ menuItem.label }}</span></gn-ui-button\n >\n </li>\n </ul>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'importExternalFile'\">\n <div\n data-test=\"importMenuImportExternalFileSection\"\n class=\"p-6 flex flex-col gap-2 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-button\n data-test=\"importMenuImportExternalFileSectionBackButton\"\n type=\"light\"\n (buttonClick)=\"displayMainMenu()\"\n >\n <ng-icon name=\"iconoirArrowLeft\"></ng-icon>\n </gn-ui-button>\n <span class=\"font-bold\" translate\n >dashboard.importRecord.importExternal.title</span\n >\n <span translate>dashboard.importRecord.importExternal.subtitle</span>\n </div>\n <gn-ui-url-input\n (uploadClick)=\"importRecord($event)\"\n [disabled]=\"isRecordImportInProgress\"\n ></gn-ui-url-input>\n </div>\n </ng-container>\n</ng-container>\n" }]
39331
- }], ctorParameters: () => [{ type: i1$e.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
40064
+ }], ctorParameters: () => [{ type: i1$d.Router }, { type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: NotificationsService }, { type: RecordsRepositoryInterface }], propDecorators: { closeImportMenu: [{
39332
40065
  type: Output
39333
40066
  }] } });
39334
40067
 
@@ -39692,75 +40425,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39692
40425
  args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-array works!</p>\n" }]
39693
40426
  }] });
39694
40427
 
39695
- class FormFieldMapContainerComponent {
39696
- constructor() {
39697
- this.spatialExtents$ = new BehaviorSubject([]);
39698
- this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
39699
- if (extents.length === 0) {
39700
- return null; // null extent means default view
39701
- }
39702
- const featureCollection = {
39703
- type: 'FeatureCollection',
39704
- features: [],
39705
- };
39706
- extents.forEach((extent) => {
39707
- if (extent.geometry) {
39708
- featureCollection.features.push({
39709
- type: 'Feature',
39710
- properties: {},
39711
- geometry: extent.geometry,
39712
- });
39713
- }
39714
- else if (extent.bbox?.length >= 0) {
39715
- featureCollection.features.push({
39716
- type: 'Feature',
39717
- properties: {},
39718
- geometry: this.bboxCoordsToGeometry(extent.bbox),
39719
- });
39720
- }
39721
- });
39722
- const layer = {
39723
- type: 'geojson',
39724
- data: featureCollection,
39725
- label: 'Spatial extents',
39726
- style: {
39727
- 'stroke-color': 'black',
39728
- 'stroke-width': 2,
39729
- },
39730
- };
39731
- const view = await createViewFromLayer(layer);
39732
- return {
39733
- view,
39734
- layers: [layer],
39735
- };
39736
- }));
39737
- this.error = '';
39738
- }
39739
- set spatialExtents(value) {
39740
- this.spatialExtents$.next(value);
39741
- }
39742
- bboxCoordsToGeometry(bbox) {
39743
- const geometry = new Polygon([
39744
- [
39745
- [bbox[0], bbox[1]],
39746
- [bbox[0], bbox[3]],
39747
- [bbox[2], bbox[3]],
39748
- [bbox[2], bbox[1]],
39749
- [bbox[0], bbox[1]],
39750
- ],
39751
- ]);
39752
- return new GeoJSON().writeGeometryObject(geometry);
39753
- }
39754
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39755
- 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 }); }
39756
- }
39757
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, decorators: [{
39758
- type: Component,
39759
- 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" }]
39760
- }], propDecorators: { spatialExtents: [{
39761
- type: Input
39762
- }] } });
39763
-
39764
40428
  /**
39765
40429
  * This form field is not like the others, as it will read directly from the state to handle both spatial extents
39766
40430
  * and place keywords.
@@ -39857,16 +40521,16 @@ class FormFieldSpatialExtentComponent {
39857
40521
  this.editorFacade.updateRecordField('spatialExtents', spatialExtents);
39858
40522
  }
39859
40523
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, deps: [{ token: PlatformServiceInterface }, { token: EditorFacade }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
39860
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldSpatialExtentComponent, isStandalone: true, selector: "gn-ui-form-field-spatial-extent", ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-form-field-map-container\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-form-field-map-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: GenericKeywordsComponent, selector: "gn-ui-generic-keywords", inputs: ["keywords", "keywordTypes", "placeholder", "allowSubmit"], outputs: ["changedKeywords", "addedKeyword", "deletedKeyword"] }, { kind: "component", type: FormFieldMapContainerComponent, selector: "gn-ui-form-field-map-container", inputs: ["spatialExtents"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40524
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldSpatialExtentComponent, isStandalone: true, selector: "gn-ui-form-field-spatial-extent", ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-spatial-extent\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-spatial-extent>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: GenericKeywordsComponent, selector: "gn-ui-generic-keywords", inputs: ["keywords", "keywordTypes", "placeholder", "allowSubmit"], outputs: ["changedKeywords", "addedKeyword", "deletedKeyword"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: SpatialExtentComponent, selector: "gn-ui-spatial-extent", inputs: ["spatialExtents"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39861
40525
  }
39862
40526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
39863
40527
  type: Component,
39864
40528
  args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
39865
40529
  CommonModule,
39866
40530
  GenericKeywordsComponent,
39867
- FormFieldMapContainerComponent,
39868
40531
  TranslateModule,
39869
- ], template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-form-field-map-container\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-form-field-map-container>\n </div>\n</div>\n" }]
40532
+ SpatialExtentComponent,
40533
+ ], template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-spatial-extent\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-spatial-extent>\n </div>\n</div>\n" }]
39870
40534
  }], ctorParameters: () => [{ type: PlatformServiceInterface }, { type: EditorFacade }, { type: i1$1.TranslateService }] });
39871
40535
 
39872
40536
  class ContactCardComponent {
@@ -40124,9 +40788,8 @@ class OnlineResourceCardComponent {
40124
40788
  get subtitle() {
40125
40789
  switch (this.onlineResource.type) {
40126
40790
  case 'service':
40127
- return `${this.onlineResource.accessServiceProtocol}`;
40128
40791
  case 'endpoint':
40129
- return `${this.onlineResource.protocol}`;
40792
+ return `${this.onlineResource.accessServiceProtocol}`;
40130
40793
  case 'link':
40131
40794
  case 'download':
40132
40795
  return this.getFormat(this.onlineResource);
@@ -41283,6 +41946,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41283
41946
  const ROUTER_STATE_KEY = 'router';
41284
41947
  const ROUTER_ROUTE_SEARCH = 'search';
41285
41948
  const ROUTER_ROUTE_DATASET = 'dataset';
41949
+ const ROUTER_ROUTE_SERVICE = 'service';
41950
+ const ROUTER_ROUTE_REUSE = 'reuse';
41286
41951
  const ROUTER_ROUTE_ORGANIZATION = 'organization';
41287
41952
  var ROUTE_PARAMS;
41288
41953
  (function (ROUTE_PARAMS) {
@@ -41315,6 +41980,14 @@ class RouterService {
41315
41980
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
41316
41981
  component: this.routerConfig.recordRouteComponent,
41317
41982
  },
41983
+ {
41984
+ path: `${ROUTER_ROUTE_SERVICE}/:metadataUuid`,
41985
+ component: this.routerConfig.recordRouteComponent,
41986
+ },
41987
+ {
41988
+ path: `${ROUTER_ROUTE_REUSE}/:metadataUuid`,
41989
+ component: this.routerConfig.recordRouteComponent,
41990
+ },
41318
41991
  {
41319
41992
  path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
41320
41993
  component: this.routerConfig.organizationRouteComponent,
@@ -41327,7 +42000,7 @@ class RouterService {
41327
42000
  getOrganizationPageRoute() {
41328
42001
  return ROUTER_ROUTE_ORGANIZATION;
41329
42002
  }
41330
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$e.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
42003
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$d.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
41331
42004
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
41332
42005
  }
41333
42006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, decorators: [{
@@ -41338,7 +42011,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41338
42011
  }], ctorParameters: () => [{ type: undefined, decorators: [{
41339
42012
  type: Inject,
41340
42013
  args: [ROUTER_CONFIG]
41341
- }] }, { type: i1$e.Router }] });
42014
+ }] }, { type: i1$d.Router }] });
41342
42015
 
41343
42016
  const goAction = createAction('[Router] Go', props());
41344
42017
  const backAction = createAction('[Router] Back');
@@ -41410,13 +42083,19 @@ class RouterFacade {
41410
42083
  this.currentRoute$ = this.store.pipe(select(selectCurrentRoute));
41411
42084
  this.pathParams$ = this.store.pipe(select(selectRouteParams));
41412
42085
  this.searchParams$ = this.currentRoute$.pipe(filter((route) => !!route), filter((route) => route.url[0]?.path.startsWith(ROUTER_ROUTE_SEARCH)), map$1((route) => route.queryParams), distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), map$1(expandQueryParams));
42086
+ this.routeMap = {
42087
+ dataset: ROUTER_ROUTE_DATASET,
42088
+ service: ROUTER_ROUTE_SERVICE,
42089
+ reuse: ROUTER_ROUTE_REUSE,
42090
+ };
41413
42091
  }
41414
42092
  goToMetadata(metadata) {
42093
+ const selectedRoute = this.routeMap[metadata.kind] || ROUTER_ROUTE_DATASET;
41415
42094
  this.pathParams$
41416
42095
  .pipe(take(1), filter((params) => params.metadataUuid !== metadata.uniqueIdentifier))
41417
42096
  .subscribe(() => {
41418
42097
  this.go({
41419
- path: `${ROUTER_ROUTE_DATASET}/${metadata.uniqueIdentifier}`,
42098
+ path: `${selectedRoute}/${metadata.uniqueIdentifier}`,
41420
42099
  });
41421
42100
  this.store.dispatch(setIncompleteMetadata({ incomplete: metadata }));
41422
42101
  });
@@ -41643,12 +42322,12 @@ class RouterEffects {
41643
42322
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
41644
42323
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
41645
42324
  }
41646
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, deps: [{ token: i1$c.Actions }, { token: i1$e.Router }, { token: i1$2.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
42325
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, deps: [{ token: i1$c.Actions }, { token: i1$d.Router }, { token: i1$2.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
41647
42326
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
41648
42327
  }
41649
42328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
41650
42329
  type: Injectable
41651
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$e.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
42330
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$d.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
41652
42331
  type: Inject,
41653
42332
  args: [ROUTER_CONFIG]
41654
42333
  }] }, { type: FieldsService }] });
@@ -41708,5 +42387,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41708
42387
  * Generated bundle index. Do not edit.
41709
42388
  */
41710
42389
 
41711
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InteractiveTableColumnComponent, InteractiveTableComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
42390
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
41712
42391
  //# sourceMappingURL=geonetwork-ui.mjs.map