geonetwork-ui 2.6.0-dev.582b4530a → 2.6.0-dev.76a84fb05

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) 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 +3 -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/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +2 -3
  9. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -5
  11. package/esm2022/libs/feature/record/src/index.mjs +1 -2
  12. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +5 -9
  13. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +7 -11
  14. package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +1 -1
  15. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +8 -5
  16. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -6
  17. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +3 -1
  18. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  19. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +10 -2
  20. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -3
  21. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +8 -7
  22. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -15
  23. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -2
  24. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +26 -10
  25. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  26. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  27. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +3 -3
  28. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  29. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +8 -5
  30. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +161 -0
  31. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
  32. package/esm2022/libs/ui/inputs/src/index.mjs +1 -2
  33. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +4 -3
  34. package/esm2022/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.mjs +43 -3
  35. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  36. package/esm2022/libs/ui/map/src/index.mjs +2 -1
  37. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +79 -0
  38. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  39. package/esm2022/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.mjs +3 -3
  40. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +2 -1
  41. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  42. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  43. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  44. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  45. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +13 -6
  46. package/esm2022/translations/de.json +26 -4
  47. package/esm2022/translations/en.json +27 -5
  48. package/esm2022/translations/es.json +26 -4
  49. package/esm2022/translations/fr.json +28 -6
  50. package/esm2022/translations/it.json +26 -4
  51. package/esm2022/translations/nl.json +26 -4
  52. package/esm2022/translations/pt.json +26 -4
  53. package/fesm2022/geonetwork-ui.mjs +946 -480
  54. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  55. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  56. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  57. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  58. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -2
  59. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  60. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
  61. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +6 -6
  62. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  63. 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
  64. package/libs/feature/record/src/index.d.ts +0 -1
  65. package/libs/feature/record/src/index.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  67. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  68. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  69. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  70. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  71. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  72. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  73. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  74. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  75. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  76. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  77. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  78. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  79. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  80. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  81. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  82. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  83. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  84. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  85. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  86. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -1
  87. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -1
  88. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  89. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  90. package/libs/ui/elements/src/index.d.ts +1 -0
  91. package/libs/ui/elements/src/index.d.ts.map +1 -1
  92. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  93. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  94. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  95. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  96. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  97. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  98. package/libs/ui/inputs/src/index.d.ts +0 -1
  99. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  100. package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts.map +1 -1
  101. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts +10 -3
  102. package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts.map +1 -1
  103. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  104. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  105. package/libs/ui/map/src/index.d.ts +1 -0
  106. package/libs/ui/map/src/index.d.ts.map +1 -1
  107. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  108. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  109. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  110. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  111. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  112. package/libs/util/shared/src/index.d.ts +1 -0
  113. package/libs/util/shared/src/index.d.ts.map +1 -1
  114. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  115. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  116. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  117. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  118. package/libs/util/shared/src/lib/links/link-utils.d.ts +14 -7
  119. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  120. package/package.json +1 -1
  121. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  122. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  123. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  124. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  125. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  126. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  127. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  128. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  129. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  130. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  131. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -2
  132. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  133. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  134. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  135. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  136. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  137. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  138. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  139. package/src/libs/feature/record/src/index.ts +0 -1
  140. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  141. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  142. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  143. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  144. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  145. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  146. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  147. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  148. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  149. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +0 -6
  150. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +16 -8
  151. package/src/libs/feature/search/src/lib/feature-search.module.ts +0 -8
  152. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  153. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.css +6 -0
  154. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  155. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  156. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  157. package/src/libs/ui/elements/src/index.ts +1 -0
  158. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +2 -2
  159. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  160. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  161. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  162. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  163. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  164. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  165. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -0
  166. package/src/libs/ui/inputs/src/index.ts +0 -1
  167. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +5 -5
  168. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.ts +2 -1
  169. package/src/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.ts +46 -2
  170. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  171. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  172. package/src/libs/ui/map/src/index.ts +1 -0
  173. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  174. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  175. 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
  176. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  177. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  178. package/src/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.html +1 -0
  179. package/src/libs/util/app-config/src/lib/app-config.ts +1 -0
  180. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  181. package/src/libs/util/shared/src/index.ts +1 -0
  182. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  183. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  184. package/src/libs/util/shared/src/lib/links/link-utils.ts +30 -12
  185. package/tailwind.base.css +18 -13
  186. package/translations/de.json +26 -4
  187. package/translations/en.json +27 -5
  188. package/translations/es.json +26 -4
  189. package/translations/fr.json +28 -6
  190. package/translations/it.json +26 -4
  191. package/translations/nl.json +26 -4
  192. package/translations/pt.json +26 -4
  193. package/translations/sk.json +26 -4
  194. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  195. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  196. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +0 -16
  197. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  198. 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
  199. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  200. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  201. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts +0 -8
  202. package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts.map +0 -1
  203. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  204. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  205. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +0 -3
  206. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +0 -9
  207. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.ts +0 -15
  208. /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/service-capabilities/service-capabilities.component.css} +0 -0
@@ -7,17 +7,17 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker';
7
7
  import { format } from 'date-fns/format';
8
8
  import { Namespace, Literal, lit, parse as parse$2, sym, BlankNode, graph } from 'rdflib';
9
9
  import * as i0 from '@angular/core';
10
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, ContentChild, ContentChildren, TemplateRef, Host, ElementRef, ViewChildren, ViewContainerRef, Pipe, ViewEncapsulation, inject } from '@angular/core';
10
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, ContentChild, ContentChildren, TemplateRef, Host, ElementRef, ViewChildren, ViewContainerRef, ViewEncapsulation, Pipe, inject } from '@angular/core';
11
11
  import * as i1 from '@angular/common/http';
12
12
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpEventType, HttpClientXsrfModule } from '@angular/common/http';
13
13
  import * as i1$1 from '@ngx-translate/core';
14
14
  import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
15
15
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
16
16
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
17
- import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, first as first$1, share, pairwise, delay, defaultIfEmpty, toArray } from 'rxjs/operators';
17
+ import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, delay, first as first$1, share, pairwise, defaultIfEmpty, toArray } from 'rxjs/operators';
18
18
  import * as i1$2 from '@angular/common';
19
- import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgClass, NgIf, NgTemplateOutlet, NgOptimizedImage, DatePipe } from '@angular/common';
20
- import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, filter as filter$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, timer, takeUntil, EMPTY, mergeMap as mergeMap$1, startWith as startWith$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
19
+ import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgIf, NgClass, NgTemplateOutlet, NgOptimizedImage, DatePipe } from '@angular/common';
20
+ import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, timer, filter as filter$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, 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';
@@ -41,7 +41,7 @@ import { TagInputModule } from 'ngx-chips';
41
41
  import * as i1$5 from '@angular/material/progress-spinner';
42
42
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
43
43
  import tippy from 'tippy.js';
44
- import { matErrorOutlineOutline, matInfoOutline, matComputerOutline, matCallOutline, matLocationOnOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matLocationSearchingOutline, matEmailOutline, matPhoneOutline, matSendOutline, matMapOutline, matCloudDownloadOutline, matHomeWorkOutline, matSwipeOutline, matLayersOutline, matAddCircleOutlineOutline } from '@ng-icons/material-icons/outline';
44
+ import { matErrorOutlineOutline, matInfoOutline, matComputerOutline, matCallOutline, matLocationOnOutline, matSwipeOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matLocationSearchingOutline, matEmailOutline, matPhoneOutline, matSendOutline, matMapOutline, matCloudDownloadOutline, matHomeWorkOutline, matLayersOutline, matAddCircleOutlineOutline } from '@ng-icons/material-icons/outline';
45
45
  import * as i2 from '@angular/material/core';
46
46
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
47
47
  import * as i1$7 from '@angular/material/checkbox';
@@ -58,11 +58,17 @@ import * as i1$b from '@angular/material/dialog';
58
58
  import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
59
59
  import * as i2$3 from '@angular/material/tabs';
60
60
  import { MatTabsModule } from '@angular/material/tabs';
61
- import * as i1$e from '@angular/router';
61
+ import * as i1$d from '@angular/router';
62
62
  import { RouterLink, RouterModule, RouteReuseStrategy } from '@angular/router';
63
63
  import { marked } from 'marked';
64
64
  import Duration from 'duration-relativetimeformat';
65
65
  import * as basicLightbox from 'basiclightbox';
66
+ import { FeaturesClickEventType, FeaturesHoverEventType, MapClickEventType, SourceLoadErrorType, computeMapContextDiff, createViewFromLayer } from '@geospatial-sdk/core';
67
+ import { listen, createMapFromContext, applyContextDiffToMap } from '@geospatial-sdk/openlayers';
68
+ import { createLegendFromLayer } from '@geospatial-sdk/legend';
69
+ import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
70
+ import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
71
+ import { Polygon } from 'ol/geom';
66
72
  import { formatDistance } from 'date-fns/formatDistance';
67
73
  import { enUS, sk, pt as pt$1, nl as nl$1, it as it$1, es as es$1, de as de$1, fr as fr$1 } from 'date-fns/locale';
68
74
  import { MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
@@ -72,11 +78,6 @@ import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
72
78
  import { valid as valid$1 } from 'geojson-validation';
73
79
  import { trigger, transition, animate, keyframes, style } from '@angular/animations';
74
80
  import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
75
- import { FeaturesClickEventType, FeaturesHoverEventType, MapClickEventType, SourceLoadErrorType, computeMapContextDiff, createViewFromLayer } from '@geospatial-sdk/core';
76
- import { listen, createMapFromContext, applyContextDiffToMap } from '@geospatial-sdk/openlayers';
77
- import { createLegendFromLayer } from '@geospatial-sdk/legend';
78
- import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
79
- import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
80
81
  import { extend } from 'ol/extent';
81
82
  import * as TOML from '@ltd/j-toml';
82
83
  import { Style, Fill, Stroke, Circle } from 'ol/style';
@@ -96,9 +97,8 @@ import * as i4 from '@angular/material/paginator';
96
97
  import { MatPaginatorIntl, MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
97
98
  import { LetDirective } from '@ngrx/component';
98
99
  import axios from 'axios';
99
- import * as i1$d from '@angular/platform-browser';
100
+ import * as i1$e from '@angular/platform-browser';
100
101
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
101
- import { Polygon } from 'ol/geom';
102
102
  import * as i4$1 from '@angular/material/radio';
103
103
  import { MatRadioModule } from '@angular/material/radio';
104
104
  import { MatIconModule } from '@angular/material/icon';
@@ -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
  }
@@ -18664,7 +18664,6 @@ var de = {
18664
18664
  "datahub.news.contact.title": "Ein spezielles Bedürfnis?",
18665
18665
  "datahub.news.feed": "Nachrichtenfeed",
18666
18666
  "datahub.news.figures": "Indikatoren",
18667
- "datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
18668
18667
  "datahub.search.back": "Zurück",
18669
18668
  "datahub.search.filter.all": "Alle",
18670
18669
  "datahub.search.filter.generatedByAPI": "Generiert durch eine API",
@@ -18835,6 +18834,7 @@ var de = {
18835
18834
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18836
18835
  "editor.record.loadError.closeMessage": "Verstanden",
18837
18836
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18837
+ "editor.record.lock.format": "",
18838
18838
  "editor.record.lock.reason": "",
18839
18839
  "editor.record.onlineResource.protocol.other": "",
18840
18840
  "editor.record.onlineResourceError.body": "",
@@ -18894,7 +18894,6 @@ var de = {
18894
18894
  "input.image.dropFileLabel": "",
18895
18895
  "input.image.selectFileLabel": "",
18896
18896
  "input.image.uploadErrorLabel": "",
18897
- "input.image.uploadErrorRetry": "",
18898
18897
  "input.image.uploadProgressCancel": "",
18899
18898
  "input.image.uploadProgressLabel": "",
18900
18899
  "language.ca": "Katalanisch",
@@ -18934,6 +18933,7 @@ var de = {
18934
18933
  "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
18935
18934
  "multiselect.filter.placeholder": "Suche",
18936
18935
  "nav.back": "Zurück",
18936
+ "navbar.mobile.menuTitle": "Schnellzugriff",
18937
18937
  next: next$6,
18938
18938
  "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
18939
18939
  "organisation.filter.placeholder": "Ergebnisse filtern",
@@ -18960,6 +18960,7 @@ var de = {
18960
18960
  "record.card.metadata.contact": "",
18961
18961
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
18962
18962
  "record.feature.limit": "Die Vorschau wurde aufgrund zu vieler Elemente deaktiviert",
18963
+ "record.kind.data": "",
18963
18964
  "record.kind.dataset": "",
18964
18965
  "record.kind.reuse": "",
18965
18966
  "record.kind.service": "",
@@ -18996,6 +18997,7 @@ var de = {
18996
18997
  "record.metadata.api.form.zoneTitle": "",
18997
18998
  "record.metadata.api.form.zoneTooltip": "",
18998
18999
  "record.metadata.api.gpfdl": "",
19000
+ "record.metadata.capabilities": "",
18999
19001
  "record.metadata.catalog": "Katalog",
19000
19002
  "record.metadata.contact": "Kontakt",
19001
19003
  "record.metadata.creation": "Erstellungsdatum",
@@ -19032,13 +19034,12 @@ var de = {
19032
19034
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19033
19035
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19034
19036
  "record.metadata.related": "Ähnliche Datensätze",
19035
- "record.metadata.related.contents": "Verwandte Inhalte",
19037
+ "record.metadata.related.contents": "",
19036
19038
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19037
19039
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19038
19040
  "record.metadata.status": "Status",
19039
19041
  "record.metadata.status.notPublished": "",
19040
19042
  "record.metadata.status.published": "",
19041
- "record.metadata.technical": "Technische Informationen",
19042
19043
  "record.metadata.temporalExtent": "Zeitlicher Umfang",
19043
19044
  "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
19044
19045
  "record.metadata.temporalExtent.sinceDate": "Seit {start}",
@@ -19075,6 +19076,7 @@ var de = {
19075
19076
  "results.sortBy.popularity": "Beliebtheit",
19076
19077
  "results.sortBy.qualityScore": "Qualitätsbewertung",
19077
19078
  "results.sortBy.relevancy": "Relevanz",
19079
+ "reuse.metadata.access": "",
19078
19080
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
19079
19081
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
19080
19082
  "search.error.organizationHasNoDataset": "",
@@ -19124,6 +19126,26 @@ var de = {
19124
19126
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
19125
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.",
19126
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": "",
19127
19149
  "share.tab.permalink": "Teilen",
19128
19150
  "share.tab.webComponent": "Integrieren",
19129
19151
  "table.loading.data": "Daten werden geladen...",
@@ -19218,7 +19240,6 @@ var en = {
19218
19240
  "datahub.news.contact.title": "A specific need?",
19219
19241
  "datahub.news.feed": "News feed",
19220
19242
  "datahub.news.figures": "Indicators",
19221
- "datahub.record.addToFavorites": "Add to favorites",
19222
19243
  "datahub.search.back": "Back",
19223
19244
  "datahub.search.filter.all": "All",
19224
19245
  "datahub.search.filter.generatedByAPI": "Generated by an API",
@@ -19389,6 +19410,7 @@ var en = {
19389
19410
  "editor.record.loadError.body": "The dataset could not be loaded:",
19390
19411
  "editor.record.loadError.closeMessage": "Understood",
19391
19412
  "editor.record.loadError.title": "Error loading dataset",
19413
+ "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
19392
19414
  "editor.record.lock.reason": "You are not an editor of the allowed groups",
19393
19415
  "editor.record.onlineResource.protocol.other": "Other",
19394
19416
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
@@ -19448,7 +19470,6 @@ var en = {
19448
19470
  "input.image.dropFileLabel": "or drop it here",
19449
19471
  "input.image.selectFileLabel": "Select an image",
19450
19472
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19451
- "input.image.uploadErrorRetry": "Retry",
19452
19473
  "input.image.uploadProgressCancel": "Cancel",
19453
19474
  "input.image.uploadProgressLabel": "Upload in progress...",
19454
19475
  "language.ca": "Catalan",
@@ -19488,6 +19509,7 @@ var en = {
19488
19509
  "map.wms.urlInput.hint": "Enter WMS service URL",
19489
19510
  "multiselect.filter.placeholder": "Search",
19490
19511
  "nav.back": "Back",
19512
+ "navbar.mobile.menuTitle": "Quick access",
19491
19513
  next: next$5,
19492
19514
  "ogc.unreachable.unknown": "The service could not be reached",
19493
19515
  "organisation.filter.placeholder": "Filter results",
@@ -19514,7 +19536,8 @@ var en = {
19514
19536
  "record.card.metadata.contact": "Metadata Contact",
19515
19537
  "record.externalViewer.open": "Open in the external map viewer",
19516
19538
  "record.feature.limit": "Preview disabled due to too many elements",
19517
- "record.kind.dataset": "Data",
19539
+ "record.kind.data": "Data",
19540
+ "record.kind.dataset": "Dataset",
19518
19541
  "record.kind.reuse": "Reuse",
19519
19542
  "record.kind.service": "Service",
19520
19543
  "record.metadata.about": "Description",
@@ -19550,6 +19573,7 @@ var en = {
19550
19573
  "record.metadata.api.form.zoneTitle": "Zone",
19551
19574
  "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
19552
19575
  "record.metadata.api.gpfdl": "Data download",
19576
+ "record.metadata.capabilities": "Service capabilities",
19553
19577
  "record.metadata.catalog": "Catalog",
19554
19578
  "record.metadata.contact": "Contact",
19555
19579
  "record.metadata.creation": "Date of creation",
@@ -19586,13 +19610,12 @@ var en = {
19586
19610
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19587
19611
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19588
19612
  "record.metadata.related": "Related datasets",
19589
- "record.metadata.related.contents": "Related contents",
19613
+ "record.metadata.related.contents": "Related content",
19590
19614
  "record.metadata.ressources.and.links": "Resources and links",
19591
19615
  "record.metadata.sheet": "Original metadata",
19592
19616
  "record.metadata.status": "Status",
19593
19617
  "record.metadata.status.notPublished": "Not published",
19594
19618
  "record.metadata.status.published": "Published",
19595
- "record.metadata.technical": "Technical information",
19596
19619
  "record.metadata.temporalExtent": "Temporal extent",
19597
19620
  "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
19598
19621
  "record.metadata.temporalExtent.sinceDate": "Since { start }",
@@ -19629,6 +19652,7 @@ var en = {
19629
19652
  "results.sortBy.popularity": "Popularity",
19630
19653
  "results.sortBy.qualityScore": "Quality score",
19631
19654
  "results.sortBy.relevancy": "Relevancy",
19655
+ "reuse.metadata.access": "Access the reuse",
19632
19656
  "search.autocomplete.error": "Suggestions could not be fetched:",
19633
19657
  "search.error.couldNotReachApi": "The API could not be reached",
19634
19658
  "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
@@ -19678,6 +19702,26 @@ var en = {
19678
19702
  "search.filters.useSpatialFilter": "Show datasets in the area of interest first",
19679
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.",
19680
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",
19681
19725
  "share.tab.permalink": "Share",
19682
19726
  "share.tab.webComponent": "Integrate",
19683
19727
  "table.loading.data": "Loading data...",
@@ -19772,7 +19816,6 @@ var es = {
19772
19816
  "datahub.news.contact.title": "",
19773
19817
  "datahub.news.feed": "",
19774
19818
  "datahub.news.figures": "",
19775
- "datahub.record.addToFavorites": "",
19776
19819
  "datahub.search.back": "",
19777
19820
  "datahub.search.filter.all": "",
19778
19821
  "datahub.search.filter.generatedByAPI": "",
@@ -19943,6 +19986,7 @@ var es = {
19943
19986
  "editor.record.loadError.body": "",
19944
19987
  "editor.record.loadError.closeMessage": "",
19945
19988
  "editor.record.loadError.title": "",
19989
+ "editor.record.lock.format": "",
19946
19990
  "editor.record.lock.reason": "",
19947
19991
  "editor.record.onlineResource.protocol.other": "",
19948
19992
  "editor.record.onlineResourceError.body": "",
@@ -20002,7 +20046,6 @@ var es = {
20002
20046
  "input.image.dropFileLabel": "",
20003
20047
  "input.image.selectFileLabel": "",
20004
20048
  "input.image.uploadErrorLabel": "",
20005
- "input.image.uploadErrorRetry": "",
20006
20049
  "input.image.uploadProgressCancel": "",
20007
20050
  "input.image.uploadProgressLabel": "",
20008
20051
  "language.ca": "Catalán",
@@ -20042,6 +20085,7 @@ var es = {
20042
20085
  "map.wms.urlInput.hint": "",
20043
20086
  "multiselect.filter.placeholder": "",
20044
20087
  "nav.back": "",
20088
+ "navbar.mobile.menuTitle": "Acceso rápido",
20045
20089
  next: next$4,
20046
20090
  "ogc.unreachable.unknown": "",
20047
20091
  "organisation.filter.placeholder": "",
@@ -20068,6 +20112,7 @@ var es = {
20068
20112
  "record.card.metadata.contact": "",
20069
20113
  "record.externalViewer.open": "",
20070
20114
  "record.feature.limit": "",
20115
+ "record.kind.data": "",
20071
20116
  "record.kind.dataset": "",
20072
20117
  "record.kind.reuse": "",
20073
20118
  "record.kind.service": "",
@@ -20104,6 +20149,7 @@ var es = {
20104
20149
  "record.metadata.api.form.zoneTitle": "",
20105
20150
  "record.metadata.api.form.zoneTooltip": "",
20106
20151
  "record.metadata.api.gpfdl": "",
20152
+ "record.metadata.capabilities": "",
20107
20153
  "record.metadata.catalog": "",
20108
20154
  "record.metadata.contact": "",
20109
20155
  "record.metadata.creation": "",
@@ -20140,13 +20186,12 @@ var es = {
20140
20186
  "record.metadata.quality.updateFrequency.failed": "",
20141
20187
  "record.metadata.quality.updateFrequency.success": "",
20142
20188
  "record.metadata.related": "",
20143
- "record.metadata.related.contents": "Contenidos relacionados",
20189
+ "record.metadata.related.contents": "",
20144
20190
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20145
20191
  "record.metadata.sheet": "",
20146
20192
  "record.metadata.status": "",
20147
20193
  "record.metadata.status.notPublished": "",
20148
20194
  "record.metadata.status.published": "",
20149
- "record.metadata.technical": "",
20150
20195
  "record.metadata.temporalExtent": "",
20151
20196
  "record.metadata.temporalExtent.fromDateToDate": "",
20152
20197
  "record.metadata.temporalExtent.sinceDate": "",
@@ -20183,6 +20228,7 @@ var es = {
20183
20228
  "results.sortBy.popularity": "",
20184
20229
  "results.sortBy.qualityScore": "",
20185
20230
  "results.sortBy.relevancy": "",
20231
+ "reuse.metadata.access": "",
20186
20232
  "search.autocomplete.error": "",
20187
20233
  "search.error.couldNotReachApi": "",
20188
20234
  "search.error.organizationHasNoDataset": "",
@@ -20232,6 +20278,26 @@ var es = {
20232
20278
  "search.filters.useSpatialFilter": "",
20233
20279
  "search.filters.useSpatialFilterHelp": "",
20234
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": "",
20235
20301
  "share.tab.permalink": "",
20236
20302
  "share.tab.webComponent": "",
20237
20303
  "table.loading.data": "",
@@ -20326,7 +20392,6 @@ var fr = {
20326
20392
  "datahub.news.contact.title": "Un besoin spécifique ?",
20327
20393
  "datahub.news.feed": "Fil d'activité",
20328
20394
  "datahub.news.figures": "Quelques chiffres",
20329
- "datahub.record.addToFavorites": "Ajouter aux favoris",
20330
20395
  "datahub.search.back": "Retour",
20331
20396
  "datahub.search.filter.all": "Tous",
20332
20397
  "datahub.search.filter.generatedByAPI": "généré par une API",
@@ -20497,6 +20562,7 @@ var fr = {
20497
20562
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20498
20563
  "editor.record.loadError.closeMessage": "Compris",
20499
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",
20500
20566
  "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
20501
20567
  "editor.record.onlineResource.protocol.other": "Autre",
20502
20568
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
@@ -20556,7 +20622,6 @@ var fr = {
20556
20622
  "input.image.dropFileLabel": "ou glissez-la ici",
20557
20623
  "input.image.selectFileLabel": "Sélectionnez une image",
20558
20624
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20559
- "input.image.uploadErrorRetry": "Réessayer",
20560
20625
  "input.image.uploadProgressCancel": "Annuler",
20561
20626
  "input.image.uploadProgressLabel": "Chargement en cours...",
20562
20627
  "language.ca": "Catalan",
@@ -20596,6 +20661,7 @@ var fr = {
20596
20661
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20597
20662
  "multiselect.filter.placeholder": "Rechercher",
20598
20663
  "nav.back": "Retour",
20664
+ "navbar.mobile.menuTitle": "Navigation rapide",
20599
20665
  next: next$3,
20600
20666
  "ogc.unreachable.unknown": "Le service n'est pas accessible",
20601
20667
  "organisation.filter.placeholder": "Filtrer les résultats",
@@ -20622,10 +20688,11 @@ var fr = {
20622
20688
  "record.card.metadata.contact": "Contact de la métadonnée ",
20623
20689
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
20624
20690
  "record.feature.limit": "L’aperçu a été désactivé en raison d’un trop grand nombre d'éléments",
20691
+ "record.kind.data": "Donnée",
20625
20692
  "record.kind.dataset": "Donnée",
20626
20693
  "record.kind.reuse": "Réutilisation",
20627
20694
  "record.kind.service": "Service",
20628
- "record.metadata.about": "Description",
20695
+ "record.metadata.about": "A propos",
20629
20696
  "record.metadata.api": "API",
20630
20697
  "record.metadata.api.form.closeButton": "Fermer",
20631
20698
  "record.metadata.api.form.closeForm": "Fermer le panneau de personnalisation",
@@ -20658,6 +20725,7 @@ var fr = {
20658
20725
  "record.metadata.api.form.zoneTitle": "Zone",
20659
20726
  "record.metadata.api.form.zoneTooltip": "Menu déroulant pour sélectionner une zone géographique",
20660
20727
  "record.metadata.api.gpfdl": "Téléchargement",
20728
+ "record.metadata.capabilities": "Capacités du service",
20661
20729
  "record.metadata.catalog": "Catalogue",
20662
20730
  "record.metadata.contact": "Contact",
20663
20731
  "record.metadata.creation": "Date de création",
@@ -20667,7 +20735,7 @@ var fr = {
20667
20735
  "record.metadata.keywords": "Mots-clés",
20668
20736
  "record.metadata.languages": "Langues",
20669
20737
  "record.metadata.lastUpdate": "Mis à jour le {date}",
20670
- "record.metadata.links": "Liens",
20738
+ "record.metadata.links": "Ressources & liens",
20671
20739
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20672
20740
  "record.metadata.otherConstraints": "Limitations d'usage",
20673
20741
  "record.metadata.owner": "Catalogue d'origine",
@@ -20694,13 +20762,12 @@ var fr = {
20694
20762
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20695
20763
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20696
20764
  "record.metadata.related": "Voir aussi",
20697
- "record.metadata.related.contents": "Contenus associés",
20765
+ "record.metadata.related.contents": "Contenu associé",
20698
20766
  "record.metadata.ressources.and.links": "Ressources et liens",
20699
20767
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20700
20768
  "record.metadata.status": "Statut",
20701
20769
  "record.metadata.status.notPublished": "Non publié",
20702
20770
  "record.metadata.status.published": "Publié",
20703
- "record.metadata.technical": "Informations techniques",
20704
20771
  "record.metadata.temporalExtent": "Étendue temporelle",
20705
20772
  "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
20706
20773
  "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
@@ -20737,6 +20804,7 @@ var fr = {
20737
20804
  "results.sortBy.popularity": "Popularité",
20738
20805
  "results.sortBy.qualityScore": "Indicateur de qualité",
20739
20806
  "results.sortBy.relevancy": "Pertinence",
20807
+ "reuse.metadata.access": "Accéder à la réutilisation",
20740
20808
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
20741
20809
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
20742
20810
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
@@ -20786,6 +20854,26 @@ var fr = {
20786
20854
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
20787
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.",
20788
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",
20789
20877
  "share.tab.permalink": "Partager",
20790
20878
  "share.tab.webComponent": "Intégrer",
20791
20879
  "table.loading.data": "Chargement des données...",
@@ -20880,7 +20968,6 @@ var it = {
20880
20968
  "datahub.news.contact.title": "Ha un bisogno specifico?",
20881
20969
  "datahub.news.feed": "Feed di attività",
20882
20970
  "datahub.news.figures": "Alcune figure",
20883
- "datahub.record.addToFavorites": "Aggiungere a miei preferiti",
20884
20971
  "datahub.search.back": "Ritorna",
20885
20972
  "datahub.search.filter.all": "Tutti",
20886
20973
  "datahub.search.filter.generatedByAPI": "generato da un'API",
@@ -21051,6 +21138,7 @@ var it = {
21051
21138
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21052
21139
  "editor.record.loadError.closeMessage": "Capito",
21053
21140
  "editor.record.loadError.title": "Errore durante il caricamento",
21141
+ "editor.record.lock.format": "",
21054
21142
  "editor.record.lock.reason": "Non è un editore di uno dei gruppi autorizzati",
21055
21143
  "editor.record.onlineResource.protocol.other": "Altro",
21056
21144
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
@@ -21110,7 +21198,6 @@ var it = {
21110
21198
  "input.image.dropFileLabel": "oppure trascinalo qui",
21111
21199
  "input.image.selectFileLabel": "Seleziona un'immagine",
21112
21200
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21113
- "input.image.uploadErrorRetry": "Riprova",
21114
21201
  "input.image.uploadProgressCancel": "Annulla",
21115
21202
  "input.image.uploadProgressLabel": "Caricamento...",
21116
21203
  "language.ca": "Catalano",
@@ -21150,6 +21237,7 @@ var it = {
21150
21237
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21151
21238
  "multiselect.filter.placeholder": "Cerca",
21152
21239
  "nav.back": "Indietro",
21240
+ "navbar.mobile.menuTitle": "",
21153
21241
  next: next$2,
21154
21242
  "ogc.unreachable.unknown": "Il servizio non è accessibile",
21155
21243
  "organisation.filter.placeholder": "Filtra i risultati",
@@ -21176,6 +21264,7 @@ var it = {
21176
21264
  "record.card.metadata.contact": "",
21177
21265
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
21178
21266
  "record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
21267
+ "record.kind.data": "",
21179
21268
  "record.kind.dataset": "",
21180
21269
  "record.kind.reuse": "",
21181
21270
  "record.kind.service": "",
@@ -21212,6 +21301,7 @@ var it = {
21212
21301
  "record.metadata.api.form.zoneTitle": "Zona",
21213
21302
  "record.metadata.api.form.zoneTooltip": "Menu a discesa per selezionare una zona geografica",
21214
21303
  "record.metadata.api.gpfdl": "Scarica",
21304
+ "record.metadata.capabilities": "",
21215
21305
  "record.metadata.catalog": "Catalogo",
21216
21306
  "record.metadata.contact": "Contatto",
21217
21307
  "record.metadata.creation": "Data di creazione",
@@ -21248,13 +21338,12 @@ var it = {
21248
21338
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21249
21339
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21250
21340
  "record.metadata.related": "Vedi anche",
21251
- "record.metadata.related.contents": "Contenuti correlati",
21341
+ "record.metadata.related.contents": "",
21252
21342
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21253
21343
  "record.metadata.sheet": "Origine del metadata",
21254
21344
  "record.metadata.status": "Stato",
21255
21345
  "record.metadata.status.notPublished": "Non pubblicato",
21256
21346
  "record.metadata.status.published": "Pubblicato",
21257
- "record.metadata.technical": "Informazioni tecniche",
21258
21347
  "record.metadata.temporalExtent": "Periodo di tempo",
21259
21348
  "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
21260
21349
  "record.metadata.temporalExtent.sinceDate": "Dal {start}",
@@ -21291,6 +21380,7 @@ var it = {
21291
21380
  "results.sortBy.popularity": "Popolarità",
21292
21381
  "results.sortBy.qualityScore": "Indicatore di qualità",
21293
21382
  "results.sortBy.relevancy": "Rilevanza",
21383
+ "reuse.metadata.access": "",
21294
21384
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
21295
21385
  "search.error.couldNotReachApi": "Problema di connessione all'API",
21296
21386
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora dati.",
@@ -21340,6 +21430,26 @@ var it = {
21340
21430
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
21341
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.",
21342
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": "",
21343
21453
  "share.tab.permalink": "Condividere",
21344
21454
  "share.tab.webComponent": "Incorporare",
21345
21455
  "table.loading.data": "Caricamento dei dati...",
@@ -21434,7 +21544,6 @@ var nl = {
21434
21544
  "datahub.news.contact.title": "",
21435
21545
  "datahub.news.feed": "",
21436
21546
  "datahub.news.figures": "",
21437
- "datahub.record.addToFavorites": "",
21438
21547
  "datahub.search.back": "",
21439
21548
  "datahub.search.filter.all": "",
21440
21549
  "datahub.search.filter.generatedByAPI": "",
@@ -21605,6 +21714,7 @@ var nl = {
21605
21714
  "editor.record.loadError.body": "",
21606
21715
  "editor.record.loadError.closeMessage": "",
21607
21716
  "editor.record.loadError.title": "",
21717
+ "editor.record.lock.format": "",
21608
21718
  "editor.record.lock.reason": "",
21609
21719
  "editor.record.onlineResource.protocol.other": "",
21610
21720
  "editor.record.onlineResourceError.body": "",
@@ -21664,7 +21774,6 @@ var nl = {
21664
21774
  "input.image.dropFileLabel": "",
21665
21775
  "input.image.selectFileLabel": "",
21666
21776
  "input.image.uploadErrorLabel": "",
21667
- "input.image.uploadErrorRetry": "",
21668
21777
  "input.image.uploadProgressCancel": "",
21669
21778
  "input.image.uploadProgressLabel": "",
21670
21779
  "language.ca": "Catalaans",
@@ -21704,6 +21813,7 @@ var nl = {
21704
21813
  "map.wms.urlInput.hint": "",
21705
21814
  "multiselect.filter.placeholder": "",
21706
21815
  "nav.back": "",
21816
+ "navbar.mobile.menuTitle": "",
21707
21817
  next: next$1,
21708
21818
  "ogc.unreachable.unknown": "",
21709
21819
  "organisation.filter.placeholder": "",
@@ -21730,6 +21840,7 @@ var nl = {
21730
21840
  "record.card.metadata.contact": "",
21731
21841
  "record.externalViewer.open": "",
21732
21842
  "record.feature.limit": "",
21843
+ "record.kind.data": "",
21733
21844
  "record.kind.dataset": "",
21734
21845
  "record.kind.reuse": "",
21735
21846
  "record.kind.service": "",
@@ -21766,6 +21877,7 @@ var nl = {
21766
21877
  "record.metadata.api.form.zoneTitle": "",
21767
21878
  "record.metadata.api.form.zoneTooltip": "",
21768
21879
  "record.metadata.api.gpfdl": "",
21880
+ "record.metadata.capabilities": "",
21769
21881
  "record.metadata.catalog": "",
21770
21882
  "record.metadata.contact": "",
21771
21883
  "record.metadata.creation": "",
@@ -21802,13 +21914,12 @@ var nl = {
21802
21914
  "record.metadata.quality.updateFrequency.failed": "",
21803
21915
  "record.metadata.quality.updateFrequency.success": "",
21804
21916
  "record.metadata.related": "",
21805
- "record.metadata.related.contents": "Gerelateerde inhoud",
21917
+ "record.metadata.related.contents": "",
21806
21918
  "record.metadata.ressources.and.links": "Bronnen en links",
21807
21919
  "record.metadata.sheet": "",
21808
21920
  "record.metadata.status": "",
21809
21921
  "record.metadata.status.notPublished": "",
21810
21922
  "record.metadata.status.published": "",
21811
- "record.metadata.technical": "",
21812
21923
  "record.metadata.temporalExtent": "",
21813
21924
  "record.metadata.temporalExtent.fromDateToDate": "",
21814
21925
  "record.metadata.temporalExtent.sinceDate": "",
@@ -21845,6 +21956,7 @@ var nl = {
21845
21956
  "results.sortBy.popularity": "",
21846
21957
  "results.sortBy.qualityScore": "",
21847
21958
  "results.sortBy.relevancy": "",
21959
+ "reuse.metadata.access": "",
21848
21960
  "search.autocomplete.error": "",
21849
21961
  "search.error.couldNotReachApi": "",
21850
21962
  "search.error.organizationHasNoDataset": "",
@@ -21894,6 +22006,26 @@ var nl = {
21894
22006
  "search.filters.useSpatialFilter": "",
21895
22007
  "search.filters.useSpatialFilterHelp": "",
21896
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": "",
21897
22029
  "share.tab.permalink": "",
21898
22030
  "share.tab.webComponent": "",
21899
22031
  "table.loading.data": "",
@@ -21988,7 +22120,6 @@ var pt = {
21988
22120
  "datahub.news.contact.title": "",
21989
22121
  "datahub.news.feed": "",
21990
22122
  "datahub.news.figures": "",
21991
- "datahub.record.addToFavorites": "",
21992
22123
  "datahub.search.back": "",
21993
22124
  "datahub.search.filter.all": "",
21994
22125
  "datahub.search.filter.generatedByAPI": "",
@@ -22159,6 +22290,7 @@ var pt = {
22159
22290
  "editor.record.loadError.body": "",
22160
22291
  "editor.record.loadError.closeMessage": "",
22161
22292
  "editor.record.loadError.title": "",
22293
+ "editor.record.lock.format": "",
22162
22294
  "editor.record.lock.reason": "",
22163
22295
  "editor.record.onlineResource.protocol.other": "",
22164
22296
  "editor.record.onlineResourceError.body": "",
@@ -22218,7 +22350,6 @@ var pt = {
22218
22350
  "input.image.dropFileLabel": "",
22219
22351
  "input.image.selectFileLabel": "",
22220
22352
  "input.image.uploadErrorLabel": "",
22221
- "input.image.uploadErrorRetry": "",
22222
22353
  "input.image.uploadProgressCancel": "",
22223
22354
  "input.image.uploadProgressLabel": "",
22224
22355
  "language.ca": "Catalão",
@@ -22258,6 +22389,7 @@ var pt = {
22258
22389
  "map.wms.urlInput.hint": "",
22259
22390
  "multiselect.filter.placeholder": "",
22260
22391
  "nav.back": "",
22392
+ "navbar.mobile.menuTitle": "",
22261
22393
  next: next,
22262
22394
  "ogc.unreachable.unknown": "",
22263
22395
  "organisation.filter.placeholder": "",
@@ -22284,6 +22416,7 @@ var pt = {
22284
22416
  "record.card.metadata.contact": "",
22285
22417
  "record.externalViewer.open": "",
22286
22418
  "record.feature.limit": "",
22419
+ "record.kind.data": "",
22287
22420
  "record.kind.dataset": "",
22288
22421
  "record.kind.reuse": "",
22289
22422
  "record.kind.service": "",
@@ -22320,6 +22453,7 @@ var pt = {
22320
22453
  "record.metadata.api.form.zoneTitle": "",
22321
22454
  "record.metadata.api.form.zoneTooltip": "",
22322
22455
  "record.metadata.api.gpfdl": "",
22456
+ "record.metadata.capabilities": "",
22323
22457
  "record.metadata.catalog": "",
22324
22458
  "record.metadata.contact": "",
22325
22459
  "record.metadata.creation": "",
@@ -22356,13 +22490,12 @@ var pt = {
22356
22490
  "record.metadata.quality.updateFrequency.failed": "",
22357
22491
  "record.metadata.quality.updateFrequency.success": "",
22358
22492
  "record.metadata.related": "",
22359
- "record.metadata.related.contents": "Conteúdos relacionados",
22493
+ "record.metadata.related.contents": "",
22360
22494
  "record.metadata.ressources.and.links": "Recursos e links",
22361
22495
  "record.metadata.sheet": "",
22362
22496
  "record.metadata.status": "",
22363
22497
  "record.metadata.status.notPublished": "",
22364
22498
  "record.metadata.status.published": "",
22365
- "record.metadata.technical": "",
22366
22499
  "record.metadata.temporalExtent": "",
22367
22500
  "record.metadata.temporalExtent.fromDateToDate": "",
22368
22501
  "record.metadata.temporalExtent.sinceDate": "",
@@ -22399,6 +22532,7 @@ var pt = {
22399
22532
  "results.sortBy.popularity": "",
22400
22533
  "results.sortBy.qualityScore": "",
22401
22534
  "results.sortBy.relevancy": "",
22535
+ "reuse.metadata.access": "",
22402
22536
  "search.autocomplete.error": "",
22403
22537
  "search.error.couldNotReachApi": "",
22404
22538
  "search.error.organizationHasNoDataset": "",
@@ -22448,6 +22582,26 @@ var pt = {
22448
22582
  "search.filters.useSpatialFilter": "",
22449
22583
  "search.filters.useSpatialFilterHelp": "",
22450
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": "",
22451
22605
  "share.tab.permalink": "",
22452
22606
  "share.tab.webComponent": "",
22453
22607
  "table.loading.data": "",
@@ -22796,8 +22950,8 @@ class Gn4FieldMapper {
22796
22950
  return {
22797
22951
  ...distribution,
22798
22952
  type,
22799
- endpointUrl: url,
22800
- protocol: accessServiceProtocol,
22953
+ url: url,
22954
+ accessServiceProtocol: accessServiceProtocol,
22801
22955
  };
22802
22956
  }
22803
22957
  };
@@ -23193,14 +23347,6 @@ class ElasticsearchService {
23193
23347
  }
23194
23348
  mustNotFilters() {
23195
23349
  return [
23196
- {
23197
- ...this.queryFilterOnValues('resourceType', [
23198
- 'service',
23199
- 'map',
23200
- 'map/static',
23201
- 'mapDigital',
23202
- ]),
23203
- },
23204
23350
  {
23205
23351
  query_string: {
23206
23352
  query: 'resourceType:featureCatalog AND !resourceType:dataset AND !cl_level.key:dataset',
@@ -23299,7 +23445,7 @@ class ElasticsearchService {
23299
23445
  must_not: this.mustNotFilters(),
23300
23446
  },
23301
23447
  },
23302
- _source: ['resourceTitleObject', 'uuid'],
23448
+ _source: ['resourceTitleObject', 'uuid', 'resourceType'],
23303
23449
  from: 0,
23304
23450
  size: 20,
23305
23451
  };
@@ -25037,7 +25183,7 @@ function getLinkLabel(link) {
25037
25183
  default:
25038
25184
  format = getFileFormat(link);
25039
25185
  }
25040
- const label = link.description || link.name;
25186
+ const label = link.description || ('name' in link ? link.name : '');
25041
25187
  return format ? `${label} (${format})` : label;
25042
25188
  }
25043
25189
  async function getLayers(url, serviceProtocol) {
@@ -25048,14 +25194,21 @@ async function getLayers(url, serviceProtocol) {
25048
25194
  }
25049
25195
  case 'wfs': {
25050
25196
  const endpointWfs = await new WfsEndpoint(url).isReady();
25051
- 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;
25052
25202
  }
25053
25203
  case 'wms': {
25054
25204
  const endpointWms = await new WmsEndpoint(url).isReady();
25055
- return endpointWms
25205
+ const layers = (await endpointWms
25056
25206
  .getLayers()
25057
25207
  .flatMap(wmsLayerFlatten)
25058
- .filter((l) => l.name);
25208
+ .filter((l) => l.name)).map((collection) => {
25209
+ return endpointWms.getLayerByName(collection.name);
25210
+ });
25211
+ return layers;
25059
25212
  }
25060
25213
  case 'wmts': {
25061
25214
  const endpointWmts = await new WmtsEndpoint(url).isReady();
@@ -25092,6 +25245,7 @@ var LinkUsage;
25092
25245
  class LinkClassifierService {
25093
25246
  getUsagesForLink(link) {
25094
25247
  switch (link.type) {
25248
+ case 'endpoint':
25095
25249
  case 'service': {
25096
25250
  switch (link.accessServiceProtocol) {
25097
25251
  case 'esriRest':
@@ -25140,6 +25294,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25140
25294
  }]
25141
25295
  }] });
25142
25296
 
25297
+ var name = "geonetwork-ui";
25298
+ var version = "2.6.0-dev.76a84fb05";
25299
+ var engines = {
25300
+ node: ">=20"
25301
+ };
25302
+ var main = "./index.ts";
25303
+ var type = "module";
25304
+ var exports = {
25305
+ "./tailwind.base.config.js": "./tailwind.base.config.js",
25306
+ "./style.css": "./style.css"
25307
+ };
25308
+ var repository = {
25309
+ url: "https://github.com/geonetwork/geonetwork-ui"
25310
+ };
25311
+ var peerDependencies = {
25312
+ "@angular/animations": "17.x || 18.x || 19.x",
25313
+ "@angular/cdk": "17.x || 18.x || 19.x",
25314
+ "@angular/common": "17.x || 18.x || 19.x",
25315
+ "@angular/compiler": "17.x || 18.x || 19.x",
25316
+ "@angular/core": "17.x || 18.x || 19.x",
25317
+ "@angular/forms": "17.x || 18.x || 19.x",
25318
+ "@angular/material": "17.x || 18.x || 19.x",
25319
+ "@angular/material-moment-adapter": "17.x || 18.x || 19.x",
25320
+ "@angular/platform-browser": "17.x || 18.x || 19.x",
25321
+ "@angular/platform-browser-dynamic": "17.x || 18.x || 19.x",
25322
+ "@angular/router": "17.x || 18.x || 19.x",
25323
+ "@ngrx/component": "17.x || 18.x || 19.x",
25324
+ "@ngrx/effects": "17.x || 18.x || 19.x",
25325
+ "@ngrx/router-store": "17.x || 18.x || 19.x",
25326
+ "@ngrx/store": "17.x || 18.x || 19.x",
25327
+ "@ngrx/store-devtools": "17.x || 18.x || 19.x",
25328
+ "@ngrx/operators": "18.x",
25329
+ "@ngx-translate/core": "15.x",
25330
+ "@ngx-translate/http-loader": "16.x",
25331
+ rxjs: "7.x",
25332
+ "zone.js": "*",
25333
+ tailwindcss: "3.x"
25334
+ };
25335
+ var dependencies = {
25336
+ "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
25337
+ "@camptocamp/ogc-client": "1.1.1-dev.3e2d3cc",
25338
+ "@geospatial-sdk/core": "0.0.5-dev.31",
25339
+ "@geospatial-sdk/geocoding": "0.0.5-dev.31",
25340
+ "@geospatial-sdk/legend": "0.0.5-dev.31",
25341
+ "@geospatial-sdk/openlayers": "0.0.5-dev.31",
25342
+ "@ltd/j-toml": "~1.35.2",
25343
+ "@messageformat/core": "^3.0.1",
25344
+ "@ng-icons/core": "29.10.0",
25345
+ "@ng-icons/iconoir": "29.10.0",
25346
+ "@ng-icons/material-icons": "29.10.0",
25347
+ "@ng-icons/tabler-icons": "29.10.0",
25348
+ "@nx/angular": "20.2.2",
25349
+ "@rgrove/parse-xml": "4.2.0",
25350
+ alasql: "4.6.0",
25351
+ axios: "1.7.9",
25352
+ basiclightbox: "^5.0.4",
25353
+ "chart.js": "4.4.7",
25354
+ "chroma-js": "3.1.2",
25355
+ "date-fns": "4.1.0",
25356
+ "document-register-element": "^1.14.10",
25357
+ "duration-relativetimeformat": "^2.0.4",
25358
+ "embla-carousel": "8.5.1",
25359
+ express: "^4.21.1",
25360
+ "geojson-validation": "^1.0.2",
25361
+ marked: "15.0.4",
25362
+ moment: "2.30.1",
25363
+ "ng-table-virtual-scroll": "1.6.1",
25364
+ "ngx-chips": "3.0.0",
25365
+ "ngx-dropzone": "3.1.0",
25366
+ "ngx-translate-messageformat-compiler": "7.0.0",
25367
+ ol: "^8.2.0",
25368
+ papaparse: "5.4.1",
25369
+ pg: "^8.9.0",
25370
+ proj4: "^2.9.2",
25371
+ rdflib: "^2.2.35",
25372
+ "reflect-metadata": "^0.1.13",
25373
+ semver: "7.6.3",
25374
+ "tippy.js": "6.3.7",
25375
+ tslib: "^2.3.0",
25376
+ typeorm: "^0.3.14",
25377
+ "whatwg-fetch": "^3.6.2",
25378
+ xlsx: "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz"
25379
+ };
25380
+ var packageJson = {
25381
+ name: name,
25382
+ version: version,
25383
+ engines: engines,
25384
+ main: main,
25385
+ type: type,
25386
+ exports: exports,
25387
+ repository: repository,
25388
+ peerDependencies: peerDependencies,
25389
+ dependencies: dependencies
25390
+ };
25391
+
25392
+ const GEONETWORK_UI_VERSION = packageJson.version;
25393
+ const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1] === 'dev'
25394
+ ? 'main'
25395
+ : `v${packageJson.version}`;
25396
+
25143
25397
  const minApiVersion = '4.2.2';
25144
25398
  class Gn4PlatformService {
25145
25399
  constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService, httpClient, recordsApiService) {
@@ -25333,12 +25587,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25333
25587
  type: Injectable
25334
25588
  }], ctorParameters: () => [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }, { type: i1.HttpClient }, { type: RecordsApiService }] });
25335
25589
 
25590
+ class RecordsRepositoryInterface {
25591
+ }
25592
+
25336
25593
  function provideGn4() {
25337
25594
  return [
25338
25595
  {
25339
25596
  provide: PlatformServiceInterface,
25340
25597
  useClass: Gn4PlatformService,
25341
25598
  },
25599
+ {
25600
+ provide: RecordsRepositoryInterface,
25601
+ useClass: Gn4Repository,
25602
+ },
25342
25603
  Gn4PlatformMapper,
25343
25604
  ];
25344
25605
  }
@@ -25414,7 +25675,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25414
25675
 
25415
25676
  class AnchorLinkDirective {
25416
25677
  get elementClass() {
25417
- 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
+ }
25418
25687
  }
25419
25688
  constructor(changeDetector) {
25420
25689
  this.changeDetector = changeDetector;
@@ -25422,6 +25691,8 @@ class AnchorLinkDirective {
25422
25691
  this.observer = new MutationObserver(() => {
25423
25692
  this.refreshDisabledState();
25424
25693
  });
25694
+ this.inView = false;
25695
+ this.initialized = false;
25425
25696
  }
25426
25697
  ngOnInit() {
25427
25698
  this.observer.observe(document.body, {
@@ -25430,8 +25701,32 @@ class AnchorLinkDirective {
25430
25701
  });
25431
25702
  this.refreshDisabledState();
25432
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
+ }
25433
25725
  ngOnDestroy() {
25434
25726
  this.observer.disconnect();
25727
+ if (this.intersectionObserver) {
25728
+ this.intersectionObserver.disconnect();
25729
+ }
25435
25730
  }
25436
25731
  refreshDisabledState() {
25437
25732
  const targetNotPresent = !document.getElementById(this.targetId);
@@ -25450,7 +25745,7 @@ class AnchorLinkDirective {
25450
25745
  });
25451
25746
  }
25452
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 }); }
25453
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: AnchorLinkDirective, selector: "[gnUiAnchorLink]", inputs: { targetId: ["gnUiAnchorLink", "targetId"], disabledClass: ["gnUiAnchorLinkDisabledClass", "disabledClass"], enabledClass: ["gnUiAnchorLinkEnabledClass", "enabledClass"] }, host: { listeners: { "click": "scrollToTarget()" }, properties: { "class": "this.elementClass" } }, ngImport: i0 }); }
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 }); }
25454
25749
  }
25455
25750
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorLinkDirective, decorators: [{
25456
25751
  type: Directive,
@@ -25466,6 +25761,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25466
25761
  }], enabledClass: [{
25467
25762
  type: Input,
25468
25763
  args: ['gnUiAnchorLinkEnabledClass']
25764
+ }], inViewClass: [{
25765
+ type: Input,
25766
+ args: ['gnUiAnchorLinkInViewClass']
25767
+ }], outOfViewClass: [{
25768
+ type: Input,
25769
+ args: ['gnUiAnchorLinkOutOfViewClass']
25469
25770
  }], elementClass: [{
25470
25771
  type: HostBinding,
25471
25772
  args: ['class']
@@ -25730,6 +26031,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25730
26031
  type: Output
25731
26032
  }] } });
25732
26033
 
26034
+ marker('editor.record.lock.reason');
26035
+ marker('editor.record.lock.format');
25733
26036
  class InteractiveTableComponent {
25734
26037
  constructor() {
25735
26038
  this.items = [];
@@ -25747,15 +26050,24 @@ class InteractiveTableComponent {
25747
26050
  .join(' '),
25748
26051
  };
25749
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
+ }
25750
26062
  handleRowClick(item) {
25751
26063
  this.itemClick.emit(item);
25752
26064
  }
25753
26065
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25754
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items", isDraftPage: "isDraftPage" }, outputs: { itemClick: "itemClick" }, providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"\n !item.extras?.edit && !isDraftPage\n ? ('editor.record.lock.reason' | translate)\n : ''\n \"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n !item.extras?.edit && !isDraftPage,\n 'group-hover:text-main group-hover:bg-gray-50':\n item.extras?.edit || isDraftPage,\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 }); }
25755
26067
  }
25756
26068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
25757
26069
  type: Component,
25758
- args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"\n !item.extras?.edit && !isDraftPage\n ? ('editor.record.lock.reason' | translate)\n : ''\n \"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n !item.extras?.edit && !isDraftPage,\n 'group-hover:text-main group-hover:bg-gray-50':\n item.extras?.edit || isDraftPage,\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"] }]
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"] }]
25759
26071
  }], propDecorators: { columns: [{
25760
26072
  type: ContentChildren,
25761
26073
  args: [InteractiveTableColumnComponent]
@@ -25999,11 +26311,11 @@ class ProgressBarComponent {
25999
26311
  }
26000
26312
  }
26001
26313
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26002
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"], dependencies: [{ kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
26314
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"], dependencies: [{ kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] }); }
26003
26315
  }
26004
26316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProgressBarComponent, decorators: [{
26005
26317
  type: Component,
26006
- args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [NgSwitch, NgSwitchCase, NgSwitchDefault], template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
26318
+ args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [NgSwitch, NgSwitchCase, NgSwitchDefault], template: "<ng-container [ngSwitch]=\"type\">\n <!-- Light Theme -->\n <ng-container *ngSwitchCase=\"'light'\">\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} text-xs font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n </ng-container>\n\n <!-- Default / Primary / Secondary Themes -->\n <ng-container *ngSwitchDefault>\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
26007
26319
  }], propDecorators: { value: [{
26008
26320
  type: Input
26009
26321
  }], type: [{
@@ -27397,19 +27709,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
27397
27709
  type: Input
27398
27710
  }] } });
27399
27711
 
27400
- class NavigationButtonComponent {
27401
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27402
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NavigationButtonComponent, isStandalone: true, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <ng-icon [name]=\"icon\" class=\"align-middle w-[18px]\"></ng-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27403
- }
27404
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigationButtonComponent, decorators: [{
27405
- type: Component,
27406
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgIcon], standalone: true, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <ng-icon [name]=\"icon\" class=\"align-middle w-[18px]\"></ng-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
27407
- }], propDecorators: { label: [{
27408
- type: Input
27409
- }], icon: [{
27410
- type: Input
27411
- }] } });
27412
-
27413
27712
  class SearchInputComponent {
27414
27713
  constructor() {
27415
27714
  this.value = '';
@@ -27468,11 +27767,11 @@ class StarToggleComponent {
27468
27767
  event.preventDefault();
27469
27768
  }
27470
27769
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27471
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StarToggleComponent, isStandalone: true, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [provideIcons({ matStar, matStarBorder })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 }); }
27472
27771
  }
27473
27772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StarToggleComponent, decorators: [{
27474
27773
  type: Component,
27475
- args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIcon], viewProviders: [provideIcons({ matStar, matStarBorder })], template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled,\n }\"\n >\n <ng-icon [name]=\"toggled ? 'matStar' : 'matStarBorder'\"></ng-icon>\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
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"] }]
27476
27775
  }], propDecorators: { toggled: [{
27477
27776
  type: Input
27478
27777
  }], disabled: [{
@@ -29384,7 +29683,7 @@ class MetadataContactComponent {
29384
29683
  this.organizationClick.emit(this.shownOrganization);
29385
29684
  }
29386
29685
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29387
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
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: [
29388
29687
  provideIcons({
29389
29688
  matOpenInNew,
29390
29689
  matCallOutline,
@@ -29404,7 +29703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29404
29703
  matPersonOutline,
29405
29704
  matLocationOnOutline,
29406
29705
  }),
29407
- ], template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
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" }]
29408
29707
  }], propDecorators: { metadata: [{
29409
29708
  type: Input
29410
29709
  }], organizationClick: [{
@@ -29489,6 +29788,316 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29489
29788
  }]
29490
29789
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] });
29491
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
+
29492
30101
  class MetadataInfoComponent {
29493
30102
  constructor(dateService) {
29494
30103
  this.dateService = dateService;
@@ -29541,7 +30150,7 @@ class MetadataInfoComponent {
29541
30150
  }
29542
30151
  }
29543
30152
  get temporalExtent() {
29544
- const temporalExtents = this.metadata.temporalExtents;
30153
+ const temporalExtents = this.metadata.kind === 'dataset' ? this.metadata.temporalExtents : [];
29545
30154
  return getTemporalRangeUnion(temporalExtents, this.dateService);
29546
30155
  }
29547
30156
  get shownOrganization() {
@@ -29563,7 +30172,7 @@ class MetadataInfoComponent {
29563
30172
  return this.dateService.formatDateTime(date);
29564
30173
  }
29565
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 }); }
29566
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataInfoComponent, isStandalone: true, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-primary text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }], viewProviders: [
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: [
29567
30176
  provideIcons({
29568
30177
  matOpenInNew,
29569
30178
  matMailOutline: matMailOutline$1,
@@ -29584,12 +30193,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29584
30193
  CopyTextButtonComponent,
29585
30194
  NgIcon,
29586
30195
  GnUiLinkifyDirective,
30196
+ MapContainerComponent,
30197
+ SpatialExtentComponent,
29587
30198
  ], viewProviders: [
29588
30199
  provideIcons({
29589
30200
  matOpenInNew,
29590
30201
  matMailOutline: matMailOutline$1,
29591
30202
  }),
29592
- ], template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-primary text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}\n"] }]
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"] }]
29593
30204
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
29594
30205
  type: Input
29595
30206
  }], incomplete: [{
@@ -29961,7 +30572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29961
30572
  type: Input
29962
30573
  }] } });
29963
30574
 
29964
- marker('record.kind.dataset');
30575
+ marker('record.kind.data');
29965
30576
  marker('record.kind.reuse');
29966
30577
  marker('record.kind.service');
29967
30578
  class InternalLinkCardComponent {
@@ -30041,7 +30652,7 @@ class InternalLinkCardComponent {
30041
30652
  return { text: '', icon: '' };
30042
30653
  switch (this.record.kind.toLowerCase()) {
30043
30654
  case 'dataset':
30044
- return { text: 'record.kind.dataset', icon: 'iconoirDatabase' };
30655
+ return { text: 'record.kind.data', icon: 'iconoirDatabase' };
30045
30656
  case 'reuse':
30046
30657
  return { text: 'record.kind.reuse', icon: 'iconoirMap' };
30047
30658
  case 'service':
@@ -30109,6 +30720,154 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30109
30720
  type: Output
30110
30721
  }] } });
30111
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
+
30112
30871
  class UiElementsModule {
30113
30872
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
30114
30873
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, declarations: [AvatarComponent, UserPreviewComponent], imports: [CommonModule,
@@ -30128,13 +30887,15 @@ class UiElementsModule {
30128
30887
  TextInputComponent,
30129
30888
  ImageInputComponent,
30130
30889
  ApplicationBannerComponent,
30131
- InternalLinkCardComponent], exports: [ThumbnailComponent,
30890
+ InternalLinkCardComponent,
30891
+ ServiceCapabilitiesComponent], exports: [ThumbnailComponent,
30132
30892
  AvatarComponent,
30133
30893
  UserPreviewComponent,
30134
30894
  MarkdownParserComponent,
30135
30895
  ImageInputComponent,
30136
30896
  ApplicationBannerComponent,
30137
- InternalLinkCardComponent] }); }
30897
+ InternalLinkCardComponent,
30898
+ ServiceCapabilitiesComponent] }); }
30138
30899
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, providers: [
30139
30900
  provideNgIconsConfig({
30140
30901
  size: '1.5em',
@@ -30155,7 +30916,8 @@ class UiElementsModule {
30155
30916
  TextInputComponent,
30156
30917
  ImageInputComponent,
30157
30918
  ApplicationBannerComponent,
30158
- InternalLinkCardComponent] }); }
30919
+ InternalLinkCardComponent,
30920
+ ServiceCapabilitiesComponent] }); }
30159
30921
  }
30160
30922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
30161
30923
  type: NgModule,
@@ -30181,6 +30943,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30181
30943
  ImageInputComponent,
30182
30944
  ApplicationBannerComponent,
30183
30945
  InternalLinkCardComponent,
30946
+ ServiceCapabilitiesComponent,
30184
30947
  ],
30185
30948
  providers: [
30186
30949
  provideNgIconsConfig({
@@ -30196,6 +30959,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30196
30959
  ImageInputComponent,
30197
30960
  ApplicationBannerComponent,
30198
30961
  InternalLinkCardComponent,
30962
+ ServiceCapabilitiesComponent,
30199
30963
  ],
30200
30964
  }]
30201
30965
  }] });
@@ -30536,8 +31300,9 @@ class ResultsTableComponent {
30536
31300
  return getBadgeColor(format);
30537
31301
  }
30538
31302
  handleRecordClick(item) {
30539
- if (item?.extras?.edit || this.isDraftPage)
31303
+ if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
30540
31304
  this.recordClick.emit(item);
31305
+ }
30541
31306
  }
30542
31307
  handleDuplicate(item) {
30543
31308
  this.duplicateRecord.emit(item);
@@ -30574,7 +31339,7 @@ class ResultsTableComponent {
30574
31339
  this.recordsSelectedChange.emit([[record], selected]);
30575
31340
  }
30576
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 }); }
30577
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete", isDraftPage: "isDraftPage", isDuplicating: "isDuplicating" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", rollbackDraft: "rollbackDraft", recordsSelectedChange: "recordsSelectedChange" }, providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"!item.extras?.edit && !isDraftPage\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"item.extras?.edit || isDraftPage\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"!item.extras?.edit && !isDraftPage\"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light': !item.extras?.edit && !isDraftPage,\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items", "isDraftPage"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "width", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "canDelete", "isDraftPage"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
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"] }] }); }
30578
31343
  }
30579
31344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
30580
31345
  type: Component,
@@ -30588,7 +31353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30588
31353
  ActionMenuComponent,
30589
31354
  NgIconComponent,
30590
31355
  CdkOverlayOrigin,
30591
- ], providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"!item.extras?.edit && !isDraftPage\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"item.extras?.edit || isDraftPage\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"!item.extras?.edit && !isDraftPage\"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light': !item.extras?.edit && !isDraftPage,\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
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" }]
30592
31357
  }], ctorParameters: () => [{ type: i1$9.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
30593
31358
  type: Input
30594
31359
  }], selectedRecordsIdentifiers: [{
@@ -31619,9 +32384,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31619
32384
  type: Injectable
31620
32385
  }], ctorParameters: () => [{ type: SearchFacade }] });
31621
32386
 
31622
- class RecordsRepositoryInterface {
31623
- }
31624
-
31625
32387
  class FuzzySearchComponent {
31626
32388
  constructor(searchFacade, searchService, recordsRepository) {
31627
32389
  this.searchFacade = searchFacade;
@@ -31760,7 +32522,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31760
32522
  }] }] });
31761
32523
 
31762
32524
  // expects the replacement key ${uuid}
31763
- 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');
31764
32528
 
31765
32529
  class FavoriteStarComponent {
31766
32530
  set record(value) {
@@ -31787,9 +32551,10 @@ class FavoriteStarComponent {
31787
32551
  this.isAnonymous$ = this.platformService.isAnonymous();
31788
32552
  this.loading = false;
31789
32553
  this.loginUrl = this.authService.loginUrl;
31790
- 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', {
31791
32556
  link: this.loginUrl,
31792
- });
32557
+ })));
31793
32558
  }
31794
32559
  ngAfterViewInit() {
31795
32560
  this.subscription = this.isAnonymous$
@@ -31845,11 +32610,11 @@ class FavoriteStarComponent {
31845
32610
  });
31846
32611
  }
31847
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 }); }
31848
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FavoriteStarComponent, isStandalone: true, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 mt-0.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 }); }
31849
32614
  }
31850
32615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, decorators: [{
31851
32616
  type: Component,
31852
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, StarToggleComponent], template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 mt-0.5\"\n data-test=\"favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5\"\n data-test=\"favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
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" }]
31853
32618
  }], ctorParameters: () => [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }], propDecorators: { displayCount: [{
31854
32619
  type: Input
31855
32620
  }], record: [{
@@ -31860,10 +32625,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31860
32625
  }] } });
31861
32626
 
31862
32627
  class ResultsListContainerComponent {
31863
- constructor(facade, resultsLayoutConfig, recordUrlTemplate) {
32628
+ constructor(facade, resultsLayoutConfig, recordDatasetUrlTemplate, recordServiceUrlTemplate, recordReuseUrlTemplate) {
31864
32629
  this.facade = facade;
31865
32630
  this.resultsLayoutConfig = resultsLayoutConfig;
31866
- this.recordUrlTemplate = recordUrlTemplate;
32631
+ this.recordDatasetUrlTemplate = recordDatasetUrlTemplate;
32632
+ this.recordServiceUrlTemplate = recordServiceUrlTemplate;
32633
+ this.recordReuseUrlTemplate = recordReuseUrlTemplate;
31867
32634
  this.showMore = 'auto';
31868
32635
  this.mdSelect = new EventEmitter();
31869
32636
  this.errorTypes = ErrorType;
@@ -31895,16 +32662,24 @@ class ResultsListContainerComponent {
31895
32662
  this.facade.scroll();
31896
32663
  }
31897
32664
  getRecordUrl(metadata) {
31898
- 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)
31899
32673
  return null;
31900
- return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
32674
+ const urlKind = tokenMap[metadata.kind];
32675
+ return urlKind.replace('${uuid}', metadata.uniqueIdentifier);
31901
32676
  }
31902
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }, { token: RECORD_URL_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
31903
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: { metadataQualityDisplay: "metadataQualityDisplay", layout: "layout", showMore: "showMore" }, outputs: { mdSelect: "mdSelect" }, ngImport: i0, template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ResultsListComponent, selector: "gn-ui-results-list", inputs: ["records", "layoutConfig", "favoriteTemplate", "recordUrlGetter", "metadataQualityDisplay"], outputs: ["mdSelect"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: ["isInViewport", "entersViewport", "exitsViewport"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ErrorComponent, selector: "gn-ui-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] }); }
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" }] }); }
31904
32679
  }
31905
32680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
31906
32681
  type: Component,
31907
- args: [{ selector: 'gn-ui-results-list-container', template: "<div *ngIf=\"(error$ | async) === null\" class=\"search-results relative\">\n <gn-ui-results-list\n [records]=\"facade.results$ | async\"\n [layoutConfig]=\"layoutConfig$ | async\"\n [metadataQualityDisplay]=\"\n metadataQualityDisplay && (pipelineForQualityScoreActivated | async)\n \"\n [favoriteTemplate]=\"favoriteToggle\"\n [recordUrlGetter]=\"recordUrlGetter\"\n (mdSelect)=\"onMetadataSelection($event)\"\n ></gn-ui-results-list>\n <ng-container *ngIf=\"allowShowMore$ | async\">\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n" }]
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"] }]
31908
32683
  }], ctorParameters: () => [{ type: SearchFacade }, { type: undefined, decorators: [{
31909
32684
  type: Inject,
31910
32685
  args: [RESULTS_LAYOUT_CONFIG]
@@ -31912,7 +32687,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31912
32687
  type: Optional
31913
32688
  }, {
31914
32689
  type: Inject,
31915
- 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]
31916
32697
  }] }], propDecorators: { metadataQualityDisplay: [{
31917
32698
  type: Input
31918
32699
  }], layout: [{
@@ -32664,12 +33445,7 @@ class FeatureSearchModule {
32664
33445
  FacetsModule,
32665
33446
  SearchStateContainerDirective,
32666
33447
  FilterDropdownComponent] }); }
32667
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, providers: [
32668
- {
32669
- provide: RecordsRepositoryInterface,
32670
- useClass: Gn4Repository,
32671
- },
32672
- ], imports: [CommonModule,
33448
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, imports: [CommonModule,
32673
33449
  TranslateModule.forChild(),
32674
33450
  StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
32675
33451
  initialState,
@@ -32731,12 +33507,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32731
33507
  SearchStateContainerDirective,
32732
33508
  FilterDropdownComponent,
32733
33509
  ],
32734
- providers: [
32735
- {
32736
- provide: RecordsRepositoryInterface,
32737
- useClass: Gn4Repository,
32738
- },
32739
- ],
32740
33510
  }]
32741
33511
  }] });
32742
33512
 
@@ -33224,247 +33994,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33224
33994
  }]
33225
33995
  }] });
33226
33996
 
33227
- const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
33228
- const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
33229
- const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
33230
- factory: () => ({}),
33231
- });
33232
- const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
33233
- factory: () => ({
33234
- fill: { color: 'rgba(255, 255, 255, 0.2)' },
33235
- stroke: { color: '#ffcc33', width: 2 },
33236
- }),
33237
- });
33238
-
33239
- const DEFAULT_BASEMAP_LAYER = {
33240
- type: 'xyz',
33241
- url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
33242
- attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
33243
- };
33244
- const DEFAULT_VIEW = {
33245
- center: [0, 15],
33246
- zoom: 2,
33247
- };
33248
- class MapContainerComponent {
33249
- get featuresClick() {
33250
- if (!this._featuresClick) {
33251
- this.openlayersMap.then((olMap) => {
33252
- listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
33253
- });
33254
- this._featuresClick = new EventEmitter();
33255
- }
33256
- return this._featuresClick;
33257
- }
33258
- get featuresHover() {
33259
- if (!this._featuresHover) {
33260
- this.openlayersMap.then((olMap) => {
33261
- listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
33262
- });
33263
- this._featuresHover = new EventEmitter();
33264
- }
33265
- return this._featuresHover;
33266
- }
33267
- get mapClick() {
33268
- if (!this._mapClick) {
33269
- this.openlayersMap.then((olMap) => {
33270
- listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
33271
- });
33272
- this._mapClick = new EventEmitter();
33273
- }
33274
- return this._mapClick;
33275
- }
33276
- get sourceLoadError() {
33277
- if (!this._sourceLoadError) {
33278
- this.openlayersMap.then((olMap) => {
33279
- listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
33280
- });
33281
- this._sourceLoadError = new EventEmitter();
33282
- }
33283
- return this._sourceLoadError;
33284
- }
33285
- constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
33286
- this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
33287
- this.basemapLayers = basemapLayers;
33288
- this.mapViewConstraints = mapViewConstraints;
33289
- this.openlayersMap = new Promise((resolve) => {
33290
- this.olMapResolver = resolve;
33291
- });
33292
- }
33293
- async ngAfterViewInit() {
33294
- this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
33295
- this.displayMessage$ = merge(fromEvent(this.olMap, 'mapmuted').pipe(map$1(() => true)), fromEvent(this.olMap, 'movestart').pipe(map$1(() => false)), fromEvent(this.olMap, 'singleclick').pipe(map$1(() => false))).pipe(switchMap$1((muted) => muted
33296
- ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
33297
- : of(false)));
33298
- this.olMapResolver(this.olMap);
33299
- }
33300
- async ngOnChanges(changes) {
33301
- if ('context' in changes && !changes['context'].isFirstChange()) {
33302
- const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
33303
- await applyContextDiffToMap(this.olMap, diff);
33304
- }
33305
- }
33306
- // This will apply basemap layers & view constraints
33307
- processContext(context) {
33308
- const processed = context
33309
- ? { ...context, view: context.view ?? DEFAULT_VIEW }
33310
- : { layers: [], view: DEFAULT_VIEW };
33311
- if (this.basemapLayers.length) {
33312
- processed.layers = [...this.basemapLayers, ...processed.layers];
33313
- }
33314
- if (!this.doNotUseDefaultBasemap) {
33315
- processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
33316
- }
33317
- if (this.mapViewConstraints.maxZoom) {
33318
- processed.view = {
33319
- maxZoom: this.mapViewConstraints.maxZoom,
33320
- ...processed.view,
33321
- };
33322
- }
33323
- if (this.mapViewConstraints.maxExtent) {
33324
- processed.view = {
33325
- maxExtent: this.mapViewConstraints.maxExtent,
33326
- ...processed.view,
33327
- };
33328
- }
33329
- if (processed.view &&
33330
- !('zoom' in processed.view) &&
33331
- !('center' in processed.view)) {
33332
- if (this.mapViewConstraints.maxExtent) {
33333
- processed.view = {
33334
- extent: this.mapViewConstraints.maxExtent,
33335
- ...processed.view,
33336
- };
33337
- }
33338
- else {
33339
- processed.view = { ...DEFAULT_VIEW, ...processed.view };
33340
- }
33341
- }
33342
- return processed;
33343
- }
33344
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, deps: [{ token: DO_NOT_USE_DEFAULT_BASEMAP }, { token: BASEMAP_LAYERS }, { token: MAP_VIEW_CONSTRAINTS }], target: i0.ɵɵFactoryTarget.Component }); }
33345
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapContainerComponent, isStandalone: true, selector: "gn-ui-map-container", inputs: { context: "context" }, outputs: { featuresClick: "featuresClick", featuresHover: "featuresHover", mapClick: "mapClick", sourceLoadError: "sourceLoadError" }, providers: [
33346
- provideIcons({ matSwipeOutline }),
33347
- provideNgIconsConfig({
33348
- size: '1.5em',
33349
- }),
33350
- ], viewQueries: [{ propertyName: "container", first: true, predicate: ["map"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33351
- }
33352
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
33353
- type: Component,
33354
- args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
33355
- provideIcons({ matSwipeOutline }),
33356
- provideNgIconsConfig({
33357
- size: '1.5em',
33358
- }),
33359
- ], template: "<div class=\"h-full w-full\" #map></div>\n<div\n class=\"absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none\"\n [ngClass]=\"\n (displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'\n \"\n>\n <div\n class=\"absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60\"\n ></div>\n <ng-icon\n class=\"!w-16 !h-16 text-[64px] mb-4\"\n name=\"matSwipeOutline\"\n ></ng-icon>\n <p translate>map.navigation.message</p>\n</div>\n" }]
33360
- }], ctorParameters: () => [{ type: undefined, decorators: [{
33361
- type: Inject,
33362
- args: [DO_NOT_USE_DEFAULT_BASEMAP]
33363
- }] }, { type: undefined, decorators: [{
33364
- type: Inject,
33365
- args: [BASEMAP_LAYERS]
33366
- }] }, { type: undefined, decorators: [{
33367
- type: Inject,
33368
- args: [MAP_VIEW_CONSTRAINTS]
33369
- }] }], propDecorators: { context: [{
33370
- type: Input
33371
- }], featuresClick: [{
33372
- type: Output
33373
- }], featuresHover: [{
33374
- type: Output
33375
- }], mapClick: [{
33376
- type: Output
33377
- }], sourceLoadError: [{
33378
- type: Output
33379
- }], container: [{
33380
- type: ViewChild,
33381
- args: ['map']
33382
- }] } });
33383
-
33384
- const geometryKeys = ['geometry', 'the_geom'];
33385
- class FeatureDetailComponent {
33386
- get properties() {
33387
- if (!this.feature)
33388
- return [];
33389
- return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
33390
- }
33391
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33392
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeatureDetailComponent, isStandalone: true, selector: "gn-ui-feature-detail", inputs: { feature: "feature" }, ngImport: i0, template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33393
- }
33394
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
33395
- type: Component,
33396
- args: [{ selector: 'gn-ui-feature-detail', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div *ngIf=\"feature\" class=\"root\">\n <div class=\"property\" *ngFor=\"let propName of properties\">\n <div>{{ propName }}</div>\n <div class=\"font-bold\">{{ feature.properties[propName] }}</div>\n </div>\n</div>\n", styles: [".property{border-bottom:1px solid #f2f2f2;padding-bottom:.625rem;margin-bottom:.625rem;font-size:.75rem}\n"] }]
33397
- }], propDecorators: { feature: [{
33398
- type: Input
33399
- }] } });
33400
-
33401
- class MapLegendComponent {
33402
- constructor() {
33403
- this.legendStatusChange = new EventEmitter();
33404
- }
33405
- async ngOnChanges(changes) {
33406
- if ('context' in changes) {
33407
- const mapContext = changes['context'].currentValue;
33408
- if (mapContext.layers && mapContext.layers.length > 0) {
33409
- const mapContextLayer = mapContext.layers[0];
33410
- this.legendHTML = await createLegendFromLayer(mapContextLayer);
33411
- if (this.legendHTML) {
33412
- this.legendStatusChange.emit(true);
33413
- }
33414
- }
33415
- else {
33416
- this.legendHTML = false;
33417
- this.legendStatusChange.emit(false);
33418
- }
33419
- }
33420
- }
33421
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33422
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapLegendComponent, isStandalone: true, selector: "gn-ui-map-legend", inputs: { context: "context" }, outputs: { legendStatusChange: "legendStatusChange" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
33423
- }
33424
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
33425
- type: Component,
33426
- args: [{ selector: 'gn-ui-map-legend', standalone: true, encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div *ngIf=\"legendHTML\" [innerHTML]=\"legendHTML.outerHTML\"></div>\n", styles: [".geosdk--legend-container{overflow:auto;white-space:normal;word-wrap:break-word}\n"] }]
33427
- }], propDecorators: { context: [{
33428
- type: Input
33429
- }], legendStatusChange: [{
33430
- type: Output
33431
- }] } });
33432
-
33433
- function prioritizePageScroll(interactions) {
33434
- interactions.clear();
33435
- interactions.extend(defaults({
33436
- // remove rotate interactions
33437
- altShiftDragRotate: false,
33438
- pinchRotate: false,
33439
- // replace drag and zoom interactions
33440
- dragPan: false,
33441
- mouseWheelZoom: false,
33442
- })
33443
- .extend([
33444
- new DragPan({
33445
- condition: dragPanCondition,
33446
- }),
33447
- new MouseWheelZoom({
33448
- condition: mouseWheelZoomCondition,
33449
- }),
33450
- ])
33451
- .getArray());
33452
- }
33453
- function dragPanCondition(event) {
33454
- const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
33455
- if (!dragPanCondition) {
33456
- this.getMap().dispatchEvent('mapmuted');
33457
- }
33458
- // combine the condition with the default DragPan conditions
33459
- return dragPanCondition && noModifierKeys(event) && primaryAction(event);
33460
- }
33461
- function mouseWheelZoomCondition(event) {
33462
- if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
33463
- this.getMap().dispatchEvent('mapmuted');
33464
- }
33465
- return platformModifierKeyOnly(event);
33466
- }
33467
-
33468
33997
  class MapStateContainerComponent {
33469
33998
  constructor(mapFacade) {
33470
33999
  this.mapFacade = mapFacade;
@@ -34116,6 +34645,7 @@ function loadAppConfig() {
34116
34645
  'metadata_language',
34117
34646
  'login_url',
34118
34647
  'logout_url',
34648
+ 'settings_url',
34119
34649
  'web_component_embedder_url',
34120
34650
  'languages',
34121
34651
  'contact_email',
@@ -34266,6 +34796,7 @@ proxy_path = "/proxy/?url="
34266
34796
  metadata_language = "fre"
34267
34797
  login_url = "/cas/login?service="
34268
34798
  logout_url = "/geonetwork/signout"
34799
+ settings_url = "/geonetwork/settings"
34269
34800
  web_component_embedder_url = "/datahub/wc-embedder.html"
34270
34801
 
34271
34802
  [map]
@@ -37129,15 +37660,13 @@ class MdViewFacade {
37129
37660
  this.error$ = this.store.pipe(select(getMetadataError));
37130
37661
  this.related$ = this.store.pipe(select(getRelated));
37131
37662
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
37132
- this.allLinks$ = this.metadata$.pipe(map$1((record) => record.kind === 'dataset' && 'onlineResources' in record
37133
- ? record.onlineResources
37134
- : []));
37663
+ this.allLinks$ = this.metadata$.pipe(map$1((record) => ('onlineResources' in record ? record.onlineResources : [])));
37135
37664
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links
37136
37665
  .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
37137
37666
  // Put links to IGN Géoplateforme first
37138
37667
  .sort((dd1, dd2) => {
37139
- return dd2.accessServiceProtocol ===
37140
- 'GPFDL'
37668
+ return dd2
37669
+ .accessServiceProtocol === 'GPFDL'
37141
37670
  ? 1
37142
37671
  : undefined; // do not change the sorting otherwise
37143
37672
  })));
@@ -37208,15 +37737,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37208
37737
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }, { type: DataService }] });
37209
37738
 
37210
37739
  class MdViewEffects {
37211
- constructor(actions$, recordsRepository, platformServiceInterface) {
37740
+ constructor(actions$, recordsRepository, platformServiceInterface, router) {
37212
37741
  this.actions$ = actions$;
37213
37742
  this.recordsRepository = recordsRepository;
37214
37743
  this.platformServiceInterface = platformServiceInterface;
37744
+ this.router = router;
37215
37745
  /*
37216
37746
  Metadata effects
37217
37747
  */
37218
37748
  this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getRecord(uuid)), map$1((record) => {
37219
- if (record === null) {
37749
+ if (record === null || !this.router.url.includes(record.kind)) {
37220
37750
  return loadFullMetadataFailure({ notFound: true });
37221
37751
  }
37222
37752
  return loadFullMetadataSuccess({ full: record });
@@ -37251,12 +37781,12 @@ class MdViewEffects {
37251
37781
  }));
37252
37782
  })))));
37253
37783
  }
37254
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$c.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
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 }); }
37255
37785
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects }); }
37256
37786
  }
37257
37787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, decorators: [{
37258
37788
  type: Injectable
37259
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }] });
37789
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }, { type: i1$d.Router }] });
37260
37790
 
37261
37791
  class CatalogTitleComponent {
37262
37792
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CatalogTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -37313,11 +37843,11 @@ class LanguageSwitcherComponent {
37313
37843
  this.translate.use(value);
37314
37844
  }
37315
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 }); }
37316
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LanguageSwitcherComponent, isStandalone: true, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }] }); }
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"] }] }); }
37317
37847
  }
37318
37848
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
37319
37849
  type: Component,
37320
- args: [{ selector: 'gn-ui-language-switcher', imports: [DropdownSelectorComponent], standalone: true, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageChoices\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n" }]
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" }]
37321
37851
  }], ctorParameters: () => [{ type: undefined, decorators: [{
37322
37852
  type: Optional
37323
37853
  }, {
@@ -37739,17 +38269,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37739
38269
  }]
37740
38270
  }] });
37741
38271
 
37742
- const GN_UI_VERSION = new InjectionToken('gnUiVersion');
37743
-
37744
38272
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
37745
38273
  class DataViewPermalinkComponent {
37746
38274
  set viewType(value) {
37747
38275
  this.viewType$.next(value);
37748
38276
  }
37749
- constructor(config, wcEmbedderBaseUrl, version, facade) {
38277
+ constructor(config, wcEmbedderBaseUrl, facade) {
37750
38278
  this.config = config;
37751
38279
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
37752
- this.version = version;
37753
38280
  this.facade = facade;
37754
38281
  this.viewType$ = new BehaviorSubject('map');
37755
38282
  this.permalinkUrl$ = combineLatest([
@@ -37758,7 +38285,7 @@ class DataViewPermalinkComponent {
37758
38285
  this.facade.metadata$,
37759
38286
  ]).pipe(map$2(([viewType, config, metadata]) => {
37760
38287
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
37761
- url.searchParams.set('v', `${this.version}`);
38288
+ url.searchParams.set('v', `${GEONETWORK_UI_TAG_NAME}`);
37762
38289
  if (viewType === 'chart') {
37763
38290
  if (config) {
37764
38291
  const { aggregation, xProperty, yProperty, chartType } = config;
@@ -37789,7 +38316,7 @@ class DataViewPermalinkComponent {
37789
38316
  return url.toString();
37790
38317
  }));
37791
38318
  }
37792
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, deps: [{ token: Configuration }, { token: WEB_COMPONENT_EMBEDDER_URL, optional: true }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
37793
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 }); }
37794
38321
  }
37795
38322
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
@@ -37803,9 +38330,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37803
38330
  }, {
37804
38331
  type: Inject,
37805
38332
  args: [WEB_COMPONENT_EMBEDDER_URL]
37806
- }] }, { type: undefined, decorators: [{
37807
- type: Inject,
37808
- args: [GN_UI_VERSION]
37809
38333
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37810
38334
  type: Input
37811
38335
  }] } });
@@ -37884,16 +38408,15 @@ class DataViewWebComponentComponent {
37884
38408
  set viewType(value) {
37885
38409
  this.viewType$.next(value);
37886
38410
  }
37887
- constructor(config, version, facade) {
38411
+ constructor(config, facade) {
37888
38412
  this.config = config;
37889
- this.version = version;
37890
38413
  this.facade = facade;
37891
38414
  this.viewType$ = new BehaviorSubject('map');
37892
38415
  this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
37893
38416
  if (viewType === 'chart') {
37894
38417
  if (config) {
37895
38418
  const { aggregation, xProperty, yProperty, chartType } = config;
37896
- return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${this.version}/gn-wc.js"></script>
38419
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${GEONETWORK_UI_TAG_NAME}/gn-wc.js"></script>
37897
38420
  <gn-dataset-view-chart
37898
38421
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37899
38422
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37912,7 +38435,7 @@ class DataViewWebComponentComponent {
37912
38435
  return '';
37913
38436
  }
37914
38437
  else if (viewType === 'table') {
37915
- 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>
37916
38439
  <gn-dataset-view-table
37917
38440
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37918
38441
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37925,7 +38448,7 @@ class DataViewWebComponentComponent {
37925
38448
  ></gn-dataset-view-table>`;
37926
38449
  }
37927
38450
  else {
37928
- 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>
37929
38452
  <gn-dataset-view-map
37930
38453
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37931
38454
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37939,7 +38462,7 @@ class DataViewWebComponentComponent {
37939
38462
  }
37940
38463
  }));
37941
38464
  }
37942
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, deps: [{ token: Configuration }, { token: GN_UI_VERSION }, { token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
37943
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 }); }
37944
38467
  }
37945
38468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
@@ -37948,9 +38471,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37948
38471
  }], ctorParameters: () => [{ type: Configuration, decorators: [{
37949
38472
  type: Inject,
37950
38473
  args: [Configuration]
37951
- }] }, { type: undefined, decorators: [{
37952
- type: Inject,
37953
- args: [GN_UI_VERSION]
37954
38474
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37955
38475
  type: Input
37956
38476
  }] } });
@@ -38451,7 +38971,7 @@ class RecordMetaComponent {
38451
38971
  this.meta.removeTag('property="og:url"');
38452
38972
  this.meta.removeTag('property="og:title"');
38453
38973
  }
38454
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, deps: [{ token: i1$d.Meta }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
38455
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 }); }
38456
38976
  }
38457
38977
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, decorators: [{
@@ -38462,7 +38982,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
38462
38982
  changeDetection: ChangeDetectionStrategy.OnPush,
38463
38983
  standalone: true,
38464
38984
  }]
38465
- }], ctorParameters: () => [{ type: i1$d.Meta }], propDecorators: { metadata: [{
38985
+ }], ctorParameters: () => [{ type: i1$e.Meta }], propDecorators: { metadata: [{
38466
38986
  type: Input
38467
38987
  }] } });
38468
38988
 
@@ -39510,7 +40030,7 @@ class ImportRecordComponent {
39510
40030
  },
39511
40031
  });
39512
40032
  }
39513
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportRecordComponent, deps: [{ token: i1$e.Router }, { token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: NotificationsService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
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 }); }
39514
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: [
39515
40035
  provideIcons({
39516
40036
  iconoirImport,
@@ -39541,7 +40061,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39541
40061
  size: '1.5em',
39542
40062
  }),
39543
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" }]
39544
- }], 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: [{
39545
40065
  type: Output
39546
40066
  }] } });
39547
40067
 
@@ -39905,75 +40425,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39905
40425
  args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-array works!</p>\n" }]
39906
40426
  }] });
39907
40427
 
39908
- class FormFieldMapContainerComponent {
39909
- constructor() {
39910
- this.spatialExtents$ = new BehaviorSubject([]);
39911
- this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
39912
- if (extents.length === 0) {
39913
- return null; // null extent means default view
39914
- }
39915
- const featureCollection = {
39916
- type: 'FeatureCollection',
39917
- features: [],
39918
- };
39919
- extents.forEach((extent) => {
39920
- if (extent.geometry) {
39921
- featureCollection.features.push({
39922
- type: 'Feature',
39923
- properties: {},
39924
- geometry: extent.geometry,
39925
- });
39926
- }
39927
- else if (extent.bbox?.length >= 0) {
39928
- featureCollection.features.push({
39929
- type: 'Feature',
39930
- properties: {},
39931
- geometry: this.bboxCoordsToGeometry(extent.bbox),
39932
- });
39933
- }
39934
- });
39935
- const layer = {
39936
- type: 'geojson',
39937
- data: featureCollection,
39938
- label: 'Spatial extents',
39939
- style: {
39940
- 'stroke-color': 'black',
39941
- 'stroke-width': 2,
39942
- },
39943
- };
39944
- const view = await createViewFromLayer(layer);
39945
- return {
39946
- view,
39947
- layers: [layer],
39948
- };
39949
- }));
39950
- this.error = '';
39951
- }
39952
- set spatialExtents(value) {
39953
- this.spatialExtents$.next(value);
39954
- }
39955
- bboxCoordsToGeometry(bbox) {
39956
- const geometry = new Polygon([
39957
- [
39958
- [bbox[0], bbox[1]],
39959
- [bbox[0], bbox[3]],
39960
- [bbox[2], bbox[3]],
39961
- [bbox[2], bbox[1]],
39962
- [bbox[0], bbox[1]],
39963
- ],
39964
- ]);
39965
- return new GeoJSON().writeGeometryObject(geometry);
39966
- }
39967
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39968
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldMapContainerComponent, isStandalone: true, selector: "gn-ui-form-field-map-container", inputs: { spatialExtents: "spatialExtents" }, ngImport: i0, template: "<gn-ui-map-container [context]=\"mapContext$ | async\"></gn-ui-map-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39969
- }
39970
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, decorators: [{
39971
- type: Component,
39972
- args: [{ selector: 'gn-ui-form-field-map-container', standalone: true, imports: [CommonModule, MapContainerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-map-container [context]=\"mapContext$ | async\"></gn-ui-map-container>\n" }]
39973
- }], propDecorators: { spatialExtents: [{
39974
- type: Input
39975
- }] } });
39976
-
39977
40428
  /**
39978
40429
  * This form field is not like the others, as it will read directly from the state to handle both spatial extents
39979
40430
  * and place keywords.
@@ -40070,16 +40521,16 @@ class FormFieldSpatialExtentComponent {
40070
40521
  this.editorFacade.updateRecordField('spatialExtents', spatialExtents);
40071
40522
  }
40072
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 }); }
40073
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldSpatialExtentComponent, isStandalone: true, selector: "gn-ui-form-field-spatial-extent", ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-form-field-map-container\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-form-field-map-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: GenericKeywordsComponent, selector: "gn-ui-generic-keywords", inputs: ["keywords", "keywordTypes", "placeholder", "allowSubmit"], outputs: ["changedKeywords", "addedKeyword", "deletedKeyword"] }, { kind: "component", type: FormFieldMapContainerComponent, selector: "gn-ui-form-field-map-container", inputs: ["spatialExtents"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 }); }
40074
40525
  }
40075
40526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
40076
40527
  type: Component,
40077
40528
  args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
40078
40529
  CommonModule,
40079
40530
  GenericKeywordsComponent,
40080
- FormFieldMapContainerComponent,
40081
40531
  TranslateModule,
40082
- ], template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-generic-keywords\n [placeholder]=\"'editor.record.form.keywords.place.placeholder' | translate\"\n [keywords]=\"shownKeywords$ | async\"\n [keywordTypes]=\"['place']\"\n (deletedKeyword)=\"handleKeywordDelete($event)\"\n (addedKeyword)=\"handleKeywordAdd($event)\"\n >\n </gn-ui-generic-keywords>\n <div class=\"w-full h-96 mt-2\">\n <gn-ui-form-field-map-container\n [spatialExtents]=\"spatialExtents$ | async\"\n ></gn-ui-form-field-map-container>\n </div>\n</div>\n" }]
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" }]
40083
40534
  }], ctorParameters: () => [{ type: PlatformServiceInterface }, { type: EditorFacade }, { type: i1$1.TranslateService }] });
40084
40535
 
40085
40536
  class ContactCardComponent {
@@ -40337,9 +40788,8 @@ class OnlineResourceCardComponent {
40337
40788
  get subtitle() {
40338
40789
  switch (this.onlineResource.type) {
40339
40790
  case 'service':
40340
- return `${this.onlineResource.accessServiceProtocol}`;
40341
40791
  case 'endpoint':
40342
- return `${this.onlineResource.protocol}`;
40792
+ return `${this.onlineResource.accessServiceProtocol}`;
40343
40793
  case 'link':
40344
40794
  case 'download':
40345
40795
  return this.getFormat(this.onlineResource);
@@ -41496,6 +41946,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41496
41946
  const ROUTER_STATE_KEY = 'router';
41497
41947
  const ROUTER_ROUTE_SEARCH = 'search';
41498
41948
  const ROUTER_ROUTE_DATASET = 'dataset';
41949
+ const ROUTER_ROUTE_SERVICE = 'service';
41950
+ const ROUTER_ROUTE_REUSE = 'reuse';
41499
41951
  const ROUTER_ROUTE_ORGANIZATION = 'organization';
41500
41952
  var ROUTE_PARAMS;
41501
41953
  (function (ROUTE_PARAMS) {
@@ -41528,6 +41980,14 @@ class RouterService {
41528
41980
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
41529
41981
  component: this.routerConfig.recordRouteComponent,
41530
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
+ },
41531
41991
  {
41532
41992
  path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
41533
41993
  component: this.routerConfig.organizationRouteComponent,
@@ -41540,7 +42000,7 @@ class RouterService {
41540
42000
  getOrganizationPageRoute() {
41541
42001
  return ROUTER_ROUTE_ORGANIZATION;
41542
42002
  }
41543
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$e.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
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 }); }
41544
42004
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
41545
42005
  }
41546
42006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, decorators: [{
@@ -41551,7 +42011,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41551
42011
  }], ctorParameters: () => [{ type: undefined, decorators: [{
41552
42012
  type: Inject,
41553
42013
  args: [ROUTER_CONFIG]
41554
- }] }, { type: i1$e.Router }] });
42014
+ }] }, { type: i1$d.Router }] });
41555
42015
 
41556
42016
  const goAction = createAction('[Router] Go', props());
41557
42017
  const backAction = createAction('[Router] Back');
@@ -41623,13 +42083,19 @@ class RouterFacade {
41623
42083
  this.currentRoute$ = this.store.pipe(select(selectCurrentRoute));
41624
42084
  this.pathParams$ = this.store.pipe(select(selectRouteParams));
41625
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
+ };
41626
42091
  }
41627
42092
  goToMetadata(metadata) {
42093
+ const selectedRoute = this.routeMap[metadata.kind] || ROUTER_ROUTE_DATASET;
41628
42094
  this.pathParams$
41629
42095
  .pipe(take(1), filter((params) => params.metadataUuid !== metadata.uniqueIdentifier))
41630
42096
  .subscribe(() => {
41631
42097
  this.go({
41632
- path: `${ROUTER_ROUTE_DATASET}/${metadata.uniqueIdentifier}`,
42098
+ path: `${selectedRoute}/${metadata.uniqueIdentifier}`,
41633
42099
  });
41634
42100
  this.store.dispatch(setIncompleteMetadata({ incomplete: metadata }));
41635
42101
  });
@@ -41856,12 +42322,12 @@ class RouterEffects {
41856
42322
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
41857
42323
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
41858
42324
  }
41859
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, deps: [{ token: i1$c.Actions }, { token: i1$e.Router }, { token: i1$2.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
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 }); }
41860
42326
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
41861
42327
  }
41862
42328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
41863
42329
  type: Injectable
41864
- }], 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: [{
41865
42331
  type: Inject,
41866
42332
  args: [ROUTER_CONFIG]
41867
42333
  }] }, { type: FieldsService }] });
@@ -41921,5 +42387,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41921
42387
  * Generated bundle index. Do not edit.
41922
42388
  */
41923
42389
 
41924
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
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 };
41925
42391
  //# sourceMappingURL=geonetwork-ui.mjs.map