geonetwork-ui 2.6.0-dev.9df114cd4 → 2.6.0-dev.d216c4dea

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 (186) 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 +4 -4
  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/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  33. package/esm2022/libs/ui/map/src/index.mjs +2 -1
  34. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +79 -0
  35. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  36. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +2 -1
  37. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  38. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  39. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  40. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  41. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +13 -6
  42. package/esm2022/translations/de.json +24 -3
  43. package/esm2022/translations/en.json +26 -5
  44. package/esm2022/translations/es.json +24 -3
  45. package/esm2022/translations/fr.json +24 -3
  46. package/esm2022/translations/it.json +24 -3
  47. package/esm2022/translations/nl.json +24 -3
  48. package/esm2022/translations/pt.json +24 -3
  49. package/fesm2022/geonetwork-ui.mjs +882 -451
  50. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  51. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  52. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  54. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -2
  55. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  56. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
  57. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +6 -6
  58. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  59. 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
  60. package/libs/feature/record/src/index.d.ts +0 -1
  61. package/libs/feature/record/src/index.d.ts.map +1 -1
  62. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  63. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  64. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  65. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  67. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  68. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  69. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  70. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  71. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  72. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  73. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  74. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  75. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  76. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  77. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  78. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  79. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  80. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  81. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  82. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -1
  83. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -1
  84. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  85. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  86. package/libs/ui/elements/src/index.d.ts +1 -0
  87. package/libs/ui/elements/src/index.d.ts.map +1 -1
  88. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  89. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  90. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  91. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  92. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  93. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  94. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  95. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  96. package/libs/ui/map/src/index.d.ts +1 -0
  97. package/libs/ui/map/src/index.d.ts.map +1 -1
  98. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  99. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  100. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  101. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  102. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  103. package/libs/util/shared/src/index.d.ts +1 -0
  104. package/libs/util/shared/src/index.d.ts.map +1 -1
  105. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  106. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  107. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  108. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  109. package/libs/util/shared/src/lib/links/link-utils.d.ts +14 -7
  110. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  111. package/package.json +1 -1
  112. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  113. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  114. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  115. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  116. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  117. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  118. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  119. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  120. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  121. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  122. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -2
  123. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  124. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  125. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  126. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  127. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  128. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  129. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  130. package/src/libs/feature/record/src/index.ts +0 -1
  131. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  132. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  133. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  134. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  135. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  136. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  137. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  138. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  139. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  140. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +2 -2
  141. package/src/libs/feature/search/src/lib/feature-search.module.ts +0 -8
  142. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  143. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  144. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  145. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  146. package/src/libs/ui/elements/src/index.ts +1 -0
  147. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +2 -2
  148. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  149. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  150. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  151. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  152. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  153. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  154. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -0
  155. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  156. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  157. package/src/libs/ui/map/src/index.ts +1 -0
  158. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  159. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  160. 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
  161. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  162. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  163. package/src/libs/util/app-config/src/lib/app-config.ts +1 -0
  164. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  165. package/src/libs/util/shared/src/index.ts +1 -0
  166. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  167. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  168. package/src/libs/util/shared/src/lib/links/link-utils.ts +30 -12
  169. package/tailwind.base.css +3 -3
  170. package/translations/de.json +24 -3
  171. package/translations/en.json +26 -5
  172. package/translations/es.json +24 -3
  173. package/translations/fr.json +24 -3
  174. package/translations/it.json +24 -3
  175. package/translations/nl.json +24 -3
  176. package/translations/pt.json +24 -3
  177. package/translations/sk.json +24 -3
  178. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  179. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  180. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  181. 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
  182. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  183. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  184. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  185. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  186. /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
  }
@@ -18834,6 +18834,7 @@ var de = {
18834
18834
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18835
18835
  "editor.record.loadError.closeMessage": "Verstanden",
18836
18836
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18837
+ "editor.record.lock.format": "",
18837
18838
  "editor.record.lock.reason": "",
18838
18839
  "editor.record.onlineResource.protocol.other": "",
18839
18840
  "editor.record.onlineResourceError.body": "",
@@ -18893,7 +18894,6 @@ var de = {
18893
18894
  "input.image.dropFileLabel": "",
18894
18895
  "input.image.selectFileLabel": "",
18895
18896
  "input.image.uploadErrorLabel": "",
18896
- "input.image.uploadErrorRetry": "",
18897
18897
  "input.image.uploadProgressCancel": "",
18898
18898
  "input.image.uploadProgressLabel": "",
18899
18899
  "language.ca": "Katalanisch",
@@ -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": "",
@@ -19033,13 +19034,12 @@ var de = {
19033
19034
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19034
19035
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19035
19036
  "record.metadata.related": "Ähnliche Datensätze",
19036
- "record.metadata.related.contents": "Verwandte Inhalte",
19037
+ "record.metadata.related.contents": "",
19037
19038
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19038
19039
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19039
19040
  "record.metadata.status": "Status",
19040
19041
  "record.metadata.status.notPublished": "",
19041
19042
  "record.metadata.status.published": "",
19042
- "record.metadata.technical": "Technische Informationen",
19043
19043
  "record.metadata.temporalExtent": "Zeitlicher Umfang",
19044
19044
  "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
19045
19045
  "record.metadata.temporalExtent.sinceDate": "Seit {start}",
@@ -19076,6 +19076,7 @@ var de = {
19076
19076
  "results.sortBy.popularity": "Beliebtheit",
19077
19077
  "results.sortBy.qualityScore": "Qualitätsbewertung",
19078
19078
  "results.sortBy.relevancy": "Relevanz",
19079
+ "reuse.metadata.access": "",
19079
19080
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
19080
19081
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
19081
19082
  "search.error.organizationHasNoDataset": "",
@@ -19125,6 +19126,26 @@ var de = {
19125
19126
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
19126
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.",
19127
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": "",
19128
19149
  "share.tab.permalink": "Teilen",
19129
19150
  "share.tab.webComponent": "Integrieren",
19130
19151
  "table.loading.data": "Daten werden geladen...",
@@ -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",
@@ -19515,7 +19536,8 @@ var en = {
19515
19536
  "record.card.metadata.contact": "Metadata Contact",
19516
19537
  "record.externalViewer.open": "Open in the external map viewer",
19517
19538
  "record.feature.limit": "Preview disabled due to too many elements",
19518
- "record.kind.dataset": "Data",
19539
+ "record.kind.data": "Data",
19540
+ "record.kind.dataset": "Dataset",
19519
19541
  "record.kind.reuse": "Reuse",
19520
19542
  "record.kind.service": "Service",
19521
19543
  "record.metadata.about": "Description",
@@ -19551,7 +19573,7 @@ var en = {
19551
19573
  "record.metadata.api.form.zoneTitle": "Zone",
19552
19574
  "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
19553
19575
  "record.metadata.api.gpfdl": "Data download",
19554
- "record.metadata.capabilities": "",
19576
+ "record.metadata.capabilities": "Service capabilities",
19555
19577
  "record.metadata.catalog": "Catalog",
19556
19578
  "record.metadata.contact": "Contact",
19557
19579
  "record.metadata.creation": "Date of creation",
@@ -19588,13 +19610,12 @@ var en = {
19588
19610
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19589
19611
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19590
19612
  "record.metadata.related": "Related datasets",
19591
- "record.metadata.related.contents": "Related contents",
19613
+ "record.metadata.related.contents": "Related content",
19592
19614
  "record.metadata.ressources.and.links": "Resources and links",
19593
19615
  "record.metadata.sheet": "Original metadata",
19594
19616
  "record.metadata.status": "Status",
19595
19617
  "record.metadata.status.notPublished": "Not published",
19596
19618
  "record.metadata.status.published": "Published",
19597
- "record.metadata.technical": "Technical information",
19598
19619
  "record.metadata.temporalExtent": "Temporal extent",
19599
19620
  "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
19600
19621
  "record.metadata.temporalExtent.sinceDate": "Since { start }",
@@ -19631,6 +19652,7 @@ var en = {
19631
19652
  "results.sortBy.popularity": "Popularity",
19632
19653
  "results.sortBy.qualityScore": "Quality score",
19633
19654
  "results.sortBy.relevancy": "Relevancy",
19655
+ "reuse.metadata.access": "Access the reuse",
19634
19656
  "search.autocomplete.error": "Suggestions could not be fetched:",
19635
19657
  "search.error.couldNotReachApi": "The API could not be reached",
19636
19658
  "search.error.organizationHasNoDataset": "This organization has no dataset yet.",
@@ -19680,6 +19702,26 @@ var en = {
19680
19702
  "search.filters.useSpatialFilter": "Show datasets in the area of interest first",
19681
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.",
19682
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",
19683
19725
  "share.tab.permalink": "Share",
19684
19726
  "share.tab.webComponent": "Integrate",
19685
19727
  "table.loading.data": "Loading data...",
@@ -19944,6 +19986,7 @@ var es = {
19944
19986
  "editor.record.loadError.body": "",
19945
19987
  "editor.record.loadError.closeMessage": "",
19946
19988
  "editor.record.loadError.title": "",
19989
+ "editor.record.lock.format": "",
19947
19990
  "editor.record.lock.reason": "",
19948
19991
  "editor.record.onlineResource.protocol.other": "",
19949
19992
  "editor.record.onlineResourceError.body": "",
@@ -20003,7 +20046,6 @@ var es = {
20003
20046
  "input.image.dropFileLabel": "",
20004
20047
  "input.image.selectFileLabel": "",
20005
20048
  "input.image.uploadErrorLabel": "",
20006
- "input.image.uploadErrorRetry": "",
20007
20049
  "input.image.uploadProgressCancel": "",
20008
20050
  "input.image.uploadProgressLabel": "",
20009
20051
  "language.ca": "Catalán",
@@ -20070,6 +20112,7 @@ var es = {
20070
20112
  "record.card.metadata.contact": "",
20071
20113
  "record.externalViewer.open": "",
20072
20114
  "record.feature.limit": "",
20115
+ "record.kind.data": "",
20073
20116
  "record.kind.dataset": "",
20074
20117
  "record.kind.reuse": "",
20075
20118
  "record.kind.service": "",
@@ -20143,13 +20186,12 @@ var es = {
20143
20186
  "record.metadata.quality.updateFrequency.failed": "",
20144
20187
  "record.metadata.quality.updateFrequency.success": "",
20145
20188
  "record.metadata.related": "",
20146
- "record.metadata.related.contents": "Contenidos relacionados",
20189
+ "record.metadata.related.contents": "",
20147
20190
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20148
20191
  "record.metadata.sheet": "",
20149
20192
  "record.metadata.status": "",
20150
20193
  "record.metadata.status.notPublished": "",
20151
20194
  "record.metadata.status.published": "",
20152
- "record.metadata.technical": "",
20153
20195
  "record.metadata.temporalExtent": "",
20154
20196
  "record.metadata.temporalExtent.fromDateToDate": "",
20155
20197
  "record.metadata.temporalExtent.sinceDate": "",
@@ -20186,6 +20228,7 @@ var es = {
20186
20228
  "results.sortBy.popularity": "",
20187
20229
  "results.sortBy.qualityScore": "",
20188
20230
  "results.sortBy.relevancy": "",
20231
+ "reuse.metadata.access": "",
20189
20232
  "search.autocomplete.error": "",
20190
20233
  "search.error.couldNotReachApi": "",
20191
20234
  "search.error.organizationHasNoDataset": "",
@@ -20235,6 +20278,26 @@ var es = {
20235
20278
  "search.filters.useSpatialFilter": "",
20236
20279
  "search.filters.useSpatialFilterHelp": "",
20237
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": "",
20238
20301
  "share.tab.permalink": "",
20239
20302
  "share.tab.webComponent": "",
20240
20303
  "table.loading.data": "",
@@ -20499,6 +20562,7 @@ var fr = {
20499
20562
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20500
20563
  "editor.record.loadError.closeMessage": "Compris",
20501
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",
20502
20566
  "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
20503
20567
  "editor.record.onlineResource.protocol.other": "Autre",
20504
20568
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
@@ -20558,7 +20622,6 @@ var fr = {
20558
20622
  "input.image.dropFileLabel": "ou glissez-la ici",
20559
20623
  "input.image.selectFileLabel": "Sélectionnez une image",
20560
20624
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20561
- "input.image.uploadErrorRetry": "Réessayer",
20562
20625
  "input.image.uploadProgressCancel": "Annuler",
20563
20626
  "input.image.uploadProgressLabel": "Chargement en cours...",
20564
20627
  "language.ca": "Catalan",
@@ -20625,6 +20688,7 @@ var fr = {
20625
20688
  "record.card.metadata.contact": "Contact de la métadonnée ",
20626
20689
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
20627
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",
20628
20692
  "record.kind.dataset": "Donnée",
20629
20693
  "record.kind.reuse": "Réutilisation",
20630
20694
  "record.kind.service": "Service",
@@ -20698,13 +20762,12 @@ var fr = {
20698
20762
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20699
20763
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20700
20764
  "record.metadata.related": "Voir aussi",
20701
- "record.metadata.related.contents": "Contenus associés",
20765
+ "record.metadata.related.contents": "Contenu associé",
20702
20766
  "record.metadata.ressources.and.links": "Ressources et liens",
20703
20767
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20704
20768
  "record.metadata.status": "Statut",
20705
20769
  "record.metadata.status.notPublished": "Non publié",
20706
20770
  "record.metadata.status.published": "Publié",
20707
- "record.metadata.technical": "Informations techniques",
20708
20771
  "record.metadata.temporalExtent": "Étendue temporelle",
20709
20772
  "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
20710
20773
  "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
@@ -20741,6 +20804,7 @@ var fr = {
20741
20804
  "results.sortBy.popularity": "Popularité",
20742
20805
  "results.sortBy.qualityScore": "Indicateur de qualité",
20743
20806
  "results.sortBy.relevancy": "Pertinence",
20807
+ "reuse.metadata.access": "Accéder à la réutilisation",
20744
20808
  "search.autocomplete.error": "Les suggestions ne peuvent pas être récupérées",
20745
20809
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
20746
20810
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de données.",
@@ -20790,6 +20854,26 @@ var fr = {
20790
20854
  "search.filters.useSpatialFilter": "Mettre en avant les résultats sur la zone d'intérêt",
20791
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.",
20792
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",
20793
20877
  "share.tab.permalink": "Partager",
20794
20878
  "share.tab.webComponent": "Intégrer",
20795
20879
  "table.loading.data": "Chargement des données...",
@@ -21054,6 +21138,7 @@ var it = {
21054
21138
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21055
21139
  "editor.record.loadError.closeMessage": "Capito",
21056
21140
  "editor.record.loadError.title": "Errore durante il caricamento",
21141
+ "editor.record.lock.format": "",
21057
21142
  "editor.record.lock.reason": "Non è un editore di uno dei gruppi autorizzati",
21058
21143
  "editor.record.onlineResource.protocol.other": "Altro",
21059
21144
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
@@ -21113,7 +21198,6 @@ var it = {
21113
21198
  "input.image.dropFileLabel": "oppure trascinalo qui",
21114
21199
  "input.image.selectFileLabel": "Seleziona un'immagine",
21115
21200
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21116
- "input.image.uploadErrorRetry": "Riprova",
21117
21201
  "input.image.uploadProgressCancel": "Annulla",
21118
21202
  "input.image.uploadProgressLabel": "Caricamento...",
21119
21203
  "language.ca": "Catalano",
@@ -21180,6 +21264,7 @@ var it = {
21180
21264
  "record.card.metadata.contact": "",
21181
21265
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
21182
21266
  "record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
21267
+ "record.kind.data": "",
21183
21268
  "record.kind.dataset": "",
21184
21269
  "record.kind.reuse": "",
21185
21270
  "record.kind.service": "",
@@ -21253,13 +21338,12 @@ var it = {
21253
21338
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21254
21339
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21255
21340
  "record.metadata.related": "Vedi anche",
21256
- "record.metadata.related.contents": "Contenuti correlati",
21341
+ "record.metadata.related.contents": "",
21257
21342
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21258
21343
  "record.metadata.sheet": "Origine del metadata",
21259
21344
  "record.metadata.status": "Stato",
21260
21345
  "record.metadata.status.notPublished": "Non pubblicato",
21261
21346
  "record.metadata.status.published": "Pubblicato",
21262
- "record.metadata.technical": "Informazioni tecniche",
21263
21347
  "record.metadata.temporalExtent": "Periodo di tempo",
21264
21348
  "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
21265
21349
  "record.metadata.temporalExtent.sinceDate": "Dal {start}",
@@ -21296,6 +21380,7 @@ var it = {
21296
21380
  "results.sortBy.popularity": "Popolarità",
21297
21381
  "results.sortBy.qualityScore": "Indicatore di qualità",
21298
21382
  "results.sortBy.relevancy": "Rilevanza",
21383
+ "reuse.metadata.access": "",
21299
21384
  "search.autocomplete.error": "Impossibile recuperare le suggerimenti",
21300
21385
  "search.error.couldNotReachApi": "Problema di connessione all'API",
21301
21386
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora dati.",
@@ -21345,6 +21430,26 @@ var it = {
21345
21430
  "search.filters.useSpatialFilter": "Evidenzia i risultati nell'area di interesse",
21346
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.",
21347
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": "",
21348
21453
  "share.tab.permalink": "Condividere",
21349
21454
  "share.tab.webComponent": "Incorporare",
21350
21455
  "table.loading.data": "Caricamento dei dati...",
@@ -21609,6 +21714,7 @@ var nl = {
21609
21714
  "editor.record.loadError.body": "",
21610
21715
  "editor.record.loadError.closeMessage": "",
21611
21716
  "editor.record.loadError.title": "",
21717
+ "editor.record.lock.format": "",
21612
21718
  "editor.record.lock.reason": "",
21613
21719
  "editor.record.onlineResource.protocol.other": "",
21614
21720
  "editor.record.onlineResourceError.body": "",
@@ -21668,7 +21774,6 @@ var nl = {
21668
21774
  "input.image.dropFileLabel": "",
21669
21775
  "input.image.selectFileLabel": "",
21670
21776
  "input.image.uploadErrorLabel": "",
21671
- "input.image.uploadErrorRetry": "",
21672
21777
  "input.image.uploadProgressCancel": "",
21673
21778
  "input.image.uploadProgressLabel": "",
21674
21779
  "language.ca": "Catalaans",
@@ -21735,6 +21840,7 @@ var nl = {
21735
21840
  "record.card.metadata.contact": "",
21736
21841
  "record.externalViewer.open": "",
21737
21842
  "record.feature.limit": "",
21843
+ "record.kind.data": "",
21738
21844
  "record.kind.dataset": "",
21739
21845
  "record.kind.reuse": "",
21740
21846
  "record.kind.service": "",
@@ -21808,13 +21914,12 @@ var nl = {
21808
21914
  "record.metadata.quality.updateFrequency.failed": "",
21809
21915
  "record.metadata.quality.updateFrequency.success": "",
21810
21916
  "record.metadata.related": "",
21811
- "record.metadata.related.contents": "Gerelateerde inhoud",
21917
+ "record.metadata.related.contents": "",
21812
21918
  "record.metadata.ressources.and.links": "Bronnen en links",
21813
21919
  "record.metadata.sheet": "",
21814
21920
  "record.metadata.status": "",
21815
21921
  "record.metadata.status.notPublished": "",
21816
21922
  "record.metadata.status.published": "",
21817
- "record.metadata.technical": "",
21818
21923
  "record.metadata.temporalExtent": "",
21819
21924
  "record.metadata.temporalExtent.fromDateToDate": "",
21820
21925
  "record.metadata.temporalExtent.sinceDate": "",
@@ -21851,6 +21956,7 @@ var nl = {
21851
21956
  "results.sortBy.popularity": "",
21852
21957
  "results.sortBy.qualityScore": "",
21853
21958
  "results.sortBy.relevancy": "",
21959
+ "reuse.metadata.access": "",
21854
21960
  "search.autocomplete.error": "",
21855
21961
  "search.error.couldNotReachApi": "",
21856
21962
  "search.error.organizationHasNoDataset": "",
@@ -21900,6 +22006,26 @@ var nl = {
21900
22006
  "search.filters.useSpatialFilter": "",
21901
22007
  "search.filters.useSpatialFilterHelp": "",
21902
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": "",
21903
22029
  "share.tab.permalink": "",
21904
22030
  "share.tab.webComponent": "",
21905
22031
  "table.loading.data": "",
@@ -22164,6 +22290,7 @@ var pt = {
22164
22290
  "editor.record.loadError.body": "",
22165
22291
  "editor.record.loadError.closeMessage": "",
22166
22292
  "editor.record.loadError.title": "",
22293
+ "editor.record.lock.format": "",
22167
22294
  "editor.record.lock.reason": "",
22168
22295
  "editor.record.onlineResource.protocol.other": "",
22169
22296
  "editor.record.onlineResourceError.body": "",
@@ -22223,7 +22350,6 @@ var pt = {
22223
22350
  "input.image.dropFileLabel": "",
22224
22351
  "input.image.selectFileLabel": "",
22225
22352
  "input.image.uploadErrorLabel": "",
22226
- "input.image.uploadErrorRetry": "",
22227
22353
  "input.image.uploadProgressCancel": "",
22228
22354
  "input.image.uploadProgressLabel": "",
22229
22355
  "language.ca": "Catalão",
@@ -22290,6 +22416,7 @@ var pt = {
22290
22416
  "record.card.metadata.contact": "",
22291
22417
  "record.externalViewer.open": "",
22292
22418
  "record.feature.limit": "",
22419
+ "record.kind.data": "",
22293
22420
  "record.kind.dataset": "",
22294
22421
  "record.kind.reuse": "",
22295
22422
  "record.kind.service": "",
@@ -22363,13 +22490,12 @@ var pt = {
22363
22490
  "record.metadata.quality.updateFrequency.failed": "",
22364
22491
  "record.metadata.quality.updateFrequency.success": "",
22365
22492
  "record.metadata.related": "",
22366
- "record.metadata.related.contents": "Conteúdos relacionados",
22493
+ "record.metadata.related.contents": "",
22367
22494
  "record.metadata.ressources.and.links": "Recursos e links",
22368
22495
  "record.metadata.sheet": "",
22369
22496
  "record.metadata.status": "",
22370
22497
  "record.metadata.status.notPublished": "",
22371
22498
  "record.metadata.status.published": "",
22372
- "record.metadata.technical": "",
22373
22499
  "record.metadata.temporalExtent": "",
22374
22500
  "record.metadata.temporalExtent.fromDateToDate": "",
22375
22501
  "record.metadata.temporalExtent.sinceDate": "",
@@ -22406,6 +22532,7 @@ var pt = {
22406
22532
  "results.sortBy.popularity": "",
22407
22533
  "results.sortBy.qualityScore": "",
22408
22534
  "results.sortBy.relevancy": "",
22535
+ "reuse.metadata.access": "",
22409
22536
  "search.autocomplete.error": "",
22410
22537
  "search.error.couldNotReachApi": "",
22411
22538
  "search.error.organizationHasNoDataset": "",
@@ -22455,6 +22582,26 @@ var pt = {
22455
22582
  "search.filters.useSpatialFilter": "",
22456
22583
  "search.filters.useSpatialFilterHelp": "",
22457
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": "",
22458
22605
  "share.tab.permalink": "",
22459
22606
  "share.tab.webComponent": "",
22460
22607
  "table.loading.data": "",
@@ -22803,8 +22950,8 @@ class Gn4FieldMapper {
22803
22950
  return {
22804
22951
  ...distribution,
22805
22952
  type,
22806
- endpointUrl: url,
22807
- protocol: accessServiceProtocol,
22953
+ url: url,
22954
+ accessServiceProtocol: accessServiceProtocol,
22808
22955
  };
22809
22956
  }
22810
22957
  };
@@ -23200,14 +23347,6 @@ class ElasticsearchService {
23200
23347
  }
23201
23348
  mustNotFilters() {
23202
23349
  return [
23203
- {
23204
- ...this.queryFilterOnValues('resourceType', [
23205
- 'service',
23206
- 'map',
23207
- 'map/static',
23208
- 'mapDigital',
23209
- ]),
23210
- },
23211
23350
  {
23212
23351
  query_string: {
23213
23352
  query: 'resourceType:featureCatalog AND !resourceType:dataset AND !cl_level.key:dataset',
@@ -23306,7 +23445,7 @@ class ElasticsearchService {
23306
23445
  must_not: this.mustNotFilters(),
23307
23446
  },
23308
23447
  },
23309
- _source: ['resourceTitleObject', 'uuid'],
23448
+ _source: ['resourceTitleObject', 'uuid', 'resourceType'],
23310
23449
  from: 0,
23311
23450
  size: 20,
23312
23451
  };
@@ -25044,7 +25183,7 @@ function getLinkLabel(link) {
25044
25183
  default:
25045
25184
  format = getFileFormat(link);
25046
25185
  }
25047
- const label = link.description || link.name;
25186
+ const label = link.description || ('name' in link ? link.name : '');
25048
25187
  return format ? `${label} (${format})` : label;
25049
25188
  }
25050
25189
  async function getLayers(url, serviceProtocol) {
@@ -25055,14 +25194,21 @@ async function getLayers(url, serviceProtocol) {
25055
25194
  }
25056
25195
  case 'wfs': {
25057
25196
  const endpointWfs = await new WfsEndpoint(url).isReady();
25058
- 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;
25059
25202
  }
25060
25203
  case 'wms': {
25061
25204
  const endpointWms = await new WmsEndpoint(url).isReady();
25062
- return endpointWms
25205
+ const layers = (await endpointWms
25063
25206
  .getLayers()
25064
25207
  .flatMap(wmsLayerFlatten)
25065
- .filter((l) => l.name);
25208
+ .filter((l) => l.name)).map((collection) => {
25209
+ return endpointWms.getLayerByName(collection.name);
25210
+ });
25211
+ return layers;
25066
25212
  }
25067
25213
  case 'wmts': {
25068
25214
  const endpointWmts = await new WmtsEndpoint(url).isReady();
@@ -25099,6 +25245,7 @@ var LinkUsage;
25099
25245
  class LinkClassifierService {
25100
25246
  getUsagesForLink(link) {
25101
25247
  switch (link.type) {
25248
+ case 'endpoint':
25102
25249
  case 'service': {
25103
25250
  switch (link.accessServiceProtocol) {
25104
25251
  case 'esriRest':
@@ -25147,6 +25294,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25147
25294
  }]
25148
25295
  }] });
25149
25296
 
25297
+ var name = "geonetwork-ui";
25298
+ var version = "2.6.0-dev.d216c4dea";
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
+
25150
25397
  const minApiVersion = '4.2.2';
25151
25398
  class Gn4PlatformService {
25152
25399
  constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService, httpClient, recordsApiService) {
@@ -25340,12 +25587,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25340
25587
  type: Injectable
25341
25588
  }], ctorParameters: () => [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }, { type: i1.HttpClient }, { type: RecordsApiService }] });
25342
25589
 
25590
+ class RecordsRepositoryInterface {
25591
+ }
25592
+
25343
25593
  function provideGn4() {
25344
25594
  return [
25345
25595
  {
25346
25596
  provide: PlatformServiceInterface,
25347
25597
  useClass: Gn4PlatformService,
25348
25598
  },
25599
+ {
25600
+ provide: RecordsRepositoryInterface,
25601
+ useClass: Gn4Repository,
25602
+ },
25349
25603
  Gn4PlatformMapper,
25350
25604
  ];
25351
25605
  }
@@ -25777,6 +26031,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25777
26031
  type: Output
25778
26032
  }] } });
25779
26033
 
26034
+ marker('editor.record.lock.reason');
26035
+ marker('editor.record.lock.format');
25780
26036
  class InteractiveTableComponent {
25781
26037
  constructor() {
25782
26038
  this.items = [];
@@ -25794,15 +26050,24 @@ class InteractiveTableComponent {
25794
26050
  .join(' '),
25795
26051
  };
25796
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
+ }
25797
26062
  handleRowClick(item) {
25798
26063
  this.itemClick.emit(item);
25799
26064
  }
25800
26065
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25801
- 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 }); }
25802
26067
  }
25803
26068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
25804
26069
  type: Component,
25805
- 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"] }]
25806
26071
  }], propDecorators: { columns: [{
25807
26072
  type: ContentChildren,
25808
26073
  args: [InteractiveTableColumnComponent]
@@ -29418,7 +29683,7 @@ class MetadataContactComponent {
29418
29683
  this.organizationClick.emit(this.shownOrganization);
29419
29684
  }
29420
29685
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29421
- 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: [
29422
29687
  provideIcons({
29423
29688
  matOpenInNew,
29424
29689
  matCallOutline,
@@ -29438,7 +29703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29438
29703
  matPersonOutline,
29439
29704
  matLocationOnOutline,
29440
29705
  }),
29441
- ], 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" }]
29442
29707
  }], propDecorators: { metadata: [{
29443
29708
  type: Input
29444
29709
  }], organizationClick: [{
@@ -29523,6 +29788,316 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29523
29788
  }]
29524
29789
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] });
29525
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
+
29526
30101
  class MetadataInfoComponent {
29527
30102
  constructor(dateService) {
29528
30103
  this.dateService = dateService;
@@ -29575,7 +30150,7 @@ class MetadataInfoComponent {
29575
30150
  }
29576
30151
  }
29577
30152
  get temporalExtent() {
29578
- const temporalExtents = this.metadata.temporalExtents;
30153
+ const temporalExtents = this.metadata.kind === 'dataset' ? this.metadata.temporalExtents : [];
29579
30154
  return getTemporalRangeUnion(temporalExtents, this.dateService);
29580
30155
  }
29581
30156
  get shownOrganization() {
@@ -29597,7 +30172,7 @@ class MetadataInfoComponent {
29597
30172
  return this.dateService.formatDateTime(date);
29598
30173
  }
29599
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 }); }
29600
- 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: [
29601
30176
  provideIcons({
29602
30177
  matOpenInNew,
29603
30178
  matMailOutline: matMailOutline$1,
@@ -29618,12 +30193,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29618
30193
  CopyTextButtonComponent,
29619
30194
  NgIcon,
29620
30195
  GnUiLinkifyDirective,
30196
+ MapContainerComponent,
30197
+ SpatialExtentComponent,
29621
30198
  ], viewProviders: [
29622
30199
  provideIcons({
29623
30200
  matOpenInNew,
29624
30201
  matMailOutline: matMailOutline$1,
29625
30202
  }),
29626
- ], 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"] }]
29627
30204
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
29628
30205
  type: Input
29629
30206
  }], incomplete: [{
@@ -29995,7 +30572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29995
30572
  type: Input
29996
30573
  }] } });
29997
30574
 
29998
- marker('record.kind.dataset');
30575
+ marker('record.kind.data');
29999
30576
  marker('record.kind.reuse');
30000
30577
  marker('record.kind.service');
30001
30578
  class InternalLinkCardComponent {
@@ -30075,7 +30652,7 @@ class InternalLinkCardComponent {
30075
30652
  return { text: '', icon: '' };
30076
30653
  switch (this.record.kind.toLowerCase()) {
30077
30654
  case 'dataset':
30078
- return { text: 'record.kind.dataset', icon: 'iconoirDatabase' };
30655
+ return { text: 'record.kind.data', icon: 'iconoirDatabase' };
30079
30656
  case 'reuse':
30080
30657
  return { text: 'record.kind.reuse', icon: 'iconoirMap' };
30081
30658
  case 'service':
@@ -30143,6 +30720,154 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30143
30720
  type: Output
30144
30721
  }] } });
30145
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
+
30146
30871
  class UiElementsModule {
30147
30872
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
30148
30873
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, declarations: [AvatarComponent, UserPreviewComponent], imports: [CommonModule,
@@ -30162,13 +30887,15 @@ class UiElementsModule {
30162
30887
  TextInputComponent,
30163
30888
  ImageInputComponent,
30164
30889
  ApplicationBannerComponent,
30165
- InternalLinkCardComponent], exports: [ThumbnailComponent,
30890
+ InternalLinkCardComponent,
30891
+ ServiceCapabilitiesComponent], exports: [ThumbnailComponent,
30166
30892
  AvatarComponent,
30167
30893
  UserPreviewComponent,
30168
30894
  MarkdownParserComponent,
30169
30895
  ImageInputComponent,
30170
30896
  ApplicationBannerComponent,
30171
- InternalLinkCardComponent] }); }
30897
+ InternalLinkCardComponent,
30898
+ ServiceCapabilitiesComponent] }); }
30172
30899
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, providers: [
30173
30900
  provideNgIconsConfig({
30174
30901
  size: '1.5em',
@@ -30189,7 +30916,8 @@ class UiElementsModule {
30189
30916
  TextInputComponent,
30190
30917
  ImageInputComponent,
30191
30918
  ApplicationBannerComponent,
30192
- InternalLinkCardComponent] }); }
30919
+ InternalLinkCardComponent,
30920
+ ServiceCapabilitiesComponent] }); }
30193
30921
  }
30194
30922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
30195
30923
  type: NgModule,
@@ -30215,6 +30943,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30215
30943
  ImageInputComponent,
30216
30944
  ApplicationBannerComponent,
30217
30945
  InternalLinkCardComponent,
30946
+ ServiceCapabilitiesComponent,
30218
30947
  ],
30219
30948
  providers: [
30220
30949
  provideNgIconsConfig({
@@ -30230,6 +30959,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30230
30959
  ImageInputComponent,
30231
30960
  ApplicationBannerComponent,
30232
30961
  InternalLinkCardComponent,
30962
+ ServiceCapabilitiesComponent,
30233
30963
  ],
30234
30964
  }]
30235
30965
  }] });
@@ -30570,8 +31300,9 @@ class ResultsTableComponent {
30570
31300
  return getBadgeColor(format);
30571
31301
  }
30572
31302
  handleRecordClick(item) {
30573
- if (item?.extras?.edit || this.isDraftPage)
31303
+ if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
30574
31304
  this.recordClick.emit(item);
31305
+ }
30575
31306
  }
30576
31307
  handleDuplicate(item) {
30577
31308
  this.duplicateRecord.emit(item);
@@ -30608,7 +31339,7 @@ class ResultsTableComponent {
30608
31339
  this.recordsSelectedChange.emit([[record], selected]);
30609
31340
  }
30610
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 }); }
30611
- 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"] }] }); }
30612
31343
  }
30613
31344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
30614
31345
  type: Component,
@@ -30622,7 +31353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30622
31353
  ActionMenuComponent,
30623
31354
  NgIconComponent,
30624
31355
  CdkOverlayOrigin,
30625
- ], 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" }]
30626
31357
  }], ctorParameters: () => [{ type: i1$9.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
30627
31358
  type: Input
30628
31359
  }], selectedRecordsIdentifiers: [{
@@ -31653,9 +32384,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31653
32384
  type: Injectable
31654
32385
  }], ctorParameters: () => [{ type: SearchFacade }] });
31655
32386
 
31656
- class RecordsRepositoryInterface {
31657
- }
31658
-
31659
32387
  class FuzzySearchComponent {
31660
32388
  constructor(searchFacade, searchService, recordsRepository) {
31661
32389
  this.searchFacade = searchFacade;
@@ -31794,7 +32522,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31794
32522
  }] }] });
31795
32523
 
31796
32524
  // expects the replacement key ${uuid}
31797
- 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');
31798
32528
 
31799
32529
  class FavoriteStarComponent {
31800
32530
  set record(value) {
@@ -31880,11 +32610,11 @@ class FavoriteStarComponent {
31880
32610
  });
31881
32611
  }
31882
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 }); }
31883
- 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"] }], 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 }); }
31884
32614
  }
31885
32615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FavoriteStarComponent, decorators: [{
31886
32616
  type: Component,
31887
- 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</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" }]
31888
32618
  }], ctorParameters: () => [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }], propDecorators: { displayCount: [{
31889
32619
  type: Input
31890
32620
  }], record: [{
@@ -31895,10 +32625,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31895
32625
  }] } });
31896
32626
 
31897
32627
  class ResultsListContainerComponent {
31898
- constructor(facade, resultsLayoutConfig, recordUrlTemplate) {
32628
+ constructor(facade, resultsLayoutConfig, recordDatasetUrlTemplate, recordServiceUrlTemplate, recordReuseUrlTemplate) {
31899
32629
  this.facade = facade;
31900
32630
  this.resultsLayoutConfig = resultsLayoutConfig;
31901
- this.recordUrlTemplate = recordUrlTemplate;
32631
+ this.recordDatasetUrlTemplate = recordDatasetUrlTemplate;
32632
+ this.recordServiceUrlTemplate = recordServiceUrlTemplate;
32633
+ this.recordReuseUrlTemplate = recordReuseUrlTemplate;
31902
32634
  this.showMore = 'auto';
31903
32635
  this.mdSelect = new EventEmitter();
31904
32636
  this.errorTypes = ErrorType;
@@ -31930,16 +32662,24 @@ class ResultsListContainerComponent {
31930
32662
  this.facade.scroll();
31931
32663
  }
31932
32664
  getRecordUrl(metadata) {
31933
- 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)
31934
32673
  return null;
31935
- return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
32674
+ const urlKind = tokenMap[metadata.kind];
32675
+ return urlKind.replace('${uuid}', metadata.uniqueIdentifier);
31936
32676
  }
31937
- 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 }); }
31938
- 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: [":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" }] }); }
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" }] }); }
31939
32679
  }
31940
32680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
31941
32681
  type: Component,
31942
- 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", 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"] }]
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"] }]
31943
32683
  }], ctorParameters: () => [{ type: SearchFacade }, { type: undefined, decorators: [{
31944
32684
  type: Inject,
31945
32685
  args: [RESULTS_LAYOUT_CONFIG]
@@ -31947,7 +32687,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31947
32687
  type: Optional
31948
32688
  }, {
31949
32689
  type: Inject,
31950
- 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]
31951
32697
  }] }], propDecorators: { metadataQualityDisplay: [{
31952
32698
  type: Input
31953
32699
  }], layout: [{
@@ -32699,12 +33445,7 @@ class FeatureSearchModule {
32699
33445
  FacetsModule,
32700
33446
  SearchStateContainerDirective,
32701
33447
  FilterDropdownComponent] }); }
32702
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, providers: [
32703
- {
32704
- provide: RecordsRepositoryInterface,
32705
- useClass: Gn4Repository,
32706
- },
32707
- ], imports: [CommonModule,
33448
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureSearchModule, imports: [CommonModule,
32708
33449
  TranslateModule.forChild(),
32709
33450
  StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
32710
33451
  initialState,
@@ -32766,12 +33507,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32766
33507
  SearchStateContainerDirective,
32767
33508
  FilterDropdownComponent,
32768
33509
  ],
32769
- providers: [
32770
- {
32771
- provide: RecordsRepositoryInterface,
32772
- useClass: Gn4Repository,
32773
- },
32774
- ],
32775
33510
  }]
32776
33511
  }] });
32777
33512
 
@@ -33259,247 +33994,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33259
33994
  }]
33260
33995
  }] });
33261
33996
 
33262
- const DO_NOT_USE_DEFAULT_BASEMAP = new InjectionToken('doNotUseDefaultBasemap', { factory: () => false });
33263
- const BASEMAP_LAYERS = new InjectionToken('basemapLayers', { factory: () => [] });
33264
- const MAP_VIEW_CONSTRAINTS = new InjectionToken('mapViewConstraints', {
33265
- factory: () => ({}),
33266
- });
33267
- const VECTOR_STYLE_DEFAULT = new InjectionToken('vectorStyleDefault', {
33268
- factory: () => ({
33269
- fill: { color: 'rgba(255, 255, 255, 0.2)' },
33270
- stroke: { color: '#ffcc33', width: 2 },
33271
- }),
33272
- });
33273
-
33274
- const DEFAULT_BASEMAP_LAYER = {
33275
- type: 'xyz',
33276
- url: `https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
33277
- attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
33278
- };
33279
- const DEFAULT_VIEW = {
33280
- center: [0, 15],
33281
- zoom: 2,
33282
- };
33283
- class MapContainerComponent {
33284
- get featuresClick() {
33285
- if (!this._featuresClick) {
33286
- this.openlayersMap.then((olMap) => {
33287
- listen(olMap, FeaturesClickEventType, ({ features }) => this._featuresClick.emit(features));
33288
- });
33289
- this._featuresClick = new EventEmitter();
33290
- }
33291
- return this._featuresClick;
33292
- }
33293
- get featuresHover() {
33294
- if (!this._featuresHover) {
33295
- this.openlayersMap.then((olMap) => {
33296
- listen(olMap, FeaturesHoverEventType, ({ features }) => this._featuresHover.emit(features));
33297
- });
33298
- this._featuresHover = new EventEmitter();
33299
- }
33300
- return this._featuresHover;
33301
- }
33302
- get mapClick() {
33303
- if (!this._mapClick) {
33304
- this.openlayersMap.then((olMap) => {
33305
- listen(olMap, MapClickEventType, ({ coordinate }) => this._mapClick.emit(coordinate));
33306
- });
33307
- this._mapClick = new EventEmitter();
33308
- }
33309
- return this._mapClick;
33310
- }
33311
- get sourceLoadError() {
33312
- if (!this._sourceLoadError) {
33313
- this.openlayersMap.then((olMap) => {
33314
- listen(olMap, SourceLoadErrorType, (error) => this._sourceLoadError.emit(error));
33315
- });
33316
- this._sourceLoadError = new EventEmitter();
33317
- }
33318
- return this._sourceLoadError;
33319
- }
33320
- constructor(doNotUseDefaultBasemap, basemapLayers, mapViewConstraints) {
33321
- this.doNotUseDefaultBasemap = doNotUseDefaultBasemap;
33322
- this.basemapLayers = basemapLayers;
33323
- this.mapViewConstraints = mapViewConstraints;
33324
- this.openlayersMap = new Promise((resolve) => {
33325
- this.olMapResolver = resolve;
33326
- });
33327
- }
33328
- async ngAfterViewInit() {
33329
- this.olMap = await createMapFromContext(this.processContext(this.context), this.container.nativeElement);
33330
- 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
33331
- ? timer(2000).pipe(map$1(() => false), startWith(true), delay(400))
33332
- : of(false)));
33333
- this.olMapResolver(this.olMap);
33334
- }
33335
- async ngOnChanges(changes) {
33336
- if ('context' in changes && !changes['context'].isFirstChange()) {
33337
- const diff = computeMapContextDiff(this.processContext(changes['context'].currentValue), this.processContext(changes['context'].previousValue));
33338
- await applyContextDiffToMap(this.olMap, diff);
33339
- }
33340
- }
33341
- // This will apply basemap layers & view constraints
33342
- processContext(context) {
33343
- const processed = context
33344
- ? { ...context, view: context.view ?? DEFAULT_VIEW }
33345
- : { layers: [], view: DEFAULT_VIEW };
33346
- if (this.basemapLayers.length) {
33347
- processed.layers = [...this.basemapLayers, ...processed.layers];
33348
- }
33349
- if (!this.doNotUseDefaultBasemap) {
33350
- processed.layers = [DEFAULT_BASEMAP_LAYER, ...processed.layers];
33351
- }
33352
- if (this.mapViewConstraints.maxZoom) {
33353
- processed.view = {
33354
- maxZoom: this.mapViewConstraints.maxZoom,
33355
- ...processed.view,
33356
- };
33357
- }
33358
- if (this.mapViewConstraints.maxExtent) {
33359
- processed.view = {
33360
- maxExtent: this.mapViewConstraints.maxExtent,
33361
- ...processed.view,
33362
- };
33363
- }
33364
- if (processed.view &&
33365
- !('zoom' in processed.view) &&
33366
- !('center' in processed.view)) {
33367
- if (this.mapViewConstraints.maxExtent) {
33368
- processed.view = {
33369
- extent: this.mapViewConstraints.maxExtent,
33370
- ...processed.view,
33371
- };
33372
- }
33373
- else {
33374
- processed.view = { ...DEFAULT_VIEW, ...processed.view };
33375
- }
33376
- }
33377
- return processed;
33378
- }
33379
- 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 }); }
33380
- 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: [
33381
- provideIcons({ matSwipeOutline }),
33382
- provideNgIconsConfig({
33383
- size: '1.5em',
33384
- }),
33385
- ], 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 }); }
33386
- }
33387
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapContainerComponent, decorators: [{
33388
- type: Component,
33389
- args: [{ selector: 'gn-ui-map-container', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule, NgIconComponent], providers: [
33390
- provideIcons({ matSwipeOutline }),
33391
- provideNgIconsConfig({
33392
- size: '1.5em',
33393
- }),
33394
- ], 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" }]
33395
- }], ctorParameters: () => [{ type: undefined, decorators: [{
33396
- type: Inject,
33397
- args: [DO_NOT_USE_DEFAULT_BASEMAP]
33398
- }] }, { type: undefined, decorators: [{
33399
- type: Inject,
33400
- args: [BASEMAP_LAYERS]
33401
- }] }, { type: undefined, decorators: [{
33402
- type: Inject,
33403
- args: [MAP_VIEW_CONSTRAINTS]
33404
- }] }], propDecorators: { context: [{
33405
- type: Input
33406
- }], featuresClick: [{
33407
- type: Output
33408
- }], featuresHover: [{
33409
- type: Output
33410
- }], mapClick: [{
33411
- type: Output
33412
- }], sourceLoadError: [{
33413
- type: Output
33414
- }], container: [{
33415
- type: ViewChild,
33416
- args: ['map']
33417
- }] } });
33418
-
33419
- const geometryKeys = ['geometry', 'the_geom'];
33420
- class FeatureDetailComponent {
33421
- get properties() {
33422
- if (!this.feature)
33423
- return [];
33424
- return Object.keys(this.feature.properties).filter((prop) => !geometryKeys.includes(prop));
33425
- }
33426
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33427
- 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 }); }
33428
- }
33429
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureDetailComponent, decorators: [{
33430
- type: Component,
33431
- 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"] }]
33432
- }], propDecorators: { feature: [{
33433
- type: Input
33434
- }] } });
33435
-
33436
- class MapLegendComponent {
33437
- constructor() {
33438
- this.legendStatusChange = new EventEmitter();
33439
- }
33440
- async ngOnChanges(changes) {
33441
- if ('context' in changes) {
33442
- const mapContext = changes['context'].currentValue;
33443
- if (mapContext.layers && mapContext.layers.length > 0) {
33444
- const mapContextLayer = mapContext.layers[0];
33445
- this.legendHTML = await createLegendFromLayer(mapContextLayer);
33446
- if (this.legendHTML) {
33447
- this.legendStatusChange.emit(true);
33448
- }
33449
- }
33450
- else {
33451
- this.legendHTML = false;
33452
- this.legendStatusChange.emit(false);
33453
- }
33454
- }
33455
- }
33456
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33457
- 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 }); }
33458
- }
33459
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapLegendComponent, decorators: [{
33460
- type: Component,
33461
- 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"] }]
33462
- }], propDecorators: { context: [{
33463
- type: Input
33464
- }], legendStatusChange: [{
33465
- type: Output
33466
- }] } });
33467
-
33468
- function prioritizePageScroll(interactions) {
33469
- interactions.clear();
33470
- interactions.extend(defaults({
33471
- // remove rotate interactions
33472
- altShiftDragRotate: false,
33473
- pinchRotate: false,
33474
- // replace drag and zoom interactions
33475
- dragPan: false,
33476
- mouseWheelZoom: false,
33477
- })
33478
- .extend([
33479
- new DragPan({
33480
- condition: dragPanCondition,
33481
- }),
33482
- new MouseWheelZoom({
33483
- condition: mouseWheelZoomCondition,
33484
- }),
33485
- ])
33486
- .getArray());
33487
- }
33488
- function dragPanCondition(event) {
33489
- const dragPanCondition = this.getPointerCount() === 2 || mouseOnly(event);
33490
- if (!dragPanCondition) {
33491
- this.getMap().dispatchEvent('mapmuted');
33492
- }
33493
- // combine the condition with the default DragPan conditions
33494
- return dragPanCondition && noModifierKeys(event) && primaryAction(event);
33495
- }
33496
- function mouseWheelZoomCondition(event) {
33497
- if (!platformModifierKeyOnly(event) && event.type === 'wheel') {
33498
- this.getMap().dispatchEvent('mapmuted');
33499
- }
33500
- return platformModifierKeyOnly(event);
33501
- }
33502
-
33503
33997
  class MapStateContainerComponent {
33504
33998
  constructor(mapFacade) {
33505
33999
  this.mapFacade = mapFacade;
@@ -34151,6 +34645,7 @@ function loadAppConfig() {
34151
34645
  'metadata_language',
34152
34646
  'login_url',
34153
34647
  'logout_url',
34648
+ 'settings_url',
34154
34649
  'web_component_embedder_url',
34155
34650
  'languages',
34156
34651
  'contact_email',
@@ -34301,6 +34796,7 @@ proxy_path = "/proxy/?url="
34301
34796
  metadata_language = "fre"
34302
34797
  login_url = "/cas/login?service="
34303
34798
  logout_url = "/geonetwork/signout"
34799
+ settings_url = "/geonetwork/settings"
34304
34800
  web_component_embedder_url = "/datahub/wc-embedder.html"
34305
34801
 
34306
34802
  [map]
@@ -37164,15 +37660,13 @@ class MdViewFacade {
37164
37660
  this.error$ = this.store.pipe(select(getMetadataError));
37165
37661
  this.related$ = this.store.pipe(select(getRelated));
37166
37662
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
37167
- this.allLinks$ = this.metadata$.pipe(map$1((record) => record.kind === 'dataset' && 'onlineResources' in record
37168
- ? record.onlineResources
37169
- : []));
37663
+ this.allLinks$ = this.metadata$.pipe(map$1((record) => ('onlineResources' in record ? record.onlineResources : [])));
37170
37664
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links
37171
37665
  .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
37172
37666
  // Put links to IGN Géoplateforme first
37173
37667
  .sort((dd1, dd2) => {
37174
- return dd2.accessServiceProtocol ===
37175
- 'GPFDL'
37668
+ return dd2
37669
+ .accessServiceProtocol === 'GPFDL'
37176
37670
  ? 1
37177
37671
  : undefined; // do not change the sorting otherwise
37178
37672
  })));
@@ -37243,15 +37737,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37243
37737
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }, { type: DataService }] });
37244
37738
 
37245
37739
  class MdViewEffects {
37246
- constructor(actions$, recordsRepository, platformServiceInterface) {
37740
+ constructor(actions$, recordsRepository, platformServiceInterface, router) {
37247
37741
  this.actions$ = actions$;
37248
37742
  this.recordsRepository = recordsRepository;
37249
37743
  this.platformServiceInterface = platformServiceInterface;
37744
+ this.router = router;
37250
37745
  /*
37251
37746
  Metadata effects
37252
37747
  */
37253
37748
  this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getRecord(uuid)), map$1((record) => {
37254
- if (record === null) {
37749
+ if (record === null || !this.router.url.includes(record.kind)) {
37255
37750
  return loadFullMetadataFailure({ notFound: true });
37256
37751
  }
37257
37752
  return loadFullMetadataSuccess({ full: record });
@@ -37286,12 +37781,12 @@ class MdViewEffects {
37286
37781
  }));
37287
37782
  })))));
37288
37783
  }
37289
- 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 }); }
37290
37785
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects }); }
37291
37786
  }
37292
37787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MdViewEffects, decorators: [{
37293
37788
  type: Injectable
37294
- }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }] });
37789
+ }], ctorParameters: () => [{ type: i1$c.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }, { type: i1$d.Router }] });
37295
37790
 
37296
37791
  class CatalogTitleComponent {
37297
37792
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CatalogTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -37348,11 +37843,11 @@ class LanguageSwitcherComponent {
37348
37843
  this.translate.use(value);
37349
37844
  }
37350
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 }); }
37351
- 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"] }] }); }
37352
37847
  }
37353
37848
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
37354
37849
  type: Component,
37355
- 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" }]
37356
37851
  }], ctorParameters: () => [{ type: undefined, decorators: [{
37357
37852
  type: Optional
37358
37853
  }, {
@@ -37774,17 +38269,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37774
38269
  }]
37775
38270
  }] });
37776
38271
 
37777
- const GN_UI_VERSION = new InjectionToken('gnUiVersion');
37778
-
37779
38272
  const WEB_COMPONENT_EMBEDDER_URL = new InjectionToken('webComponentEmbedderUrl');
37780
38273
  class DataViewPermalinkComponent {
37781
38274
  set viewType(value) {
37782
38275
  this.viewType$.next(value);
37783
38276
  }
37784
- constructor(config, wcEmbedderBaseUrl, version, facade) {
38277
+ constructor(config, wcEmbedderBaseUrl, facade) {
37785
38278
  this.config = config;
37786
38279
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
37787
- this.version = version;
37788
38280
  this.facade = facade;
37789
38281
  this.viewType$ = new BehaviorSubject('map');
37790
38282
  this.permalinkUrl$ = combineLatest([
@@ -37793,7 +38285,7 @@ class DataViewPermalinkComponent {
37793
38285
  this.facade.metadata$,
37794
38286
  ]).pipe(map$2(([viewType, config, metadata]) => {
37795
38287
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
37796
- url.searchParams.set('v', `${this.version}`);
38288
+ url.searchParams.set('v', `${GEONETWORK_UI_TAG_NAME}`);
37797
38289
  if (viewType === 'chart') {
37798
38290
  if (config) {
37799
38291
  const { aggregation, xProperty, yProperty, chartType } = config;
@@ -37824,7 +38316,7 @@ class DataViewPermalinkComponent {
37824
38316
  return url.toString();
37825
38317
  }));
37826
38318
  }
37827
- 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 }); }
37828
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 }); }
37829
38321
  }
37830
38322
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewPermalinkComponent, decorators: [{
@@ -37838,9 +38330,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37838
38330
  }, {
37839
38331
  type: Inject,
37840
38332
  args: [WEB_COMPONENT_EMBEDDER_URL]
37841
- }] }, { type: undefined, decorators: [{
37842
- type: Inject,
37843
- args: [GN_UI_VERSION]
37844
38333
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37845
38334
  type: Input
37846
38335
  }] } });
@@ -37919,16 +38408,15 @@ class DataViewWebComponentComponent {
37919
38408
  set viewType(value) {
37920
38409
  this.viewType$.next(value);
37921
38410
  }
37922
- constructor(config, version, facade) {
38411
+ constructor(config, facade) {
37923
38412
  this.config = config;
37924
- this.version = version;
37925
38413
  this.facade = facade;
37926
38414
  this.viewType$ = new BehaviorSubject('map');
37927
38415
  this.webComponentHtml$ = combineLatest(this.viewType$, this.facade.chartConfig$, this.facade.metadata$).pipe(map$2(([viewType, config, metadata]) => {
37928
38416
  if (viewType === 'chart') {
37929
38417
  if (config) {
37930
38418
  const { aggregation, xProperty, yProperty, chartType } = config;
37931
- 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>
37932
38420
  <gn-dataset-view-chart
37933
38421
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37934
38422
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37947,7 +38435,7 @@ class DataViewWebComponentComponent {
37947
38435
  return '';
37948
38436
  }
37949
38437
  else if (viewType === 'table') {
37950
- 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>
37951
38439
  <gn-dataset-view-table
37952
38440
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37953
38441
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37960,7 +38448,7 @@ class DataViewWebComponentComponent {
37960
38448
  ></gn-dataset-view-table>`;
37961
38449
  }
37962
38450
  else {
37963
- 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>
37964
38452
  <gn-dataset-view-map
37965
38453
  api-url="${new URL(this.config.basePath, window.location.origin).toString()}"
37966
38454
  dataset-id="${metadata.uniqueIdentifier}"
@@ -37974,7 +38462,7 @@ class DataViewWebComponentComponent {
37974
38462
  }
37975
38463
  }));
37976
38464
  }
37977
- 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 }); }
37978
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 }); }
37979
38467
  }
37980
38468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataViewWebComponentComponent, decorators: [{
@@ -37983,9 +38471,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37983
38471
  }], ctorParameters: () => [{ type: Configuration, decorators: [{
37984
38472
  type: Inject,
37985
38473
  args: [Configuration]
37986
- }] }, { type: undefined, decorators: [{
37987
- type: Inject,
37988
- args: [GN_UI_VERSION]
37989
38474
  }] }, { type: MdViewFacade }], propDecorators: { viewType: [{
37990
38475
  type: Input
37991
38476
  }] } });
@@ -38486,7 +38971,7 @@ class RecordMetaComponent {
38486
38971
  this.meta.removeTag('property="og:url"');
38487
38972
  this.meta.removeTag('property="og:title"');
38488
38973
  }
38489
- 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 }); }
38490
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 }); }
38491
38976
  }
38492
38977
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RecordMetaComponent, decorators: [{
@@ -38497,7 +38982,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
38497
38982
  changeDetection: ChangeDetectionStrategy.OnPush,
38498
38983
  standalone: true,
38499
38984
  }]
38500
- }], ctorParameters: () => [{ type: i1$d.Meta }], propDecorators: { metadata: [{
38985
+ }], ctorParameters: () => [{ type: i1$e.Meta }], propDecorators: { metadata: [{
38501
38986
  type: Input
38502
38987
  }] } });
38503
38988
 
@@ -39545,7 +40030,7 @@ class ImportRecordComponent {
39545
40030
  },
39546
40031
  });
39547
40032
  }
39548
- 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 }); }
39549
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: [
39550
40035
  provideIcons({
39551
40036
  iconoirImport,
@@ -39576,7 +40061,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39576
40061
  size: '1.5em',
39577
40062
  }),
39578
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" }]
39579
- }], 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: [{
39580
40065
  type: Output
39581
40066
  }] } });
39582
40067
 
@@ -39940,75 +40425,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39940
40425
  args: [{ selector: 'gn-ui-form-field-array', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-array works!</p>\n" }]
39941
40426
  }] });
39942
40427
 
39943
- class FormFieldMapContainerComponent {
39944
- constructor() {
39945
- this.spatialExtents$ = new BehaviorSubject([]);
39946
- this.mapContext$ = this.spatialExtents$.pipe(switchMap$1(async (extents) => {
39947
- if (extents.length === 0) {
39948
- return null; // null extent means default view
39949
- }
39950
- const featureCollection = {
39951
- type: 'FeatureCollection',
39952
- features: [],
39953
- };
39954
- extents.forEach((extent) => {
39955
- if (extent.geometry) {
39956
- featureCollection.features.push({
39957
- type: 'Feature',
39958
- properties: {},
39959
- geometry: extent.geometry,
39960
- });
39961
- }
39962
- else if (extent.bbox?.length >= 0) {
39963
- featureCollection.features.push({
39964
- type: 'Feature',
39965
- properties: {},
39966
- geometry: this.bboxCoordsToGeometry(extent.bbox),
39967
- });
39968
- }
39969
- });
39970
- const layer = {
39971
- type: 'geojson',
39972
- data: featureCollection,
39973
- label: 'Spatial extents',
39974
- style: {
39975
- 'stroke-color': 'black',
39976
- 'stroke-width': 2,
39977
- },
39978
- };
39979
- const view = await createViewFromLayer(layer);
39980
- return {
39981
- view,
39982
- layers: [layer],
39983
- };
39984
- }));
39985
- this.error = '';
39986
- }
39987
- set spatialExtents(value) {
39988
- this.spatialExtents$.next(value);
39989
- }
39990
- bboxCoordsToGeometry(bbox) {
39991
- const geometry = new Polygon([
39992
- [
39993
- [bbox[0], bbox[1]],
39994
- [bbox[0], bbox[3]],
39995
- [bbox[2], bbox[3]],
39996
- [bbox[2], bbox[1]],
39997
- [bbox[0], bbox[1]],
39998
- ],
39999
- ]);
40000
- return new GeoJSON().writeGeometryObject(geometry);
40001
- }
40002
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40003
- 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 }); }
40004
- }
40005
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldMapContainerComponent, decorators: [{
40006
- type: Component,
40007
- 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" }]
40008
- }], propDecorators: { spatialExtents: [{
40009
- type: Input
40010
- }] } });
40011
-
40012
40428
  /**
40013
40429
  * This form field is not like the others, as it will read directly from the state to handle both spatial extents
40014
40430
  * and place keywords.
@@ -40105,16 +40521,16 @@ class FormFieldSpatialExtentComponent {
40105
40521
  this.editorFacade.updateRecordField('spatialExtents', spatialExtents);
40106
40522
  }
40107
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 }); }
40108
- 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 }); }
40109
40525
  }
40110
40526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldSpatialExtentComponent, decorators: [{
40111
40527
  type: Component,
40112
40528
  args: [{ selector: 'gn-ui-form-field-spatial-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
40113
40529
  CommonModule,
40114
40530
  GenericKeywordsComponent,
40115
- FormFieldMapContainerComponent,
40116
40531
  TranslateModule,
40117
- ], 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" }]
40118
40534
  }], ctorParameters: () => [{ type: PlatformServiceInterface }, { type: EditorFacade }, { type: i1$1.TranslateService }] });
40119
40535
 
40120
40536
  class ContactCardComponent {
@@ -40372,9 +40788,8 @@ class OnlineResourceCardComponent {
40372
40788
  get subtitle() {
40373
40789
  switch (this.onlineResource.type) {
40374
40790
  case 'service':
40375
- return `${this.onlineResource.accessServiceProtocol}`;
40376
40791
  case 'endpoint':
40377
- return `${this.onlineResource.protocol}`;
40792
+ return `${this.onlineResource.accessServiceProtocol}`;
40378
40793
  case 'link':
40379
40794
  case 'download':
40380
40795
  return this.getFormat(this.onlineResource);
@@ -41531,6 +41946,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41531
41946
  const ROUTER_STATE_KEY = 'router';
41532
41947
  const ROUTER_ROUTE_SEARCH = 'search';
41533
41948
  const ROUTER_ROUTE_DATASET = 'dataset';
41949
+ const ROUTER_ROUTE_SERVICE = 'service';
41950
+ const ROUTER_ROUTE_REUSE = 'reuse';
41534
41951
  const ROUTER_ROUTE_ORGANIZATION = 'organization';
41535
41952
  var ROUTE_PARAMS;
41536
41953
  (function (ROUTE_PARAMS) {
@@ -41563,6 +41980,14 @@ class RouterService {
41563
41980
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
41564
41981
  component: this.routerConfig.recordRouteComponent,
41565
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
+ },
41566
41991
  {
41567
41992
  path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
41568
41993
  component: this.routerConfig.organizationRouteComponent,
@@ -41575,7 +42000,7 @@ class RouterService {
41575
42000
  getOrganizationPageRoute() {
41576
42001
  return ROUTER_ROUTE_ORGANIZATION;
41577
42002
  }
41578
- 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 }); }
41579
42004
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
41580
42005
  }
41581
42006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, decorators: [{
@@ -41586,7 +42011,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41586
42011
  }], ctorParameters: () => [{ type: undefined, decorators: [{
41587
42012
  type: Inject,
41588
42013
  args: [ROUTER_CONFIG]
41589
- }] }, { type: i1$e.Router }] });
42014
+ }] }, { type: i1$d.Router }] });
41590
42015
 
41591
42016
  const goAction = createAction('[Router] Go', props());
41592
42017
  const backAction = createAction('[Router] Back');
@@ -41658,13 +42083,19 @@ class RouterFacade {
41658
42083
  this.currentRoute$ = this.store.pipe(select(selectCurrentRoute));
41659
42084
  this.pathParams$ = this.store.pipe(select(selectRouteParams));
41660
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
+ };
41661
42091
  }
41662
42092
  goToMetadata(metadata) {
42093
+ const selectedRoute = this.routeMap[metadata.kind] || ROUTER_ROUTE_DATASET;
41663
42094
  this.pathParams$
41664
42095
  .pipe(take(1), filter((params) => params.metadataUuid !== metadata.uniqueIdentifier))
41665
42096
  .subscribe(() => {
41666
42097
  this.go({
41667
- path: `${ROUTER_ROUTE_DATASET}/${metadata.uniqueIdentifier}`,
42098
+ path: `${selectedRoute}/${metadata.uniqueIdentifier}`,
41668
42099
  });
41669
42100
  this.store.dispatch(setIncompleteMetadata({ incomplete: metadata }));
41670
42101
  });
@@ -41891,12 +42322,12 @@ class RouterEffects {
41891
42322
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
41892
42323
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
41893
42324
  }
41894
- 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 }); }
41895
42326
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
41896
42327
  }
41897
42328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
41898
42329
  type: Injectable
41899
- }], 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: [{
41900
42331
  type: Inject,
41901
42332
  args: [ROUTER_CONFIG]
41902
42333
  }] }, { type: FieldsService }] });
@@ -41956,5 +42387,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
41956
42387
  * Generated bundle index. Do not edit.
41957
42388
  */
41958
42389
 
41959
- 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, 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 };
41960
42391
  //# sourceMappingURL=geonetwork-ui.mjs.map