geonetwork-ui 2.3.0-dev.e03215d1 → 2.3.0-dev.e43863db

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 (206) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +2 -2
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +9 -7
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -8
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +15 -4
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -7
  6. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  7. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +1 -1
  8. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +47 -2
  9. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +104 -0
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +8 -3
  12. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  13. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +8 -1
  14. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  15. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  16. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  17. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  18. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +58 -17
  19. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +7 -3
  20. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
  21. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +17 -9
  22. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +34 -5
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +1 -3
  24. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  25. package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +1 -1
  26. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +4 -4
  27. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +1 -1
  28. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  29. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +1 -1
  30. package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +1 -1
  31. package/esm2022/libs/ui/elements/src/index.mjs +2 -2
  32. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  33. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  34. package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +30 -0
  35. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  36. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +89 -54
  37. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +6 -11
  38. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +3 -5
  39. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  40. package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +4 -3
  41. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +5 -3
  42. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  43. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +5 -3
  44. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +6 -5
  45. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  46. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  47. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  48. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  49. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +3 -1
  50. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  51. package/esm2022/libs/util/app-config/src/lib/model.mjs +1 -1
  52. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  53. package/esm2022/translations/de.json +12 -14
  54. package/esm2022/translations/en.json +12 -14
  55. package/esm2022/translations/es.json +12 -14
  56. package/esm2022/translations/fr.json +12 -14
  57. package/esm2022/translations/it.json +12 -14
  58. package/esm2022/translations/nl.json +12 -14
  59. package/esm2022/translations/pt.json +12 -14
  60. package/fesm2022/geonetwork-ui.mjs +997 -536
  61. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  62. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +2 -2
  63. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -1
  64. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +1 -1
  65. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +4 -1
  67. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  68. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +2 -1
  69. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  70. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  71. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +3 -3
  72. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  73. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +4 -1
  74. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  75. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +21 -0
  76. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts.map +1 -0
  77. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +1 -0
  78. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  79. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  80. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  81. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  82. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +7 -0
  83. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  84. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -1
  85. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  86. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  87. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +2 -2
  88. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  89. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +5 -2
  90. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  91. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  92. package/libs/feature/search/src/index.d.ts +1 -0
  93. package/libs/feature/search/src/index.d.ts.map +1 -1
  94. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  95. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  96. package/libs/ui/elements/src/index.d.ts +1 -1
  97. package/libs/ui/elements/src/index.d.ts.map +1 -1
  98. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  99. package/libs/ui/elements/src/lib/error/error.component.d.ts +16 -0
  100. package/libs/ui/elements/src/lib/error/error.component.d.ts.map +1 -0
  101. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  102. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  103. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +22 -4
  104. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  105. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
  106. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  107. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +1 -2
  108. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -1
  109. package/libs/ui/inputs/src/index.d.ts +1 -0
  110. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  111. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +1 -1
  112. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
  113. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +2 -1
  114. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  115. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  116. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  117. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -1
  118. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  119. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +27 -27
  120. package/libs/ui/layout/src/index.d.ts +1 -0
  121. package/libs/ui/layout/src/index.d.ts.map +1 -1
  122. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  123. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  124. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  125. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  126. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  127. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  128. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  129. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  130. package/libs/util/app-config/src/lib/model.d.ts +1 -0
  131. package/libs/util/app-config/src/lib/model.d.ts.map +1 -1
  132. package/package.json +2 -2
  133. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +9 -1
  134. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +3 -3
  135. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +35 -31
  136. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +68 -16
  137. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +72 -17
  138. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +16 -10
  139. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +3 -3
  140. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  141. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +8 -0
  142. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +65 -1
  143. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +0 -0
  144. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +14 -0
  145. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +143 -0
  146. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +5 -0
  147. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +5 -0
  148. package/src/libs/feature/editor/src/lib/fields.config.ts +7 -0
  149. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  150. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  151. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  152. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +7 -0
  153. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +57 -17
  154. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +6 -2
  155. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +17 -9
  156. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +40 -4
  157. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +0 -2
  158. package/src/libs/feature/search/src/index.ts +1 -0
  159. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +4 -4
  160. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  161. package/src/libs/ui/elements/src/index.ts +1 -1
  162. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  163. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  164. package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.html → error/error.component.html} +18 -3
  165. package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.ts → error/error.component.ts} +5 -4
  166. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  167. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  168. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +25 -9
  169. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +116 -57
  170. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -6
  171. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +1 -1
  172. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +0 -1
  173. package/src/libs/ui/inputs/src/index.ts +1 -0
  174. package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -0
  175. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -0
  176. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +1 -0
  177. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  178. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  179. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  180. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -0
  181. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +1 -0
  182. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +1 -1
  183. package/src/libs/ui/layout/src/index.ts +1 -0
  184. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  185. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  186. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  187. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  188. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  189. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  190. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  191. package/src/libs/util/app-config/src/lib/app-config.ts +2 -0
  192. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  193. package/src/libs/util/app-config/src/lib/model.ts +1 -0
  194. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  195. package/translations/de.json +12 -14
  196. package/translations/en.json +12 -14
  197. package/translations/es.json +12 -14
  198. package/translations/fr.json +12 -14
  199. package/translations/it.json +12 -14
  200. package/translations/nl.json +12 -14
  201. package/translations/pt.json +12 -14
  202. package/translations/sk.json +12 -14
  203. package/esm2022/libs/ui/elements/src/lib/search-results-error/search-results-error.component.mjs +0 -29
  204. package/libs/ui/elements/src/lib/search-results-error/search-results-error.component.d.ts +0 -15
  205. package/libs/ui/elements/src/lib/search-results-error/search-results-error.component.d.ts.map +0 -1
  206. /package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.css → error/error.component.css} +0 -0
@@ -8,11 +8,11 @@ import * as i1$1 from '@ngx-translate/core';
8
8
  import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
10
10
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
11
- import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestFrom, switchMap as switchMap$1, catchError, take, delay, debounceTime, distinctUntilChanged, finalize, first, throttleTime, share, pairwise, mergeMap } from 'rxjs/operators';
11
+ import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestFrom, switchMap as switchMap$1, catchError, take, delay, debounceTime, distinctUntilChanged, finalize, first, throttleTime, share, pairwise, mergeMap, defaultIfEmpty, scan } from 'rxjs/operators';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, firstValueFrom, Subject, merge, throwError, BehaviorSubject, fromEvent, timer, Subscription, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, debounceTime as debounceTime$1, animationFrameScheduler, from, tap as tap$2, Observable, buffer, combineLatestWith, catchError as catchError$1, takeUntil, exhaustMap, mergeMap as mergeMap$1, EMPTY, withLatestFrom as withLatestFrom$1, filter as filter$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, firstValueFrom, Subject, merge, throwError, BehaviorSubject, fromEvent, timer, Subscription, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, debounceTime as debounceTime$1, filter as filter$1, animationFrameScheduler, from, tap as tap$2, Observable, buffer, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, exhaustMap, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
18
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule, Store } from '@ngrx/store';
@@ -28,12 +28,13 @@ import { transformExtent, fromLonLat } from 'ol/proj';
28
28
  import ImageWMS from 'ol/source/ImageWMS';
29
29
  import TileWMS from 'ol/source/TileWMS';
30
30
  import VectorSource from 'ol/source/Vector';
31
- import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction';
31
+ import { defaults as defaults$1, DragPan, MouseWheelZoom } from 'ol/interaction';
32
32
  import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition';
33
33
  import chroma from 'chroma-js';
34
34
  import { WmtsEndpoint, WmsEndpoint, WfsEndpoint, OgcApiEndpoint, sharedFetch, useCache } from '@camptocamp/ogc-client';
35
35
  import { register, fromEPSGCode } from 'ol/proj/proj4';
36
36
  import proj4 from 'proj4/dist/proj4';
37
+ import { defaults } from 'ol/control/defaults';
37
38
  import * as TOML from '@ltd/j-toml';
38
39
  import CircleStyle from 'ol/style/Circle';
39
40
  import View from 'ol/View';
@@ -42,7 +43,12 @@ import TileLayer from 'ol/layer/Tile';
42
43
  import XYZ from 'ol/source/XYZ';
43
44
  import { bbox } from 'ol/loadingstrategy';
44
45
  import WMTS from 'ol/source/WMTS';
45
- import * as i2$3 from '@angular/material/tabs';
46
+ import OGCVectorTile from 'ol/source/OGCVectorTile.js';
47
+ import { MVT, WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
48
+ import VectorTileLayer from 'ol/layer/VectorTile';
49
+ import OGCMapTile from 'ol/source/OGCMapTile.js';
50
+ import ImageLayer from 'ol/layer/Image';
51
+ import * as i2$4 from '@angular/material/tabs';
46
52
  import { MatTabsModule } from '@angular/material/tabs';
47
53
  import * as i2$1 from '@angular/forms';
48
54
  import { UntypedFormControl, FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms';
@@ -54,11 +60,11 @@ import * as i1$4 from '@angular/material/checkbox';
54
60
  import { MatCheckboxModule } from '@angular/material/checkbox';
55
61
  import * as i5$1 from 'ngx-chips';
56
62
  import { TagInputModule } from 'ngx-chips';
57
- import * as i3 from '@angular/material/tooltip';
63
+ import * as i2$2 from '@angular/material/tooltip';
58
64
  import { MatTooltipModule } from '@angular/material/tooltip';
59
- import * as i2$2 from '@angular/material/datepicker';
65
+ import * as i2$3 from '@angular/material/datepicker';
60
66
  import { MatDatepickerModule } from '@angular/material/datepicker';
61
- import * as i3$1 from 'ngx-dropzone';
67
+ import * as i3 from 'ngx-dropzone';
62
68
  import { NgxDropzoneModule } from 'ngx-dropzone';
63
69
  import * as i1$5 from '@angular/cdk/overlay';
64
70
  import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
@@ -84,21 +90,53 @@ import { trigger, transition, animate, keyframes, style } from '@angular/animati
84
90
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
85
91
  import * as i4$1 from '@angular/cdk/scrolling';
86
92
  import { ScrollingModule } from '@angular/cdk/scrolling';
87
- import * as i2$4 from '@angular/material/sort';
93
+ import * as i2$5 from '@angular/material/sort';
88
94
  import { MatSort, MatSortModule } from '@angular/material/sort';
89
95
  import * as i1$9 from '@angular/material/table';
90
96
  import { MatTableModule } from '@angular/material/table';
91
- import * as i3$2 from 'ng-table-virtual-scroll';
97
+ import * as i3$1 from 'ng-table-virtual-scroll';
92
98
  import { TableVirtualScrollDataSource, TableVirtualScrollModule } from 'ng-table-virtual-scroll';
93
99
  import * as Papa from 'papaparse';
94
100
  import parseDate from 'date-fns/parse';
95
101
  import parseIsoDate from 'date-fns/parseISO';
96
- import { WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
97
102
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
98
- import * as i3$3 from '@ngrx/router-store';
103
+ import * as i3$2 from '@ngrx/router-store';
99
104
  import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
100
105
  import { navigation } from '@ngrx/router-store/data-persistence';
101
106
 
107
+ class MetadataMapperContext {
108
+ }
109
+ class BaseConverter {
110
+ constructor(ctx = new MetadataMapperContext()) {
111
+ this.ctx = ctx;
112
+ }
113
+ readRecords(documents) {
114
+ return Promise.all(documents.map((doc) => this.readRecord(doc)));
115
+ }
116
+ writeRecords(records) {
117
+ return Promise.all(records.map((doc) => this.writeRecord(doc)));
118
+ }
119
+ }
120
+
121
+ function isEqual(a, b) {
122
+ if (Array.isArray(a) && Array.isArray(b)) {
123
+ return a.length === b.length && a.every((e, i) => isEqual(e, b[i]));
124
+ }
125
+ else if (a instanceof Date && b instanceof Date) {
126
+ return a.getTime() === b.getTime();
127
+ }
128
+ else if (a instanceof URL && b instanceof URL) {
129
+ return a.toString() === b.toString();
130
+ }
131
+ else if (a instanceof Object && b instanceof Object) {
132
+ const aKeys = Object.keys(a);
133
+ const bKeys = Object.keys(b);
134
+ return (aKeys.length === bKeys.length &&
135
+ aKeys.every((key) => isEqual(a[key], b[key])));
136
+ }
137
+ return a === b;
138
+ }
139
+
102
140
  function pipe(...fns) {
103
141
  return (value) => fns.reduce((prev, curr) => curr(prev), value);
104
142
  }
@@ -498,6 +536,108 @@ function renameElements(rootElement, replaceMap) {
498
536
  return rootElement;
499
537
  }
500
538
 
539
+ function matchProtocol(protocol) {
540
+ if (/wms/i.test(protocol))
541
+ return 'wms';
542
+ if (/wfs/i.test(protocol))
543
+ return 'wfs';
544
+ if (/wmts/i.test(protocol))
545
+ return 'wmts';
546
+ if (/wps/i.test(protocol))
547
+ return 'wps';
548
+ if (/ogc\W*api\W*features/i.test(protocol))
549
+ return 'ogcFeatures';
550
+ if (/esri/i.test(protocol))
551
+ return 'esriRest';
552
+ return 'other';
553
+ }
554
+ function matchMimeType(format) {
555
+ if (/shp|shapefile/i.test(format))
556
+ return 'x-gis/x-shapefile';
557
+ // TODO: check whether the format is a valid mime type
558
+ return format || null;
559
+ }
560
+
561
+ /**
562
+ * Parts are [firstName, lastName]
563
+ * Second part will be null if no separation could be done
564
+ * @param fullName
565
+ */
566
+ function fullNameToParts(fullName) {
567
+ const parts = fullName.trim().split(/\s+/);
568
+ const first = parts.shift();
569
+ return [first, parts.join(' ').trim() || null];
570
+ }
571
+ function namePartsToFull(firstName, lastName) {
572
+ const first = firstName?.trim();
573
+ const last = lastName?.trim();
574
+ if (!first && !last)
575
+ return null;
576
+ return last && first ? `${first} ${last}` : last || first;
577
+ }
578
+
579
+ function getKeywordTypeFromKeywordTypeCode(typeCode) {
580
+ if (!typeCode)
581
+ return 'other';
582
+ switch (typeCode) {
583
+ case 'theme':
584
+ case 'place':
585
+ case 'temporal':
586
+ case 'other':
587
+ return typeCode;
588
+ default:
589
+ return 'other';
590
+ }
591
+ }
592
+
593
+ function getRoleFromRoleCode(roleCode) {
594
+ if (!roleCode)
595
+ return 'unspecified';
596
+ switch (roleCode) {
597
+ case 'author':
598
+ case 'coAuthor':
599
+ return 'author';
600
+ case 'originator':
601
+ return 'originator';
602
+ case 'principalInvestigator':
603
+ return 'principal_investigator';
604
+ case 'resourceProvider':
605
+ return 'resource_provider';
606
+ case 'processor':
607
+ return 'processor';
608
+ case 'custodian':
609
+ return 'custodian';
610
+ case 'owner':
611
+ return 'owner';
612
+ case 'pointOfContact':
613
+ return 'point_of_contact';
614
+ case 'publisher':
615
+ return 'publisher';
616
+ case 'distributor':
617
+ return 'distributor';
618
+ case 'user':
619
+ return 'user';
620
+ case 'collaborator':
621
+ return 'collaborator';
622
+ case 'editor':
623
+ return 'editor';
624
+ case 'contributor':
625
+ return 'contributor';
626
+ case 'stakeholder':
627
+ return 'stakeholder';
628
+ case 'sponsor':
629
+ return 'sponsor';
630
+ case 'funder':
631
+ return 'funder';
632
+ case 'rightsHolder':
633
+ return 'rights_holder';
634
+ case 'mediator':
635
+ return 'mediator';
636
+ default:
637
+ return 'other';
638
+ }
639
+ }
640
+
501
641
  function getStatusFromStatusCode(statusCode) {
502
642
  switch (statusCode) {
503
643
  case 'completed':
@@ -580,108 +720,6 @@ function getUpdateFrequencyFromFrequencyCode(frequencyCode) {
580
720
  }
581
721
  }
582
722
 
583
- function getRoleFromRoleCode(roleCode) {
584
- if (!roleCode)
585
- return 'unspecified';
586
- switch (roleCode) {
587
- case 'author':
588
- case 'coAuthor':
589
- return 'author';
590
- case 'originator':
591
- return 'originator';
592
- case 'principalInvestigator':
593
- return 'principal_investigator';
594
- case 'resourceProvider':
595
- return 'resource_provider';
596
- case 'processor':
597
- return 'processor';
598
- case 'custodian':
599
- return 'custodian';
600
- case 'owner':
601
- return 'owner';
602
- case 'pointOfContact':
603
- return 'point_of_contact';
604
- case 'publisher':
605
- return 'publisher';
606
- case 'distributor':
607
- return 'distributor';
608
- case 'user':
609
- return 'user';
610
- case 'collaborator':
611
- return 'collaborator';
612
- case 'editor':
613
- return 'editor';
614
- case 'contributor':
615
- return 'contributor';
616
- case 'stakeholder':
617
- return 'stakeholder';
618
- case 'sponsor':
619
- return 'sponsor';
620
- case 'funder':
621
- return 'funder';
622
- case 'rightsHolder':
623
- return 'rights_holder';
624
- case 'mediator':
625
- return 'mediator';
626
- default:
627
- return 'other';
628
- }
629
- }
630
-
631
- function matchProtocol(protocol) {
632
- if (/wms/i.test(protocol))
633
- return 'wms';
634
- if (/wfs/i.test(protocol))
635
- return 'wfs';
636
- if (/wmts/i.test(protocol))
637
- return 'wmts';
638
- if (/wps/i.test(protocol))
639
- return 'wps';
640
- if (/ogc\W*api\W*features/i.test(protocol))
641
- return 'ogcFeatures';
642
- if (/esri/i.test(protocol))
643
- return 'esriRest';
644
- return 'other';
645
- }
646
- function matchMimeType(format) {
647
- if (/shp|shapefile/i.test(format))
648
- return 'x-gis/x-shapefile';
649
- // TODO: check whether the format is a valid mime type
650
- return format || null;
651
- }
652
-
653
- function getKeywordTypeFromKeywordTypeCode(typeCode) {
654
- if (!typeCode)
655
- return 'other';
656
- switch (typeCode) {
657
- case 'theme':
658
- case 'place':
659
- case 'temporal':
660
- case 'other':
661
- return typeCode;
662
- default:
663
- return 'other';
664
- }
665
- }
666
-
667
- /**
668
- * Parts are [firstName, lastName]
669
- * Second part will be null if no separation could be done
670
- * @param fullName
671
- */
672
- function fullNameToParts(fullName) {
673
- const parts = fullName.trim().split(/\s+/);
674
- const first = parts.shift();
675
- return [first, parts.join(' ').trim() || null];
676
- }
677
- function namePartsToFull(firstName, lastName) {
678
- const first = firstName?.trim();
679
- const last = lastName?.trim();
680
- if (!first && !last)
681
- return null;
682
- return last && first ? `${first} ${last}` : last || first;
683
- }
684
-
685
723
  function extractCharacterString() {
686
724
  return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
687
725
  }
@@ -855,7 +893,7 @@ function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
855
893
  else if (days <= 7) {
856
894
  return {
857
895
  per: 'week',
858
- updatedTimes: Math.round(7 / days),
896
+ updatedTimes: Math.round(7 / days - 0.0001), // this is to make sure that 'every 2 days' = '3 times per week'
859
897
  };
860
898
  }
861
899
  else if (days) {
@@ -1030,6 +1068,21 @@ function extractServiceOnlineResources() {
1030
1068
  function readOnlineResources(rootEl) {
1031
1069
  return pipe(findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'), mapArray(extractServiceOnlineResources()), flattenArray())(rootEl);
1032
1070
  }
1071
+ function readTemporalExtents(rootEl) {
1072
+ return pipe(findIdentification(), findNestedElements('gmd:extent', 'gmd:EX_Extent', 'gmd:temporalElement'), mapArray(combine(findNestedElement('gmd:EX_TemporalExtent', 'gmd:extent', 'gml:TimePeriod'), findNestedElement('gmd:EX_TemporalExtent', 'gmd:extent', 'gml:TimeInstant'))), mapArray(([periodEl, instantEl]) => {
1073
+ if (periodEl) {
1074
+ return pipe(combine(pipe(findChildElement('gml:beginPosition', false), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null))), pipe(findChildElement('gml:endPosition', false), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)))), map(([start, end]) => ({
1075
+ start,
1076
+ end,
1077
+ })))(periodEl);
1078
+ }
1079
+ else {
1080
+ return pipe(findChildElement('gml:timePosition', false), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)), map((date) => ({
1081
+ start: date,
1082
+ })))(instantEl);
1083
+ }
1084
+ }))(rootEl);
1085
+ }
1033
1086
 
1034
1087
  function writeCharacterString(text) {
1035
1088
  return tap(pipe(findChildOrCreate('gco:CharacterString'), setTextContent(text)));
@@ -1154,7 +1207,7 @@ function getISODuration(updateFrequency) {
1154
1207
  duration.hours = Math.round(24 / updateFrequency.updatedTimes);
1155
1208
  break;
1156
1209
  case 'week':
1157
- duration.days = Math.round(7 / updateFrequency.updatedTimes);
1210
+ duration.days = Math.round(7 / updateFrequency.updatedTimes - 0.0001); // this is to make sure that '2 times per week' = 'every 3 days'
1158
1211
  break;
1159
1212
  case 'month':
1160
1213
  if (updateFrequency.updatedTimes <= 1)
@@ -1428,38 +1481,16 @@ function createOnlineResource(onlineResource) {
1428
1481
  function writeOnlineResources(record, rootEl) {
1429
1482
  pipe(removeDistributions(), appendChildren(...record.onlineResources.map(createOnlineResource)))(rootEl);
1430
1483
  }
1431
-
1432
- function isEqual(a, b) {
1433
- if (Array.isArray(a) && Array.isArray(b)) {
1434
- return a.length === b.length && a.every((e, i) => isEqual(e, b[i]));
1435
- }
1436
- else if (a instanceof Date && b instanceof Date) {
1437
- return a.getTime() === b.getTime();
1438
- }
1439
- else if (a instanceof URL && b instanceof URL) {
1440
- return a.toString() === b.toString();
1441
- }
1442
- else if (a instanceof Object && b instanceof Object) {
1443
- const aKeys = Object.keys(a);
1444
- const bKeys = Object.keys(b);
1445
- return (aKeys.length === bKeys.length &&
1446
- aKeys.every((key) => isEqual(a[key], b[key])));
1447
- }
1448
- return a === b;
1449
- }
1450
-
1451
- class MetadataMapperContext {
1452
- }
1453
- class BaseConverter {
1454
- constructor(ctx = new MetadataMapperContext()) {
1455
- this.ctx = ctx;
1456
- }
1457
- readRecords(documents) {
1458
- return Promise.all(documents.map((doc) => this.readRecord(doc)));
1459
- }
1460
- writeRecords(records) {
1461
- return Promise.all(records.map((doc) => this.writeRecord(doc)));
1462
- }
1484
+ function writeTemporalExtents(record, rootEl) {
1485
+ pipe(findOrCreateIdentification(), findNestedChildOrCreate('gmd:extent', 'gmd:EX_Extent'), removeChildrenByName('gmd:temporalElement'), appendChildren(...record.temporalExtents.map((extent) => pipe(createElement('gmd:temporalElement'), createChild('gmd:EX_TemporalExtent'), appendChildren('start' in extent && 'end' in extent
1486
+ ? pipe(createElement('gmd:extent'), createChild('gml:TimePeriod'), appendChildren(pipe(createElement('gml:beginPosition'), pipe(extent.start
1487
+ ? setTextContent(format(extent.start, 'yyyy-MM-dd'))
1488
+ : addAttribute('indeterminatePosition', 'unknown'))), pipe(createElement('gml:endPosition'), pipe(extent.end
1489
+ ? setTextContent(format(extent.end, 'yyyy-MM-dd'))
1490
+ : addAttribute('indeterminatePosition', 'unknown')))))
1491
+ : pipe(createElement('gmd:extent'), createChild('gml:TimeInstant'), appendChildren(pipe(createElement('gml:timePosition'), pipe(extent.start
1492
+ ? setTextContent(format(extent.start, 'yyyy-MM-dd'))
1493
+ : addAttribute('indeterminatePosition', 'unknown'))))))))))(rootEl);
1463
1494
  }
1464
1495
 
1465
1496
  class Iso19139Converter extends BaseConverter {
@@ -1492,9 +1523,9 @@ class Iso19139Converter extends BaseConverter {
1492
1523
  lineage: readLineage$1,
1493
1524
  distributions: readDistributions$1,
1494
1525
  onlineResources: readOnlineResources,
1526
+ temporalExtents: readTemporalExtents,
1495
1527
  // TODO
1496
1528
  spatialExtents: () => [],
1497
- temporalExtents: () => [],
1498
1529
  extras: () => undefined,
1499
1530
  landingPage: () => undefined,
1500
1531
  languages: () => [],
@@ -1526,9 +1557,9 @@ class Iso19139Converter extends BaseConverter {
1526
1557
  lineage: writeLineage$1,
1527
1558
  distributions: writeDistributions$1,
1528
1559
  onlineResources: writeOnlineResources,
1560
+ temporalExtents: writeTemporalExtents,
1529
1561
  // TODO
1530
1562
  spatialExtents: () => undefined,
1531
- temporalExtents: () => undefined,
1532
1563
  extras: () => undefined,
1533
1564
  landingPage: () => undefined,
1534
1565
  languages: () => undefined,
@@ -1685,6 +1716,8 @@ class Iso19139Converter extends BaseConverter {
1685
1716
  fieldChanged('spatialRepresentation') &&
1686
1717
  this.writers['spatialRepresentation'](record, rootEl);
1687
1718
  fieldChanged('overviews') && this.writers['overviews'](record, rootEl);
1719
+ fieldChanged('temporalExtents') &&
1720
+ this.writers['temporalExtents'](record, rootEl);
1688
1721
  fieldChanged('distributions') &&
1689
1722
  this.writers['distributions'](record, rootEl);
1690
1723
  fieldChanged('lineage') && this.writers['lineage'](record, rootEl);
@@ -17429,6 +17462,8 @@ var de = {
17429
17462
  "editor.record.form.license.pddl": "",
17430
17463
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17431
17464
  "editor.record.form.resourceUpdated": "",
17465
+ "editor.record.form.updateFrequency": "",
17466
+ "editor.record.form.updateFrequency.planned": "",
17432
17467
  "editor.record.loadError.body": "",
17433
17468
  "editor.record.loadError.closeMessage": "",
17434
17469
  "editor.record.loadError.title": "",
@@ -17499,6 +17534,7 @@ var de = {
17499
17534
  "multiselect.filter.placeholder": "Suche",
17500
17535
  "nav.back": "Zurück",
17501
17536
  next: next$6,
17537
+ "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
17502
17538
  "organisation.filter.placeholder": "Ergebnisse filtern",
17503
17539
  "organisation.sort.sortBy": "Sortieren nach:",
17504
17540
  "organisations.hits.found": "{hits, plural, =0{Keine Organisation gefunden} other{{hits} von {total} Organisationen angezeigt}}",
@@ -17563,14 +17599,6 @@ var de = {
17563
17599
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
17564
17600
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
17565
17601
  "record.metadata.related": "Ähnliche Datensätze",
17566
- "record.metadata.userFeedbacks": "",
17567
- "record.metadata.userFeedbacks.anonymousUser": "",
17568
- "record.metadata.userFeedbacks.sortSelector.label": "",
17569
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
17570
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
17571
- "record.metadata.userFeedbacks.newComment.placeholder": "",
17572
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
17573
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
17574
17602
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
17575
17603
  "record.metadata.status": "Status",
17576
17604
  "record.metadata.technical": "Technische Informationen",
@@ -17585,6 +17613,14 @@ var de = {
17585
17613
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
17586
17614
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
17587
17615
  "record.metadata.usage": "Nutzung und Einschränkungen",
17616
+ "record.metadata.userFeedbacks": "",
17617
+ "record.metadata.userFeedbacks.anonymousUser": "",
17618
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
17619
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
17620
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
17621
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
17622
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
17623
+ "record.metadata.userFeedbacks.sortSelector.label": "",
17588
17624
  "record.more.details": "Weitere Details",
17589
17625
  "record.tab.chart": "Diagramm",
17590
17626
  "record.tab.data": "Tabelle",
@@ -17605,6 +17641,7 @@ var de = {
17605
17641
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
17606
17642
  "search.error.receivedError": "Ein Fehler ist aufgetreten",
17607
17643
  "search.error.recordNotFound": "Der Datensatz mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
17644
+ "search.error.recordHasnolink": "",
17608
17645
  "search.field.any.placeholder": "Suche Datensätze ...",
17609
17646
  "search.field.sortBy": "Sortieren nach:",
17610
17647
  "search.filters.clear": "Zurücksetzen",
@@ -17644,12 +17681,6 @@ var de = {
17644
17681
  "table.loading.data": "Daten werden geladen...",
17645
17682
  "table.object.count": "Objekte in diesem Datensatz",
17646
17683
  "table.select.data": "Datenquelle",
17647
- "timeSincePipe.lessThanAMinute": "",
17648
- "timeSincePipe.minutesAgo": "",
17649
- "timeSincePipe.hoursAgo": "",
17650
- "timeSincePipe.daysAgo": "",
17651
- "timeSincePipe.monthsAgo": "",
17652
- "timeSincePipe.yearsAgo": "",
17653
17684
  "tooltip.html.copy": "HTML kopieren",
17654
17685
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
17655
17686
  "tooltip.url.copy": "URL kopieren",
@@ -17825,6 +17856,8 @@ var en = {
17825
17856
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
17826
17857
  "editor.record.form.license.unknown": "Unknown or absent",
17827
17858
  "editor.record.form.resourceUpdated": "Last update date",
17859
+ "editor.record.form.updateFrequency": "Update frequency",
17860
+ "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
17828
17861
  "editor.record.loadError.body": "The record could not be loaded:",
17829
17862
  "editor.record.loadError.closeMessage": "Understood",
17830
17863
  "editor.record.loadError.title": "Error loading record",
@@ -17895,6 +17928,7 @@ var en = {
17895
17928
  "multiselect.filter.placeholder": "Search",
17896
17929
  "nav.back": "Back",
17897
17930
  next: next$5,
17931
+ "ogc.unreachable.unknown": "The service could not be reached",
17898
17932
  "organisation.filter.placeholder": "Filter results",
17899
17933
  "organisation.sort.sortBy": "Sort by:",
17900
17934
  "organisations.hits.found": "{hits, plural, =0{No organizations found} other{{hits} out of {total} organizations shown}}",
@@ -17959,14 +17993,6 @@ var en = {
17959
17993
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17960
17994
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17961
17995
  "record.metadata.related": "Related records",
17962
- "record.metadata.userFeedbacks": "Questions / Answers",
17963
- "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
17964
- "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
17965
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
17966
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
17967
- "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
17968
- "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
17969
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
17970
17996
  "record.metadata.sheet": "Original metadata",
17971
17997
  "record.metadata.status": "Status",
17972
17998
  "record.metadata.technical": "Technical information",
@@ -17981,6 +18007,14 @@ var en = {
17981
18007
  "record.metadata.updateFrequency": "Data Update Frequency",
17982
18008
  "record.metadata.updatedOn": "Last Data Information Update",
17983
18009
  "record.metadata.usage": "License and Conditions",
18010
+ "record.metadata.userFeedbacks": "Questions / Answers",
18011
+ "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
18012
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
18013
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
18014
+ "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
18015
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
18016
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
18017
+ "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
17984
18018
  "record.more.details": "Read more",
17985
18019
  "record.tab.chart": "Chart",
17986
18020
  "record.tab.data": "Table",
@@ -18001,6 +18035,7 @@ var en = {
18001
18035
  "search.error.couldNotReachApi": "The API could not be reached",
18002
18036
  "search.error.receivedError": "An error was received",
18003
18037
  "search.error.recordNotFound": "The record with identifier \"{ id }\" could not be found.",
18038
+ "search.error.recordHasnolink": "This record currently has no link yet, please come back later.",
18004
18039
  "search.field.any.placeholder": "Search datasets ...",
18005
18040
  "search.field.sortBy": "Sort by:",
18006
18041
  "search.filters.clear": "Reset",
@@ -18040,12 +18075,6 @@ var en = {
18040
18075
  "table.loading.data": "Loading data...",
18041
18076
  "table.object.count": "objects in this dataset",
18042
18077
  "table.select.data": "Data source",
18043
- "timeSincePipe.lessThanAMinute": "Less than a minute ago",
18044
- "timeSincePipe.minutesAgo": "{value} minute{s} ago",
18045
- "timeSincePipe.hoursAgo": "{value} hour{s} ago",
18046
- "timeSincePipe.daysAgo": "{value} day{s} ago",
18047
- "timeSincePipe.monthsAgo": "{value} month{s} ago",
18048
- "timeSincePipe.yearsAgo": "{value} year{s} ago",
18049
18078
  "tooltip.html.copy": "Copy HTML",
18050
18079
  "tooltip.id.copy": "Copy unique identifier",
18051
18080
  "tooltip.url.copy": "Copy URL",
@@ -18221,6 +18250,8 @@ var es = {
18221
18250
  "editor.record.form.license.pddl": "",
18222
18251
  "editor.record.form.license.unknown": "",
18223
18252
  "editor.record.form.resourceUpdated": "",
18253
+ "editor.record.form.updateFrequency": "",
18254
+ "editor.record.form.updateFrequency.planned": "",
18224
18255
  "editor.record.loadError.body": "",
18225
18256
  "editor.record.loadError.closeMessage": "",
18226
18257
  "editor.record.loadError.title": "",
@@ -18291,6 +18322,7 @@ var es = {
18291
18322
  "multiselect.filter.placeholder": "",
18292
18323
  "nav.back": "",
18293
18324
  next: next$4,
18325
+ "ogc.unreachable.unknown": "",
18294
18326
  "organisation.filter.placeholder": "",
18295
18327
  "organisation.sort.sortBy": "",
18296
18328
  "organisations.hits.found": "",
@@ -18355,14 +18387,6 @@ var es = {
18355
18387
  "record.metadata.quality.updateFrequency.failed": "",
18356
18388
  "record.metadata.quality.updateFrequency.success": "",
18357
18389
  "record.metadata.related": "",
18358
- "record.metadata.userFeedbacks": "",
18359
- "record.metadata.userFeedbacks.anonymousUser": "",
18360
- "record.metadata.userFeedbacks.sortSelector.label": "",
18361
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
18362
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
18363
- "record.metadata.userFeedbacks.newComment.placeholder": "",
18364
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
18365
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
18366
18390
  "record.metadata.sheet": "",
18367
18391
  "record.metadata.status": "",
18368
18392
  "record.metadata.technical": "",
@@ -18377,6 +18401,14 @@ var es = {
18377
18401
  "record.metadata.updateFrequency": "",
18378
18402
  "record.metadata.updatedOn": "",
18379
18403
  "record.metadata.usage": "",
18404
+ "record.metadata.userFeedbacks": "",
18405
+ "record.metadata.userFeedbacks.anonymousUser": "",
18406
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
18407
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
18408
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
18409
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
18410
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
18411
+ "record.metadata.userFeedbacks.sortSelector.label": "",
18380
18412
  "record.more.details": "",
18381
18413
  "record.tab.chart": "",
18382
18414
  "record.tab.data": "",
@@ -18397,6 +18429,7 @@ var es = {
18397
18429
  "search.error.couldNotReachApi": "",
18398
18430
  "search.error.receivedError": "",
18399
18431
  "search.error.recordNotFound": "",
18432
+ "search.error.recordHasnolink": "",
18400
18433
  "search.field.any.placeholder": "",
18401
18434
  "search.field.sortBy": "",
18402
18435
  "search.filters.clear": "",
@@ -18436,12 +18469,6 @@ var es = {
18436
18469
  "table.loading.data": "",
18437
18470
  "table.object.count": "",
18438
18471
  "table.select.data": "",
18439
- "timeSincePipe.lessThanAMinute": "",
18440
- "timeSincePipe.minutesAgo": "",
18441
- "timeSincePipe.hoursAgo": "",
18442
- "timeSincePipe.daysAgo": "",
18443
- "timeSincePipe.monthsAgo": "",
18444
- "timeSincePipe.yearsAgo": "",
18445
18472
  "tooltip.html.copy": "",
18446
18473
  "tooltip.id.copy": "",
18447
18474
  "tooltip.url.copy": "",
@@ -18617,6 +18644,8 @@ var fr = {
18617
18644
  "editor.record.form.license.pddl": "",
18618
18645
  "editor.record.form.license.unknown": "Non-reconnue ou absente",
18619
18646
  "editor.record.form.resourceUpdated": "Date de dernière révision",
18647
+ "editor.record.form.updateFrequency": "Fréquence de mise à jour",
18648
+ "editor.record.form.updateFrequency.planned": "Ces données doivent être mise à jour régulièrement.",
18620
18649
  "editor.record.loadError.body": "",
18621
18650
  "editor.record.loadError.closeMessage": "",
18622
18651
  "editor.record.loadError.title": "",
@@ -18687,6 +18716,7 @@ var fr = {
18687
18716
  "multiselect.filter.placeholder": "Rechercher",
18688
18717
  "nav.back": "Retour",
18689
18718
  next: next$3,
18719
+ "ogc.unreachable.unknown": "Le service n'est pas accessible",
18690
18720
  "organisation.filter.placeholder": "Filtrer les résultats",
18691
18721
  "organisation.sort.sortBy": "Trier par :",
18692
18722
  "organisations.hits.found": "{hits, plural, =0{Aucune organisation trouvé} one{1 organisation sur {total} affichée} other{{hits} organisations sur {total} affichées}}",
@@ -18751,14 +18781,6 @@ var fr = {
18751
18781
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
18752
18782
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
18753
18783
  "record.metadata.related": "Voir aussi",
18754
- "record.metadata.userFeedbacks": "Questions / Réponses",
18755
- "record.metadata.userFeedbacks.anonymousUser": "Pour rédiger un commentaire, veuillez vous identifier.",
18756
- "record.metadata.userFeedbacks.sortSelector.label": "Trier par ...",
18757
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Les plus récents en premier",
18758
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Les plus anciens en premier",
18759
- "record.metadata.userFeedbacks.newComment.placeholder": "Rédiger votre commentaire ici...",
18760
- "record.metadata.userFeedbacks.newAnswer.placeholder": "Répondre...",
18761
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publier",
18762
18784
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
18763
18785
  "record.metadata.status": "Statut",
18764
18786
  "record.metadata.technical": "Informations techniques",
@@ -18773,6 +18795,14 @@ var fr = {
18773
18795
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
18774
18796
  "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
18775
18797
  "record.metadata.usage": "Licences et conditions d'utilisation",
18798
+ "record.metadata.userFeedbacks": "Questions / Réponses",
18799
+ "record.metadata.userFeedbacks.anonymousUser": "Pour rédiger un commentaire, veuillez vous identifier.",
18800
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publier",
18801
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Répondre...",
18802
+ "record.metadata.userFeedbacks.newComment.placeholder": "Rédiger votre commentaire ici...",
18803
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Les plus récents en premier",
18804
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Les plus anciens en premier",
18805
+ "record.metadata.userFeedbacks.sortSelector.label": "Trier par ...",
18776
18806
  "record.more.details": "Détails",
18777
18807
  "record.tab.chart": "Graphique",
18778
18808
  "record.tab.data": "Tableau",
@@ -18793,6 +18823,7 @@ var fr = {
18793
18823
  "search.error.couldNotReachApi": "Problème de connexion à l'API",
18794
18824
  "search.error.receivedError": "Erreur retournée",
18795
18825
  "search.error.recordNotFound": "Cette donnée n'a pu être trouvée.",
18826
+ "search.error.recordHasnolink": "Ce dataset n'a pas encore de lien, réessayez plus tard s'il vous plaît.",
18796
18827
  "search.field.any.placeholder": "Rechercher une donnée...",
18797
18828
  "search.field.sortBy": "Trier par :",
18798
18829
  "search.filters.clear": "Réinitialiser",
@@ -18832,12 +18863,6 @@ var fr = {
18832
18863
  "table.loading.data": "Chargement des données...",
18833
18864
  "table.object.count": "enregistrements dans ces données",
18834
18865
  "table.select.data": "Source de données",
18835
- "timeSincePipe.lessThanAMinute": "Il y a moins d'une minute",
18836
- "timeSincePipe.minutesAgo": "Il y a {value} minute{s}",
18837
- "timeSincePipe.hoursAgo": "Il y a {value} heure{s}",
18838
- "timeSincePipe.daysAgo": "Il y a {value} jour{s}",
18839
- "timeSincePipe.monthsAgo": "Il y a {value} mois",
18840
- "timeSincePipe.yearsAgo": "Il y a {value} an{s}",
18841
18866
  "tooltip.html.copy": "Copier le HTML",
18842
18867
  "tooltip.id.copy": "Copier l'identifiant unique",
18843
18868
  "tooltip.url.copy": "Copier l'URL",
@@ -19013,6 +19038,8 @@ var it = {
19013
19038
  "editor.record.form.license.pddl": "",
19014
19039
  "editor.record.form.license.unknown": "Non riconosciuta o assente",
19015
19040
  "editor.record.form.resourceUpdated": "",
19041
+ "editor.record.form.updateFrequency": "",
19042
+ "editor.record.form.updateFrequency.planned": "",
19016
19043
  "editor.record.loadError.body": "",
19017
19044
  "editor.record.loadError.closeMessage": "",
19018
19045
  "editor.record.loadError.title": "",
@@ -19083,6 +19110,7 @@ var it = {
19083
19110
  "multiselect.filter.placeholder": "Cerca",
19084
19111
  "nav.back": "Indietro",
19085
19112
  next: next$2,
19113
+ "ogc.unreachable.unknown": "Il servizio non è accessibile",
19086
19114
  "organisation.filter.placeholder": "Filtra i risultati",
19087
19115
  "organisation.sort.sortBy": "Ordina per:",
19088
19116
  "organisations.hits.found": "{hits, plural, =0{Nessuna organizzazione trovata} one{1 organizzazione su {total} visualizzata} other{{hits} organizzazioni su {total} visualizzate}}",
@@ -19147,14 +19175,6 @@ var it = {
19147
19175
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
19148
19176
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
19149
19177
  "record.metadata.related": "Vedi anche",
19150
- "record.metadata.userFeedbacks": "",
19151
- "record.metadata.userFeedbacks.anonymousUser": "",
19152
- "record.metadata.userFeedbacks.sortSelector.label": "",
19153
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19154
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19155
- "record.metadata.userFeedbacks.newComment.placeholder": "",
19156
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19157
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19158
19178
  "record.metadata.sheet": "Origine del metadata",
19159
19179
  "record.metadata.status": "Stato",
19160
19180
  "record.metadata.technical": "Informazioni tecniche",
@@ -19169,6 +19189,14 @@ var it = {
19169
19189
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
19170
19190
  "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
19171
19191
  "record.metadata.usage": "Licenze e limiti di utilizzo",
19192
+ "record.metadata.userFeedbacks": "",
19193
+ "record.metadata.userFeedbacks.anonymousUser": "",
19194
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19195
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19196
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19197
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19198
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19199
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19172
19200
  "record.more.details": "Dettagli",
19173
19201
  "record.tab.chart": "Grafico",
19174
19202
  "record.tab.data": "Tabella",
@@ -19189,6 +19217,7 @@ var it = {
19189
19217
  "search.error.couldNotReachApi": "Problema di connessione all'API",
19190
19218
  "search.error.receivedError": "Errore ricevuto",
19191
19219
  "search.error.recordNotFound": "Impossibile trovare questo dato",
19220
+ "search.error.recordHasnolink": "",
19192
19221
  "search.field.any.placeholder": "Cerca un dato...",
19193
19222
  "search.field.sortBy": "Ordina per:",
19194
19223
  "search.filters.clear": "Ripristina",
@@ -19228,12 +19257,6 @@ var it = {
19228
19257
  "table.loading.data": "Caricamento dei dati...",
19229
19258
  "table.object.count": "record in questi dati",
19230
19259
  "table.select.data": "Sorgente dati",
19231
- "timeSincePipe.lessThanAMinute": "",
19232
- "timeSincePipe.minutesAgo": "",
19233
- "timeSincePipe.hoursAgo": "",
19234
- "timeSincePipe.daysAgo": "",
19235
- "timeSincePipe.monthsAgo": "",
19236
- "timeSincePipe.yearsAgo": "",
19237
19260
  "tooltip.html.copy": "Copiare il HTML",
19238
19261
  "tooltip.id.copy": "Copiare l'identificatore unico",
19239
19262
  "tooltip.url.copy": "Copiare l'URL",
@@ -19409,6 +19432,8 @@ var nl = {
19409
19432
  "editor.record.form.license.pddl": "",
19410
19433
  "editor.record.form.license.unknown": "",
19411
19434
  "editor.record.form.resourceUpdated": "",
19435
+ "editor.record.form.updateFrequency": "",
19436
+ "editor.record.form.updateFrequency.planned": "",
19412
19437
  "editor.record.loadError.body": "",
19413
19438
  "editor.record.loadError.closeMessage": "",
19414
19439
  "editor.record.loadError.title": "",
@@ -19479,6 +19504,7 @@ var nl = {
19479
19504
  "multiselect.filter.placeholder": "",
19480
19505
  "nav.back": "",
19481
19506
  next: next$1,
19507
+ "ogc.unreachable.unknown": "",
19482
19508
  "organisation.filter.placeholder": "",
19483
19509
  "organisation.sort.sortBy": "",
19484
19510
  "organisations.hits.found": "",
@@ -19543,14 +19569,6 @@ var nl = {
19543
19569
  "record.metadata.quality.updateFrequency.failed": "",
19544
19570
  "record.metadata.quality.updateFrequency.success": "",
19545
19571
  "record.metadata.related": "",
19546
- "record.metadata.userFeedbacks": "",
19547
- "record.metadata.userFeedbacks.anonymousUser": "",
19548
- "record.metadata.userFeedbacks.sortSelector.label": "",
19549
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19550
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19551
- "record.metadata.userFeedbacks.newComment.placeholder": "",
19552
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19553
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19554
19572
  "record.metadata.sheet": "",
19555
19573
  "record.metadata.status": "",
19556
19574
  "record.metadata.technical": "",
@@ -19565,6 +19583,14 @@ var nl = {
19565
19583
  "record.metadata.updateFrequency": "",
19566
19584
  "record.metadata.updatedOn": "",
19567
19585
  "record.metadata.usage": "",
19586
+ "record.metadata.userFeedbacks": "",
19587
+ "record.metadata.userFeedbacks.anonymousUser": "",
19588
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19589
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19590
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19591
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19592
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19593
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19568
19594
  "record.more.details": "",
19569
19595
  "record.tab.chart": "",
19570
19596
  "record.tab.data": "",
@@ -19585,6 +19611,7 @@ var nl = {
19585
19611
  "search.error.couldNotReachApi": "",
19586
19612
  "search.error.receivedError": "",
19587
19613
  "search.error.recordNotFound": "",
19614
+ "search.error.recordHasnolink": "",
19588
19615
  "search.field.any.placeholder": "",
19589
19616
  "search.field.sortBy": "",
19590
19617
  "search.filters.clear": "",
@@ -19624,12 +19651,6 @@ var nl = {
19624
19651
  "table.loading.data": "",
19625
19652
  "table.object.count": "",
19626
19653
  "table.select.data": "",
19627
- "timeSincePipe.lessThanAMinute": "",
19628
- "timeSincePipe.minutesAgo": "",
19629
- "timeSincePipe.hoursAgo": "",
19630
- "timeSincePipe.daysAgo": "",
19631
- "timeSincePipe.monthsAgo": "",
19632
- "timeSincePipe.yearsAgo": "",
19633
19654
  "tooltip.html.copy": "",
19634
19655
  "tooltip.id.copy": "",
19635
19656
  "tooltip.url.copy": "",
@@ -19805,6 +19826,8 @@ var pt = {
19805
19826
  "editor.record.form.license.pddl": "",
19806
19827
  "editor.record.form.license.unknown": "",
19807
19828
  "editor.record.form.resourceUpdated": "",
19829
+ "editor.record.form.updateFrequency": "",
19830
+ "editor.record.form.updateFrequency.planned": "",
19808
19831
  "editor.record.loadError.body": "",
19809
19832
  "editor.record.loadError.closeMessage": "",
19810
19833
  "editor.record.loadError.title": "",
@@ -19875,6 +19898,7 @@ var pt = {
19875
19898
  "multiselect.filter.placeholder": "",
19876
19899
  "nav.back": "",
19877
19900
  next: next,
19901
+ "ogc.unreachable.unknown": "",
19878
19902
  "organisation.filter.placeholder": "",
19879
19903
  "organisation.sort.sortBy": "",
19880
19904
  "organisations.hits.found": "",
@@ -19939,14 +19963,6 @@ var pt = {
19939
19963
  "record.metadata.quality.updateFrequency.failed": "",
19940
19964
  "record.metadata.quality.updateFrequency.success": "",
19941
19965
  "record.metadata.related": "",
19942
- "record.metadata.userFeedbacks": "",
19943
- "record.metadata.userFeedbacks.anonymousUser": "",
19944
- "record.metadata.userFeedbacks.sortSelector.label": "",
19945
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19946
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19947
- "record.metadata.userFeedbacks.newComment.placeholder": "",
19948
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19949
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19950
19966
  "record.metadata.sheet": "",
19951
19967
  "record.metadata.status": "",
19952
19968
  "record.metadata.technical": "",
@@ -19961,6 +19977,14 @@ var pt = {
19961
19977
  "record.metadata.updateFrequency": "",
19962
19978
  "record.metadata.updatedOn": "",
19963
19979
  "record.metadata.usage": "",
19980
+ "record.metadata.userFeedbacks": "",
19981
+ "record.metadata.userFeedbacks.anonymousUser": "",
19982
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19983
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19984
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19985
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19986
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19987
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19964
19988
  "record.more.details": "",
19965
19989
  "record.tab.chart": "",
19966
19990
  "record.tab.data": "",
@@ -19981,6 +20005,7 @@ var pt = {
19981
20005
  "search.error.couldNotReachApi": "",
19982
20006
  "search.error.receivedError": "",
19983
20007
  "search.error.recordNotFound": "",
20008
+ "search.error.recordHasnolink": "",
19984
20009
  "search.field.any.placeholder": "",
19985
20010
  "search.field.sortBy": "",
19986
20011
  "search.filters.clear": "",
@@ -20020,12 +20045,6 @@ var pt = {
20020
20045
  "table.loading.data": "",
20021
20046
  "table.object.count": "",
20022
20047
  "table.select.data": "",
20023
- "timeSincePipe.lessThanAMinute": "",
20024
- "timeSincePipe.minutesAgo": "",
20025
- "timeSincePipe.hoursAgo": "",
20026
- "timeSincePipe.daysAgo": "",
20027
- "timeSincePipe.monthsAgo": "",
20028
- "timeSincePipe.yearsAgo": "",
20029
20048
  "tooltip.html.copy": "",
20030
20049
  "tooltip.id.copy": "",
20031
20050
  "tooltip.url.copy": "",
@@ -21630,15 +21649,17 @@ class Gn4PlatformService {
21630
21649
  return this.thesauri[uri];
21631
21650
  }
21632
21651
  getUserFeedbacks(uuid) {
21633
- return this.userfeedbackApiService
21634
- .getUserComments(uuid)
21635
- .pipe(map$1((userFeedbacks) => userFeedbacks.map(this.mapper.userFeedbacksFromApi)));
21652
+ return this.userfeedbackApiService.getUserComments(uuid).pipe(map$1((userFeedbacks) => userFeedbacks.map(this.mapper.userFeedbacksFromApi)), catchError((error) => {
21653
+ console.error('Error fetching user feedbacks:', error);
21654
+ return of(undefined);
21655
+ }));
21636
21656
  }
21637
21657
  postUserFeedbacks(userFeedback) {
21638
21658
  const mappedUserFeedBack = this.mapper.userFeedbacksToApi(userFeedback);
21639
- return this.userfeedbackApiService
21640
- .newUserFeedback(mappedUserFeedBack)
21641
- .pipe(map$1(() => undefined));
21659
+ return this.userfeedbackApiService.newUserFeedback(mappedUserFeedBack).pipe(map$1(() => undefined), catchError((error) => {
21660
+ console.error('Error posting user feedback:', error);
21661
+ return of(undefined);
21662
+ }));
21642
21663
  }
21643
21664
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }, { token: UserfeedbackApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21644
21665
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
@@ -22524,7 +22545,7 @@ class LinkClassifierService {
22524
22545
  case 'wmts':
22525
22546
  return [LinkUsage.API, LinkUsage.MAP_API];
22526
22547
  case 'ogcFeatures':
22527
- return [LinkUsage.API];
22548
+ return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA];
22528
22549
  default:
22529
22550
  return [LinkUsage.UNKNOWN];
22530
22551
  }
@@ -22577,7 +22598,10 @@ class MapUtilsService {
22577
22598
  }
22578
22599
  createEmptyMap() {
22579
22600
  return new Map$1({
22580
- controls: [],
22601
+ controls: defaults({
22602
+ attribution: true,
22603
+ attributionOptions: { collapsible: false },
22604
+ }),
22581
22605
  pixelRatio: 1,
22582
22606
  });
22583
22607
  }
@@ -22676,7 +22700,7 @@ class MapUtilsService {
22676
22700
  }
22677
22701
  prioritizePageScroll(interactions) {
22678
22702
  interactions.clear();
22679
- interactions.extend(defaults({
22703
+ interactions.extend(defaults$1({
22680
22704
  // remove rotate interactions
22681
22705
  altShiftDragRotate: false,
22682
22706
  pinchRotate: false,
@@ -22695,7 +22719,7 @@ class MapUtilsService {
22695
22719
  .getArray());
22696
22720
  }
22697
22721
  getRecordExtent(record) {
22698
- if (!('spatialExtents' in record)) {
22722
+ if (!('spatialExtents' in record) || record.spatialExtents.length === 0) {
22699
22723
  return null;
22700
22724
  }
22701
22725
  // transform an array of geojson geometries into a bbox
@@ -23416,6 +23440,7 @@ function loadAppConfig() {
23416
23440
  const parsedLayersSections = parseMultiConfigSection(parsed, 'map_layer', ['type'], ['name', 'url', 'data'], warnings, errors);
23417
23441
  const parsedMapSection = parseConfigSection(parsed, 'map', [], [
23418
23442
  'max_zoom',
23443
+ 'do_not_tile_wms',
23419
23444
  'max_extent',
23420
23445
  'baselayer',
23421
23446
  'do_not_use_default_basemap',
@@ -23427,6 +23452,7 @@ function loadAppConfig() {
23427
23452
  ? null
23428
23453
  : {
23429
23454
  MAX_ZOOM: parsedMapSection.max_zoom,
23455
+ DO_NOT_TILE_WMS: parsedMapSection.do_not_tile_wms,
23430
23456
  MAX_EXTENT: parsedMapSection.max_extent,
23431
23457
  EXTERNAL_VIEWER_URL_TEMPLATE: parsedMapSection.external_viewer_url_template,
23432
23458
  EXTERNAL_VIEWER_OPEN_NEW_TAB: parsedMapSection.external_viewer_open_new_tab,
@@ -23604,6 +23630,7 @@ const MAP_CONFIG_FIXTURE = {
23604
23630
  MAX_ZOOM: 10,
23605
23631
  MAX_EXTENT: [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855],
23606
23632
  DO_NOT_USE_DEFAULT_BASEMAP: false,
23633
+ DO_NOT_TILE_WMS: false,
23607
23634
  EXTERNAL_VIEWER_URL_TEMPLATE: 'https://example.com/myviewer/#/?actions=[{"type":"CATALOG:ADD_LAYERS_FROM_CATALOGS","layers":["${layer_name}"],"sources":[{"url":"${service_url}","type":"${service_type}"}]}]',
23608
23635
  EXTERNAL_VIEWER_OPEN_NEW_TAB: true,
23609
23636
  MAP_LAYERS: [
@@ -23793,6 +23820,7 @@ const DEFAULT_BASELAYER_CONTEXT = {
23793
23820
  `https://b.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
23794
23821
  `https://c.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
23795
23822
  ],
23823
+ attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
23796
23824
  };
23797
23825
  const DEFAULT_VIEW = {
23798
23826
  center: [0, 15],
@@ -23817,36 +23845,68 @@ class MapContextService {
23817
23845
  }
23818
23846
  map.setView(this.createView(mapContext.view, map));
23819
23847
  map.getLayers().clear();
23820
- mapContext.layers.forEach((layer) => map.addLayer(this.createLayer(layer)));
23848
+ mapContext.layers.forEach((layer) => map.addLayer(this.createLayer(layer, mapConfig)));
23821
23849
  return map;
23822
23850
  }
23823
- createLayer(layerModel) {
23851
+ createLayer(layerModel, mapConfig) {
23824
23852
  const { type } = layerModel;
23825
23853
  const style = this.styleService.styles.default;
23826
23854
  switch (type) {
23827
23855
  case MapContextLayerTypeEnum.OGCAPI:
23828
- return new VectorLayer({
23829
- source: new VectorSource({
23830
- format: new GeoJSON(),
23831
- url: layerModel.url,
23832
- }),
23833
- style,
23834
- });
23856
+ if (layerModel.layerType === 'vectorTiles') {
23857
+ return new VectorTileLayer({
23858
+ source: new OGCVectorTile({
23859
+ url: layerModel.url,
23860
+ format: new MVT(),
23861
+ attributions: layerModel.attributions,
23862
+ }),
23863
+ });
23864
+ }
23865
+ else if (layerModel.layerType === 'mapTiles') {
23866
+ return new TileLayer({
23867
+ source: new OGCMapTile({
23868
+ url: layerModel.url,
23869
+ attributions: layerModel.attributions,
23870
+ }),
23871
+ });
23872
+ }
23873
+ else {
23874
+ return new VectorLayer({
23875
+ source: new VectorSource({
23876
+ format: new GeoJSON(),
23877
+ url: layerModel.url,
23878
+ attributions: layerModel.attributions,
23879
+ }),
23880
+ style,
23881
+ });
23882
+ }
23835
23883
  case MapContextLayerTypeEnum.XYZ:
23836
23884
  return new TileLayer({
23837
23885
  source: new XYZ({
23838
23886
  url: 'url' in layerModel ? layerModel.url : undefined,
23839
23887
  urls: 'urls' in layerModel ? layerModel.urls : undefined,
23888
+ attributions: layerModel.attributions,
23840
23889
  }),
23841
23890
  });
23842
23891
  case MapContextLayerTypeEnum.WMS:
23843
- return new TileLayer({
23844
- source: new TileWMS({
23845
- url: layerModel.url,
23846
- params: { LAYERS: layerModel.name },
23847
- gutter: 20,
23848
- }),
23849
- });
23892
+ if (mapConfig?.DO_NOT_TILE_WMS) {
23893
+ return new ImageLayer({
23894
+ source: new ImageWMS({
23895
+ url: layerModel.url,
23896
+ params: { LAYERS: layerModel.name },
23897
+ attributions: layerModel.attributions,
23898
+ }),
23899
+ });
23900
+ }
23901
+ else {
23902
+ return new TileLayer({
23903
+ source: new TileWMS({
23904
+ url: layerModel.url,
23905
+ params: { LAYERS: layerModel.name, TILED: true },
23906
+ attributions: layerModel.attributions,
23907
+ }),
23908
+ });
23909
+ }
23850
23910
  case MapContextLayerTypeEnum.WMTS: {
23851
23911
  // TODO: isolate this in utils service
23852
23912
  const olLayer = new TileLayer({});
@@ -23868,6 +23928,7 @@ class MapContextService {
23868
23928
  tileGrid,
23869
23929
  projection: matrixSet.crs,
23870
23930
  dimensions,
23931
+ attributions: layerModel.attributions,
23871
23932
  }));
23872
23933
  });
23873
23934
  return olLayer;
@@ -23890,6 +23951,7 @@ class MapContextService {
23890
23951
  });
23891
23952
  },
23892
23953
  strategy: bbox,
23954
+ attributions: layerModel.attributions,
23893
23955
  }));
23894
23956
  });
23895
23957
  return olLayer;
@@ -24297,11 +24359,11 @@ class CheckToggleComponent {
24297
24359
  this.toggled.emit(event);
24298
24360
  }
24299
24361
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24300
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: { title: "title", label: "label", value: "value", color: "color" }, outputs: { toggled: "toggled" }, ngImport: i0, template: "<label class=\"inline-flex relative items-start cursor-pointer\" [title]=\"title\">\n <span class=\"shrink-0\">\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [ngModel]=\"value\"\n (ngModelChange)=\"toggle($event)\"\n />\n <div\n class=\"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-2 rounded-full peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all\"\n [class]=\"\n color === 'secondary'\n ? 'peer-focus:ring-secondary-lighter peer-checked:bg-secondary'\n : 'peer-focus:ring-primary-lighter peer-checked:bg-primary'\n \"\n ></div>\n </span>\n <span class=\"ml-3 mt-[2px] text-sm font-medium\">{{ label }}</span>\n</label>\n", styles: [""], dependencies: [{ kind: "directive", type: i2$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24362
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckToggleComponent, isStandalone: true, selector: "gn-ui-check-toggle", inputs: { title: "title", label: "label", value: "value", color: "color" }, outputs: { toggled: "toggled" }, ngImport: i0, template: "<label class=\"inline-flex relative items-start cursor-pointer\" [title]=\"title\">\n <span class=\"shrink-0\">\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [ngModel]=\"value\"\n (ngModelChange)=\"toggle($event)\"\n />\n <div\n class=\"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-2 rounded-full peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all\"\n [class]=\"\n color === 'secondary'\n ? 'peer-focus:ring-secondary-lighter peer-checked:bg-secondary'\n : 'peer-focus:ring-primary-lighter peer-checked:bg-primary'\n \"\n ></div>\n </span>\n <span class=\"ml-3 mt-[2px] text-sm font-medium\">{{ label }}</span>\n</label>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24301
24363
  }
24302
24364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, decorators: [{
24303
24365
  type: Component,
24304
- args: [{ selector: 'gn-ui-check-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<label class=\"inline-flex relative items-start cursor-pointer\" [title]=\"title\">\n <span class=\"shrink-0\">\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [ngModel]=\"value\"\n (ngModelChange)=\"toggle($event)\"\n />\n <div\n class=\"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-2 rounded-full peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all\"\n [class]=\"\n color === 'secondary'\n ? 'peer-focus:ring-secondary-lighter peer-checked:bg-secondary'\n : 'peer-focus:ring-primary-lighter peer-checked:bg-primary'\n \"\n ></div>\n </span>\n <span class=\"ml-3 mt-[2px] text-sm font-medium\">{{ label }}</span>\n</label>\n" }]
24366
+ args: [{ selector: 'gn-ui-check-toggle', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormsModule], template: "<label class=\"inline-flex relative items-start cursor-pointer\" [title]=\"title\">\n <span class=\"shrink-0\">\n <input\n type=\"checkbox\"\n class=\"sr-only peer\"\n [ngModel]=\"value\"\n (ngModelChange)=\"toggle($event)\"\n />\n <div\n class=\"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-2 rounded-full peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all\"\n [class]=\"\n color === 'secondary'\n ? 'peer-focus:ring-secondary-lighter peer-checked:bg-secondary'\n : 'peer-focus:ring-primary-lighter peer-checked:bg-primary'\n \"\n ></div>\n </span>\n <span class=\"ml-3 mt-[2px] text-sm font-medium\">{{ label }}</span>\n</label>\n" }]
24305
24367
  }], propDecorators: { title: [{
24306
24368
  type: Input
24307
24369
  }], label: [{
@@ -24421,7 +24483,7 @@ class CopyTextButtonComponent {
24421
24483
  event.target.blur();
24422
24484
  }
24423
24485
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24424
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24486
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24425
24487
  }
24426
24488
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24427
24489
  type: Component,
@@ -24441,7 +24503,7 @@ class DatePickerComponent {
24441
24503
  this.dateChange = new EventEmitter();
24442
24504
  }
24443
24505
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24444
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DatePickerComponent, isStandalone: true, selector: "gn-ui-date-picker", inputs: { date: "date" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between pl-3 rounded-lg border border-gray-300 bg-white\"\n>\n <input\n [matDatepicker]=\"picker\"\n [value]=\"date\"\n (dateChange)=\"dateChange.emit($event.value)\"\n />\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n</div>\n<mat-datepicker #picker></mat-datepicker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] }); }
24506
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DatePickerComponent, isStandalone: true, selector: "gn-ui-date-picker", inputs: { date: "date" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between pl-3 rounded-lg border border-gray-300 bg-white\"\n>\n <input\n [matDatepicker]=\"picker\"\n [value]=\"date\"\n (dateChange)=\"dateChange.emit($event.value)\"\n />\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n</div>\n<mat-datepicker #picker></mat-datepicker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] }); }
24445
24507
  }
24446
24508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DatePickerComponent, decorators: [{
24447
24509
  type: Component,
@@ -24460,7 +24522,7 @@ class DateRangePickerComponent {
24460
24522
  this.endDate = event.value;
24461
24523
  }
24462
24524
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24463
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DateRangePickerComponent, isStandalone: true, selector: "gn-ui-date-range-picker", ngImport: i0, template: "<div\n class=\"flex items-center justify-center w-64 h-11 rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"w-48 flex justify-between\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matStartDate\n placeholder=\"Start date\"\n (dateInput)=\"startDateSelected($event)\"\n />\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matEndDate\n placeholder=\"End date\"\n (dateInput)=\"endDateSelected($event)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n</div>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2$2.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2$2.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2$2.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2$2.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }] }); }
24525
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DateRangePickerComponent, isStandalone: true, selector: "gn-ui-date-range-picker", ngImport: i0, template: "<div\n class=\"flex items-center justify-center w-64 h-11 rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"w-48 flex justify-between\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matStartDate\n placeholder=\"Start date\"\n (dateInput)=\"startDateSelected($event)\"\n />\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matEndDate\n placeholder=\"End date\"\n (dateInput)=\"endDateSelected($event)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n</div>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2$3.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2$3.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2$3.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2$3.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }] }); }
24464
24526
  }
24465
24527
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, decorators: [{
24466
24528
  type: Component,
@@ -24484,7 +24546,7 @@ class DragAndDropFileInputComponent {
24484
24546
  this.fileChange.emit(this.selectedFile);
24485
24547
  }
24486
24548
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24487
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: { placeholder: "placeholder", accept: "accept" }, outputs: { fileChange: "fileChange" }, ngImport: i0, template: "<div class=\"flex h-full\">\n <ngx-dropzone\n class=\"flex-1\"\n multiple=\"false\"\n (change)=\"selectFile($event)\"\n [accept]=\"accept\"\n >\n <div *ngIf=\"!fileName\" class=\"text-gray-900 pl-2 py-2\" translate=\"\">\n {{ placeholder }}\n </div>\n\n <div *ngIf=\"fileName\" class=\"text-gray-900 pl-2 py-2\">{{ fileName }}</div>\n </ngx-dropzone>\n</div>\n", styles: ["ngx-dropzone{height:auto;border:none}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3$1.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }] }); }
24549
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: { placeholder: "placeholder", accept: "accept" }, outputs: { fileChange: "fileChange" }, ngImport: i0, template: "<div class=\"flex h-full\">\n <ngx-dropzone\n class=\"flex-1\"\n multiple=\"false\"\n (change)=\"selectFile($event)\"\n [accept]=\"accept\"\n >\n <div *ngIf=\"!fileName\" class=\"text-gray-900 pl-2 py-2\" translate=\"\">\n {{ placeholder }}\n </div>\n\n <div *ngIf=\"fileName\" class=\"text-gray-900 pl-2 py-2\">{{ fileName }}</div>\n </ngx-dropzone>\n</div>\n", styles: ["ngx-dropzone{height:auto;border:none}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }] }); }
24488
24550
  }
24489
24551
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
24490
24552
  type: Component,
@@ -24812,7 +24874,7 @@ class DropdownSelectorComponent {
24812
24874
  }
24813
24875
  }
24814
24876
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24815
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, isStandalone: true, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$5.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24877
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, isStandalone: true, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth", disabled: "disabled" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n [disabled]=\"disabled\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$5.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24816
24878
  }
24817
24879
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24818
24880
  type: Component,
@@ -24822,7 +24884,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24822
24884
  OverlayModule,
24823
24885
  MatIconModule,
24824
24886
  TranslateModule,
24825
- ], template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
24887
+ ], template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n [disabled]=\"disabled\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
24826
24888
  }], propDecorators: { title: [{
24827
24889
  type: Input
24828
24890
  }], showTitle: [{
@@ -24839,6 +24901,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24839
24901
  type: Input
24840
24902
  }], minWidth: [{
24841
24903
  type: Input
24904
+ }], disabled: [{
24905
+ type: Input
24842
24906
  }], selectValue: [{
24843
24907
  type: Output
24844
24908
  }], overlayOrigin: [{
@@ -25066,11 +25130,11 @@ class TextInputComponent {
25066
25130
  this.rawChange.next(value);
25067
25131
  }
25068
25132
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25069
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextInputComponent, selector: "gn-ui-text-input", inputs: { value: "value", extraClass: "extraClass", hint: "hint", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input\n #input\n [class]=\"classList\"\n type=\"text\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [placeholder]=\"hint\"\n [attr.aria-label]=\"hint\"\n [attr.required]=\"required || null\"\n/>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25133
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextInputComponent, selector: "gn-ui-text-input", inputs: { value: "value", extraClass: "extraClass", hint: "hint", required: "required", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input\n #input\n [class]=\"classList\"\n type=\"text\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [placeholder]=\"hint\"\n [attr.aria-label]=\"hint\"\n [attr.required]=\"required || null\"\n [disabled]=\"disabled\"\n/>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25070
25134
  }
25071
25135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, decorators: [{
25072
25136
  type: Component,
25073
- args: [{ selector: 'gn-ui-text-input', template: "<input\n #input\n [class]=\"classList\"\n type=\"text\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [placeholder]=\"hint\"\n [attr.aria-label]=\"hint\"\n [attr.required]=\"required || null\"\n/>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25137
+ args: [{ selector: 'gn-ui-text-input', template: "<input\n #input\n [class]=\"classList\"\n type=\"text\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [placeholder]=\"hint\"\n [attr.aria-label]=\"hint\"\n [attr.required]=\"required || null\"\n [disabled]=\"disabled\"\n/>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25074
25138
  }], propDecorators: { value: [{
25075
25139
  type: Input
25076
25140
  }], extraClass: [{
@@ -25079,6 +25143,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25079
25143
  type: Input
25080
25144
  }], required: [{
25081
25145
  type: Input
25146
+ }], disabled: [{
25147
+ type: Input
25082
25148
  }], valueChange: [{
25083
25149
  type: Output
25084
25150
  }], input: [{
@@ -25562,7 +25628,6 @@ class UiInputsModule {
25562
25628
  StarToggleComponent,
25563
25629
  DropdownMultiselectComponent,
25564
25630
  ViewportIntersectorComponent,
25565
- CheckToggleComponent,
25566
25631
  CopyTextButtonComponent,
25567
25632
  CheckboxComponent,
25568
25633
  SearchInputComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
@@ -25585,7 +25650,8 @@ class UiInputsModule {
25585
25650
  ButtonComponent,
25586
25651
  ImageInputComponent,
25587
25652
  DropdownSelectorComponent,
25588
- DateRangePickerComponent], exports: [DropdownSelectorComponent,
25653
+ DateRangePickerComponent,
25654
+ CheckToggleComponent], exports: [DropdownSelectorComponent,
25589
25655
  AutocompleteComponent,
25590
25656
  ButtonComponent,
25591
25657
  TextInputComponent,
@@ -25622,7 +25688,8 @@ class UiInputsModule {
25622
25688
  MatNativeDateModule,
25623
25689
  ImageInputComponent,
25624
25690
  DropdownSelectorComponent,
25625
- DateRangePickerComponent] }); }
25691
+ DateRangePickerComponent,
25692
+ CheckToggleComponent] }); }
25626
25693
  }
25627
25694
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, decorators: [{
25628
25695
  type: NgModule,
@@ -25636,7 +25703,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25636
25703
  StarToggleComponent,
25637
25704
  DropdownMultiselectComponent,
25638
25705
  ViewportIntersectorComponent,
25639
- CheckToggleComponent,
25640
25706
  CopyTextButtonComponent,
25641
25707
  CheckboxComponent,
25642
25708
  SearchInputComponent,
@@ -25665,6 +25731,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25665
25731
  ImageInputComponent,
25666
25732
  DropdownSelectorComponent,
25667
25733
  DateRangePickerComponent,
25734
+ CheckToggleComponent,
25668
25735
  ],
25669
25736
  exports: [
25670
25737
  DropdownSelectorComponent,
@@ -25689,34 +25756,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25689
25756
  }]
25690
25757
  }] });
25691
25758
 
25759
+ class PreviousNextButtonsComponent {
25760
+ constructor() {
25761
+ this.directionButtonClicked = new EventEmitter();
25762
+ }
25763
+ previousButtonClicked() {
25764
+ this.directionButtonClicked.next('previous');
25765
+ }
25766
+ nextButtonClicked() {
25767
+ this.directionButtonClicked.next('next');
25768
+ }
25769
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PreviousNextButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25770
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PreviousNextButtonsComponent, isStandalone: true, selector: "gn-ui-previous-next-buttons", inputs: { isFirst: "isFirst", isLast: "isLast" }, outputs: { directionButtonClicked: "directionButtonClicked" }, ngImport: i0, template: "<div class=\"flex flex-row gap-x-4 items-center\">\n <gn-ui-button\n data-test=\"previousButton\"\n [type]=\"isFirst ? 'default' : 'outline'\"\n [disabled]=\"isFirst\"\n (buttonClick)=\"previousButtonClicked()\"\n >\n <mat-icon\n class=\"material-symbols-outlined text-[14px] text-center pt-[5px]\"\n >\n arrow_back\n </mat-icon>\n </gn-ui-button>\n <gn-ui-button\n data-test=\"nextButton\"\n [type]=\"isLast ? 'default' : 'outline'\"\n [disabled]=\"isLast\"\n (buttonClick)=\"nextButtonClicked()\"\n >\n <mat-icon\n class=\"material-symbols-outlined text-[14px] text-center pt-[5px]\"\n >\n arrow_forward\n </mat-icon>\n </gn-ui-button>\n</div>\n", styles: [":host{--gn-ui-button-rounded: 100%;--gn-ui-button-width: 8px;--gn-ui-button-height: 8px;--gn-ui-button-padding: 12px}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25771
+ }
25772
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PreviousNextButtonsComponent, decorators: [{
25773
+ type: Component,
25774
+ args: [{ selector: 'gn-ui-previous-next-buttons', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ButtonComponent, MatIconModule], template: "<div class=\"flex flex-row gap-x-4 items-center\">\n <gn-ui-button\n data-test=\"previousButton\"\n [type]=\"isFirst ? 'default' : 'outline'\"\n [disabled]=\"isFirst\"\n (buttonClick)=\"previousButtonClicked()\"\n >\n <mat-icon\n class=\"material-symbols-outlined text-[14px] text-center pt-[5px]\"\n >\n arrow_back\n </mat-icon>\n </gn-ui-button>\n <gn-ui-button\n data-test=\"nextButton\"\n [type]=\"isLast ? 'default' : 'outline'\"\n [disabled]=\"isLast\"\n (buttonClick)=\"nextButtonClicked()\"\n >\n <mat-icon\n class=\"material-symbols-outlined text-[14px] text-center pt-[5px]\"\n >\n arrow_forward\n </mat-icon>\n </gn-ui-button>\n</div>\n", styles: [":host{--gn-ui-button-rounded: 100%;--gn-ui-button-width: 8px;--gn-ui-button-height: 8px;--gn-ui-button-padding: 12px}\n"] }]
25775
+ }], propDecorators: { isFirst: [{
25776
+ type: Input
25777
+ }], isLast: [{
25778
+ type: Input
25779
+ }], directionButtonClicked: [{
25780
+ type: Output
25781
+ }] } });
25782
+
25692
25783
  class AddLayerFromOgcApiComponent {
25693
25784
  constructor(changeDetectorRef) {
25694
25785
  this.changeDetectorRef = changeDetectorRef;
25695
25786
  this.layerAdded = new EventEmitter();
25696
25787
  this.urlChange = new Subject();
25697
- this.layerUrl = '';
25698
25788
  this.loading = false;
25699
25789
  this.layers = [];
25700
- this.ogcEndpoint = null;
25701
25790
  this.errorMessage = null;
25791
+ this.selectedLayerTypes = {};
25702
25792
  }
25703
25793
  ngOnInit() {
25704
25794
  this.urlChange.pipe(debounceTime$1(700)).subscribe(() => {
25705
25795
  this.loadLayers();
25706
- this.changeDetectorRef.detectChanges(); // manually trigger change detection
25707
25796
  });
25708
25797
  }
25709
25798
  async loadLayers() {
25710
25799
  this.errorMessage = null;
25711
25800
  try {
25712
25801
  this.loading = true;
25713
- if (this.ogcUrl.trim() === '') {
25802
+ if (!this.ogcUrl.trim()) {
25714
25803
  this.layers = [];
25715
25804
  return;
25716
25805
  }
25717
- this.ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl);
25718
- // Currently only supports feature collections
25719
- this.layers = await this.ogcEndpoint.featureCollections;
25806
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl);
25807
+ this.layers = await ogcEndpoint.allCollections;
25808
+ this.setDefaultLayerTypes();
25720
25809
  }
25721
25810
  catch (error) {
25722
25811
  const err = error;
@@ -25728,21 +25817,75 @@ class AddLayerFromOgcApiComponent {
25728
25817
  this.changeDetectorRef.markForCheck();
25729
25818
  }
25730
25819
  }
25731
- async addLayer(layer) {
25732
- this.layerUrl = await this.ogcEndpoint.getCollectionItemsUrl(layer);
25733
- const layerToAdd = {
25734
- name: layer,
25735
- url: this.layerUrl,
25736
- type: MapContextLayerTypeEnum.OGCAPI,
25737
- };
25738
- this.layerAdded.emit({ ...layerToAdd, title: layer });
25820
+ setDefaultLayerTypes() {
25821
+ this.layers.forEach((layer) => {
25822
+ const choices = this.getLayerChoices(layer);
25823
+ if (choices.length > 0) {
25824
+ this.selectedLayerTypes[layer.name] = choices[0].value;
25825
+ }
25826
+ });
25827
+ }
25828
+ getLayerChoices(layer) {
25829
+ const choices = [];
25830
+ if (layer.hasRecords) {
25831
+ choices.push({ label: 'Records', value: 'record' });
25832
+ }
25833
+ if (layer.hasFeatures) {
25834
+ choices.push({ label: 'Features', value: 'features' });
25835
+ }
25836
+ if (layer.hasVectorTiles) {
25837
+ choices.push({ label: 'Vector Tiles', value: 'vectorTiles' });
25838
+ }
25839
+ if (layer.hasMapTiles) {
25840
+ choices.push({ label: 'Map Tiles', value: 'mapTiles' });
25841
+ }
25842
+ return choices;
25843
+ }
25844
+ shouldDisplayLayer(layer) {
25845
+ return (layer.hasRecords ||
25846
+ layer.hasFeatures ||
25847
+ layer.hasVectorTiles ||
25848
+ layer.hasMapTiles);
25849
+ }
25850
+ onLayerTypeSelect(layerName, selectedType) {
25851
+ this.selectedLayerTypes[layerName] = selectedType
25852
+ ? selectedType
25853
+ : this.getLayerChoices(layerName)[0]?.value;
25854
+ }
25855
+ async addLayer(layer, layerType) {
25856
+ try {
25857
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl);
25858
+ let layerUrl;
25859
+ if (layerType === 'vectorTiles') {
25860
+ layerUrl = await ogcEndpoint.getVectorTilesetUrl(layer);
25861
+ }
25862
+ else if (layerType === 'mapTiles') {
25863
+ layerUrl = await ogcEndpoint.getMapTilesetUrl(layer);
25864
+ }
25865
+ else {
25866
+ layerUrl = await ogcEndpoint.getCollectionItemsUrl(layer, {
25867
+ outputFormat: 'json',
25868
+ });
25869
+ }
25870
+ const layerToAdd = {
25871
+ name: layer,
25872
+ url: layerUrl,
25873
+ type: MapContextLayerTypeEnum.OGCAPI,
25874
+ layerType: layerType,
25875
+ };
25876
+ this.layerAdded.emit({ ...layerToAdd, title: layer });
25877
+ }
25878
+ catch (error) {
25879
+ const err = error;
25880
+ console.error('Error adding layer:', err.message);
25881
+ }
25739
25882
  }
25740
25883
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromOgcApiComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25741
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromOgcApiComponent, isStandalone: true, selector: "gn-ui-add-layer-from-ogc-api", inputs: { ogcUrl: "ogcUrl" }, outputs: { layerAdded: "layerAdded" }, ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"ogcUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.ogc.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer }}\n </p>\n <gn-ui-button\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.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: "ngmodule", type: UiInputsModule }, { 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", "hint", "required"], outputs: ["valueChange"] }] }); }
25884
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromOgcApiComponent, isStandalone: true, selector: "gn-ui-add-layer-from-ogc-api", inputs: { ogcUrl: "ogcUrl" }, outputs: { layerAdded: "layerAdded" }, ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"ogcUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.ogc.urlInput.hint' | translate\"\n class=\"w-96\"\n ></gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<ng-container *ngFor=\"let layer of layers\">\n <div\n *ngIf=\"shouldDisplayLayer(layer)\"\n class=\"flex items-center justify-between my-2 layer-item-tree\"\n >\n <div class=\"flex flex-col items-start w-full\">\n <p\n class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\"\n [title]=\"layer.name\"\n >\n {{ layer.name }}\n </p>\n <div class=\"flex justify-between items-center w-full\">\n <gn-ui-dropdown-selector\n [title]=\"'Add Layer As' | translate\"\n [choices]=\"getLayerChoices(layer)\"\n (selectValue)=\"onLayerTypeSelect(layer.name, $event)\"\n [selected]=\"selectedLayerTypes[layer.name]\"\n extraBtnClass=\"w-6 h-5 !text-sm !px-2 !py-1\"\n ></gn-ui-dropdown-selector>\n <gn-ui-button\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer.name, selectedLayerTypes[layer.name])\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n >\n <span translate>map.layer.add</span>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [".dropdown-content{display:none}.relative:hover .dropdown-content{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.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: "ngmodule", type: UiInputsModule }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { 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", "hint", "required", "disabled"], outputs: ["valueChange"] }] }); }
25742
25885
  }
25743
25886
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromOgcApiComponent, decorators: [{
25744
25887
  type: Component,
25745
- args: [{ selector: 'gn-ui-add-layer-from-ogc-api', standalone: true, imports: [CommonModule, TranslateModule, UiInputsModule], template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"ogcUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.ogc.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer }}\n </p>\n <gn-ui-button\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n" }]
25888
+ args: [{ selector: 'gn-ui-add-layer-from-ogc-api', standalone: true, imports: [CommonModule, TranslateModule, UiInputsModule], template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"ogcUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.ogc.urlInput.hint' | translate\"\n class=\"w-96\"\n ></gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<ng-container *ngFor=\"let layer of layers\">\n <div\n *ngIf=\"shouldDisplayLayer(layer)\"\n class=\"flex items-center justify-between my-2 layer-item-tree\"\n >\n <div class=\"flex flex-col items-start w-full\">\n <p\n class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\"\n [title]=\"layer.name\"\n >\n {{ layer.name }}\n </p>\n <div class=\"flex justify-between items-center w-full\">\n <gn-ui-dropdown-selector\n [title]=\"'Add Layer As' | translate\"\n [choices]=\"getLayerChoices(layer)\"\n (selectValue)=\"onLayerTypeSelect(layer.name, $event)\"\n [selected]=\"selectedLayerTypes[layer.name]\"\n extraBtnClass=\"w-6 h-5 !text-sm !px-2 !py-1\"\n ></gn-ui-dropdown-selector>\n <gn-ui-button\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer.name, selectedLayerTypes[layer.name])\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n >\n <span translate>map.layer.add</span>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [".dropdown-content{display:none}.relative:hover .dropdown-content{display:block}\n"] }]
25746
25889
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { ogcUrl: [{
25747
25890
  type: Input
25748
25891
  }], layerAdded: [{
@@ -26484,7 +26627,8 @@ class ApiCardComponent {
26484
26627
  }
26485
26628
  ngOnInit() {
26486
26629
  this.displayApiFormButton =
26487
- this.link.accessServiceProtocol === 'ogcFeatures' ? true : false;
26630
+ this.link.accessServiceProtocol === 'ogcFeatures' ||
26631
+ this.link.accessServiceProtocol === 'wfs';
26488
26632
  }
26489
26633
  ngOnChanges(changes) {
26490
26634
  this.currentlyActive =
@@ -26497,7 +26641,7 @@ class ApiCardComponent {
26497
26641
  }
26498
26642
  }
26499
26643
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26500
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ApiCardComponent, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden\"\n [ngClass]=\"{ 'cursor-pointer': displayApiFormButton }\"\n (click)=\"openRecordApiFormPanel()\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <gn-ui-copy-text-button\n *ngIf=\"!displayApiFormButton\"\n [text]=\"link.url.toString()\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26644
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ApiCardComponent, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden\"\n [ngClass]=\"{ 'cursor-pointer': displayApiFormButton }\"\n (click)=\"openRecordApiFormPanel()\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <gn-ui-copy-text-button\n *ngIf=\"!displayApiFormButton\"\n [text]=\"link.url.toString()\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26501
26645
  }
26502
26646
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, decorators: [{
26503
26647
  type: Component,
@@ -26628,7 +26772,7 @@ class DownloadsListComponent {
26628
26772
  return getBadgeColor(getFileFormat(link));
26629
26773
  }
26630
26774
  isFromWfs(link) {
26631
- return link.type === 'service' && link.accessServiceProtocol === 'wfs';
26775
+ return link.type === 'download' && link.accessServiceProtocol === 'wfs';
26632
26776
  }
26633
26777
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
26634
26778
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DownloadsListComponent, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between mt-8 mb-6 sm:mt-12 sm:mb-2\"\n *ngIf=\"links && links.length > 0\"\n>\n <p\n class=\"font-title text-[28px] text-title font-medium mr-4 pb-4 text-center sm:text-left\"\n translate\n >\n record.metadata.download\n </p>\n <div\n class=\"flex flex-wrap justify-start sm:justify-end sm:pb-4\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-50')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n<div class=\"mb-2 sm:mb-3\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"isFromWfs(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromWfs"], outputs: ["exportUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -26660,14 +26804,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26660
26804
  }] } });
26661
26805
 
26662
26806
  class LinkCardComponent {
26807
+ constructor() {
26808
+ this.compact = false;
26809
+ }
26810
+ get title() {
26811
+ if (this.link.name && this.link.description) {
26812
+ return `${this.link.name} | ${this.link.description}`;
26813
+ }
26814
+ return this.link.name || this.link.description || '';
26815
+ }
26663
26816
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26664
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, selector: "gn-ui-link-card", inputs: { link: "link" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26817
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, isStandalone: true, selector: "gn-ui-link-card", inputs: { link: "link", compact: "compact" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden\"\n [ngClass]=\"{ 'h-40': !compact }\"\n [title]=\"title\"\n>\n <ng-container *ngIf=\"!compact; else compactTpl\">\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\"\n >open_in_new</mat-icon\n >\n </div>\n </ng-container>\n <ng-template #compactTpl>\n <div class=\"flex items-center justify-between gap-4\">\n <p\n class=\"overflow-hidden font-title font-medium text-21 text-black text-ellipsis whitespace-nowrap\"\n >\n {{ link.name || link.description }}\n </p>\n <mat-icon class=\"material-symbols-outlined card-icon flex-shrink-0\"\n >open_in_new</mat-icon\n >\n </div>\n </ng-template>\n</a>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26665
26818
  }
26666
26819
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, decorators: [{
26667
26820
  type: Component,
26668
- args: [{ selector: 'gn-ui-link-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n" }]
26821
+ args: [{ selector: 'gn-ui-link-card', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, MatIconModule], template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden\"\n [ngClass]=\"{ 'h-40': !compact }\"\n [title]=\"title\"\n>\n <ng-container *ngIf=\"!compact; else compactTpl\">\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\"\n >open_in_new</mat-icon\n >\n </div>\n </ng-container>\n <ng-template #compactTpl>\n <div class=\"flex items-center justify-between gap-4\">\n <p\n class=\"overflow-hidden font-title font-medium text-21 text-black text-ellipsis whitespace-nowrap\"\n >\n {{ link.name || link.description }}\n </p>\n <mat-icon class=\"material-symbols-outlined card-icon flex-shrink-0\"\n >open_in_new</mat-icon\n >\n </div>\n </ng-template>\n</a>\n" }]
26669
26822
  }], propDecorators: { link: [{
26670
26823
  type: Input
26824
+ }], compact: [{
26825
+ type: Input
26671
26826
  }] } });
26672
26827
 
26673
26828
  class MarkdownParserComponent {
@@ -27126,42 +27281,37 @@ const DEFAULT_PARAMS = {
27126
27281
  };
27127
27282
  class RecordApiFormComponent {
27128
27283
  constructor() {
27129
- this.offset$ = new BehaviorSubject('');
27130
- this.limit$ = new BehaviorSubject('');
27131
- this.format$ = new BehaviorSubject('');
27284
+ this.offset$ = new BehaviorSubject(DEFAULT_PARAMS.OFFSET);
27285
+ this.limit$ = new BehaviorSubject(DEFAULT_PARAMS.LIMIT);
27286
+ this.format$ = new BehaviorSubject(DEFAULT_PARAMS.FORMAT);
27287
+ this.endpoint$ = new BehaviorSubject(undefined);
27288
+ this.supportOffset = true;
27132
27289
  this.outputFormats = [{ value: 'json', label: 'JSON' }];
27133
- this.apiQueryUrl$ = combineLatest([this.offset$, this.limit$, this.format$]).pipe(map$2(([offset, limit, format]) => {
27134
- let outputUrl;
27135
- if (this.apiBaseUrl) {
27136
- const url = new URL(this.apiBaseUrl);
27137
- const params = { offset: offset, limit: limit, f: format };
27138
- for (const [key, value] of Object.entries(params)) {
27139
- if (value && value !== '0') {
27140
- url.searchParams.set(key, value);
27141
- }
27142
- else {
27143
- url.searchParams.delete(key);
27144
- }
27145
- }
27146
- outputUrl = url.toString();
27147
- }
27148
- return outputUrl;
27149
- }));
27290
+ this.apiQueryUrl$ = combineLatest([
27291
+ this.offset$,
27292
+ this.limit$,
27293
+ this.format$,
27294
+ // only compute the url if the endpoint was created
27295
+ this.endpoint$.pipe(filter$1((endpoint) => !!endpoint)),
27296
+ ]).pipe(switchMap(([offset, limit, format]) => this.generateApiQueryUrl(offset, limit, format)));
27150
27297
  this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
27151
27298
  this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
27152
27299
  }
27153
27300
  set apiLink(value) {
27154
- this.apiBaseUrl = value ? value.url.href : undefined;
27155
27301
  this.outputFormats = [{ value: 'json', label: 'JSON' }];
27156
- this.parseOutputFormats();
27302
+ this.accessServiceProtocol = value ? value.accessServiceProtocol : undefined;
27303
+ this.apiFeatureType = value ? value.name : undefined;
27304
+ if (value) {
27305
+ this.apiBaseUrl = value.url.href;
27306
+ this.createEndpoint().then(() => this.parseOutputFormats());
27307
+ }
27157
27308
  this.resetUrl();
27158
27309
  }
27159
27310
  setOffset(value) {
27160
27311
  this.offset$.next(value);
27161
27312
  }
27162
27313
  setLimit(value) {
27163
- const newLimit = value === '' ? '-1' : value;
27164
- this.limit$.next(newLimit);
27314
+ this.limit$.next(value === '' ? '-1' : value);
27165
27315
  }
27166
27316
  setFormat(value) {
27167
27317
  this.format$.next(String(value));
@@ -27171,45 +27321,84 @@ class RecordApiFormComponent {
27171
27321
  this.limit$.next(DEFAULT_PARAMS.LIMIT);
27172
27322
  this.format$.next(DEFAULT_PARAMS.FORMAT);
27173
27323
  }
27174
- parseOutputFormats() {
27175
- const apiUrl = this.apiBaseUrl.slice(-1) === '?'
27324
+ async parseOutputFormats() {
27325
+ if (!this.endpoint)
27326
+ return;
27327
+ const apiUrl = this.apiBaseUrl.endsWith('?')
27176
27328
  ? this.apiBaseUrl.slice(0, -1)
27177
27329
  : this.apiBaseUrl;
27178
- this.getOutputFormats(apiUrl).then((outputFormats) => {
27179
- const formatsList = outputFormats.itemFormats.map((format) => {
27180
- const normalizedFormat = mimeTypeToFormat(format);
27181
- if (normalizedFormat) {
27182
- return {
27183
- label: normalizedFormat?.toUpperCase(),
27184
- value: normalizedFormat,
27185
- };
27186
- }
27187
- return null;
27188
- });
27189
- this.outputFormats = this.outputFormats.concat(formatsList.filter(Boolean));
27190
- this.outputFormats = this.outputFormats
27191
- .filter((format, index, self) => index === self.findIndex((t) => t.value === format.value))
27192
- .sort((a, b) => a.label.localeCompare(b.label));
27330
+ const outputFormats = await this.getOutputFormats(apiUrl);
27331
+ const formatsList = outputFormats.itemFormats
27332
+ ? this.mapFormats(outputFormats.itemFormats)
27333
+ : this.mapFormats(outputFormats.outputFormats || []);
27334
+ this.outputFormats = this.outputFormats
27335
+ .concat(formatsList.filter(Boolean))
27336
+ .filter((format, index, self) => index === self.findIndex((t) => t.value === format.value))
27337
+ .sort((a, b) => a.label.localeCompare(b.label));
27338
+ }
27339
+ mapFormats(formats) {
27340
+ return formats.map((format) => {
27341
+ const normalizedFormat = mimeTypeToFormat(format);
27342
+ return normalizedFormat
27343
+ ? { label: normalizedFormat.toUpperCase(), value: normalizedFormat }
27344
+ : null;
27193
27345
  });
27194
27346
  }
27195
27347
  async getOutputFormats(url) {
27196
- const endpoint = await new OgcApiEndpoint(url);
27197
- const firstCollection = (await endpoint.featureCollections)[0];
27198
- return endpoint.getCollectionInfo(firstCollection);
27348
+ if (!this.endpoint)
27349
+ return {};
27350
+ if (this.endpoint instanceof WfsEndpoint) {
27351
+ this.supportOffset = this.endpoint.supportsStartIndex();
27352
+ return this.endpoint.getServiceInfo();
27353
+ }
27354
+ else {
27355
+ return (await this.endpoint.getCollectionInfo(this.firstCollection));
27356
+ }
27357
+ }
27358
+ async createEndpoint() {
27359
+ if (!this.apiBaseUrl || !this.accessServiceProtocol)
27360
+ return;
27361
+ if (this.accessServiceProtocol === 'wfs') {
27362
+ this.endpoint = new WfsEndpoint(this.apiBaseUrl);
27363
+ await this.endpoint.isReady();
27364
+ }
27365
+ else {
27366
+ this.endpoint = new OgcApiEndpoint(this.apiBaseUrl);
27367
+ this.firstCollection = (await this.endpoint.allCollections)[0].name;
27368
+ }
27369
+ this.endpoint$.next(this.endpoint);
27370
+ }
27371
+ async generateApiQueryUrl(offset, limit, format) {
27372
+ if (!this.apiBaseUrl || !this.endpoint || !this.apiFeatureType)
27373
+ return '';
27374
+ const options = {
27375
+ outputFormat: format,
27376
+ startIndex: offset ? Number(offset) : undefined,
27377
+ maxFeatures: limit !== '-1' ? Number(limit) : undefined,
27378
+ limit: limit !== '-1' ? Number(limit) : limit === '-1' ? -1 : undefined,
27379
+ offset: offset !== '' ? Number(offset) : undefined,
27380
+ };
27381
+ if (this.endpoint instanceof WfsEndpoint) {
27382
+ options.maxFeatures = limit !== '-1' ? Number(limit) : undefined;
27383
+ return this.endpoint.getFeatureUrl(this.apiFeatureType, options);
27384
+ }
27385
+ else {
27386
+ return await this.endpoint.getCollectionItemsUrl(this.firstCollection, options);
27387
+ }
27199
27388
  }
27200
27389
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27201
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27390
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div\n *ngIf=\"!supportOffset\"\n class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\"\n >\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27202
27391
  }
27203
27392
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
27204
27393
  type: Component,
27205
- args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
27394
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div\n *ngIf=\"!supportOffset\"\n class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\"\n >\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
27206
27395
  }], propDecorators: { apiLink: [{
27207
27396
  type: Input
27208
27397
  }] } });
27209
27398
 
27210
27399
  class RelatedRecordCardComponent {
27211
27400
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27212
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record" }, ngImport: i0, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\n [routerLink]=\"['/dataset', record.uniqueIdentifier]\"\n target=\"_blank\"\n>\n <div class=\"h-52 bg-gray-100\">\n <gn-ui-thumbnail\n class=\"h-52 w-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col justify-between h-44 px-5 pt-4 pb-6\">\n <h4\n class=\"max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden\"\n >\n {{ record.title }}\n </h4>\n <div>\n <button\n mat-raised-button\n [matTooltip]=\"'tooltip.url.open' | translate\"\n matTooltipPosition=\"above\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle text-secondary\"\n >open_in_new</mat-icon\n >\n </button>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27401
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record" }, ngImport: i0, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\n [routerLink]=\"['/dataset', record.uniqueIdentifier]\"\n target=\"_blank\"\n>\n <div class=\"h-52 bg-gray-100\">\n <gn-ui-thumbnail\n class=\"h-52 w-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col justify-between h-44 px-5 pt-4 pb-6\">\n <h4\n class=\"max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden\"\n >\n {{ record.title }}\n </h4>\n <div>\n <button\n mat-raised-button\n [matTooltip]=\"'tooltip.url.open' | translate\"\n matTooltipPosition=\"above\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle text-secondary\"\n >open_in_new</mat-icon\n >\n </button>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27213
27402
  }
27214
27403
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
27215
27404
  type: Component,
@@ -27223,17 +27412,18 @@ var ErrorType;
27223
27412
  ErrorType[ErrorType["COULD_NOT_REACH_API"] = 0] = "COULD_NOT_REACH_API";
27224
27413
  ErrorType[ErrorType["RECEIVED_ERROR"] = 1] = "RECEIVED_ERROR";
27225
27414
  ErrorType[ErrorType["RECORD_NOT_FOUND"] = 2] = "RECORD_NOT_FOUND";
27415
+ ErrorType[ErrorType["DATASET_HAS_NO_LINK"] = 3] = "DATASET_HAS_NO_LINK";
27226
27416
  })(ErrorType || (ErrorType = {}));
27227
- class SearchResultsErrorComponent {
27417
+ class ErrorComponent {
27228
27418
  constructor() {
27229
27419
  this.types = ErrorType;
27230
27420
  }
27231
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchResultsErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27232
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: { type: "type", error: "error", recordId: "recordId" }, ngImport: i0, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div *ngIf=\"type === types.COULD_NOT_REACH_API\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.RECORD_NOT_FOUND\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27421
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27422
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ErrorComponent, selector: "gn-ui-error", inputs: { type: "type", error: "error", recordId: "recordId" }, ngImport: i0, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div\n *ngIf=\"type === types.COULD_NOT_REACH_API\"\n data-test=\"could-not-reach-api-error\"\n >\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div\n *ngIf=\"type === types.DATASET_HAS_NO_LINK\"\n data-test=\"dataset-has-no-link-error\"\n >\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">computer</mat-icon>\n </div>\n <div translate>search.error.recordHasnolink</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\" data-test=\"received-error-error\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div\n *ngIf=\"type === types.RECORD_NOT_FOUND\"\n data-test=\"record-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27233
27423
  }
27234
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchResultsErrorComponent, decorators: [{
27424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ErrorComponent, decorators: [{
27235
27425
  type: Component,
27236
- args: [{ selector: 'gn-ui-search-results-error', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div *ngIf=\"type === types.COULD_NOT_REACH_API\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.RECORD_NOT_FOUND\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"] }]
27426
+ args: [{ selector: 'gn-ui-error', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div\n *ngIf=\"type === types.COULD_NOT_REACH_API\"\n data-test=\"could-not-reach-api-error\"\n >\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">face</mat-icon>\n <mat-icon class=\"material-symbols-outlined question-mark1\"\n >question_mark</mat-icon\n >\n <mat-icon class=\"material-symbols-outlined question-mark2\"\n >question_mark</mat-icon\n >\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div\n *ngIf=\"type === types.DATASET_HAS_NO_LINK\"\n data-test=\"dataset-has-no-link-error\"\n >\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">computer</mat-icon>\n </div>\n <div translate>search.error.recordHasnolink</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\" data-test=\"received-error-error\">\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined face\">mood_bad</mat-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div\n *ngIf=\"type === types.RECORD_NOT_FOUND\"\n data-test=\"record-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <mat-icon class=\"material-symbols-outlined computer\">computer</mat-icon>\n <mat-icon class=\"material-symbols-outlined computer-question-mark\"\n >question_mark</mat-icon\n >\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["mat-icon{width:auto;height:auto}mat-icon.face{font-size:3em}mat-icon.question-mark1{position:absolute;bottom:1.1em;left:calc(50% + .7em);font-size:1.7em}mat-icon.question-mark2{position:absolute;bottom:1.6em;left:calc(50% + 1.6em);font-size:1.4em}.computer{font-size:3em}.computer-question-mark{position:absolute;top:.6em;left:calc(50% - .5em);font-size:1.2em}\n"] }]
27237
27427
  }], propDecorators: { type: [{
27238
27428
  type: Input
27239
27429
  }], error: [{
@@ -27305,48 +27495,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27305
27495
  }] } });
27306
27496
 
27307
27497
  class CarouselComponent {
27498
+ get isFirstStep() {
27499
+ return this.currentStep === 0;
27500
+ }
27501
+ get isLastStep() {
27502
+ return this.currentStep === this.steps.length - 1;
27503
+ }
27504
+ get stepsCount() {
27505
+ return this.steps.length;
27506
+ }
27308
27507
  constructor(changeDetector) {
27309
27508
  this.changeDetector = changeDetector;
27310
27509
  this.containerClass = '';
27311
- this.stepsContainerClass = '';
27510
+ this.stepsContainerClass = 'w-full bottom-0 top-auto';
27511
+ this.currentStepChange = new EventEmitter();
27312
27512
  this.steps = [];
27313
- this.selectedStep = -1;
27513
+ this.currentStep = 0;
27514
+ this.refreshSteps = () => {
27515
+ this.steps = this.emblaApi.scrollSnapList();
27516
+ this.currentStep = this.emblaApi.selectedScrollSnap();
27517
+ this.currentStepChange.emit(this.currentStep);
27518
+ this.changeDetector.detectChanges();
27519
+ };
27314
27520
  }
27315
27521
  ngAfterViewInit() {
27316
27522
  this.emblaApi = EmblaCarousel(this.carouselOverflowContainer.nativeElement, {
27317
27523
  duration: 15,
27318
27524
  });
27319
- const refreshSteps = () => {
27320
- this.steps = this.emblaApi.scrollSnapList();
27321
- this.selectedStep = this.emblaApi.selectedScrollSnap();
27322
- this.changeDetector.detectChanges();
27323
- };
27324
27525
  this.emblaApi
27325
- .on('init', refreshSteps)
27326
- .on('reInit', refreshSteps)
27327
- .on('select', refreshSteps);
27526
+ .on('init', this.refreshSteps)
27527
+ .on('reInit', this.refreshSteps)
27528
+ .on('select', this.refreshSteps);
27328
27529
  }
27329
27530
  scrollToStep(stepIndex) {
27330
27531
  this.emblaApi.scrollTo(stepIndex);
27331
27532
  }
27533
+ slideToPrevious() {
27534
+ if (this.isFirstStep)
27535
+ return;
27536
+ this.emblaApi.scrollPrev();
27537
+ }
27538
+ slideToNext() {
27539
+ if (this.isLastStep)
27540
+ return;
27541
+ this.emblaApi.scrollNext();
27542
+ }
27332
27543
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
27333
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27544
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, isStandalone: true, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, outputs: { currentStepChange: "currentStepChange" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"w-full\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"currentStep === i ? 'bg-primary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative;display:block}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27334
27545
  }
27335
27546
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
27336
27547
  type: Component,
27337
- args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
27338
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
27548
+ args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div #carouselOverflowContainer class=\"w-full\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"currentStep === i ? 'bg-primary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative;display:block}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"] }]
27549
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { carouselOverflowContainer: [{
27550
+ type: ViewChild,
27551
+ args: ['carouselOverflowContainer']
27552
+ }], containerClass: [{
27339
27553
  type: Input
27340
27554
  }], stepsContainerClass: [{
27341
27555
  type: Input
27342
- }], carouselOverflowContainer: [{
27343
- type: ViewChild,
27344
- args: ['carouselOverflowContainer']
27556
+ }], currentStepChange: [{
27557
+ type: Output
27345
27558
  }] } });
27346
27559
 
27347
27560
  class FormFieldWrapperComponent {
27348
27561
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27349
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27562
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27350
27563
  }
27351
27564
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
27352
27565
  type: Component,
@@ -27495,17 +27708,87 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27495
27708
  args: ['innerContainer']
27496
27709
  }] } });
27497
27710
 
27711
+ class BlockListComponent {
27712
+ get pages() {
27713
+ return new Array(this.pagesCount).fill(0).map((_, i) => i);
27714
+ }
27715
+ get isFirstPage() {
27716
+ return this.currentPage === 0;
27717
+ }
27718
+ get isLastPage() {
27719
+ return this.currentPage === this.pagesCount - 1;
27720
+ }
27721
+ get pagesCount() {
27722
+ return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
27723
+ }
27724
+ constructor(changeDetector) {
27725
+ this.changeDetector = changeDetector;
27726
+ this.pageSize = 5;
27727
+ this.containerClass = '';
27728
+ this.paginationContainerClass = 'w-full bottom-0 top-auto';
27729
+ this.minHeight = 0;
27730
+ this.currentPage = 0;
27731
+ this.refreshBlocksVisibility = () => {
27732
+ this.blocks.forEach((block, index) => {
27733
+ block.nativeElement.style.display =
27734
+ index >= this.currentPage * this.pageSize &&
27735
+ index < (this.currentPage + 1) * this.pageSize
27736
+ ? null
27737
+ : 'none';
27738
+ });
27739
+ };
27740
+ }
27741
+ ngAfterViewInit() {
27742
+ this.blocks.changes.subscribe(this.refreshBlocksVisibility);
27743
+ this.refreshBlocksVisibility();
27744
+ // we store the first height as the min-height of the list container
27745
+ this.minHeight = this.blockContainer.nativeElement.clientHeight;
27746
+ this.changeDetector.detectChanges();
27747
+ }
27748
+ goToPage(index) {
27749
+ this.currentPage = Math.max(Math.min(index, this.pagesCount - 1), 0);
27750
+ this.changeDetector.detectChanges();
27751
+ this.refreshBlocksVisibility();
27752
+ }
27753
+ previousPage() {
27754
+ if (this.isFirstPage)
27755
+ return;
27756
+ this.goToPage(this.currentPage - 1);
27757
+ }
27758
+ nextPage() {
27759
+ if (this.isLastPage)
27760
+ return;
27761
+ this.goToPage(this.currentPage + 1);
27762
+ }
27763
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BlockListComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
27764
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: BlockListComponent, isStandalone: true, selector: "gn-ui-block-list", inputs: { pageSize: "pageSize", containerClass: "containerClass", paginationContainerClass: "paginationContainerClass" }, queries: [{ propertyName: "blocks", predicate: ["block"], read: ElementRef }], viewQueries: [{ propertyName: "blockContainer", first: true, predicate: ["blockContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"block-list-container flex flex-col\"\n #blockContainer\n [ngClass]=\"containerClass\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"pagesCount > 1\"\n class=\"absolute flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"paginationContainerClass\"\n>\n <button\n *ngFor=\"let page of pages\"\n class=\"list-page-dot\"\n (click)=\"goToPage(page)\"\n [ngClass]=\"currentPage === page ? 'bg-primary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.list-page-dot{width:6px;height:6px;border-radius:6px;position:relative}.list-page-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27765
+ }
27766
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BlockListComponent, decorators: [{
27767
+ type: Component,
27768
+ args: [{ selector: 'gn-ui-block-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<div\n class=\"block-list-container flex flex-col\"\n #blockContainer\n [ngClass]=\"containerClass\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"pagesCount > 1\"\n class=\"absolute flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"paginationContainerClass\"\n>\n <button\n *ngFor=\"let page of pages\"\n class=\"list-page-dot\"\n (click)=\"goToPage(page)\"\n [ngClass]=\"currentPage === page ? 'bg-primary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.list-page-dot{width:6px;height:6px;border-radius:6px;position:relative}.list-page-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"] }]
27769
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { pageSize: [{
27770
+ type: Input
27771
+ }], containerClass: [{
27772
+ type: Input
27773
+ }], paginationContainerClass: [{
27774
+ type: Input
27775
+ }], blocks: [{
27776
+ type: ContentChildren,
27777
+ args: ['block', { read: ElementRef }]
27778
+ }], blockContainer: [{
27779
+ type: ViewChild,
27780
+ args: ['blockContainer']
27781
+ }] } });
27782
+
27498
27783
  class UiLayoutModule {
27499
27784
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27500
27785
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, declarations: [ExpandablePanelComponent,
27501
27786
  StickyHeaderComponent,
27502
27787
  AnchorLinkDirective,
27503
- ExpandablePanelButtonComponent,
27504
- CarouselComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
27788
+ ExpandablePanelButtonComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
27505
27789
  StickyHeaderComponent,
27506
27790
  AnchorLinkDirective,
27507
- ExpandablePanelButtonComponent,
27508
- CarouselComponent] }); }
27791
+ ExpandablePanelButtonComponent] }); }
27509
27792
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, imports: [CommonModule, MatIconModule, TranslateModule.forChild()] }); }
27510
27793
  }
27511
27794
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, decorators: [{
@@ -27517,14 +27800,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27517
27800
  StickyHeaderComponent,
27518
27801
  AnchorLinkDirective,
27519
27802
  ExpandablePanelButtonComponent,
27520
- CarouselComponent,
27521
27803
  ],
27522
27804
  exports: [
27523
27805
  ExpandablePanelComponent,
27524
27806
  StickyHeaderComponent,
27525
27807
  AnchorLinkDirective,
27526
27808
  ExpandablePanelButtonComponent,
27527
- CarouselComponent,
27528
27809
  ],
27529
27810
  }]
27530
27811
  }] });
@@ -27534,7 +27815,7 @@ class UserPreviewComponent {
27534
27815
  return (this.user.name + ' ' + this.user.surname).trim();
27535
27816
  }
27536
27817
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27537
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: UserPreviewComponent, selector: "gn-ui-user-preview", inputs: { user: "user", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<figure class=\"text-center\">\n <div\n class=\"w-12 h-12 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n", dependencies: [{ kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27818
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: UserPreviewComponent, selector: "gn-ui-user-preview", inputs: { user: "user", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<figure class=\"text-center\">\n <div\n class=\"w-12 h-12 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n", dependencies: [{ kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27538
27819
  }
27539
27820
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserPreviewComponent, decorators: [{
27540
27821
  type: Component,
@@ -27630,17 +27911,15 @@ class UserFeedbackItemComponent {
27630
27911
  this.onNewAnswerValueChange();
27631
27912
  }
27632
27913
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27633
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: { userFeedbackParent: "userFeedbackParent", userFeedBacksAnswers: "userFeedBacksAnswers", isActiveUserEditor: "isActiveUserEditor", activeUser: "activeUser", isLastComment: "isLastComment", isAddUserFeedbackLoading: "isAddUserFeedbackLoading" }, outputs: { newUserFeedbackAnswer: "newUserFeedbackAnswer" }, ngImport: i0, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"isActiveUserEditor\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: ["userFeedbackParent", "userFeedBacksAnswers", "isActiveUserEditor", "activeUser", "isLastComment", "isAddUserFeedbackLoading"], outputs: ["newUserFeedbackAnswer"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: TimeSincePipe, name: "timeSince" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27914
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: { userFeedbackParent: "userFeedbackParent", userFeedBacksAnswers: "userFeedBacksAnswers", activeUser: "activeUser", isLastComment: "isLastComment", isAddUserFeedbackLoading: "isAddUserFeedbackLoading" }, outputs: { newUserFeedbackAnswer: "newUserFeedbackAnswer" }, ngImport: i0, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"activeUser\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: ["userFeedbackParent", "userFeedBacksAnswers", "activeUser", "isLastComment", "isAddUserFeedbackLoading"], outputs: ["newUserFeedbackAnswer"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: TimeSincePipe, name: "timeSince" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27634
27915
  }
27635
27916
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, decorators: [{
27636
27917
  type: Component,
27637
- args: [{ selector: 'gn-ui-user-feedback-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"isActiveUserEditor\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n" }]
27918
+ args: [{ selector: 'gn-ui-user-feedback-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"activeUser\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n" }]
27638
27919
  }], propDecorators: { userFeedbackParent: [{
27639
27920
  type: Input
27640
27921
  }], userFeedBacksAnswers: [{
27641
27922
  type: Input
27642
- }], isActiveUserEditor: [{
27643
- type: Input
27644
27923
  }], activeUser: [{
27645
27924
  type: Input
27646
27925
  }], isLastComment: [{
@@ -27658,13 +27937,12 @@ class UiElementsModule {
27658
27937
  DownloadItemComponent,
27659
27938
  DownloadsListComponent,
27660
27939
  ApiCardComponent,
27661
- LinkCardComponent,
27662
27940
  RelatedRecordCardComponent,
27663
27941
  MetadataContactComponent,
27664
27942
  MetadataCatalogComponent,
27665
27943
  MetadataQualityComponent,
27666
27944
  MetadataQualityItemComponent,
27667
- SearchResultsErrorComponent,
27945
+ ErrorComponent,
27668
27946
  PaginationComponent,
27669
27947
  AvatarComponent,
27670
27948
  UserPreviewComponent,
@@ -27689,13 +27967,12 @@ class UiElementsModule {
27689
27967
  DownloadItemComponent,
27690
27968
  DownloadsListComponent,
27691
27969
  ApiCardComponent,
27692
- LinkCardComponent,
27693
27970
  RelatedRecordCardComponent,
27694
27971
  MetadataContactComponent,
27695
27972
  MetadataCatalogComponent,
27696
27973
  MetadataQualityComponent,
27697
27974
  MetadataQualityItemComponent,
27698
- SearchResultsErrorComponent,
27975
+ ErrorComponent,
27699
27976
  PaginationComponent,
27700
27977
  ThumbnailComponent,
27701
27978
  AvatarComponent,
@@ -27743,13 +28020,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27743
28020
  DownloadItemComponent,
27744
28021
  DownloadsListComponent,
27745
28022
  ApiCardComponent,
27746
- LinkCardComponent,
27747
28023
  RelatedRecordCardComponent,
27748
28024
  MetadataContactComponent,
27749
28025
  MetadataCatalogComponent,
27750
28026
  MetadataQualityComponent,
27751
28027
  MetadataQualityItemComponent,
27752
- SearchResultsErrorComponent,
28028
+ ErrorComponent,
27753
28029
  PaginationComponent,
27754
28030
  AvatarComponent,
27755
28031
  UserPreviewComponent,
@@ -27766,13 +28042,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27766
28042
  DownloadItemComponent,
27767
28043
  DownloadsListComponent,
27768
28044
  ApiCardComponent,
27769
- LinkCardComponent,
27770
28045
  RelatedRecordCardComponent,
27771
28046
  MetadataContactComponent,
27772
28047
  MetadataCatalogComponent,
27773
28048
  MetadataQualityComponent,
27774
28049
  MetadataQualityItemComponent,
27775
- SearchResultsErrorComponent,
28050
+ ErrorComponent,
27776
28051
  PaginationComponent,
27777
28052
  ThumbnailComponent,
27778
28053
  AvatarComponent,
@@ -29035,7 +29310,7 @@ class ResultsLayoutComponent {
29035
29310
  this.searchFacade.setResultsLayout(layout);
29036
29311
  }
29037
29312
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsLayoutComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
29038
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsLayoutComponent, selector: "gn-ui-results-layout", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'results.layout.selectOne' | translate\"\n [ariaName]=\"'results.layout.selectOne' | translate\"\n [choices]=\"choices\"\n (selectValue)=\"change($event)\"\n [selected]=\"searchFacade.layout$ | async\"\n></gn-ui-dropdown-selector>\n", dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29313
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsLayoutComponent, selector: "gn-ui-results-layout", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'results.layout.selectOne' | translate\"\n [ariaName]=\"'results.layout.selectOne' | translate\"\n [choices]=\"choices\"\n (selectValue)=\"change($event)\"\n [selected]=\"searchFacade.layout$ | async\"\n></gn-ui-dropdown-selector>\n", dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29039
29314
  }
29040
29315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsLayoutComponent, decorators: [{
29041
29316
  type: Component,
@@ -29181,11 +29456,11 @@ class ResultsListContainerComponent {
29181
29456
  return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier);
29182
29457
  }
29183
29458
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsListContainerComponent, deps: [{ token: SearchFacade }, { token: RESULTS_LAYOUT_CONFIG }, { token: RECORD_URL_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
29184
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\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-search-results-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-search-results-error>\n <gn-ui-search-results-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-search-results-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.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: SearchResultsErrorComponent, selector: "gn-ui-search-results-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }] }); }
29459
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", 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\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\n <div class=\"show-more h-[100px] pt-[30px]\" *ngIf=\"showMore === 'button'\">\n <gn-ui-button\n data-cy=\"addMoreBtn\"\n type=\"secondary\"\n (buttonClick)=\"onShowMore()\"\n extraClass=\"m-auto !p-[22px]\"\n >\n <span class=\"uppercase font-medium tracking-widest\" translate\n >results.showMore</span\n >\n </gn-ui-button>\n </div>\n <div class=\"show-more h-[100px]\" *ngIf=\"showMore === 'auto'\">\n <gn-ui-viewport-intersector\n (entersViewport)=\"onShowMore()\"\n ></gn-ui-viewport-intersector>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(facade.isLoading$ | async) === true\">\n <div class=\"loading flex justify-center h-[100px] pt-[45px]\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n</div>\n\n<div class=\"p-4 max-w-[600px] m-auto text-[13px]\">\n <gn-ui-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-error>\n <gn-ui-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-error>\n</div>\n\n<ng-template #favoriteToggle let-record>\n <gn-ui-favorite-star [record]=\"record\"></gn-ui-favorite-star>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.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: ErrorComponent, selector: "gn-ui-error", inputs: ["type", "error", "recordId"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: ["displayCount", "record"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }] }); }
29185
29460
  }
29186
29461
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsListContainerComponent, decorators: [{
29187
29462
  type: Component,
29188
- 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\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\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-search-results-error\n *ngIf=\"(errorCode$ | async) === 0\"\n [type]=\"errorTypes.COULD_NOT_REACH_API\"\n >\n </gn-ui-search-results-error>\n <gn-ui-search-results-error\n *ngIf=\"(error$ | async) !== null && (errorCode$ | async) !== 0\"\n [type]=\"errorTypes.RECEIVED_ERROR\"\n [error]=\"errorMessage$ | async\"\n ></gn-ui-search-results-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" }]
29463
+ 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\n *ngIf=\"\n (facade.isLoading$ | async) === false &&\n (facade.isEndOfResults$ | async) === false\n \"\n >\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" }]
29189
29464
  }], ctorParameters: function () { return [{ type: SearchFacade }, { type: undefined, decorators: [{
29190
29465
  type: Inject,
29191
29466
  args: [RESULTS_LAYOUT_CONFIG]
@@ -29243,7 +29518,7 @@ class SortByComponent {
29243
29518
  this.searchService.setSortBy(criteriaAsString.split(','));
29244
29519
  }
29245
29520
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SortByComponent, deps: [{ token: SearchFacade }, { token: SearchService }], target: i0.ɵɵFactoryTarget.Component }); }
29246
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SortByComponent, selector: "gn-ui-sort-by", inputs: { isQualitySortable: "isQualitySortable" }, ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'search.field.sortBy' | translate\"\n [choices]=\"choices\"\n (selectValue)=\"changeSortBy($event)\"\n [selected]=\"currentSortBy$ | async\"\n ariaName=\"search-sort-by\"\n></gn-ui-dropdown-selector>\n", dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29521
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SortByComponent, selector: "gn-ui-sort-by", inputs: { isQualitySortable: "isQualitySortable" }, ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'search.field.sortBy' | translate\"\n [choices]=\"choices\"\n (selectValue)=\"changeSortBy($event)\"\n [selected]=\"currentSortBy$ | async\"\n ariaName=\"search-sort-by\"\n></gn-ui-dropdown-selector>\n", dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29247
29522
  }
29248
29523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SortByComponent, decorators: [{
29249
29524
  type: Component,
@@ -30111,7 +30386,7 @@ class AddLayerFromWmsComponent {
30111
30386
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
30112
30387
  }
30113
30388
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
30114
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30389
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30115
30390
  }
30116
30391
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, decorators: [{
30117
30392
  type: Component,
@@ -30262,7 +30537,7 @@ class AddLayerFromWfsComponent {
30262
30537
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
30263
30538
  }
30264
30539
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
30265
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30540
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30266
30541
  }
30267
30542
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
30268
30543
  type: Component,
@@ -30282,7 +30557,7 @@ class LayersPanelComponent {
30282
30557
  this.mapFacade.addLayer(layer);
30283
30558
  }
30284
30559
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
30285
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LayersPanelComponent, selector: "gn-ui-layers-panel", ngImport: i0, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.ogc.api' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-ogc-api\n [ogcUrl]=\"ogcUrl\"\n (layerAdded)=\"addLayer($event)\"\n ></gn-ui-add-layer-from-ogc-api>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>\n </div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ExpandablePanelButtonComponent, selector: "gn-ui-expandable-panel-button", inputs: ["titleTemplate", "collapsed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$3.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: AddLayerFromOgcApiComponent, selector: "gn-ui-add-layer-from-ogc-api", inputs: ["ogcUrl"], outputs: ["layerAdded"] }, { kind: "component", type: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { kind: "component", type: AddLayerFromFileComponent, selector: "gn-ui-add-layer-from-file" }, { kind: "component", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30560
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LayersPanelComponent, selector: "gn-ui-layers-panel", ngImport: i0, template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <mat-icon class=\"material-symbols-outlined mr-2\">layers</mat-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n <div\n *ngFor=\"let layer of layers$ | async; let index = index\"\n class=\"flex flex-row py-3\"\n >\n <mat-icon class=\"material-symbols-outlined -ml-2 mr-2 shrink-0\"\n >chevron_right</mat-icon\n >\n <span class=\"mr-2 grow\">{{ layer.title }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index)\"\n >\n delete\n </a>\n </div>\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.ogc.api' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-ogc-api\n [ogcUrl]=\"ogcUrl\"\n (layerAdded)=\"addLayer($event)\"\n ></gn-ui-add-layer-from-ogc-api>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>\n </div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <mat-icon class=\"material-symbols-outlined mr-4\">add_circle</mat-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ExpandablePanelButtonComponent, selector: "gn-ui-expandable-panel-button", inputs: ["titleTemplate", "collapsed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: AddLayerFromOgcApiComponent, selector: "gn-ui-add-layer-from-ogc-api", inputs: ["ogcUrl"], outputs: ["layerAdded"] }, { kind: "component", type: AddLayerFromCatalogComponent, selector: "gn-ui-add-layer-from-catalog" }, { kind: "component", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms" }, { kind: "component", type: AddLayerFromFileComponent, selector: "gn-ui-add-layer-from-file" }, { kind: "component", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs" }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30286
30561
  }
30287
30562
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
30288
30563
  type: Component,
@@ -30751,14 +31026,12 @@ on(setChartConfig, (state, { chartConfig }) => ({
30751
31026
  */
30752
31027
  on(loadUserFeedbacks, (state) => ({
30753
31028
  ...state,
30754
- error: null,
30755
31029
  allUserFeedbacksLoading: true,
30756
31030
  })), on(addUserFeedback, (state) => ({
30757
31031
  ...state,
30758
31032
  addUserFeedbackLoading: true,
30759
31033
  })), on(loadUserFeedbacksSuccess, (state, { userFeedbacks }) => ({
30760
31034
  ...state,
30761
- error: null,
30762
31035
  userFeedbacks: userFeedbacks,
30763
31036
  addUserFeedbackLoading: false,
30764
31037
  allUserFeedbacksLoading: false,
@@ -30796,117 +31069,6 @@ const getUserFeedbacks = createSelector(getMdViewState, (state) => state.userFee
30796
31069
  const getAllUserFeedbacksLoading = createSelector(getMdViewState, (state) => state.allUserFeedbacksLoading);
30797
31070
  const getAddUserFeedbacksLoading = createSelector(getMdViewState, (state) => state.addUserFeedbackLoading);
30798
31071
 
30799
- /**
30800
- * The Metadata View Facade is used to render complete metadata records.
30801
- * Supply it with an incomplete record (at least containing the uuid) and the
30802
- * corresponding full record will be loaded.
30803
- * To clear the current record use the `close()` method.
30804
- */
30805
- class MdViewFacade {
30806
- constructor(store, linkClassifier, avatarService) {
30807
- this.store = store;
30808
- this.linkClassifier = linkClassifier;
30809
- this.avatarService = avatarService;
30810
- this.isPresent$ = this.store.pipe(select(getMetadataUuid), map$1((uuid) => !!uuid));
30811
- this.isMetadataLoading$ = this.store.pipe(select(getMetadataIsLoading));
30812
- this.metadata$ = this.store.pipe(select(getMetadata), filter((md) => !!md));
30813
- this.isIncomplete$ = this.store.pipe(select(getMetadataIsIncomplete), filter((incomplete) => incomplete !== null));
30814
- this.error$ = this.store.pipe(select(getMetadataError));
30815
- this.related$ = this.store.pipe(select(getRelated));
30816
- this.chartConfig$ = this.store.pipe(select(getChartConfig));
30817
- this.allLinks$ = this.metadata$.pipe(map$1((record) => ('distributions' in record ? record.distributions : [])));
30818
- this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))));
30819
- this.mapApiLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API))));
30820
- this.downloadLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.DOWNLOAD))));
30821
- this.dataLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.DATA))));
30822
- this.geoDataLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.GEODATA))));
30823
- this.landingPageLinks$ = this.metadata$.pipe(map$1((record) => ('landingPage' in record ? [record.landingPage] : [])));
30824
- this.otherLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.UNKNOWN))));
30825
- this.userFeedbacks$ = this.store.pipe(select(getUserFeedbacks));
30826
- this.isAllUserFeedbackLoading$ = this.store.pipe(select(getAllUserFeedbacksLoading));
30827
- this.isAddUserFeedbackLoading$ = this.store.pipe(select(getAddUserFeedbacksLoading));
30828
- }
30829
- /**
30830
- * This will show an incomplete record (e.g. from a search result) as a preview
30831
- * Note: the full record will not be loaded automatically; use the `loadFull` method for that
30832
- */
30833
- setIncompleteMetadata(incomplete) {
30834
- this.store.dispatch(setIncompleteMetadata({ incomplete }));
30835
- }
30836
- /**
30837
- * This will trigger the load of a full metadata record
30838
- */
30839
- loadFull(uuid) {
30840
- this.store.dispatch(loadFullMetadata({ uuid }));
30841
- }
30842
- closeMetadata() {
30843
- this.store.dispatch(closeMetadata());
30844
- }
30845
- setChartConfig(chartConfig) {
30846
- this.store.dispatch(setChartConfig({ chartConfig }));
30847
- }
30848
- /**
30849
- * UserFeedbacks
30850
- */
30851
- addUserFeedback(userFeedback) {
30852
- this.store.dispatch(addUserFeedback({ userFeedback }));
30853
- }
30854
- loadUserFeedbacks(datasetUuid) {
30855
- this.store.dispatch(loadUserFeedbacks({ datasetUuid }));
30856
- }
30857
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, deps: [{ token: i1$2.Store }, { token: LinkClassifierService }, { token: AvatarServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
30858
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade }); }
30859
- }
30860
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, decorators: [{
30861
- type: Injectable
30862
- }], ctorParameters: function () { return [{ type: i1$2.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }]; } });
30863
-
30864
- class MdViewEffects {
30865
- constructor(actions$, recordsRepository, platformServiceInterface) {
30866
- this.actions$ = actions$;
30867
- this.recordsRepository = recordsRepository;
30868
- this.platformServiceInterface = platformServiceInterface;
30869
- /*
30870
- Metadata effects
30871
- */
30872
- this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getByUniqueIdentifier(uuid)), map$1((record) => {
30873
- if (record === null) {
30874
- return loadFullMetadataFailure({ notFound: true });
30875
- }
30876
- return loadFullMetadataSuccess({ full: record });
30877
- }), catchError((error) => of(loadFullMetadataFailure({ otherError: error.message })))));
30878
- /*
30879
- Related effects
30880
- */
30881
- this.loadRelatedRecords$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSimilarRecords(full)), map$1((related) => {
30882
- return setRelated({ related });
30883
- }), catchError((error) => of(setRelated({ related: null })))));
30884
- /*
30885
- UserFeedback effects
30886
- */
30887
- this.loadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(loadUserFeedbacks), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
30888
- otherError: error.message,
30889
- })))))));
30890
- this.reloadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedbackSuccess), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
30891
- otherError: error.message,
30892
- })))))));
30893
- this.addUserFeedback$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedback), mergeMap$1((action) => this.platformServiceInterface
30894
- .postUserFeedbacks(action.userFeedback)
30895
- .pipe(map$1(() => addUserFeedbackSuccess({
30896
- datasetUuid: action.userFeedback.metadataUUID,
30897
- })), catchError((error) => {
30898
- return of(addUserFeedbackFailure({
30899
- otherError: error.message,
30900
- }));
30901
- })))));
30902
- }
30903
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$8.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
30904
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects }); }
30905
- }
30906
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, decorators: [{
30907
- type: Injectable
30908
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
30909
-
30910
31072
  class FigureComponent {
30911
31073
  constructor() {
30912
31074
  this.color = 'primary';
@@ -31140,7 +31302,7 @@ class TableComponent {
31140
31302
  return rowIdPrefix + id;
31141
31303
  }
31142
31304
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
31143
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TableComponent, isStandalone: true, selector: "gn-ui-table", inputs: { data: "data", activeId: "activeId" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"border border-gray-300 rounded-lg overflow-hidden bg-white h-full\">\n <cdk-virtual-scroll-viewport\n tvsItemSize=\"48\"\n headerHeight=\"56\"\n style=\"height: calc(100% - 37px)\"\n >\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8\" matSort>\n <ng-container *ngFor=\"let prop of properties\" [matColumnDef]=\"prop\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ prop }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[prop] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"row.id === activeId\"\n ></tr>\n </table>\n </cdk-virtual-scroll-viewport>\n <div class=\"text-gray-900 border-t border-gray-300 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n</div>\n", styles: ["table{width:100%;background:white}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:whitesmoke}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$4.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$4.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$2.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31305
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TableComponent, isStandalone: true, selector: "gn-ui-table", inputs: { data: "data", activeId: "activeId" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"border border-gray-300 rounded-lg overflow-hidden bg-white h-full\">\n <cdk-virtual-scroll-viewport\n tvsItemSize=\"48\"\n headerHeight=\"56\"\n style=\"height: calc(100% - 37px)\"\n >\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8\" matSort>\n <ng-container *ngFor=\"let prop of properties\" [matColumnDef]=\"prop\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ prop }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[prop] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"row.id === activeId\"\n ></tr>\n </table>\n </cdk-virtual-scroll-viewport>\n <div class=\"text-gray-900 border-t border-gray-300 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n</div>\n", styles: ["table{width:100%;background:white}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:whitesmoke}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$5.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$1.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31144
31306
  }
31145
31307
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TableComponent, decorators: [{
31146
31308
  type: Component,
@@ -32010,6 +32172,7 @@ marker('wfs.unreachable.http');
32010
32172
  marker('wfs.unreachable.unknown');
32011
32173
  marker('wfs.featuretype.notfound');
32012
32174
  marker('wfs.geojsongml.notsupported');
32175
+ marker('ogc.unreachable.unknown');
32013
32176
  marker('dataset.error.network');
32014
32177
  marker('dataset.error.http');
32015
32178
  marker('dataset.error.parse');
@@ -32089,6 +32252,39 @@ class DataService {
32089
32252
  mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
32090
32253
  }))));
32091
32254
  }
32255
+ async getDownloadLinksFromOgcApiFeatures(ogcApiLink) {
32256
+ const collectionInfo = await this.getDownloadUrlsFromOgcApi(ogcApiLink.url.href);
32257
+ return Object.keys(collectionInfo.bulkDownloadLinks).map((downloadLink) => {
32258
+ return {
32259
+ ...ogcApiLink,
32260
+ type: 'download',
32261
+ url: new URL(collectionInfo.bulkDownloadLinks[downloadLink]),
32262
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(downloadLink)),
32263
+ };
32264
+ });
32265
+ }
32266
+ async getDownloadUrlsFromOgcApi(url) {
32267
+ const endpoint = new OgcApiEndpoint(this.proxy.getProxiedUrl(url));
32268
+ return await endpoint.allCollections
32269
+ .then((collections) => {
32270
+ return endpoint.getCollectionInfo(collections[0].name);
32271
+ })
32272
+ .catch((error) => {
32273
+ throw new Error(`ogc.unreachable.unknown`);
32274
+ });
32275
+ }
32276
+ async getItemsFromOgcApi(url) {
32277
+ const endpoint = new OgcApiEndpoint(this.proxy.getProxiedUrl(url));
32278
+ return await endpoint.featureCollections
32279
+ .then((collections) => {
32280
+ return collections.length
32281
+ ? endpoint.getCollectionItem(collections[0], '1')
32282
+ : null;
32283
+ })
32284
+ .catch((error) => {
32285
+ throw new Error(`ogc.unreachable.unknown`);
32286
+ });
32287
+ }
32092
32288
  getDownloadLinksFromEsriRest(esriRestLink) {
32093
32289
  return ['json', 'geojson'].map((format) => ({
32094
32290
  ...esriRestLink,
@@ -32132,6 +32328,17 @@ class DataService {
32132
32328
  const url = this.getDownloadUrlFromEsriRest(link.url.toString(), 'geojson');
32133
32329
  return from(openDataset(url, 'geojson')).pipe();
32134
32330
  }
32331
+ else if (link.type === 'service' &&
32332
+ link.accessServiceProtocol === 'ogcFeatures') {
32333
+ return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
32334
+ const geojsonUrl = collectionInfo.jsonDownloadLink;
32335
+ return openDataset(geojsonUrl, 'geojson');
32336
+ }), tap$1((url) => {
32337
+ if (url === null) {
32338
+ throw new Error('wfs.geojsongml.notsupported');
32339
+ }
32340
+ }));
32341
+ }
32135
32342
  return throwError(() => 'protocol not supported');
32136
32343
  }
32137
32344
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -32358,7 +32565,7 @@ class ChartViewComponent {
32358
32565
  this.changeDetector.detectChanges();
32359
32566
  }
32360
32567
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChartViewComponent, deps: [{ token: DataService }, { token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
32361
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ChartViewComponent, selector: "gn-ui-chart-view", inputs: { link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n *ngIf=\"!isCountAggregation\"\n [choices]=\"yChoices$ | async\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32568
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ChartViewComponent, selector: "gn-ui-chart-view", inputs: { link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n *ngIf=\"!isCountAggregation\"\n [choices]=\"yChoices$ | async\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32362
32569
  }
32363
32570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChartViewComponent, decorators: [{
32364
32571
  type: Component,
@@ -32432,6 +32639,143 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32432
32639
  }]
32433
32640
  }] });
32434
32641
 
32642
+ /**
32643
+ * The Metadata View Facade is used to render complete metadata records.
32644
+ * Supply it with an incomplete record (at least containing the uuid) and the
32645
+ * corresponding full record will be loaded.
32646
+ * To clear the current record use the `close()` method.
32647
+ */
32648
+ class MdViewFacade {
32649
+ constructor(store, linkClassifier, avatarService, dataService) {
32650
+ this.store = store;
32651
+ this.linkClassifier = linkClassifier;
32652
+ this.avatarService = avatarService;
32653
+ this.dataService = dataService;
32654
+ this.isPresent$ = this.store.pipe(select(getMetadataUuid), map$1((uuid) => !!uuid));
32655
+ this.isMetadataLoading$ = this.store.pipe(select(getMetadataIsLoading));
32656
+ this.metadata$ = this.store.pipe(select(getMetadata), filter((md) => !!md));
32657
+ this.isIncomplete$ = this.store.pipe(select(getMetadataIsIncomplete), filter((incomplete) => incomplete !== null));
32658
+ this.error$ = this.store.pipe(select(getMetadataError));
32659
+ this.related$ = this.store.pipe(select(getRelated));
32660
+ this.chartConfig$ = this.store.pipe(select(getChartConfig));
32661
+ this.allLinks$ = this.metadata$.pipe(map$1((record) => ('distributions' in record ? record.distributions : [])));
32662
+ this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))));
32663
+ this.mapApiLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API))));
32664
+ this.downloadLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.DOWNLOAD))));
32665
+ this.dataLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.DATA))));
32666
+ this.geoDataLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.GEODATA))));
32667
+ this.geoDataLinksWithGeometry$ = this.allLinks$.pipe(mergeMap((links) => {
32668
+ return from(links);
32669
+ }), mergeMap((link) => {
32670
+ if (this.linkClassifier.hasUsage(link, LinkUsage.GEODATA)) {
32671
+ if (link.type === 'service' &&
32672
+ link.accessServiceProtocol === 'ogcFeatures') {
32673
+ return from(this.dataService.getItemsFromOgcApi(link.url.href)).pipe(map$1((collectionRecords) => {
32674
+ return collectionRecords && collectionRecords.geometry
32675
+ ? link
32676
+ : null;
32677
+ }), defaultIfEmpty(null));
32678
+ }
32679
+ else {
32680
+ return of(link);
32681
+ }
32682
+ }
32683
+ else {
32684
+ return of(null);
32685
+ }
32686
+ }), scan((acc, val) => {
32687
+ if (val !== null && !acc.includes(val)) {
32688
+ acc.push(val);
32689
+ }
32690
+ return acc;
32691
+ }, []));
32692
+ this.landingPageLinks$ = this.metadata$.pipe(map$1((record) => ('landingPage' in record ? [record.landingPage] : [])));
32693
+ this.otherLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.UNKNOWN))));
32694
+ this.userFeedbacks$ = this.store.pipe(select(getUserFeedbacks));
32695
+ this.isAllUserFeedbackLoading$ = this.store.pipe(select(getAllUserFeedbacksLoading));
32696
+ this.isAddUserFeedbackLoading$ = this.store.pipe(select(getAddUserFeedbacksLoading));
32697
+ }
32698
+ /**
32699
+ * This will show an incomplete record (e.g. from a search result) as a preview
32700
+ * Note: the full record will not be loaded automatically; use the `loadFull` method for that
32701
+ */
32702
+ setIncompleteMetadata(incomplete) {
32703
+ this.store.dispatch(setIncompleteMetadata({ incomplete }));
32704
+ }
32705
+ /**
32706
+ * This will trigger the load of a full metadata record
32707
+ */
32708
+ loadFull(uuid) {
32709
+ this.store.dispatch(loadFullMetadata({ uuid }));
32710
+ }
32711
+ closeMetadata() {
32712
+ this.store.dispatch(closeMetadata());
32713
+ }
32714
+ setChartConfig(chartConfig) {
32715
+ this.store.dispatch(setChartConfig({ chartConfig }));
32716
+ }
32717
+ /**
32718
+ * UserFeedbacks
32719
+ */
32720
+ addUserFeedback(userFeedback) {
32721
+ this.store.dispatch(addUserFeedback({ userFeedback }));
32722
+ }
32723
+ loadUserFeedbacks(datasetUuid) {
32724
+ this.store.dispatch(loadUserFeedbacks({ datasetUuid }));
32725
+ }
32726
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, deps: [{ token: i1$2.Store }, { token: LinkClassifierService }, { token: AvatarServiceInterface }, { token: DataService }], target: i0.ɵɵFactoryTarget.Injectable }); }
32727
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade }); }
32728
+ }
32729
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, decorators: [{
32730
+ type: Injectable
32731
+ }], ctorParameters: function () { return [{ type: i1$2.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }, { type: DataService }]; } });
32732
+
32733
+ class MdViewEffects {
32734
+ constructor(actions$, recordsRepository, platformServiceInterface) {
32735
+ this.actions$ = actions$;
32736
+ this.recordsRepository = recordsRepository;
32737
+ this.platformServiceInterface = platformServiceInterface;
32738
+ /*
32739
+ Metadata effects
32740
+ */
32741
+ this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getByUniqueIdentifier(uuid)), map$1((record) => {
32742
+ if (record === null) {
32743
+ return loadFullMetadataFailure({ notFound: true });
32744
+ }
32745
+ return loadFullMetadataSuccess({ full: record });
32746
+ }), catchError((error) => of(loadFullMetadataFailure({ otherError: error.message })))));
32747
+ /*
32748
+ Related effects
32749
+ */
32750
+ this.loadRelatedRecords$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSimilarRecords(full)), map$1((related) => {
32751
+ return setRelated({ related });
32752
+ }), catchError((error) => of(setRelated({ related: null })))));
32753
+ /*
32754
+ UserFeedback effects
32755
+ */
32756
+ this.loadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(loadUserFeedbacks), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
32757
+ otherError: error.message,
32758
+ })))))));
32759
+ this.reloadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedbackSuccess), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
32760
+ otherError: error.message,
32761
+ })))))));
32762
+ this.addUserFeedback$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedback), mergeMap$1((action) => this.platformServiceInterface
32763
+ .postUserFeedbacks(action.userFeedback)
32764
+ .pipe(map$1(() => addUserFeedbackSuccess({
32765
+ datasetUuid: action.userFeedback.metadataUUID,
32766
+ })), catchError((error) => {
32767
+ return of(addUserFeedbackFailure({
32768
+ otherError: error.message,
32769
+ }));
32770
+ })))));
32771
+ }
32772
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$8.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
32773
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects }); }
32774
+ }
32775
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, decorators: [{
32776
+ type: Injectable
32777
+ }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
32778
+
32435
32779
  marker('externalviewer.dataset.unnamed');
32436
32780
  class ExternalViewerButtonComponent {
32437
32781
  get externalViewer() {
@@ -32499,8 +32843,10 @@ class MapViewComponent {
32499
32843
  this.subscription = new Subscription();
32500
32844
  this.compatibleMapLinks$ = combineLatest([
32501
32845
  this.mdViewFacade.mapApiLinks$,
32502
- this.mdViewFacade.geoDataLinks$,
32503
- ]).pipe(map$1(([mapApiLinks, geoDataLinks]) => [...mapApiLinks, ...geoDataLinks]));
32846
+ this.mdViewFacade.geoDataLinksWithGeometry$,
32847
+ ]).pipe(map$1(([mapApiLinks, geoDataLinksWithGeometry]) => {
32848
+ return [...mapApiLinks, ...geoDataLinksWithGeometry];
32849
+ }));
32504
32850
  this.dropdownChoices$ = this.compatibleMapLinks$.pipe(map$1((links) => links.length
32505
32851
  ? links.map((link, index) => ({
32506
32852
  label: getLinkLabel(link),
@@ -32526,15 +32872,20 @@ class MapViewComponent {
32526
32872
  return of([]);
32527
32873
  }), finalize(() => (this.loading = false)));
32528
32874
  }));
32529
- this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError((error) => {
32530
- console.warn(error); // FIXME: report this to the user somehow
32875
+ this.mapContext$ = this.currentLayers$.pipe(switchMap$1((layers) => from(this.mapUtils.getLayerExtent(layers[0])).pipe(catchError(() => {
32876
+ this.error = 'The layer has no extent';
32531
32877
  return of(undefined);
32532
32878
  }), map$1((extent) => ({
32533
32879
  layers,
32534
32880
  view: {
32535
32881
  extent,
32536
32882
  },
32537
- })), tap$1(() => this.resetSelection()))), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
32883
+ })), tap$1((res) => {
32884
+ this.resetSelection();
32885
+ }))), startWith({
32886
+ layers: [],
32887
+ view: {},
32888
+ }), withLatestFrom$1(this.mdViewFacade.metadata$), map$1(([context, metadata]) => {
32538
32889
  if (context.view.extent)
32539
32890
  return context;
32540
32891
  const extent = this.mapUtils.getRecordExtent(metadata);
@@ -32590,7 +32941,8 @@ class MapViewComponent {
32590
32941
  }
32591
32942
  else if ((link.type === 'service' &&
32592
32943
  (link.accessServiceProtocol === 'wfs' ||
32593
- link.accessServiceProtocol === 'esriRest')) ||
32944
+ link.accessServiceProtocol === 'esriRest' ||
32945
+ link.accessServiceProtocol === 'ogcFeatures')) ||
32594
32946
  link.type === 'download') {
32595
32947
  return this.dataService.readAsGeoJson(link).pipe(map$1((data) => ({
32596
32948
  type: MapContextLayerTypeEnum.GEOJSON,
@@ -32603,7 +32955,7 @@ class MapViewComponent {
32603
32955
  this.selectedLinkIndex$.next(link);
32604
32956
  }
32605
32957
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapManagerService }, { token: MapUtilsService }, { token: DataService }, { token: FeatureInfoService }, { token: i0.ChangeDetectorRef }, { token: MapStyleService }], target: i0.ɵɵFactoryTarget.Component }); }
32606
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MapViewComponent, selector: "gn-ui-map-view", ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MapContextComponent, selector: "gn-ui-map-context", inputs: ["context", "mapConfig"], outputs: ["featureClicked"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mapConfig"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32958
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MapViewComponent, selector: "gn-ui-map-view", ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <div class=\"w-full flex justify-end mb-7 mt-1\">\n <gn-ui-dropdown-selector\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n <gn-ui-external-viewer-button\n class=\"shrink-0 py-1 place-self-end\"\n [link]=\"selectedLink$ | async\"\n [mapConfig]=\"mapConfig\"\n >\n </gn-ui-external-viewer-button>\n </div>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-context\n [context]=\"mapContext$ | async\"\n [mapConfig]=\"mapConfig\"\n ></gn-ui-map-context>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <button\n (click)=\"resetSelection()\"\n class=\"rounded bg-primary-opacity-25 text-white absolute right-[0.5em]\"\n >\n <mat-icon\n class=\"material-symbols-outlined align-middle text-sm\"\n style=\"height: 21px\"\n >close</mat-icon\n >\n </button>\n <gn-ui-feature-detail [feature]=\"selection\"></gn-ui-feature-detail>\n </div>\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"error_outline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MapContextComponent, selector: "gn-ui-map-context", inputs: ["context", "mapConfig"], outputs: ["featureClicked"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mapConfig"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32607
32959
  }
32608
32960
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
32609
32961
  type: Component,
@@ -32641,7 +32993,7 @@ class DataViewComponent {
32641
32993
  this.selectedLink$.next(link);
32642
32994
  }
32643
32995
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataViewComponent, deps: [{ token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
32644
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DataViewComponent, selector: "gn-ui-data-view", inputs: { mode: "mode" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <gn-ui-dropdown-selector\n *ngIf=\"dropdownChoices$ | async as choices\"\n [title]=\"'table.select.data' | translate\"\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [choices]=\"choices\"\n (selectValue)=\"selectLink($event)\"\n ></gn-ui-dropdown-selector>\n <div class=\"relative h-[420px]\">\n <gn-ui-table-view\n *ngIf=\"mode === 'table'\"\n [link]=\"selectedLink$ | async\"\n ></gn-ui-table-view>\n <gn-ui-chart-view\n *ngIf=\"mode === 'chart'\"\n (chartConfig$)=\"setChartConfig($event)\"\n [link]=\"selectedLink$ | async\"\n ></gn-ui-chart-view>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TableViewComponent, selector: "gn-ui-table-view", inputs: ["link"] }, { kind: "component", type: ChartViewComponent, selector: "gn-ui-chart-view", inputs: ["link", "aggregation", "xProperty", "yProperty", "chartType"], outputs: ["chartConfig$"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32996
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DataViewComponent, selector: "gn-ui-data-view", inputs: { mode: "mode" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col p-1\">\n <gn-ui-dropdown-selector\n *ngIf=\"dropdownChoices$ | async as choices\"\n [title]=\"'table.select.data' | translate\"\n class=\"truncate p-1 -mx-1\"\n extraBtnClass=\"!text-primary font-sans font-medium\"\n [choices]=\"choices\"\n (selectValue)=\"selectLink($event)\"\n ></gn-ui-dropdown-selector>\n <div class=\"relative h-[420px]\">\n <gn-ui-table-view\n *ngIf=\"mode === 'table'\"\n [link]=\"selectedLink$ | async\"\n ></gn-ui-table-view>\n <gn-ui-chart-view\n *ngIf=\"mode === 'chart'\"\n (chartConfig$)=\"setChartConfig($event)\"\n [link]=\"selectedLink$ | async\"\n ></gn-ui-chart-view>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TableViewComponent, selector: "gn-ui-table-view", inputs: ["link"] }, { kind: "component", type: ChartViewComponent, selector: "gn-ui-chart-view", inputs: ["link", "aggregation", "xProperty", "yProperty", "chartType"], outputs: ["chartConfig$"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32645
32997
  }
32646
32998
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataViewComponent, decorators: [{
32647
32999
  type: Component,
@@ -32735,7 +33087,7 @@ class OrganisationsFilterComponent {
32735
33087
  this.filterByValueChange.next(inputValue);
32736
33088
  }
32737
33089
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationsFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
32738
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: OrganisationsFilterComponent, selector: "gn-ui-organisations-filter", outputs: { sortBy: "sortBy", filterBy: "filterBy" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap sm:flex-nowrap justify-between bg-white shadow-xl p-5 rounded-lg\"\n>\n <span class=\"grow mb-4 mr-4 sm:mb-0 sm:mr-16 sm:max-w-sm\">\n <gn-ui-search-input\n (valueChange)=\"filterOrganisations($event)\"\n [placeholder]=\"'organisation.filter.placeholder' | translate\"\n ></gn-ui-search-input>\n </span>\n <span class=\"flex flex-wrap sm:flex-nowrap sm:shrink-0\">\n <gn-ui-dropdown-selector\n [title]=\"'organisation.sort.sortBy' | translate\"\n class=\"shrink\"\n [choices]=\"choices\"\n [minWidth]=\"'180px'\"\n [showTitle]=\"true\"\n (selectValue)=\"selectOrderToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n </span>\n</div>\n", dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: SearchInputComponent, selector: "gn-ui-search-input", inputs: ["value", "placeholder"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33090
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: OrganisationsFilterComponent, selector: "gn-ui-organisations-filter", outputs: { sortBy: "sortBy", filterBy: "filterBy" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap sm:flex-nowrap justify-between bg-white shadow-xl p-5 rounded-lg\"\n>\n <span class=\"grow mb-4 mr-4 sm:mb-0 sm:mr-16 sm:max-w-sm\">\n <gn-ui-search-input\n (valueChange)=\"filterOrganisations($event)\"\n [placeholder]=\"'organisation.filter.placeholder' | translate\"\n ></gn-ui-search-input>\n </span>\n <span class=\"flex flex-wrap sm:flex-nowrap sm:shrink-0\">\n <gn-ui-dropdown-selector\n [title]=\"'organisation.sort.sortBy' | translate\"\n class=\"shrink\"\n [choices]=\"choices\"\n [minWidth]=\"'180px'\"\n [showTitle]=\"true\"\n (selectValue)=\"selectOrderToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n </span>\n</div>\n", dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: SearchInputComponent, selector: "gn-ui-search-input", inputs: ["value", "placeholder"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32739
33091
  }
32740
33092
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationsFilterComponent, decorators: [{
32741
33093
  type: Component,
@@ -32775,7 +33127,7 @@ class LanguageSwitcherComponent {
32775
33127
  this.translate.use(value);
32776
33128
  }
32777
33129
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
32778
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\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"], outputs: ["selectValue"] }] }); }
33130
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\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"] }] }); }
32779
33131
  }
32780
33132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
32781
33133
  type: Component,
@@ -33188,7 +33540,7 @@ class DataViewShareComponent {
33188
33540
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
33189
33541
  }
33190
33542
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataViewShareComponent, deps: [{ token: WEB_COMPONENT_EMBEDDER_URL, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
33191
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DataViewShareComponent, selector: "gn-ui-data-view-share", ngImport: i0, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2$3.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink" }, { kind: "component", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33543
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DataViewShareComponent, selector: "gn-ui-data-view-share", ngImport: i0, template: "<div class=\"container-lg px-5 my-1 lg:mx-auto\">\n <mat-tab-group\n [selectedIndex]=\"0\"\n animationDuration=\"0ms\"\n mat-stretch-tabs=\"false\"\n mat-align-tabs=\"start\"\n [disableRipple]=\"!wcEmbedderBaseUrl\"\n >\n <mat-tab *ngIf=\"wcEmbedderBaseUrl\">\n <ng-template mat-tab-label>\n <span class=\"tab-header-label-gray\" translate>share.tab.permalink</span>\n </ng-template>\n <gn-ui-data-view-permalink></gn-ui-data-view-permalink>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span\n [class]=\"\n wcEmbedderBaseUrl\n ? 'tab-header-label-gray'\n : 'single-tab-header-label-gray'\n \"\n translate\n >share.tab.webComponent</span\n >\n </ng-template>\n <gn-ui-data-view-web-component></gn-ui-data-view-web-component>\n </mat-tab>\n </mat-tab-group>\n</div>\n", styles: ["::ng-deep .mat-mdc-tab.mdc-tab.mdc-tab--active .tab-header-label-gray{opacity:100%;font-weight:700}.tab-header-label-gray{@apply text-sm text-gray-700 opacity-75 hover:text-gray-900;}.single-tab-header-label-gray{@apply text-sm text-gray-900;}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i2$4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i2$4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DataViewPermalinkComponent, selector: "gn-ui-data-view-permalink" }, { kind: "component", type: DataViewWebComponentComponent, selector: "gn-ui-data-view-web-component" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33192
33544
  }
33193
33545
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataViewShareComponent, decorators: [{
33194
33546
  type: Component,
@@ -33331,6 +33683,13 @@ const DEFAULT_FIELDS = [
33331
33683
  type: 'date',
33332
33684
  },
33333
33685
  },
33686
+ {
33687
+ model: 'updateFrequency',
33688
+ formFieldConfig: {
33689
+ labelKey: marker('editor.record.form.updateFrequency'),
33690
+ type: 'text',
33691
+ },
33692
+ },
33334
33693
  ];
33335
33694
 
33336
33695
  const EDITOR_FEATURE_KEY = 'editor';
@@ -33715,7 +34074,7 @@ class WizardFieldComponent {
33715
34074
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
33716
34075
  },
33717
34076
  { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
33718
- ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i2$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34077
+ ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i2$3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33719
34078
  }
33720
34079
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardFieldComponent, decorators: [{
33721
34080
  type: Component,
@@ -34092,7 +34451,7 @@ class FormFieldLicenseComponent {
34092
34451
  this.control.setValue([{ text: value }]);
34093
34452
  }
34094
34453
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34095
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldLicenseComponent, isStandalone: true, selector: "gn-ui-form-field-license", inputs: { control: "control", label: "label" }, ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"label\"\n [showTitle]=\"false\"\n [choices]=\"choices\"\n [selected]=\"selected\"\n (selectValue)=\"onSelectValue($event)\"\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"], outputs: ["selectValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34454
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldLicenseComponent, isStandalone: true, selector: "gn-ui-form-field-license", inputs: { control: "control", label: "label" }, ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"label\"\n [showTitle]=\"false\"\n [choices]=\"choices\"\n [selected]=\"selected\"\n (selectValue)=\"onSelectValue($event)\"\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34096
34455
  }
34097
34456
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, decorators: [{
34098
34457
  type: Component,
@@ -34114,6 +34473,104 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
34114
34473
  type: Input
34115
34474
  }] } });
34116
34475
 
34476
+ class FormFieldUpdateFrequencyComponent {
34477
+ get planned() {
34478
+ return this.control.value !== 'notPlanned';
34479
+ }
34480
+ constructor(translateService) {
34481
+ this.translateService = translateService;
34482
+ this.choices = [
34483
+ {
34484
+ value: 'day.1',
34485
+ label: this.translateService.instant('domain.record.updateFrequency.day', {
34486
+ count: 1,
34487
+ }),
34488
+ },
34489
+ {
34490
+ value: 'day.2',
34491
+ label: this.translateService.instant('domain.record.updateFrequency.day', {
34492
+ count: 2,
34493
+ }),
34494
+ },
34495
+ {
34496
+ value: 'week.1',
34497
+ label: this.translateService.instant('domain.record.updateFrequency.week', {
34498
+ count: 1,
34499
+ }),
34500
+ },
34501
+ {
34502
+ value: 'week.2',
34503
+ label: this.translateService.instant('domain.record.updateFrequency.week', {
34504
+ count: 2,
34505
+ }),
34506
+ },
34507
+ {
34508
+ value: 'month.1',
34509
+ label: this.translateService.instant('domain.record.updateFrequency.month', {
34510
+ count: 1,
34511
+ }),
34512
+ },
34513
+ {
34514
+ value: 'month.2',
34515
+ label: this.translateService.instant('domain.record.updateFrequency.month', {
34516
+ count: 2,
34517
+ }),
34518
+ },
34519
+ {
34520
+ value: 'year.1',
34521
+ label: this.translateService.instant('domain.record.updateFrequency.year', {
34522
+ count: 1,
34523
+ }),
34524
+ },
34525
+ {
34526
+ value: 'year.2',
34527
+ label: this.translateService.instant('domain.record.updateFrequency.year', {
34528
+ count: 2,
34529
+ }),
34530
+ },
34531
+ ];
34532
+ }
34533
+ ngOnInit() {
34534
+ const updatedTimes = this.control.value?.updatedTimes;
34535
+ const per = this.control.value?.per;
34536
+ if (updatedTimes && updatedTimes !== 1 && updatedTimes !== 2) {
34537
+ this.choices = [
34538
+ {
34539
+ value: `${per}.${updatedTimes}`,
34540
+ label: this.translateService.instant(`domain.record.updateFrequency.${per}`, {
34541
+ count: updatedTimes,
34542
+ }),
34543
+ },
34544
+ ...this.choices,
34545
+ ];
34546
+ }
34547
+ }
34548
+ onPlannedToggled() {
34549
+ if (this.planned) {
34550
+ this.control.setValue('notPlanned');
34551
+ }
34552
+ else {
34553
+ this.control.setValue({ updatedTimes: 1, per: 'day' });
34554
+ }
34555
+ }
34556
+ get selectedFrequency() {
34557
+ const { updatedTimes, per } = this.control.value;
34558
+ return `${per}.${updatedTimes}`;
34559
+ }
34560
+ onSelectFrequencyValue(value) {
34561
+ const split = value.split('.');
34562
+ this.control.setValue({ updatedTimes: Number(split[1]), per: split[0] });
34563
+ }
34564
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldUpdateFrequencyComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
34565
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldUpdateFrequencyComponent, isStandalone: true, selector: "gn-ui-form-field-update-frequency", inputs: { control: "control" }, ngImport: i0, template: "<gn-ui-check-toggle\n [label]=\"'editor.record.form.updateFrequency.planned' | translate\"\n [value]=\"planned\"\n (toggled)=\"onPlannedToggled()\"\n></gn-ui-check-toggle>\n<gn-ui-dropdown-selector\n title=\"updateFrequency\"\n [showTitle]=\"false\"\n [choices]=\"choices\"\n [selected]=\"selectedFrequency\"\n (selectValue)=\"onSelectFrequencyValue($event)\"\n [disabled]=\"!planned\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34566
+ }
34567
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldUpdateFrequencyComponent, decorators: [{
34568
+ type: Component,
34569
+ args: [{ selector: 'gn-ui-form-field-update-frequency', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CheckToggleComponent, DropdownSelectorComponent, TranslateModule], template: "<gn-ui-check-toggle\n [label]=\"'editor.record.form.updateFrequency.planned' | translate\"\n [value]=\"planned\"\n (toggled)=\"onPlannedToggled()\"\n></gn-ui-check-toggle>\n<gn-ui-dropdown-selector\n title=\"updateFrequency\"\n [showTitle]=\"false\"\n [choices]=\"choices\"\n [selected]=\"selectedFrequency\"\n (selectValue)=\"onSelectFrequencyValue($event)\"\n [disabled]=\"!planned\"\n>\n</gn-ui-dropdown-selector>\n" }]
34570
+ }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { control: [{
34571
+ type: Input
34572
+ }] } });
34573
+
34117
34574
  class FormFieldComponent {
34118
34575
  set value(v) {
34119
34576
  this.formControl.setValue(v, {
@@ -34174,11 +34631,14 @@ class FormFieldComponent {
34174
34631
  get isResourceUpdated() {
34175
34632
  return this.model === 'resourceUpdated';
34176
34633
  }
34634
+ get isUpdateFrequency() {
34635
+ return this.model === 'updateFrequency';
34636
+ }
34177
34637
  get withoutWrapper() {
34178
34638
  return this.model === 'title' || this.model === 'abstract';
34179
34639
  }
34180
34640
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34181
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "component", type: FormFieldResourceUpdatedComponent, selector: "gn-ui-form-field-resource-updated", inputs: ["control"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldObjectComponent, selector: "gn-ui-form-field-object" }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldTemporalExtentComponent, selector: "gn-ui-form-field-temporal-extent" }, { kind: "component", type: FormFieldFileComponent, selector: "gn-ui-form-field-file", inputs: ["control", "readonly", "invalid", "placeholder"] }, { kind: "component", type: FormFieldArrayComponent, selector: "gn-ui-form-field-array" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34641
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "component", type: FormFieldResourceUpdatedComponent, selector: "gn-ui-form-field-resource-updated", inputs: ["control"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["control"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldObjectComponent, selector: "gn-ui-form-field-object" }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldTemporalExtentComponent, selector: "gn-ui-form-field-temporal-extent" }, { kind: "component", type: FormFieldFileComponent, selector: "gn-ui-form-field-file", inputs: ["control", "readonly", "invalid", "placeholder"] }, { kind: "component", type: FormFieldArrayComponent, selector: "gn-ui-form-field-array" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34182
34642
  }
34183
34643
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, decorators: [{
34184
34644
  type: Component,
@@ -34191,6 +34651,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
34191
34651
  FormFieldWrapperComponent,
34192
34652
  FormFieldLicenseComponent,
34193
34653
  FormFieldResourceUpdatedComponent,
34654
+ FormFieldUpdateFrequencyComponent,
34194
34655
  FormFieldSimpleComponent,
34195
34656
  FormFieldRichComponent,
34196
34657
  FormFieldObjectComponent,
@@ -34199,7 +34660,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
34199
34660
  FormFieldFileComponent,
34200
34661
  FormFieldArrayComponent,
34201
34662
  TranslateModule,
34202
- ], template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</ng-template>\n" }]
34663
+ ], template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isUpdateFrequency\">\n <gn-ui-form-field-update-frequency\n [control]=\"formControl\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</ng-template>\n" }]
34203
34664
  }], ctorParameters: function () { return []; }, propDecorators: { model: [{
34204
34665
  type: Input
34205
34666
  }], config: [{
@@ -34557,7 +35018,7 @@ class DefaultRouterModule {
34557
35018
  };
34558
35019
  }
34559
35020
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
34560
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$3.StoreRouterConnectingModule, i1$8.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
35021
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$2.StoreRouterConnectingModule, i1$8.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
34561
35022
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, providers: [
34562
35023
  RouterFacade,
34563
35024
  {
@@ -34600,5 +35061,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
34600
35061
  * Generated bundle index. Do not edit.
34601
35062
  */
34602
35063
 
34603
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldWrapperComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, 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_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, 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, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, downgradeImage, downsizeImage, dragPanCondition, dropEmptyTranslations, editorReducer, findConverterForDocument, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, megabytesToBytes, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
35064
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MultilingualSearchField, MyOrgService, NavigationButtonComponent, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, 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_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, 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, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, downgradeImage, downsizeImage, dragPanCondition, dropEmptyTranslations, editorReducer, findConverterForDocument, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, megabytesToBytes, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, totalPages, updateLayer, updateRecordField };
34604
35065
  //# sourceMappingURL=geonetwork-ui.mjs.map