geonetwork-ui 2.3.0-dev.3efe236f → 2.3.0-dev.549700bf

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 (185) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +2 -2
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
  3. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -7
  4. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +1 -1
  5. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +35 -2
  6. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  7. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  8. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +104 -0
  9. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +25 -6
  10. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  11. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +23 -1
  12. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  13. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  14. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  15. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  16. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +29 -8
  17. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
  18. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +4 -3
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +1 -1
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +1 -3
  21. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  22. package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +1 -1
  23. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +1 -1
  24. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  25. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +1 -1
  26. package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +1 -1
  27. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  28. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  29. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  30. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +99 -36
  31. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +1 -6
  32. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +3 -5
  33. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  34. package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +4 -3
  35. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  36. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  37. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +19 -8
  38. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  39. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +5 -3
  40. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +14 -11
  41. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  42. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  43. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  44. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  45. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  46. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  47. package/esm2022/translations/de.json +22 -14
  48. package/esm2022/translations/en.json +22 -14
  49. package/esm2022/translations/es.json +22 -14
  50. package/esm2022/translations/fr.json +22 -14
  51. package/esm2022/translations/it.json +22 -14
  52. package/esm2022/translations/nl.json +22 -14
  53. package/esm2022/translations/pt.json +22 -14
  54. package/fesm2022/geonetwork-ui.mjs +1505 -908
  55. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  56. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  57. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  58. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  59. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  60. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  61. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  62. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  63. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
  64. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +21 -0
  65. 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
  66. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +4 -0
  67. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  68. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  69. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  70. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  71. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +1 -0
  72. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  73. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  74. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  75. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  76. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  77. package/libs/feature/search/src/index.d.ts +1 -0
  78. package/libs/feature/search/src/index.d.ts.map +1 -1
  79. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  80. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  81. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  82. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  83. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  84. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  85. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +24 -4
  86. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  87. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
  88. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  89. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +1 -2
  90. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -1
  91. package/libs/ui/inputs/src/index.d.ts +15 -14
  92. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  93. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +1 -1
  94. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
  95. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  96. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  97. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  98. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  99. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +2 -1
  100. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  101. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  102. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  103. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -1
  104. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  105. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  106. package/libs/ui/layout/src/index.d.ts +1 -0
  107. package/libs/ui/layout/src/index.d.ts.map +1 -1
  108. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  109. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  110. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  111. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  112. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  113. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  114. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  115. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  116. package/package.json +2 -2
  117. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +1 -1
  118. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +1 -4
  119. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +16 -10
  120. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  121. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +2 -2
  122. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
  123. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  124. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  125. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  126. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  127. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  128. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  129. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +0 -0
  130. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +14 -0
  131. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +143 -0
  132. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +38 -33
  133. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +21 -0
  134. package/src/libs/feature/editor/src/lib/fields.config.ts +22 -0
  135. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  136. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  137. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  138. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +1 -0
  139. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +26 -8
  140. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  141. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +0 -1
  142. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +0 -2
  143. package/src/libs/feature/search/src/index.ts +1 -0
  144. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  145. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  146. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  147. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  148. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  149. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
  150. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +126 -30
  151. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +0 -2
  152. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +1 -1
  153. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +0 -1
  154. package/src/libs/ui/inputs/src/index.ts +15 -14
  155. package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -0
  156. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  157. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  158. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  159. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  160. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -0
  161. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +14 -0
  162. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  163. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  164. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  165. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -0
  166. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +1 -0
  167. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -3
  168. package/src/libs/ui/layout/src/index.ts +1 -0
  169. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  170. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  171. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  172. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  173. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  174. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  175. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  176. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  177. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  178. package/translations/de.json +22 -14
  179. package/translations/en.json +22 -14
  180. package/translations/es.json +22 -14
  181. package/translations/fr.json +22 -14
  182. package/translations/it.json +22 -14
  183. package/translations/nl.json +22 -14
  184. package/translations/pt.json +22 -14
  185. package/translations/sk.json +22 -14
@@ -8,7 +8,7 @@ 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, distinctUntilChanged, debounceTime, 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 } 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';
@@ -42,30 +42,33 @@ import TileLayer from 'ol/layer/Tile';
42
42
  import XYZ from 'ol/source/XYZ';
43
43
  import { bbox } from 'ol/loadingstrategy';
44
44
  import WMTS from 'ol/source/WMTS';
45
- import * as i2$3 from '@angular/material/tabs';
45
+ import OGCVectorTile from 'ol/source/OGCVectorTile.js';
46
+ import { MVT, WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
47
+ import VectorTileLayer from 'ol/layer/VectorTile';
48
+ import OGCMapTile from 'ol/source/OGCMapTile.js';
49
+ import * as i2$4 from '@angular/material/tabs';
46
50
  import { MatTabsModule } from '@angular/material/tabs';
47
- import * as i1$4 from '@angular/cdk/overlay';
48
- import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
49
51
  import * as i2$1 from '@angular/forms';
50
52
  import { UntypedFormControl, FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms';
51
- import * as i5 from 'ngx-chips';
52
- import { TagInputModule } from 'ngx-chips';
53
53
  import * as i4 from '@angular/material/autocomplete';
54
54
  import { MatAutocompleteTrigger, MatAutocomplete, MatAutocompleteModule } from '@angular/material/autocomplete';
55
- import * as i5$1 from '@angular/material/core';
55
+ import * as i5 from '@angular/material/core';
56
56
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
57
+ import * as i1$4 from '@angular/material/checkbox';
58
+ import { MatCheckboxModule } from '@angular/material/checkbox';
59
+ import * as i5$1 from 'ngx-chips';
60
+ import { TagInputModule } from 'ngx-chips';
61
+ import * as i2$2 from '@angular/material/tooltip';
62
+ import { MatTooltipModule } from '@angular/material/tooltip';
63
+ import * as i2$3 from '@angular/material/datepicker';
64
+ import { MatDatepickerModule } from '@angular/material/datepicker';
57
65
  import * as i3 from 'ngx-dropzone';
58
66
  import { NgxDropzoneModule } from 'ngx-dropzone';
59
- import * as i1$5 from '@angular/material/progress-spinner';
67
+ import * as i1$5 from '@angular/cdk/overlay';
68
+ import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
69
+ import * as i1$6 from '@angular/material/progress-spinner';
60
70
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
61
- import * as i1$6 from '@angular/material/checkbox';
62
- import { MatCheckboxModule } from '@angular/material/checkbox';
63
- import * as i3$1 from '@angular/material/tooltip';
64
- import { MatTooltipModule } from '@angular/material/tooltip';
65
- import * as i2$2 from '@angular/material/form-field';
66
71
  import { MatFormFieldModule } from '@angular/material/form-field';
67
- import * as i3$2 from '@angular/material/datepicker';
68
- import { MatDatepickerModule } from '@angular/material/datepicker';
69
72
  import { MatInputModule } from '@angular/material/input';
70
73
  import * as i1$7 from '@angular/router';
71
74
  import { RouterModule, RouterLink, RouteReuseStrategy } from '@angular/router';
@@ -85,18 +88,17 @@ import { trigger, transition, animate, keyframes, style } from '@angular/animati
85
88
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
86
89
  import * as i4$1 from '@angular/cdk/scrolling';
87
90
  import { ScrollingModule } from '@angular/cdk/scrolling';
88
- import * as i2$4 from '@angular/material/sort';
91
+ import * as i2$5 from '@angular/material/sort';
89
92
  import { MatSort, MatSortModule } from '@angular/material/sort';
90
93
  import * as i1$9 from '@angular/material/table';
91
94
  import { MatTableModule } from '@angular/material/table';
92
- import * as i3$3 from 'ng-table-virtual-scroll';
95
+ import * as i3$1 from 'ng-table-virtual-scroll';
93
96
  import { TableVirtualScrollDataSource, TableVirtualScrollModule } from 'ng-table-virtual-scroll';
94
97
  import * as Papa from 'papaparse';
95
98
  import parseDate from 'date-fns/parse';
96
99
  import parseIsoDate from 'date-fns/parseISO';
97
- import { WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
98
100
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
99
- import * as i3$4 from '@ngrx/router-store';
101
+ import * as i3$2 from '@ngrx/router-store';
100
102
  import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
101
103
  import { navigation } from '@ngrx/router-store/data-persistence';
102
104
 
@@ -856,7 +858,7 @@ function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
856
858
  else if (days <= 7) {
857
859
  return {
858
860
  per: 'week',
859
- updatedTimes: Math.round(7 / days),
861
+ updatedTimes: Math.round(7 / days - 0.0001), // this is to make sure that 'every 2 days' = '3 times per week'
860
862
  };
861
863
  }
862
864
  else if (days) {
@@ -1155,7 +1157,7 @@ function getISODuration(updateFrequency) {
1155
1157
  duration.hours = Math.round(24 / updateFrequency.updatedTimes);
1156
1158
  break;
1157
1159
  case 'week':
1158
- duration.days = Math.round(7 / updateFrequency.updatedTimes);
1160
+ duration.days = Math.round(7 / updateFrequency.updatedTimes - 0.0001); // this is to make sure that '2 times per week' = 'every 3 days'
1159
1161
  break;
1160
1162
  case 'month':
1161
1163
  if (updateFrequency.updatedTimes <= 1)
@@ -17419,6 +17421,19 @@ var de = {
17419
17421
  "downloads.format.unknown": "unbekannt",
17420
17422
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
17421
17423
  dropFile: dropFile$6,
17424
+ "editor.record.form.license": "Lizenz",
17425
+ "editor.record.form.license.cc-by": "",
17426
+ "editor.record.form.license.cc-by-sa": "",
17427
+ "editor.record.form.license.cc-zero": "",
17428
+ "editor.record.form.license.etalab": "",
17429
+ "editor.record.form.license.etalab-v2": "",
17430
+ "editor.record.form.license.odbl": "",
17431
+ "editor.record.form.license.odc-by": "",
17432
+ "editor.record.form.license.pddl": "",
17433
+ "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17434
+ "editor.record.form.resourceUpdated": "",
17435
+ "editor.record.form.updateFrequency": "",
17436
+ "editor.record.form.updateFrequency.planned": "",
17422
17437
  "editor.record.loadError.body": "",
17423
17438
  "editor.record.loadError.closeMessage": "",
17424
17439
  "editor.record.loadError.title": "",
@@ -17489,6 +17504,7 @@ var de = {
17489
17504
  "multiselect.filter.placeholder": "Suche",
17490
17505
  "nav.back": "Zurück",
17491
17506
  next: next$6,
17507
+ "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
17492
17508
  "organisation.filter.placeholder": "Ergebnisse filtern",
17493
17509
  "organisation.sort.sortBy": "Sortieren nach:",
17494
17510
  "organisations.hits.found": "{hits, plural, =0{Keine Organisation gefunden} other{{hits} von {total} Organisationen angezeigt}}",
@@ -17553,14 +17569,6 @@ var de = {
17553
17569
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
17554
17570
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
17555
17571
  "record.metadata.related": "Ähnliche Datensätze",
17556
- "record.metadata.userFeedbacks": "",
17557
- "record.metadata.userFeedbacks.anonymousUser": "",
17558
- "record.metadata.userFeedbacks.sortSelector.label": "",
17559
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
17560
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
17561
- "record.metadata.userFeedbacks.newComment.placeholder": "",
17562
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
17563
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
17564
17572
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
17565
17573
  "record.metadata.status": "Status",
17566
17574
  "record.metadata.technical": "Technische Informationen",
@@ -17575,6 +17583,14 @@ var de = {
17575
17583
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
17576
17584
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
17577
17585
  "record.metadata.usage": "Nutzung und Einschränkungen",
17586
+ "record.metadata.userFeedbacks": "",
17587
+ "record.metadata.userFeedbacks.anonymousUser": "",
17588
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
17589
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
17590
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
17591
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
17592
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
17593
+ "record.metadata.userFeedbacks.sortSelector.label": "",
17578
17594
  "record.more.details": "Weitere Details",
17579
17595
  "record.tab.chart": "Diagramm",
17580
17596
  "record.tab.data": "Tabelle",
@@ -17634,12 +17650,6 @@ var de = {
17634
17650
  "table.loading.data": "Daten werden geladen...",
17635
17651
  "table.object.count": "Objekte in diesem Datensatz",
17636
17652
  "table.select.data": "Datenquelle",
17637
- "timeSincePipe.lessThanAMinute": "",
17638
- "timeSincePipe.minutesAgo": "",
17639
- "timeSincePipe.hoursAgo": "",
17640
- "timeSincePipe.daysAgo": "",
17641
- "timeSincePipe.monthsAgo": "",
17642
- "timeSincePipe.yearsAgo": "",
17643
17653
  "tooltip.html.copy": "HTML kopieren",
17644
17654
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
17645
17655
  "tooltip.url.copy": "URL kopieren",
@@ -17804,6 +17814,19 @@ var en = {
17804
17814
  "downloads.format.unknown": "unknown",
17805
17815
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17806
17816
  dropFile: dropFile$5,
17817
+ "editor.record.form.license": "License",
17818
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17819
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17820
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
17821
+ "editor.record.form.license.etalab": "Open Licence (Etalab)",
17822
+ "editor.record.form.license.etalab-v2": "Open Licence v2.0 (Etalab)",
17823
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
17824
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17825
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
17826
+ "editor.record.form.license.unknown": "Unknown or absent",
17827
+ "editor.record.form.resourceUpdated": "Last update date",
17828
+ "editor.record.form.updateFrequency": "Update frequency",
17829
+ "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
17807
17830
  "editor.record.loadError.body": "The record could not be loaded:",
17808
17831
  "editor.record.loadError.closeMessage": "Understood",
17809
17832
  "editor.record.loadError.title": "Error loading record",
@@ -17874,6 +17897,7 @@ var en = {
17874
17897
  "multiselect.filter.placeholder": "Search",
17875
17898
  "nav.back": "Back",
17876
17899
  next: next$5,
17900
+ "ogc.unreachable.unknown": "The service could not be reached",
17877
17901
  "organisation.filter.placeholder": "Filter results",
17878
17902
  "organisation.sort.sortBy": "Sort by:",
17879
17903
  "organisations.hits.found": "{hits, plural, =0{No organizations found} other{{hits} out of {total} organizations shown}}",
@@ -17938,14 +17962,6 @@ var en = {
17938
17962
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17939
17963
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17940
17964
  "record.metadata.related": "Related records",
17941
- "record.metadata.userFeedbacks": "Questions / Answers",
17942
- "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
17943
- "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
17944
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
17945
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
17946
- "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
17947
- "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
17948
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
17949
17965
  "record.metadata.sheet": "Original metadata",
17950
17966
  "record.metadata.status": "Status",
17951
17967
  "record.metadata.technical": "Technical information",
@@ -17960,6 +17976,14 @@ var en = {
17960
17976
  "record.metadata.updateFrequency": "Data Update Frequency",
17961
17977
  "record.metadata.updatedOn": "Last Data Information Update",
17962
17978
  "record.metadata.usage": "License and Conditions",
17979
+ "record.metadata.userFeedbacks": "Questions / Answers",
17980
+ "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
17981
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
17982
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
17983
+ "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
17984
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
17985
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
17986
+ "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
17963
17987
  "record.more.details": "Read more",
17964
17988
  "record.tab.chart": "Chart",
17965
17989
  "record.tab.data": "Table",
@@ -18019,12 +18043,6 @@ var en = {
18019
18043
  "table.loading.data": "Loading data...",
18020
18044
  "table.object.count": "objects in this dataset",
18021
18045
  "table.select.data": "Data source",
18022
- "timeSincePipe.lessThanAMinute": "Less than a minute ago",
18023
- "timeSincePipe.minutesAgo": "{value} minute{s} ago",
18024
- "timeSincePipe.hoursAgo": "{value} hour{s} ago",
18025
- "timeSincePipe.daysAgo": "{value} day{s} ago",
18026
- "timeSincePipe.monthsAgo": "{value} month{s} ago",
18027
- "timeSincePipe.yearsAgo": "{value} year{s} ago",
18028
18046
  "tooltip.html.copy": "Copy HTML",
18029
18047
  "tooltip.id.copy": "Copy unique identifier",
18030
18048
  "tooltip.url.copy": "Copy URL",
@@ -18189,6 +18207,19 @@ var es = {
18189
18207
  "downloads.format.unknown": "",
18190
18208
  "downloads.wfs.featuretype.not.found": "",
18191
18209
  dropFile: dropFile$4,
18210
+ "editor.record.form.license": "",
18211
+ "editor.record.form.license.cc-by": "",
18212
+ "editor.record.form.license.cc-by-sa": "",
18213
+ "editor.record.form.license.cc-zero": "",
18214
+ "editor.record.form.license.etalab": "",
18215
+ "editor.record.form.license.etalab-v2": "",
18216
+ "editor.record.form.license.odbl": "",
18217
+ "editor.record.form.license.odc-by": "",
18218
+ "editor.record.form.license.pddl": "",
18219
+ "editor.record.form.license.unknown": "",
18220
+ "editor.record.form.resourceUpdated": "",
18221
+ "editor.record.form.updateFrequency": "",
18222
+ "editor.record.form.updateFrequency.planned": "",
18192
18223
  "editor.record.loadError.body": "",
18193
18224
  "editor.record.loadError.closeMessage": "",
18194
18225
  "editor.record.loadError.title": "",
@@ -18259,6 +18290,7 @@ var es = {
18259
18290
  "multiselect.filter.placeholder": "",
18260
18291
  "nav.back": "",
18261
18292
  next: next$4,
18293
+ "ogc.unreachable.unknown": "",
18262
18294
  "organisation.filter.placeholder": "",
18263
18295
  "organisation.sort.sortBy": "",
18264
18296
  "organisations.hits.found": "",
@@ -18323,14 +18355,6 @@ var es = {
18323
18355
  "record.metadata.quality.updateFrequency.failed": "",
18324
18356
  "record.metadata.quality.updateFrequency.success": "",
18325
18357
  "record.metadata.related": "",
18326
- "record.metadata.userFeedbacks": "",
18327
- "record.metadata.userFeedbacks.anonymousUser": "",
18328
- "record.metadata.userFeedbacks.sortSelector.label": "",
18329
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
18330
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
18331
- "record.metadata.userFeedbacks.newComment.placeholder": "",
18332
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
18333
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
18334
18358
  "record.metadata.sheet": "",
18335
18359
  "record.metadata.status": "",
18336
18360
  "record.metadata.technical": "",
@@ -18345,6 +18369,14 @@ var es = {
18345
18369
  "record.metadata.updateFrequency": "",
18346
18370
  "record.metadata.updatedOn": "",
18347
18371
  "record.metadata.usage": "",
18372
+ "record.metadata.userFeedbacks": "",
18373
+ "record.metadata.userFeedbacks.anonymousUser": "",
18374
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
18375
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
18376
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
18377
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
18378
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
18379
+ "record.metadata.userFeedbacks.sortSelector.label": "",
18348
18380
  "record.more.details": "",
18349
18381
  "record.tab.chart": "",
18350
18382
  "record.tab.data": "",
@@ -18404,12 +18436,6 @@ var es = {
18404
18436
  "table.loading.data": "",
18405
18437
  "table.object.count": "",
18406
18438
  "table.select.data": "",
18407
- "timeSincePipe.lessThanAMinute": "",
18408
- "timeSincePipe.minutesAgo": "",
18409
- "timeSincePipe.hoursAgo": "",
18410
- "timeSincePipe.daysAgo": "",
18411
- "timeSincePipe.monthsAgo": "",
18412
- "timeSincePipe.yearsAgo": "",
18413
18439
  "tooltip.html.copy": "",
18414
18440
  "tooltip.id.copy": "",
18415
18441
  "tooltip.url.copy": "",
@@ -18574,6 +18600,19 @@ var fr = {
18574
18600
  "downloads.format.unknown": "inconnu",
18575
18601
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
18576
18602
  dropFile: dropFile$3,
18603
+ "editor.record.form.license": "Licence",
18604
+ "editor.record.form.license.cc-by": "",
18605
+ "editor.record.form.license.cc-by-sa": "",
18606
+ "editor.record.form.license.cc-zero": "",
18607
+ "editor.record.form.license.etalab": "Licence Ouverte (Etalab)",
18608
+ "editor.record.form.license.etalab-v2": "Licence Ouverte v2.0 (Etalab)",
18609
+ "editor.record.form.license.odbl": "",
18610
+ "editor.record.form.license.odc-by": "",
18611
+ "editor.record.form.license.pddl": "",
18612
+ "editor.record.form.license.unknown": "Non-reconnue ou absente",
18613
+ "editor.record.form.resourceUpdated": "Date de dernière révision",
18614
+ "editor.record.form.updateFrequency": "Fréquence de mise à jour",
18615
+ "editor.record.form.updateFrequency.planned": "Ces données doivent être mise à jour régulièrement.",
18577
18616
  "editor.record.loadError.body": "",
18578
18617
  "editor.record.loadError.closeMessage": "",
18579
18618
  "editor.record.loadError.title": "",
@@ -18644,6 +18683,7 @@ var fr = {
18644
18683
  "multiselect.filter.placeholder": "Rechercher",
18645
18684
  "nav.back": "Retour",
18646
18685
  next: next$3,
18686
+ "ogc.unreachable.unknown": "Le service n'est pas accessible",
18647
18687
  "organisation.filter.placeholder": "Filtrer les résultats",
18648
18688
  "organisation.sort.sortBy": "Trier par :",
18649
18689
  "organisations.hits.found": "{hits, plural, =0{Aucune organisation trouvé} one{1 organisation sur {total} affichée} other{{hits} organisations sur {total} affichées}}",
@@ -18708,14 +18748,6 @@ var fr = {
18708
18748
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
18709
18749
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
18710
18750
  "record.metadata.related": "Voir aussi",
18711
- "record.metadata.userFeedbacks": "Questions / Réponses",
18712
- "record.metadata.userFeedbacks.anonymousUser": "Pour rédiger un commentaire, veuillez vous identifier.",
18713
- "record.metadata.userFeedbacks.sortSelector.label": "Trier par ...",
18714
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Les plus récents en premier",
18715
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Les plus anciens en premier",
18716
- "record.metadata.userFeedbacks.newComment.placeholder": "Rédiger votre commentaire ici...",
18717
- "record.metadata.userFeedbacks.newAnswer.placeholder": "Répondre...",
18718
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publier",
18719
18751
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
18720
18752
  "record.metadata.status": "Statut",
18721
18753
  "record.metadata.technical": "Informations techniques",
@@ -18730,6 +18762,14 @@ var fr = {
18730
18762
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
18731
18763
  "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
18732
18764
  "record.metadata.usage": "Licences et conditions d'utilisation",
18765
+ "record.metadata.userFeedbacks": "Questions / Réponses",
18766
+ "record.metadata.userFeedbacks.anonymousUser": "Pour rédiger un commentaire, veuillez vous identifier.",
18767
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publier",
18768
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Répondre...",
18769
+ "record.metadata.userFeedbacks.newComment.placeholder": "Rédiger votre commentaire ici...",
18770
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Les plus récents en premier",
18771
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Les plus anciens en premier",
18772
+ "record.metadata.userFeedbacks.sortSelector.label": "Trier par ...",
18733
18773
  "record.more.details": "Détails",
18734
18774
  "record.tab.chart": "Graphique",
18735
18775
  "record.tab.data": "Tableau",
@@ -18789,12 +18829,6 @@ var fr = {
18789
18829
  "table.loading.data": "Chargement des données...",
18790
18830
  "table.object.count": "enregistrements dans ces données",
18791
18831
  "table.select.data": "Source de données",
18792
- "timeSincePipe.lessThanAMinute": "Il y a moins d'une minute",
18793
- "timeSincePipe.minutesAgo": "Il y a {value} minute{s}",
18794
- "timeSincePipe.hoursAgo": "Il y a {value} heure{s}",
18795
- "timeSincePipe.daysAgo": "Il y a {value} jour{s}",
18796
- "timeSincePipe.monthsAgo": "Il y a {value} mois",
18797
- "timeSincePipe.yearsAgo": "Il y a {value} an{s}",
18798
18832
  "tooltip.html.copy": "Copier le HTML",
18799
18833
  "tooltip.id.copy": "Copier l'identifiant unique",
18800
18834
  "tooltip.url.copy": "Copier l'URL",
@@ -18959,6 +18993,19 @@ var it = {
18959
18993
  "downloads.format.unknown": "sconosciuto",
18960
18994
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18961
18995
  dropFile: dropFile$2,
18996
+ "editor.record.form.license": "Licenza",
18997
+ "editor.record.form.license.cc-by": "",
18998
+ "editor.record.form.license.cc-by-sa": "",
18999
+ "editor.record.form.license.cc-zero": "",
19000
+ "editor.record.form.license.etalab": "Licenza aperta (Etalab)",
19001
+ "editor.record.form.license.etalab-v2": "Licenza aperta v2.0 (Etalab)",
19002
+ "editor.record.form.license.odbl": "",
19003
+ "editor.record.form.license.odc-by": "",
19004
+ "editor.record.form.license.pddl": "",
19005
+ "editor.record.form.license.unknown": "Non riconosciuta o assente",
19006
+ "editor.record.form.resourceUpdated": "",
19007
+ "editor.record.form.updateFrequency": "",
19008
+ "editor.record.form.updateFrequency.planned": "",
18962
19009
  "editor.record.loadError.body": "",
18963
19010
  "editor.record.loadError.closeMessage": "",
18964
19011
  "editor.record.loadError.title": "",
@@ -19029,6 +19076,7 @@ var it = {
19029
19076
  "multiselect.filter.placeholder": "Cerca",
19030
19077
  "nav.back": "Indietro",
19031
19078
  next: next$2,
19079
+ "ogc.unreachable.unknown": "Il servizio non è accessibile",
19032
19080
  "organisation.filter.placeholder": "Filtra i risultati",
19033
19081
  "organisation.sort.sortBy": "Ordina per:",
19034
19082
  "organisations.hits.found": "{hits, plural, =0{Nessuna organizzazione trovata} one{1 organizzazione su {total} visualizzata} other{{hits} organizzazioni su {total} visualizzate}}",
@@ -19093,14 +19141,6 @@ var it = {
19093
19141
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
19094
19142
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
19095
19143
  "record.metadata.related": "Vedi anche",
19096
- "record.metadata.userFeedbacks": "",
19097
- "record.metadata.userFeedbacks.anonymousUser": "",
19098
- "record.metadata.userFeedbacks.sortSelector.label": "",
19099
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19100
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19101
- "record.metadata.userFeedbacks.newComment.placeholder": "",
19102
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19103
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19104
19144
  "record.metadata.sheet": "Origine del metadata",
19105
19145
  "record.metadata.status": "Stato",
19106
19146
  "record.metadata.technical": "Informazioni tecniche",
@@ -19115,6 +19155,14 @@ var it = {
19115
19155
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
19116
19156
  "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
19117
19157
  "record.metadata.usage": "Licenze e limiti di utilizzo",
19158
+ "record.metadata.userFeedbacks": "",
19159
+ "record.metadata.userFeedbacks.anonymousUser": "",
19160
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19161
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19162
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19163
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19164
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19165
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19118
19166
  "record.more.details": "Dettagli",
19119
19167
  "record.tab.chart": "Grafico",
19120
19168
  "record.tab.data": "Tabella",
@@ -19174,12 +19222,6 @@ var it = {
19174
19222
  "table.loading.data": "Caricamento dei dati...",
19175
19223
  "table.object.count": "record in questi dati",
19176
19224
  "table.select.data": "Sorgente dati",
19177
- "timeSincePipe.lessThanAMinute": "",
19178
- "timeSincePipe.minutesAgo": "",
19179
- "timeSincePipe.hoursAgo": "",
19180
- "timeSincePipe.daysAgo": "",
19181
- "timeSincePipe.monthsAgo": "",
19182
- "timeSincePipe.yearsAgo": "",
19183
19225
  "tooltip.html.copy": "Copiare il HTML",
19184
19226
  "tooltip.id.copy": "Copiare l'identificatore unico",
19185
19227
  "tooltip.url.copy": "Copiare l'URL",
@@ -19344,6 +19386,19 @@ var nl = {
19344
19386
  "downloads.format.unknown": "",
19345
19387
  "downloads.wfs.featuretype.not.found": "",
19346
19388
  dropFile: dropFile$1,
19389
+ "editor.record.form.license": "",
19390
+ "editor.record.form.license.cc-by": "",
19391
+ "editor.record.form.license.cc-by-sa": "",
19392
+ "editor.record.form.license.cc-zero": "",
19393
+ "editor.record.form.license.etalab": "",
19394
+ "editor.record.form.license.etalab-v2": "",
19395
+ "editor.record.form.license.odbl": "",
19396
+ "editor.record.form.license.odc-by": "",
19397
+ "editor.record.form.license.pddl": "",
19398
+ "editor.record.form.license.unknown": "",
19399
+ "editor.record.form.resourceUpdated": "",
19400
+ "editor.record.form.updateFrequency": "",
19401
+ "editor.record.form.updateFrequency.planned": "",
19347
19402
  "editor.record.loadError.body": "",
19348
19403
  "editor.record.loadError.closeMessage": "",
19349
19404
  "editor.record.loadError.title": "",
@@ -19414,6 +19469,7 @@ var nl = {
19414
19469
  "multiselect.filter.placeholder": "",
19415
19470
  "nav.back": "",
19416
19471
  next: next$1,
19472
+ "ogc.unreachable.unknown": "",
19417
19473
  "organisation.filter.placeholder": "",
19418
19474
  "organisation.sort.sortBy": "",
19419
19475
  "organisations.hits.found": "",
@@ -19478,14 +19534,6 @@ var nl = {
19478
19534
  "record.metadata.quality.updateFrequency.failed": "",
19479
19535
  "record.metadata.quality.updateFrequency.success": "",
19480
19536
  "record.metadata.related": "",
19481
- "record.metadata.userFeedbacks": "",
19482
- "record.metadata.userFeedbacks.anonymousUser": "",
19483
- "record.metadata.userFeedbacks.sortSelector.label": "",
19484
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19485
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19486
- "record.metadata.userFeedbacks.newComment.placeholder": "",
19487
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19488
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19489
19537
  "record.metadata.sheet": "",
19490
19538
  "record.metadata.status": "",
19491
19539
  "record.metadata.technical": "",
@@ -19500,6 +19548,14 @@ var nl = {
19500
19548
  "record.metadata.updateFrequency": "",
19501
19549
  "record.metadata.updatedOn": "",
19502
19550
  "record.metadata.usage": "",
19551
+ "record.metadata.userFeedbacks": "",
19552
+ "record.metadata.userFeedbacks.anonymousUser": "",
19553
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19554
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19555
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19556
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19557
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19558
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19503
19559
  "record.more.details": "",
19504
19560
  "record.tab.chart": "",
19505
19561
  "record.tab.data": "",
@@ -19559,12 +19615,6 @@ var nl = {
19559
19615
  "table.loading.data": "",
19560
19616
  "table.object.count": "",
19561
19617
  "table.select.data": "",
19562
- "timeSincePipe.lessThanAMinute": "",
19563
- "timeSincePipe.minutesAgo": "",
19564
- "timeSincePipe.hoursAgo": "",
19565
- "timeSincePipe.daysAgo": "",
19566
- "timeSincePipe.monthsAgo": "",
19567
- "timeSincePipe.yearsAgo": "",
19568
19618
  "tooltip.html.copy": "",
19569
19619
  "tooltip.id.copy": "",
19570
19620
  "tooltip.url.copy": "",
@@ -19729,6 +19779,19 @@ var pt = {
19729
19779
  "downloads.format.unknown": "",
19730
19780
  "downloads.wfs.featuretype.not.found": "",
19731
19781
  dropFile: dropFile,
19782
+ "editor.record.form.license": "",
19783
+ "editor.record.form.license.cc-by": "",
19784
+ "editor.record.form.license.cc-by-sa": "",
19785
+ "editor.record.form.license.cc-zero": "",
19786
+ "editor.record.form.license.etalab": "",
19787
+ "editor.record.form.license.etalab-v2": "",
19788
+ "editor.record.form.license.odbl": "",
19789
+ "editor.record.form.license.odc-by": "",
19790
+ "editor.record.form.license.pddl": "",
19791
+ "editor.record.form.license.unknown": "",
19792
+ "editor.record.form.resourceUpdated": "",
19793
+ "editor.record.form.updateFrequency": "",
19794
+ "editor.record.form.updateFrequency.planned": "",
19732
19795
  "editor.record.loadError.body": "",
19733
19796
  "editor.record.loadError.closeMessage": "",
19734
19797
  "editor.record.loadError.title": "",
@@ -19799,6 +19862,7 @@ var pt = {
19799
19862
  "multiselect.filter.placeholder": "",
19800
19863
  "nav.back": "",
19801
19864
  next: next,
19865
+ "ogc.unreachable.unknown": "",
19802
19866
  "organisation.filter.placeholder": "",
19803
19867
  "organisation.sort.sortBy": "",
19804
19868
  "organisations.hits.found": "",
@@ -19863,14 +19927,6 @@ var pt = {
19863
19927
  "record.metadata.quality.updateFrequency.failed": "",
19864
19928
  "record.metadata.quality.updateFrequency.success": "",
19865
19929
  "record.metadata.related": "",
19866
- "record.metadata.userFeedbacks": "",
19867
- "record.metadata.userFeedbacks.anonymousUser": "",
19868
- "record.metadata.userFeedbacks.sortSelector.label": "",
19869
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19870
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19871
- "record.metadata.userFeedbacks.newComment.placeholder": "",
19872
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19873
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19874
19930
  "record.metadata.sheet": "",
19875
19931
  "record.metadata.status": "",
19876
19932
  "record.metadata.technical": "",
@@ -19885,6 +19941,14 @@ var pt = {
19885
19941
  "record.metadata.updateFrequency": "",
19886
19942
  "record.metadata.updatedOn": "",
19887
19943
  "record.metadata.usage": "",
19944
+ "record.metadata.userFeedbacks": "",
19945
+ "record.metadata.userFeedbacks.anonymousUser": "",
19946
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19947
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19948
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19949
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19950
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19951
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19888
19952
  "record.more.details": "",
19889
19953
  "record.tab.chart": "",
19890
19954
  "record.tab.data": "",
@@ -19944,12 +20008,6 @@ var pt = {
19944
20008
  "table.loading.data": "",
19945
20009
  "table.object.count": "",
19946
20010
  "table.select.data": "",
19947
- "timeSincePipe.lessThanAMinute": "",
19948
- "timeSincePipe.minutesAgo": "",
19949
- "timeSincePipe.hoursAgo": "",
19950
- "timeSincePipe.daysAgo": "",
19951
- "timeSincePipe.monthsAgo": "",
19952
- "timeSincePipe.yearsAgo": "",
19953
20011
  "tooltip.html.copy": "",
19954
20012
  "tooltip.id.copy": "",
19955
20013
  "tooltip.url.copy": "",
@@ -21554,15 +21612,17 @@ class Gn4PlatformService {
21554
21612
  return this.thesauri[uri];
21555
21613
  }
21556
21614
  getUserFeedbacks(uuid) {
21557
- return this.userfeedbackApiService
21558
- .getUserComments(uuid)
21559
- .pipe(map$1((userFeedbacks) => userFeedbacks.map(this.mapper.userFeedbacksFromApi)));
21615
+ return this.userfeedbackApiService.getUserComments(uuid).pipe(map$1((userFeedbacks) => userFeedbacks.map(this.mapper.userFeedbacksFromApi)), catchError((error) => {
21616
+ console.error('Error fetching user feedbacks:', error);
21617
+ return of(undefined);
21618
+ }));
21560
21619
  }
21561
21620
  postUserFeedbacks(userFeedback) {
21562
21621
  const mappedUserFeedBack = this.mapper.userFeedbacksToApi(userFeedback);
21563
- return this.userfeedbackApiService
21564
- .newUserFeedback(mappedUserFeedBack)
21565
- .pipe(map$1(() => undefined));
21622
+ return this.userfeedbackApiService.newUserFeedback(mappedUserFeedBack).pipe(map$1(() => undefined), catchError((error) => {
21623
+ console.error('Error posting user feedback:', error);
21624
+ return of(undefined);
21625
+ }));
21566
21626
  }
21567
21627
  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 }); }
21568
21628
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
@@ -22296,6 +22356,27 @@ const FORMATS = {
22296
22356
  color: '#de630b',
22297
22357
  mimeTypes: ['application/x-dxf', 'image/x-dxf'],
22298
22358
  },
22359
+ html: {
22360
+ extensions: ['html', 'htm'],
22361
+ priority: 12,
22362
+ color: '#f2bb3a',
22363
+ mimeTypes: ['text/html'],
22364
+ },
22365
+ fgb: {
22366
+ extensions: ['fgb', 'flatgeobuf'],
22367
+ priority: 13,
22368
+ color: '#f2bb3a',
22369
+ mimeTypes: ['application/flatgeobuf'],
22370
+ },
22371
+ jsonfg: {
22372
+ extensions: ['jsonfg', 'jsonfgc'],
22373
+ priority: 14,
22374
+ color: '#f2bb3a',
22375
+ mimeTypes: [
22376
+ 'application/vnd.ogc.fg+json',
22377
+ 'application/vnd.ogc.fg+json;compatibility=geojson',
22378
+ ],
22379
+ },
22299
22380
  };
22300
22381
  function getFormatPriority(linkFormat) {
22301
22382
  for (const format in FORMATS) {
@@ -22427,7 +22508,7 @@ class LinkClassifierService {
22427
22508
  case 'wmts':
22428
22509
  return [LinkUsage.API, LinkUsage.MAP_API];
22429
22510
  case 'ogcFeatures':
22430
- return [LinkUsage.API];
22511
+ return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA];
22431
22512
  default:
22432
22513
  return [LinkUsage.UNKNOWN];
22433
22514
  }
@@ -23728,13 +23809,30 @@ class MapContextService {
23728
23809
  const style = this.styleService.styles.default;
23729
23810
  switch (type) {
23730
23811
  case MapContextLayerTypeEnum.OGCAPI:
23731
- return new VectorLayer({
23732
- source: new VectorSource({
23733
- format: new GeoJSON(),
23734
- url: layerModel.url,
23735
- }),
23736
- style,
23737
- });
23812
+ if (layerModel.layerType === 'vectorTiles') {
23813
+ return new VectorTileLayer({
23814
+ source: new OGCVectorTile({
23815
+ url: layerModel.url,
23816
+ format: new MVT(),
23817
+ }),
23818
+ });
23819
+ }
23820
+ else if (layerModel.layerType === 'mapTiles') {
23821
+ return new TileLayer({
23822
+ source: new OGCMapTile({
23823
+ url: layerModel.url,
23824
+ }),
23825
+ });
23826
+ }
23827
+ else {
23828
+ return new VectorLayer({
23829
+ source: new VectorSource({
23830
+ format: new GeoJSON(),
23831
+ url: layerModel.url,
23832
+ }),
23833
+ style,
23834
+ });
23835
+ }
23738
23836
  case MapContextLayerTypeEnum.XYZ:
23739
23837
  return new TileLayer({
23740
23838
  source: new XYZ({
@@ -23973,6 +24071,173 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23973
24071
  type: Input
23974
24072
  }] } });
23975
24073
 
24074
+ class PopupAlertComponent {
24075
+ constructor(changeDetector) {
24076
+ this.changeDetector = changeDetector;
24077
+ this.type = 'info';
24078
+ this.position = 'top';
24079
+ this.expanded = false;
24080
+ this.timeout = null;
24081
+ }
24082
+ get showDuration() {
24083
+ const chars = this.content.nativeElement.innerHTML.length;
24084
+ return Math.max(3000, chars * 20);
24085
+ }
24086
+ ngOnInit() {
24087
+ this.expandAndClose();
24088
+ }
24089
+ expand() {
24090
+ this.expanded = true;
24091
+ this.changeDetector.detectChanges();
24092
+ clearTimeout(this.timeout);
24093
+ }
24094
+ expandAndClose() {
24095
+ this.expanded = true;
24096
+ this.changeDetector.detectChanges();
24097
+ clearTimeout(this.timeout);
24098
+ this.timeout = setTimeout(() => {
24099
+ this.expanded = false;
24100
+ this.changeDetector.detectChanges();
24101
+ }, this.showDuration);
24102
+ }
24103
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PopupAlertComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24104
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: { icon: "icon", type: "type", position: "position" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<div class=\"h-full relative container\">\n <div\n class=\"pointer-events-auto absolute text-white flex flex-row p-2 rounded message\"\n role=\"alert\"\n [ngClass]=\"{\n 'position-bottom': position === 'bottom',\n 'position-top': position === 'top',\n expanded: this.expanded,\n 'bg-red-500': type === 'danger',\n 'bg-yellow-500': type === 'warning',\n 'bg-blue-500': type === 'info'\n }\"\n (mouseenter)=\"expand()\"\n (mouseleave)=\"expandAndClose()\"\n >\n <mat-icon class=\"material-symbols-outlined mr-2 shrink-0 select-none\">{{\n icon\n }}</mat-icon>\n <div class=\"grow\" #content [ngClass]=\"{ invisible: !expanded }\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{pointer-events:none}.container{filter:drop-shadow(0px 4px 3px rgba(0,0,0,.2))}.message{transition:clip-path .3s cubic-bezier(.25,.46,.45,.94)}.message.expanded{clip-path:circle(100%)}.position-top{clip-path:circle(19px at 20px 20px);align-items:start;top:0;left:0}.position-bottom{clip-path:circle(19px at 20px calc(100% - 20px));align-items:end;bottom:0;left:0}.container ::ng-deep a{text-decoration:underline;font-weight:700}.container ::ng-deep a:hover{opacity:.85}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24105
+ }
24106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PopupAlertComponent, decorators: [{
24107
+ type: Component,
24108
+ args: [{ selector: 'gn-ui-popup-alert', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"h-full relative container\">\n <div\n class=\"pointer-events-auto absolute text-white flex flex-row p-2 rounded message\"\n role=\"alert\"\n [ngClass]=\"{\n 'position-bottom': position === 'bottom',\n 'position-top': position === 'top',\n expanded: this.expanded,\n 'bg-red-500': type === 'danger',\n 'bg-yellow-500': type === 'warning',\n 'bg-blue-500': type === 'info'\n }\"\n (mouseenter)=\"expand()\"\n (mouseleave)=\"expandAndClose()\"\n >\n <mat-icon class=\"material-symbols-outlined mr-2 shrink-0 select-none\">{{\n icon\n }}</mat-icon>\n <div class=\"grow\" #content [ngClass]=\"{ invisible: !expanded }\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{pointer-events:none}.container{filter:drop-shadow(0px 4px 3px rgba(0,0,0,.2))}.message{transition:clip-path .3s cubic-bezier(.25,.46,.45,.94)}.message.expanded{clip-path:circle(100%)}.position-top{clip-path:circle(19px at 20px 20px);align-items:start;top:0;left:0}.position-bottom{clip-path:circle(19px at 20px calc(100% - 20px));align-items:end;bottom:0;left:0}.container ::ng-deep a{text-decoration:underline;font-weight:700}.container ::ng-deep a:hover{opacity:.85}\n"] }]
24109
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { icon: [{
24110
+ type: Input
24111
+ }], type: [{
24112
+ type: Input
24113
+ }], position: [{
24114
+ type: Input
24115
+ }], content: [{
24116
+ type: ViewChild,
24117
+ args: ['content']
24118
+ }] } });
24119
+
24120
+ class AutocompleteComponent {
24121
+ constructor(cdRef) {
24122
+ this.cdRef = cdRef;
24123
+ this.clearOnSelection = false;
24124
+ this.autoFocus = false;
24125
+ this.itemSelected = new EventEmitter();
24126
+ this.inputSubmitted = new EventEmitter();
24127
+ this.inputCleared = new EventEmitter();
24128
+ this.control = new UntypedFormControl();
24129
+ this.subscription = new Subscription();
24130
+ this.cancelEnter = true;
24131
+ this.selectionSubject = new ReplaySubject(1);
24132
+ this.lastInputValue$ = new ReplaySubject(1);
24133
+ this.error = null;
24134
+ this.displayWithFn = (item) => item;
24135
+ }
24136
+ ngOnChanges(changes) {
24137
+ const { value } = changes;
24138
+ if (value) {
24139
+ const previousTextValue = this.displayWithFn(value.previousValue);
24140
+ const currentTextValue = this.displayWithFn(value.currentValue);
24141
+ if (previousTextValue !== currentTextValue) {
24142
+ this.updateInputValue(value.currentValue);
24143
+ }
24144
+ }
24145
+ }
24146
+ ngOnInit() {
24147
+ this.suggestions$ = merge(this.control.valueChanges.pipe(filter((value) => typeof value === 'string'), filter((value) => value.length > 2), debounceTime(400), distinctUntilChanged(), tap$1(() => (this.searching = true))), this.control.valueChanges.pipe(filter((value) => typeof value === 'object' && value.title), map$1((item) => item.title))).pipe(switchMap$1((value) => (value ? this.action(value) : of([]))), catchError((error) => {
24148
+ this.error = error.message;
24149
+ return of([]);
24150
+ }), finalize(() => (this.searching = false)));
24151
+ this.subscription = this.control.valueChanges.subscribe((any) => {
24152
+ if (any !== '') {
24153
+ this.cancelEnter = false;
24154
+ }
24155
+ });
24156
+ this.control.valueChanges
24157
+ .pipe(filter((value) => typeof value === 'string'))
24158
+ .subscribe(this.lastInputValue$);
24159
+ }
24160
+ ngAfterViewInit() {
24161
+ this.autocomplete.optionSelected.subscribe(this.selectionSubject);
24162
+ if (this.autoFocus) {
24163
+ this.inputRef.nativeElement.focus();
24164
+ this.cdRef.detectChanges();
24165
+ }
24166
+ }
24167
+ ngOnDestroy() {
24168
+ this.subscription.unsubscribe();
24169
+ }
24170
+ updateInputValue(value) {
24171
+ if (value) {
24172
+ this.control.setValue(value);
24173
+ }
24174
+ if (this.inputRef) {
24175
+ this.inputRef.nativeElement.value = value?.title || '';
24176
+ }
24177
+ }
24178
+ clear() {
24179
+ this.inputRef.nativeElement.value = '';
24180
+ this.inputCleared.emit();
24181
+ this.selectionSubject
24182
+ .pipe(take(1))
24183
+ .subscribe((selection) => selection && selection.option.deselect());
24184
+ this.inputRef.nativeElement.focus();
24185
+ this.triggerRef.closePanel();
24186
+ }
24187
+ handleEnter(any) {
24188
+ if (!this.cancelEnter) {
24189
+ this.inputSubmitted.emit(any);
24190
+ this.triggerRef.closePanel();
24191
+ }
24192
+ }
24193
+ handleClickSearch() {
24194
+ this.inputSubmitted.emit(this.inputRef.nativeElement.value);
24195
+ this.triggerRef.closePanel();
24196
+ }
24197
+ handleSelection(event) {
24198
+ this.cancelEnter = true;
24199
+ this.itemSelected.emit(event.option.value);
24200
+ if (this.clearOnSelection) {
24201
+ this.lastInputValue$.pipe(first()).subscribe((any) => {
24202
+ this.inputRef.nativeElement.value = any;
24203
+ });
24204
+ }
24205
+ }
24206
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24207
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], 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: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24208
+ }
24209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
24210
+ type: Component,
24211
+ args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
24212
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
24213
+ type: Input
24214
+ }], action: [{
24215
+ type: Input
24216
+ }], value: [{
24217
+ type: Input
24218
+ }], clearOnSelection: [{
24219
+ type: Input
24220
+ }], autoFocus: [{
24221
+ type: Input
24222
+ }], itemSelected: [{
24223
+ type: Output
24224
+ }], inputSubmitted: [{
24225
+ type: Output
24226
+ }], inputCleared: [{
24227
+ type: Output
24228
+ }], triggerRef: [{
24229
+ type: ViewChild,
24230
+ args: [MatAutocompleteTrigger]
24231
+ }], autocomplete: [{
24232
+ type: ViewChild,
24233
+ args: [MatAutocomplete]
24234
+ }], inputRef: [{
24235
+ type: ViewChild,
24236
+ args: ['searchInput']
24237
+ }], displayWithFn: [{
24238
+ type: Input
24239
+ }] } });
24240
+
23976
24241
  class ButtonComponent {
23977
24242
  constructor() {
23978
24243
  this.btnClass = 'gn-ui-btn-default';
@@ -24024,171 +24289,213 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24024
24289
  type: Output
24025
24290
  }] } });
24026
24291
 
24027
- const DEFAULT_ROW_NUMBERS = 6;
24028
- class DropdownSelectorComponent {
24292
+ class CheckToggleComponent {
24029
24293
  constructor() {
24030
- this.showTitle = true;
24031
- this.extraBtnClass = '';
24032
- this.minWidth = '';
24033
- this.selectValue = new EventEmitter();
24034
- this.overlayOpen = false;
24035
- this.overlayWidth = 'auto';
24036
- this.overlayMaxHeight = 'none';
24037
- this.overlayPositions = [
24038
- {
24039
- originX: 'start',
24040
- originY: 'bottom',
24041
- overlayX: 'start',
24042
- overlayY: 'top',
24043
- offsetY: 8,
24044
- },
24045
- {
24046
- originX: 'start',
24047
- originY: 'top',
24048
- overlayX: 'start',
24049
- overlayY: 'bottom',
24050
- offsetY: -8,
24051
- },
24052
- ];
24053
- }
24054
- get selectedChoice() {
24055
- return (this.choices.find((choice) => choice.value === this.selected) ??
24056
- this.choices[0]);
24057
- }
24058
- get id() {
24059
- return this.title.toLowerCase().replace(/[^a-z]+/g, '-');
24060
- }
24061
- getChoiceLabel() {
24062
- return this.selectedChoice?.label;
24063
- }
24064
- ngOnInit() {
24065
- if (!this.maxRows)
24066
- this.maxRows = DEFAULT_ROW_NUMBERS;
24067
- if (!this.choices || this.choices.length === 0) {
24068
- this.choices = [];
24069
- }
24070
- }
24071
- isSelected(choice) {
24072
- return choice === this.selectedChoice;
24294
+ this.color = 'primary';
24295
+ this.toggled = new EventEmitter();
24073
24296
  }
24074
- onSelectValue(choice) {
24075
- this.closeOverlay();
24076
- this.selected = choice.value;
24077
- this.selectValue.emit(this.selected);
24297
+ toggle(event) {
24298
+ this.toggled.emit(event);
24078
24299
  }
24079
- openOverlay() {
24080
- this.overlayWidth =
24081
- this.overlayOrigin.elementRef.nativeElement.getBoundingClientRect()
24082
- .width + 'px';
24083
- this.overlayMaxHeight = this.maxRows
24084
- ? `${this.maxRows * 29 + 60}px`
24085
- : 'none';
24086
- this.overlayOpen = true;
24087
- return Promise.all([
24088
- firstValueFrom(this.overlay.attach),
24089
- firstValueFrom(this.choiceInputs.changes),
24090
- ]);
24300
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24301
+ 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 }); }
24302
+ }
24303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, decorators: [{
24304
+ type: Component,
24305
+ 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" }]
24306
+ }], propDecorators: { title: [{
24307
+ type: Input
24308
+ }], label: [{
24309
+ type: Input
24310
+ }], value: [{
24311
+ type: Input
24312
+ }], color: [{
24313
+ type: Input
24314
+ }], toggled: [{
24315
+ type: Output
24316
+ }] } });
24317
+
24318
+ class CheckboxComponent {
24319
+ constructor() {
24320
+ this.type = 'default';
24321
+ this.checked = false;
24322
+ this.indeterminate = false;
24323
+ this.changed = new EventEmitter();
24091
24324
  }
24092
- closeOverlay() {
24093
- this.overlayOpen = false;
24325
+ get classList() {
24326
+ return `${this.type}`;
24094
24327
  }
24095
- focusFirstItem() {
24096
- this.choiceInputs.get(0).nativeElement.focus();
24328
+ handleClick(event) {
24329
+ event.stopPropagation();
24330
+ this.checked = !this.checked;
24331
+ this.changed.emit(this.checked);
24097
24332
  }
24098
- focusLastItem() {
24099
- this.choiceInputs.get(this.choiceInputs.length - 1).nativeElement.focus();
24333
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24334
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24335
+ }
24336
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
24337
+ type: Component,
24338
+ args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
24339
+ }], propDecorators: { type: [{
24340
+ type: Input
24341
+ }], checked: [{
24342
+ type: Input
24343
+ }], indeterminate: [{
24344
+ type: Input
24345
+ }], changed: [{
24346
+ type: Output
24347
+ }] } });
24348
+
24349
+ class ChipsInputComponent {
24350
+ onChange(event) {
24351
+ this.rawChange.next(event);
24100
24352
  }
24101
- async handleTriggerKeydown(event) {
24102
- const keyCode = event.code;
24103
- const isOpenKey = keyCode === 'ArrowDown' ||
24104
- keyCode === 'ArrowUp' ||
24105
- keyCode === 'ArrowLeft' ||
24106
- keyCode === 'ArrowRight' ||
24107
- keyCode === 'Enter' ||
24108
- keyCode === 'Space';
24109
- const isCloseKey = keyCode === 'Escape';
24110
- if (isOpenKey) {
24111
- event.preventDefault();
24112
- if (!this.overlayOpen) {
24113
- await this.openOverlay();
24353
+ constructor(http, translate) {
24354
+ this.http = http;
24355
+ this.translate = translate;
24356
+ this.required = false;
24357
+ this.loadOnce = false;
24358
+ this.autocompleteItems = [];
24359
+ this.invalid = false;
24360
+ this.items = [];
24361
+ this.requestAutocompleteItems = (text) => {
24362
+ if (this.url) {
24363
+ if (this.loadOnce && this.loadedItems) {
24364
+ return this.loadedItems;
24365
+ }
24366
+ const url = this.url(text);
24367
+ const lang = LANG_2_TO_3_MAPPER[this.translate.currentLang.slice(0, 2)];
24368
+ return this.http
24369
+ .get(url.replace('${lang}', lang))
24370
+ .pipe(map$1((item) => item.map((i) => i.values[lang])));
24114
24371
  }
24115
- if (keyCode === 'ArrowLeft' || keyCode === 'ArrowUp')
24116
- this.focusLastItem();
24117
- else
24118
- this.focusFirstItem();
24119
- }
24120
- else if (this.overlayOpen && isCloseKey) {
24121
- event.preventDefault();
24122
- this.closeOverlay();
24123
- }
24372
+ else {
24373
+ return of(this.autocompleteItems || []);
24374
+ }
24375
+ };
24376
+ this.rawChange = new Subject();
24377
+ this.itemsChange = this.rawChange.pipe(distinctUntilChanged());
24378
+ this.subscription = new Subscription();
24124
24379
  }
24125
- handleOverlayKeydown(event) {
24126
- if (!this.overlayOpen)
24127
- return;
24128
- const keyCode = event.code;
24129
- if (keyCode === 'ArrowDown' || keyCode === 'ArrowRight') {
24130
- event.preventDefault();
24131
- this.shiftItemFocus(1);
24132
- }
24133
- else if (keyCode === 'ArrowLeft' || keyCode === 'ArrowUp') {
24134
- event.preventDefault();
24135
- this.shiftItemFocus(-1);
24136
- }
24137
- else if (keyCode === 'Escape') {
24138
- this.closeOverlay();
24380
+ ngOnInit() {
24381
+ if (this.loadOnce) {
24382
+ this.loadedItems = this.requestAutocompleteItems('*').pipe(shareReplay(1));
24139
24383
  }
24384
+ this.items = this.selectedItems;
24385
+ this.subscription = this.rawChange
24386
+ .pipe(tap$1((v) => (this.invalid = v.length === 0)))
24387
+ .subscribe();
24388
+ this.rawChange.next(this.items);
24140
24389
  }
24141
- shiftItemFocus(shift) {
24142
- const index = this.focusedIndex;
24143
- if (index === -1)
24144
- return;
24145
- const max = this.choiceInputs.length;
24146
- // modulo, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder
24147
- const newIndex = (((index + shift) % max) + max) % max;
24148
- this.choiceInputs.get(newIndex).nativeElement.focus();
24390
+ ngOnDestroy() {
24391
+ this.subscription.unsubscribe();
24149
24392
  }
24150
- get focusedIndex() {
24151
- return this.choiceInputs.reduce((prev, curr, curIndex) => curr.nativeElement === document.activeElement ? curIndex : prev, -1);
24393
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChipsInputComponent, deps: [{ token: i1.HttpClient }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
24394
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: { url: "url", placeholder: "placeholder", selectedItems: "selectedItems", required: "required", loadOnce: "loadOnce", autocompleteItems: "autocompleteItems" }, outputs: { itemsChange: "itemsChange" }, ngImport: i0, template: "<tag-input\n [ngModel]=\"items\"\n (ngModelChange)=\"onChange($event)\"\n onlyFromAutocomplete=\"true\"\n [placeholder]=\"placeholder\"\n [secondaryPlaceholder]=\"placeholder\"\n [ripple]=\"false\"\n [animationDuration]=\"{ enter: '0ms', leave: '0ms' }\"\n [onTextChangeDebounce]=\"100\"\n class=\"border-2 border-primary h-full rounded-lg p-2 bg-white text-sm focus:border-primary\"\n [ngClass]=\"{ invalid: invalid }\"\n>\n <tag-input-dropdown\n [autocompleteObservable]=\"requestAutocompleteItems\"\n [minimumTextLength]=\"0\"\n [keepOpen]=\"false\"\n [showDropdownIfEmpty]=\"true\"\n >\n <ng-template let-item=\"item\" let-index=\"index\">\n {{ item.display }}\n </ng-template>\n </tag-input-dropdown>\n</tag-input>\n", styles: ["tag-input::ng-deep .ng2-tag-input{border-bottom:none}tag-input::ng-deep .ng2-tag-input.ng2-tag-input--focused{border-bottom:none}tag-input::ng-deep tag{border-radius:5px;background:var(--color-primary-lightest);font-family:inherit;align-content:center;font-style:italic}tag-input::ng-deep tag::ng-deep:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover,tag-input::ng-deep tag:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover{background:var(--color-primary)!important}tag-input::ng-deep .tag__text{padding-right:7px}tag-input::ng-deep div,tag-input::ng-deep form{height:100%}tag-input.invalid{border-color:var(--color-secondary)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5$1.TagInputComponent, selector: "tag-input", inputs: ["separatorKeys", "separatorKeyCodes", "placeholder", "secondaryPlaceholder", "maxItems", "validators", "asyncValidators", "onlyFromAutocomplete", "errorMessages", "theme", "onTextChangeDebounce", "inputId", "inputClass", "clearOnBlur", "hideForm", "addOnBlur", "addOnPaste", "pasteSplitPattern", "blinkIfDupe", "removable", "editable", "allowDupes", "modelAsStrings", "trimTags", "inputText", "ripple", "tabindex", "disable", "dragZone", "onRemoving", "onAdding", "animationDuration"], outputs: ["onAdd", "onRemove", "onSelect", "onFocus", "onBlur", "onTextChange", "onPaste", "onValidationError", "onTagEdited", "inputTextChange"] }, { kind: "component", type: i5$1.TagInputDropdown, selector: "tag-input-dropdown", inputs: ["offset", "focusFirstElement", "showDropdownIfEmpty", "autocompleteObservable", "minimumTextLength", "limitItemsTo", "displayBy", "identifyBy", "matchingFn", "appendToBody", "keepOpen", "dynamicUpdate", "zIndex", "autocompleteItems"] }] }); }
24395
+ }
24396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChipsInputComponent, decorators: [{
24397
+ type: Component,
24398
+ args: [{ selector: 'gn-ui-chips-input', template: "<tag-input\n [ngModel]=\"items\"\n (ngModelChange)=\"onChange($event)\"\n onlyFromAutocomplete=\"true\"\n [placeholder]=\"placeholder\"\n [secondaryPlaceholder]=\"placeholder\"\n [ripple]=\"false\"\n [animationDuration]=\"{ enter: '0ms', leave: '0ms' }\"\n [onTextChangeDebounce]=\"100\"\n class=\"border-2 border-primary h-full rounded-lg p-2 bg-white text-sm focus:border-primary\"\n [ngClass]=\"{ invalid: invalid }\"\n>\n <tag-input-dropdown\n [autocompleteObservable]=\"requestAutocompleteItems\"\n [minimumTextLength]=\"0\"\n [keepOpen]=\"false\"\n [showDropdownIfEmpty]=\"true\"\n >\n <ng-template let-item=\"item\" let-index=\"index\">\n {{ item.display }}\n </ng-template>\n </tag-input-dropdown>\n</tag-input>\n", styles: ["tag-input::ng-deep .ng2-tag-input{border-bottom:none}tag-input::ng-deep .ng2-tag-input.ng2-tag-input--focused{border-bottom:none}tag-input::ng-deep tag{border-radius:5px;background:var(--color-primary-lightest);font-family:inherit;align-content:center;font-style:italic}tag-input::ng-deep tag::ng-deep:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover,tag-input::ng-deep tag:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover{background:var(--color-primary)!important}tag-input::ng-deep .tag__text{padding-right:7px}tag-input::ng-deep div,tag-input::ng-deep form{height:100%}tag-input.invalid{border-color:var(--color-secondary)}\n"] }]
24399
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i1$1.TranslateService }]; }, propDecorators: { url: [{
24400
+ type: Input
24401
+ }], placeholder: [{
24402
+ type: Input
24403
+ }], selectedItems: [{
24404
+ type: Input
24405
+ }], required: [{
24406
+ type: Input
24407
+ }], loadOnce: [{
24408
+ type: Input
24409
+ }], autocompleteItems: [{
24410
+ type: Input
24411
+ }], itemsChange: [{
24412
+ type: Output
24413
+ }] } });
24414
+
24415
+ class CopyTextButtonComponent {
24416
+ constructor() {
24417
+ this.displayText = true;
24418
+ this.rows = 1;
24152
24419
  }
24153
- selectIfEnter(event, choice) {
24154
- if (event.code === 'Enter') {
24155
- event.preventDefault();
24156
- this.onSelectValue(choice);
24157
- }
24420
+ copyText(event) {
24421
+ navigator.clipboard.writeText(this.text);
24422
+ event.target.blur();
24158
24423
  }
24159
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24160
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, 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: "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: "directive", type: i1$4.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$4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24424
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24425
+ 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 }); }
24161
24426
  }
24162
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24163
24428
  type: Component,
24164
- args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, 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" }]
24165
- }], propDecorators: { title: [{
24166
- type: Input
24167
- }], showTitle: [{
24429
+ args: [{ selector: 'gn-ui-copy-text-button', changeDetection: ChangeDetectionStrategy.OnPush, 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" }]
24430
+ }], propDecorators: { text: [{
24168
24431
  type: Input
24169
- }], ariaName: [{
24432
+ }], tooltipText: [{
24170
24433
  type: Input
24171
- }], choices: [{
24434
+ }], displayText: [{
24172
24435
  type: Input
24173
- }], selected: [{
24436
+ }], rows: [{
24174
24437
  type: Input
24175
- }], maxRows: [{
24438
+ }] } });
24439
+
24440
+ class DatePickerComponent {
24441
+ constructor() {
24442
+ this.dateChange = new EventEmitter();
24443
+ }
24444
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24445
+ 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"] }] }); }
24446
+ }
24447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DatePickerComponent, decorators: [{
24448
+ type: Component,
24449
+ args: [{ selector: 'gn-ui-date-picker', standalone: true, imports: [MatIconModule, MatNativeDateModule, MatDatepickerModule], 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"] }]
24450
+ }], propDecorators: { date: [{
24176
24451
  type: Input
24177
- }], extraBtnClass: [{
24452
+ }], dateChange: [{
24453
+ type: Output
24454
+ }] } });
24455
+
24456
+ class DateRangePickerComponent {
24457
+ startDateSelected(event) {
24458
+ this.startDate = event.value;
24459
+ }
24460
+ endDateSelected(event) {
24461
+ this.endDate = event.value;
24462
+ }
24463
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24464
+ 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"] }] }); }
24465
+ }
24466
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, decorators: [{
24467
+ type: Component,
24468
+ args: [{ selector: 'gn-ui-date-range-picker', standalone: true, imports: [MatIconModule, MatNativeDateModule, MatDatepickerModule], 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"] }]
24469
+ }] });
24470
+
24471
+ const placeholder = 'dropFile';
24472
+ marker('dropFile');
24473
+ class DragAndDropFileInputComponent {
24474
+ constructor() {
24475
+ this.placeholder = placeholder;
24476
+ this.accept = '*';
24477
+ this.fileChange = new EventEmitter();
24478
+ this.selectedFile = null;
24479
+ }
24480
+ get fileName() {
24481
+ return this.selectedFile && this.selectedFile.name;
24482
+ }
24483
+ selectFile(event) {
24484
+ this.selectedFile = event.addedFiles[0];
24485
+ this.fileChange.emit(this.selectedFile);
24486
+ }
24487
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24488
+ 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"] }] }); }
24489
+ }
24490
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
24491
+ type: Component,
24492
+ args: [{ selector: 'gn-ui-drag-and-drop-file-input', 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"] }]
24493
+ }], propDecorators: { placeholder: [{
24178
24494
  type: Input
24179
- }], minWidth: [{
24495
+ }], accept: [{
24180
24496
  type: Input
24181
- }], selectValue: [{
24497
+ }], fileChange: [{
24182
24498
  type: Output
24183
- }], overlayOrigin: [{
24184
- type: ViewChild,
24185
- args: ['overlayOrigin']
24186
- }], overlay: [{
24187
- type: ViewChild,
24188
- args: [CdkConnectedOverlay]
24189
- }], choiceInputs: [{
24190
- type: ViewChildren,
24191
- args: ['choiceInputs', { read: ElementRef }]
24192
24499
  }] } });
24193
24500
 
24194
24501
  class DropdownMultiselectComponent {
@@ -24336,13 +24643,13 @@ class DropdownMultiselectComponent {
24336
24643
  propagateToDocumentOnly(event);
24337
24644
  this.setFocus();
24338
24645
  }
24339
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$4.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
24340
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\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\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$4.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$4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24646
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$5.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
24647
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\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\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24341
24648
  }
24342
24649
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24343
24650
  type: Component,
24344
24651
  args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\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\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
24345
- }], ctorParameters: function () { return [{ type: i1$4.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24652
+ }], ctorParameters: function () { return [{ type: i1$5.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24346
24653
  type: Input
24347
24654
  }], choices: [{
24348
24655
  type: Input
@@ -24373,123 +24680,300 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24373
24680
  args: ['checkBox', { read: ElementRef }]
24374
24681
  }] } });
24375
24682
 
24376
- class TextInputComponent {
24683
+ const DEFAULT_ROW_NUMBERS = 6;
24684
+ class DropdownSelectorComponent {
24377
24685
  constructor() {
24378
- this.baseClass = [
24379
- 'appearance-none',
24380
- 'border border-gray-300',
24381
- 'rounded w-full',
24382
- 'p-2',
24383
- 'text-gray-700',
24384
- 'leading-tight',
24385
- 'focus:outline-none',
24386
- 'focus:border-primary',
24387
- ].join(' ');
24388
- this.value = '';
24389
- this.extraClass = '';
24390
- this.required = false;
24391
- this.rawChange = new Subject();
24392
- this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24686
+ this.showTitle = true;
24687
+ this.extraBtnClass = '';
24688
+ this.minWidth = '';
24689
+ this.selectValue = new EventEmitter();
24690
+ this.overlayOpen = false;
24691
+ this.overlayWidth = 'auto';
24692
+ this.overlayMaxHeight = 'none';
24693
+ this.overlayPositions = [
24694
+ {
24695
+ originX: 'start',
24696
+ originY: 'bottom',
24697
+ overlayX: 'start',
24698
+ overlayY: 'top',
24699
+ offsetY: 8,
24700
+ },
24701
+ {
24702
+ originX: 'start',
24703
+ originY: 'top',
24704
+ overlayX: 'start',
24705
+ overlayY: 'bottom',
24706
+ offsetY: -8,
24707
+ },
24708
+ ];
24393
24709
  }
24394
- get classList() {
24395
- return `${this.baseClass} ${this.extraClass}`;
24710
+ get selectedChoice() {
24711
+ return (this.choices.find((choice) => choice.value === this.selected) ??
24712
+ this.choices[0]);
24396
24713
  }
24397
- ngAfterViewInit() {
24398
- this.checkRequired(this.input.nativeElement.value);
24714
+ get id() {
24715
+ return this.title.toLowerCase().replace(/[^a-z]+/g, '-');
24399
24716
  }
24400
- checkRequired(value) {
24401
- this.input.nativeElement.classList.toggle('invalid', this.required && value === '');
24717
+ getChoiceLabel() {
24718
+ return this.selectedChoice?.label;
24402
24719
  }
24403
- handleChange($event) {
24404
- const value = $event.target.value;
24405
- this.checkRequired(value);
24406
- this.rawChange.next(value);
24720
+ ngOnInit() {
24721
+ if (!this.maxRows)
24722
+ this.maxRows = DEFAULT_ROW_NUMBERS;
24723
+ if (!this.choices || this.choices.length === 0) {
24724
+ this.choices = [];
24725
+ }
24407
24726
  }
24408
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24409
- 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"] }); }
24727
+ isSelected(choice) {
24728
+ return choice === this.selectedChoice;
24729
+ }
24730
+ onSelectValue(choice) {
24731
+ this.closeOverlay();
24732
+ this.selected = choice.value;
24733
+ this.selectValue.emit(this.selected);
24734
+ }
24735
+ openOverlay() {
24736
+ this.overlayWidth =
24737
+ this.overlayOrigin.elementRef.nativeElement.getBoundingClientRect()
24738
+ .width + 'px';
24739
+ this.overlayMaxHeight = this.maxRows
24740
+ ? `${this.maxRows * 29 + 60}px`
24741
+ : 'none';
24742
+ this.overlayOpen = true;
24743
+ return Promise.all([
24744
+ firstValueFrom(this.overlay.attach),
24745
+ firstValueFrom(this.choiceInputs.changes),
24746
+ ]);
24747
+ }
24748
+ closeOverlay() {
24749
+ this.overlayOpen = false;
24750
+ }
24751
+ focusFirstItem() {
24752
+ this.choiceInputs.get(0).nativeElement.focus();
24753
+ }
24754
+ focusLastItem() {
24755
+ this.choiceInputs.get(this.choiceInputs.length - 1).nativeElement.focus();
24756
+ }
24757
+ async handleTriggerKeydown(event) {
24758
+ const keyCode = event.code;
24759
+ const isOpenKey = keyCode === 'ArrowDown' ||
24760
+ keyCode === 'ArrowUp' ||
24761
+ keyCode === 'ArrowLeft' ||
24762
+ keyCode === 'ArrowRight' ||
24763
+ keyCode === 'Enter' ||
24764
+ keyCode === 'Space';
24765
+ const isCloseKey = keyCode === 'Escape';
24766
+ if (isOpenKey) {
24767
+ event.preventDefault();
24768
+ if (!this.overlayOpen) {
24769
+ await this.openOverlay();
24770
+ }
24771
+ if (keyCode === 'ArrowLeft' || keyCode === 'ArrowUp')
24772
+ this.focusLastItem();
24773
+ else
24774
+ this.focusFirstItem();
24775
+ }
24776
+ else if (this.overlayOpen && isCloseKey) {
24777
+ event.preventDefault();
24778
+ this.closeOverlay();
24779
+ }
24780
+ }
24781
+ handleOverlayKeydown(event) {
24782
+ if (!this.overlayOpen)
24783
+ return;
24784
+ const keyCode = event.code;
24785
+ if (keyCode === 'ArrowDown' || keyCode === 'ArrowRight') {
24786
+ event.preventDefault();
24787
+ this.shiftItemFocus(1);
24788
+ }
24789
+ else if (keyCode === 'ArrowLeft' || keyCode === 'ArrowUp') {
24790
+ event.preventDefault();
24791
+ this.shiftItemFocus(-1);
24792
+ }
24793
+ else if (keyCode === 'Escape') {
24794
+ this.closeOverlay();
24795
+ }
24796
+ }
24797
+ shiftItemFocus(shift) {
24798
+ const index = this.focusedIndex;
24799
+ if (index === -1)
24800
+ return;
24801
+ const max = this.choiceInputs.length;
24802
+ // modulo, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder
24803
+ const newIndex = (((index + shift) % max) + max) % max;
24804
+ this.choiceInputs.get(newIndex).nativeElement.focus();
24805
+ }
24806
+ get focusedIndex() {
24807
+ return this.choiceInputs.reduce((prev, curr, curIndex) => curr.nativeElement === document.activeElement ? curIndex : prev, -1);
24808
+ }
24809
+ selectIfEnter(event, choice) {
24810
+ if (event.code === 'Enter') {
24811
+ event.preventDefault();
24812
+ this.onSelectValue(choice);
24813
+ }
24814
+ }
24815
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24816
+ 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 }); }
24410
24817
  }
24411
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, decorators: [{
24818
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24412
24819
  type: Component,
24413
- 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"] }]
24414
- }], propDecorators: { value: [{
24820
+ args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
24821
+ CommonModule,
24822
+ ButtonComponent,
24823
+ OverlayModule,
24824
+ MatIconModule,
24825
+ TranslateModule,
24826
+ ], 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" }]
24827
+ }], propDecorators: { title: [{
24415
24828
  type: Input
24416
- }], extraClass: [{
24829
+ }], showTitle: [{
24417
24830
  type: Input
24418
- }], hint: [{
24831
+ }], ariaName: [{
24419
24832
  type: Input
24420
- }], required: [{
24833
+ }], choices: [{
24421
24834
  type: Input
24422
- }], valueChange: [{
24835
+ }], selected: [{
24836
+ type: Input
24837
+ }], maxRows: [{
24838
+ type: Input
24839
+ }], extraBtnClass: [{
24840
+ type: Input
24841
+ }], minWidth: [{
24842
+ type: Input
24843
+ }], disabled: [{
24844
+ type: Input
24845
+ }], selectValue: [{
24423
24846
  type: Output
24424
- }], input: [{
24847
+ }], overlayOrigin: [{
24425
24848
  type: ViewChild,
24426
- args: ['input']
24849
+ args: ['overlayOrigin']
24850
+ }], overlay: [{
24851
+ type: ViewChild,
24852
+ args: [CdkConnectedOverlay]
24853
+ }], choiceInputs: [{
24854
+ type: ViewChildren,
24855
+ args: ['choiceInputs', { read: ElementRef }]
24427
24856
  }] } });
24428
24857
 
24429
- class ChipsInputComponent {
24430
- onChange(event) {
24431
- this.rawChange.next(event);
24858
+ class EditableLabelDirective {
24859
+ constructor(el, renderer) {
24860
+ this.el = el;
24861
+ this.renderer = renderer;
24862
+ this.editableLabelChanged = new EventEmitter();
24432
24863
  }
24433
- constructor(http, translate) {
24434
- this.http = http;
24435
- this.translate = translate;
24436
- this.required = false;
24437
- this.loadOnce = false;
24438
- this.autocompleteItems = [];
24439
- this.invalid = false;
24440
- this.items = [];
24441
- this.requestAutocompleteItems = (text) => {
24442
- if (this.url) {
24443
- if (this.loadOnce && this.loadedItems) {
24444
- return this.loadedItems;
24445
- }
24446
- const url = this.url(text);
24447
- const lang = LANG_2_TO_3_MAPPER[this.translate.currentLang.slice(0, 2)];
24448
- return this.http
24449
- .get(url.replace('${lang}', lang))
24450
- .pipe(map$1((item) => item.map((i) => i.values[lang])));
24451
- }
24452
- else {
24453
- return of(this.autocompleteItems || []);
24454
- }
24455
- };
24864
+ ngAfterViewInit() {
24865
+ if (this.gnUiEditableLabel !== false) {
24866
+ const appendedInput = this.renderer.createElement('input');
24867
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
24868
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
24869
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
24870
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
24871
+ this.renderer.setStyle(appendedInput, 'width', '100%');
24872
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
24873
+ this.renderer.setStyle(appendedInput, 'margin', '0');
24874
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
24875
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
24876
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
24877
+ const hostContent = this.el.nativeElement.textContent || '';
24878
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
24879
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
24880
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
24881
+ this.renderer.listen(appendedInput, 'input', (event) => {
24882
+ this.editableLabelChanged.emit(event.target.value);
24883
+ });
24884
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
24885
+ }
24886
+ }
24887
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
24888
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: EditableLabelDirective, isStandalone: true, selector: "[gnUiEditableLabel]", inputs: { gnUiEditableLabel: "gnUiEditableLabel" }, outputs: { editableLabelChanged: "editableLabelChanged" }, ngImport: i0 }); }
24889
+ }
24890
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
24891
+ type: Directive,
24892
+ args: [{
24893
+ selector: '[gnUiEditableLabel]',
24894
+ standalone: true,
24895
+ }]
24896
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
24897
+ type: Output
24898
+ }], gnUiEditableLabel: [{
24899
+ type: Input
24900
+ }] } });
24901
+
24902
+ class NavigationButtonComponent {
24903
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24904
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24905
+ }
24906
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
24907
+ type: Component,
24908
+ args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
24909
+ }], propDecorators: { label: [{
24910
+ type: Input
24911
+ }], icon: [{
24912
+ type: Input
24913
+ }] } });
24914
+
24915
+ class SearchInputComponent {
24916
+ constructor() {
24917
+ this.value = '';
24918
+ this.placeholder = '';
24456
24919
  this.rawChange = new Subject();
24457
- this.itemsChange = this.rawChange.pipe(distinctUntilChanged());
24458
- this.subscription = new Subscription();
24920
+ this.valueChange = this.rawChange.pipe(distinctUntilChanged$1());
24459
24921
  }
24460
- ngOnInit() {
24461
- if (this.loadOnce) {
24462
- this.loadedItems = this.requestAutocompleteItems('*').pipe(shareReplay(1));
24463
- }
24464
- this.items = this.selectedItems;
24465
- this.subscription = this.rawChange
24466
- .pipe(tap$1((v) => (this.invalid = v.length === 0)))
24467
- .subscribe();
24468
- this.rawChange.next(this.items);
24922
+ handleChange($event) {
24923
+ const value = $event.target.value;
24924
+ this.rawChange.next(value);
24469
24925
  }
24470
- ngOnDestroy() {
24471
- this.subscription.unsubscribe();
24926
+ clear() {
24927
+ this.value = null;
24928
+ this.rawChange.next(null);
24472
24929
  }
24473
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChipsInputComponent, deps: [{ token: i1.HttpClient }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
24474
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: { url: "url", placeholder: "placeholder", selectedItems: "selectedItems", required: "required", loadOnce: "loadOnce", autocompleteItems: "autocompleteItems" }, outputs: { itemsChange: "itemsChange" }, ngImport: i0, template: "<tag-input\n [ngModel]=\"items\"\n (ngModelChange)=\"onChange($event)\"\n onlyFromAutocomplete=\"true\"\n [placeholder]=\"placeholder\"\n [secondaryPlaceholder]=\"placeholder\"\n [ripple]=\"false\"\n [animationDuration]=\"{ enter: '0ms', leave: '0ms' }\"\n [onTextChangeDebounce]=\"100\"\n class=\"border-2 border-primary h-full rounded-lg p-2 bg-white text-sm focus:border-primary\"\n [ngClass]=\"{ invalid: invalid }\"\n>\n <tag-input-dropdown\n [autocompleteObservable]=\"requestAutocompleteItems\"\n [minimumTextLength]=\"0\"\n [keepOpen]=\"false\"\n [showDropdownIfEmpty]=\"true\"\n >\n <ng-template let-item=\"item\" let-index=\"index\">\n {{ item.display }}\n </ng-template>\n </tag-input-dropdown>\n</tag-input>\n", styles: ["tag-input::ng-deep .ng2-tag-input{border-bottom:none}tag-input::ng-deep .ng2-tag-input.ng2-tag-input--focused{border-bottom:none}tag-input::ng-deep tag{border-radius:5px;background:var(--color-primary-lightest);font-family:inherit;align-content:center;font-style:italic}tag-input::ng-deep tag::ng-deep:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover,tag-input::ng-deep tag:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover{background:var(--color-primary)!important}tag-input::ng-deep .tag__text{padding-right:7px}tag-input::ng-deep div,tag-input::ng-deep form{height:100%}tag-input.invalid{border-color:var(--color-secondary)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.TagInputComponent, selector: "tag-input", inputs: ["separatorKeys", "separatorKeyCodes", "placeholder", "secondaryPlaceholder", "maxItems", "validators", "asyncValidators", "onlyFromAutocomplete", "errorMessages", "theme", "onTextChangeDebounce", "inputId", "inputClass", "clearOnBlur", "hideForm", "addOnBlur", "addOnPaste", "pasteSplitPattern", "blinkIfDupe", "removable", "editable", "allowDupes", "modelAsStrings", "trimTags", "inputText", "ripple", "tabindex", "disable", "dragZone", "onRemoving", "onAdding", "animationDuration"], outputs: ["onAdd", "onRemove", "onSelect", "onFocus", "onBlur", "onTextChange", "onPaste", "onValidationError", "onTagEdited", "inputTextChange"] }, { kind: "component", type: i5.TagInputDropdown, selector: "tag-input-dropdown", inputs: ["offset", "focusFirstElement", "showDropdownIfEmpty", "autocompleteObservable", "minimumTextLength", "limitItemsTo", "displayBy", "identifyBy", "matchingFn", "appendToBody", "keepOpen", "dynamicUpdate", "zIndex", "autocompleteItems"] }] }); }
24930
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24931
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SearchInputComponent, selector: "gn-ui-search-input", inputs: { value: "value", placeholder: "placeholder" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div class=\"h-full relative text-gray-300\">\n <input\n #input\n class=\"peer h-full appearance-none border border-gray-300 rounded w-full p-2 pl-10 text-gray-700 leading-tight hover:border-primary focus:text-primary focus:outline-none focus:border-primary focus:border-2\"\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n />\n <div\n class=\"absolute inset-y-0 left-0 pl-2.5 flex items-center peer-hover:text-primary peer-focus:text-primary\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </div>\n <button\n *ngIf=\"rawChange | async\"\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary absolute transition-all duration-100 inset-y-0 right-0 pr-2.5\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle\">close</mat-icon>\n </button>\n</div>\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: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24475
24932
  }
24476
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChipsInputComponent, decorators: [{
24933
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchInputComponent, decorators: [{
24477
24934
  type: Component,
24478
- args: [{ selector: 'gn-ui-chips-input', template: "<tag-input\n [ngModel]=\"items\"\n (ngModelChange)=\"onChange($event)\"\n onlyFromAutocomplete=\"true\"\n [placeholder]=\"placeholder\"\n [secondaryPlaceholder]=\"placeholder\"\n [ripple]=\"false\"\n [animationDuration]=\"{ enter: '0ms', leave: '0ms' }\"\n [onTextChangeDebounce]=\"100\"\n class=\"border-2 border-primary h-full rounded-lg p-2 bg-white text-sm focus:border-primary\"\n [ngClass]=\"{ invalid: invalid }\"\n>\n <tag-input-dropdown\n [autocompleteObservable]=\"requestAutocompleteItems\"\n [minimumTextLength]=\"0\"\n [keepOpen]=\"false\"\n [showDropdownIfEmpty]=\"true\"\n >\n <ng-template let-item=\"item\" let-index=\"index\">\n {{ item.display }}\n </ng-template>\n </tag-input-dropdown>\n</tag-input>\n", styles: ["tag-input::ng-deep .ng2-tag-input{border-bottom:none}tag-input::ng-deep .ng2-tag-input.ng2-tag-input--focused{border-bottom:none}tag-input::ng-deep tag{border-radius:5px;background:var(--color-primary-lightest);font-family:inherit;align-content:center;font-style:italic}tag-input::ng-deep tag::ng-deep:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover,tag-input::ng-deep tag:not(:focus):not(.tag--editing):not(:active):not(.readonly):hover{background:var(--color-primary)!important}tag-input::ng-deep .tag__text{padding-right:7px}tag-input::ng-deep div,tag-input::ng-deep form{height:100%}tag-input.invalid{border-color:var(--color-secondary)}\n"] }]
24479
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i1$1.TranslateService }]; }, propDecorators: { url: [{
24935
+ args: [{ selector: 'gn-ui-search-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"h-full relative text-gray-300\">\n <input\n #input\n class=\"peer h-full appearance-none border border-gray-300 rounded w-full p-2 pl-10 text-gray-700 leading-tight hover:border-primary focus:text-primary focus:outline-none focus:border-primary focus:border-2\"\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n />\n <div\n class=\"absolute inset-y-0 left-0 pl-2.5 flex items-center peer-hover:text-primary peer-focus:text-primary\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </div>\n <button\n *ngIf=\"rawChange | async\"\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary absolute transition-all duration-100 inset-y-0 right-0 pr-2.5\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle\">close</mat-icon>\n </button>\n</div>\n" }]
24936
+ }], propDecorators: { value: [{
24480
24937
  type: Input
24481
24938
  }], placeholder: [{
24482
24939
  type: Input
24483
- }], selectedItems: [{
24484
- type: Input
24485
- }], required: [{
24486
- type: Input
24487
- }], loadOnce: [{
24940
+ }], valueChange: [{
24941
+ type: Output
24942
+ }] } });
24943
+
24944
+ class StarToggleComponent {
24945
+ constructor() {
24946
+ this.disabled = false;
24947
+ this.newValue = new EventEmitter();
24948
+ }
24949
+ toggle(event) {
24950
+ if (!this.disabled) {
24951
+ this.toggled = !this.toggled;
24952
+ if (this.toggled) {
24953
+ const anim = this.overlay.nativeElement.getAnimations()[0];
24954
+ anim.cancel();
24955
+ anim.play();
24956
+ }
24957
+ this.newValue.emit(this.toggled);
24958
+ }
24959
+ propagateToDocumentOnly(event);
24960
+ event.preventDefault();
24961
+ }
24962
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24963
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24964
+ }
24965
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, decorators: [{
24966
+ type: Component,
24967
+ args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
24968
+ }], propDecorators: { toggled: [{
24488
24969
  type: Input
24489
- }], autocompleteItems: [{
24970
+ }], disabled: [{
24490
24971
  type: Input
24491
- }], itemsChange: [{
24972
+ }], newValue: [{
24492
24973
  type: Output
24974
+ }], overlay: [{
24975
+ type: ViewChild,
24976
+ args: ['starOverlay']
24493
24977
  }] } });
24494
24978
 
24495
24979
  class TextAreaComponent {
@@ -24552,317 +25036,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24552
25036
  args: ['input']
24553
25037
  }] } });
24554
25038
 
24555
- class PopupAlertComponent {
24556
- constructor(changeDetector) {
24557
- this.changeDetector = changeDetector;
24558
- this.type = 'info';
24559
- this.position = 'top';
24560
- this.expanded = false;
24561
- this.timeout = null;
24562
- }
24563
- get showDuration() {
24564
- const chars = this.content.nativeElement.innerHTML.length;
24565
- return Math.max(3000, chars * 20);
24566
- }
24567
- ngOnInit() {
24568
- this.expandAndClose();
24569
- }
24570
- expand() {
24571
- this.expanded = true;
24572
- this.changeDetector.detectChanges();
24573
- clearTimeout(this.timeout);
24574
- }
24575
- expandAndClose() {
24576
- this.expanded = true;
24577
- this.changeDetector.detectChanges();
24578
- clearTimeout(this.timeout);
24579
- this.timeout = setTimeout(() => {
24580
- this.expanded = false;
24581
- this.changeDetector.detectChanges();
24582
- }, this.showDuration);
24583
- }
24584
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PopupAlertComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24585
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: { icon: "icon", type: "type", position: "position" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<div class=\"h-full relative container\">\n <div\n class=\"pointer-events-auto absolute text-white flex flex-row p-2 rounded message\"\n role=\"alert\"\n [ngClass]=\"{\n 'position-bottom': position === 'bottom',\n 'position-top': position === 'top',\n expanded: this.expanded,\n 'bg-red-500': type === 'danger',\n 'bg-yellow-500': type === 'warning',\n 'bg-blue-500': type === 'info'\n }\"\n (mouseenter)=\"expand()\"\n (mouseleave)=\"expandAndClose()\"\n >\n <mat-icon class=\"material-symbols-outlined mr-2 shrink-0 select-none\">{{\n icon\n }}</mat-icon>\n <div class=\"grow\" #content [ngClass]=\"{ invisible: !expanded }\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{pointer-events:none}.container{filter:drop-shadow(0px 4px 3px rgba(0,0,0,.2))}.message{transition:clip-path .3s cubic-bezier(.25,.46,.45,.94)}.message.expanded{clip-path:circle(100%)}.position-top{clip-path:circle(19px at 20px 20px);align-items:start;top:0;left:0}.position-bottom{clip-path:circle(19px at 20px calc(100% - 20px));align-items:end;bottom:0;left:0}.container ::ng-deep a{text-decoration:underline;font-weight:700}.container ::ng-deep a:hover{opacity:.85}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24586
- }
24587
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PopupAlertComponent, decorators: [{
24588
- type: Component,
24589
- args: [{ selector: 'gn-ui-popup-alert', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"h-full relative container\">\n <div\n class=\"pointer-events-auto absolute text-white flex flex-row p-2 rounded message\"\n role=\"alert\"\n [ngClass]=\"{\n 'position-bottom': position === 'bottom',\n 'position-top': position === 'top',\n expanded: this.expanded,\n 'bg-red-500': type === 'danger',\n 'bg-yellow-500': type === 'warning',\n 'bg-blue-500': type === 'info'\n }\"\n (mouseenter)=\"expand()\"\n (mouseleave)=\"expandAndClose()\"\n >\n <mat-icon class=\"material-symbols-outlined mr-2 shrink-0 select-none\">{{\n icon\n }}</mat-icon>\n <div class=\"grow\" #content [ngClass]=\"{ invisible: !expanded }\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{pointer-events:none}.container{filter:drop-shadow(0px 4px 3px rgba(0,0,0,.2))}.message{transition:clip-path .3s cubic-bezier(.25,.46,.45,.94)}.message.expanded{clip-path:circle(100%)}.position-top{clip-path:circle(19px at 20px 20px);align-items:start;top:0;left:0}.position-bottom{clip-path:circle(19px at 20px calc(100% - 20px));align-items:end;bottom:0;left:0}.container ::ng-deep a{text-decoration:underline;font-weight:700}.container ::ng-deep a:hover{opacity:.85}\n"] }]
24590
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { icon: [{
24591
- type: Input
24592
- }], type: [{
24593
- type: Input
24594
- }], position: [{
24595
- type: Input
24596
- }], content: [{
24597
- type: ViewChild,
24598
- args: ['content']
24599
- }] } });
24600
-
24601
- class AutocompleteComponent {
24602
- constructor(cdRef) {
24603
- this.cdRef = cdRef;
24604
- this.clearOnSelection = false;
24605
- this.autoFocus = false;
24606
- this.itemSelected = new EventEmitter();
24607
- this.inputSubmitted = new EventEmitter();
24608
- this.inputCleared = new EventEmitter();
24609
- this.control = new UntypedFormControl();
24610
- this.subscription = new Subscription();
24611
- this.cancelEnter = true;
24612
- this.selectionSubject = new ReplaySubject(1);
24613
- this.lastInputValue$ = new ReplaySubject(1);
24614
- this.error = null;
24615
- this.displayWithFn = (item) => item;
24616
- }
24617
- ngOnChanges(changes) {
24618
- const { value } = changes;
24619
- if (value) {
24620
- const previousTextValue = this.displayWithFn(value.previousValue);
24621
- const currentTextValue = this.displayWithFn(value.currentValue);
24622
- if (previousTextValue !== currentTextValue) {
24623
- this.updateInputValue(value.currentValue);
24624
- }
24625
- }
25039
+ class TextInputComponent {
25040
+ constructor() {
25041
+ this.baseClass = [
25042
+ 'appearance-none',
25043
+ 'border border-gray-300',
25044
+ 'rounded w-full',
25045
+ 'p-2',
25046
+ 'text-gray-700',
25047
+ 'leading-tight',
25048
+ 'focus:outline-none',
25049
+ 'focus:border-primary',
25050
+ ].join(' ');
25051
+ this.value = '';
25052
+ this.extraClass = '';
25053
+ this.required = false;
25054
+ this.rawChange = new Subject();
25055
+ this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24626
25056
  }
24627
- ngOnInit() {
24628
- this.suggestions$ = merge(this.control.valueChanges.pipe(filter((value) => typeof value === 'string'), filter((value) => value.length > 2), debounceTime(400), distinctUntilChanged(), tap$1(() => (this.searching = true))), this.control.valueChanges.pipe(filter((value) => typeof value === 'object' && value.title), map$1((item) => item.title))).pipe(switchMap$1((value) => (value ? this.action(value) : of([]))), catchError((error) => {
24629
- this.error = error.message;
24630
- return of([]);
24631
- }), finalize(() => (this.searching = false)));
24632
- this.subscription = this.control.valueChanges.subscribe((any) => {
24633
- if (any !== '') {
24634
- this.cancelEnter = false;
24635
- }
24636
- });
24637
- this.control.valueChanges
24638
- .pipe(filter((value) => typeof value === 'string'))
24639
- .subscribe(this.lastInputValue$);
25057
+ get classList() {
25058
+ return `${this.baseClass} ${this.extraClass}`;
24640
25059
  }
24641
25060
  ngAfterViewInit() {
24642
- this.autocomplete.optionSelected.subscribe(this.selectionSubject);
24643
- if (this.autoFocus) {
24644
- this.inputRef.nativeElement.focus();
24645
- this.cdRef.detectChanges();
24646
- }
24647
- }
24648
- ngOnDestroy() {
24649
- this.subscription.unsubscribe();
24650
- }
24651
- updateInputValue(value) {
24652
- if (value) {
24653
- this.control.setValue(value);
24654
- }
24655
- if (this.inputRef) {
24656
- this.inputRef.nativeElement.value = value?.title || '';
24657
- }
24658
- }
24659
- clear() {
24660
- this.inputRef.nativeElement.value = '';
24661
- this.inputCleared.emit();
24662
- this.selectionSubject
24663
- .pipe(take(1))
24664
- .subscribe((selection) => selection && selection.option.deselect());
24665
- this.inputRef.nativeElement.focus();
24666
- this.triggerRef.closePanel();
24667
- }
24668
- handleEnter(any) {
24669
- if (!this.cancelEnter) {
24670
- this.inputSubmitted.emit(any);
24671
- this.triggerRef.closePanel();
24672
- }
25061
+ this.checkRequired(this.input.nativeElement.value);
24673
25062
  }
24674
- handleClickSearch() {
24675
- this.inputSubmitted.emit(this.inputRef.nativeElement.value);
24676
- this.triggerRef.closePanel();
25063
+ checkRequired(value) {
25064
+ this.input.nativeElement.classList.toggle('invalid', this.required && value === '');
24677
25065
  }
24678
- handleSelection(event) {
24679
- this.cancelEnter = true;
24680
- this.itemSelected.emit(event.option.value);
24681
- if (this.clearOnSelection) {
24682
- this.lastInputValue$.pipe(first()).subscribe((any) => {
24683
- this.inputRef.nativeElement.value = any;
24684
- });
24685
- }
25066
+ handleChange($event) {
25067
+ const value = $event.target.value;
25068
+ this.checkRequired(value);
25069
+ this.rawChange.next(value);
24686
25070
  }
24687
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24688
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], 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: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25071
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25072
+ 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"] }); }
24689
25073
  }
24690
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25074
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, decorators: [{
24691
25075
  type: Component,
24692
- args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
24693
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
24694
- type: Input
24695
- }], action: [{
24696
- type: Input
24697
- }], value: [{
24698
- type: Input
24699
- }], clearOnSelection: [{
25076
+ 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"] }]
25077
+ }], propDecorators: { value: [{
24700
25078
  type: Input
24701
- }], autoFocus: [{
25079
+ }], extraClass: [{
24702
25080
  type: Input
24703
- }], itemSelected: [{
24704
- type: Output
24705
- }], inputSubmitted: [{
24706
- type: Output
24707
- }], inputCleared: [{
24708
- type: Output
24709
- }], triggerRef: [{
24710
- type: ViewChild,
24711
- args: [MatAutocompleteTrigger]
24712
- }], autocomplete: [{
24713
- type: ViewChild,
24714
- args: [MatAutocomplete]
24715
- }], inputRef: [{
24716
- type: ViewChild,
24717
- args: ['searchInput']
24718
- }], displayWithFn: [{
25081
+ }], hint: [{
24719
25082
  type: Input
24720
- }] } });
24721
-
24722
- class StarToggleComponent {
24723
- constructor() {
24724
- this.disabled = false;
24725
- this.newValue = new EventEmitter();
24726
- }
24727
- toggle(event) {
24728
- if (!this.disabled) {
24729
- this.toggled = !this.toggled;
24730
- if (this.toggled) {
24731
- const anim = this.overlay.nativeElement.getAnimations()[0];
24732
- anim.cancel();
24733
- anim.play();
24734
- }
24735
- this.newValue.emit(this.toggled);
24736
- }
24737
- propagateToDocumentOnly(event);
24738
- event.preventDefault();
24739
- }
24740
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24741
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: { toggled: "toggled", disabled: "disabled" }, outputs: { newValue: "newValue" }, viewQueries: [{ propertyName: "overlay", first: true, predicate: ["starOverlay"], descendants: true }], ngImport: i0, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24742
- }
24743
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: StarToggleComponent, decorators: [{
24744
- type: Component,
24745
- args: [{ selector: 'gn-ui-star-toggle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"inline-block relative align-middle\" style=\"line-height: 0.7em\">\n <button\n type=\"button\"\n class=\"-m-[8px] p-[8px]\"\n (click)=\"toggle($event)\"\n [ngClass]=\"{\n enabled: toggled,\n 'disabled opacity-45': !toggled,\n 'transition hover:scale-125 will-change-transform': !disabled,\n 'cursor-default': disabled\n }\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n [ngClass]=\"{ 'star-filled': toggled }\"\n >star</mat-icon\n >\n </button>\n <svg\n #starOverlay\n class=\"star-toggle-overlay\"\n width=\"40px\"\n height=\"40px\"\n viewBox=\"-15 -15 30 30\"\n >\n <g>\n <path d=\"M 0,13.229167 V 0\" />\n <path d=\"M -12.484186,4.0880377 0,0\" />\n <path d=\"M -7.6784102,-10.70262 0,0\" />\n <path d=\"M 7.8734079,-10.70262 0,0\" />\n <path d=\"M 12.679184,4.0880376 0,0\" />\n </g>\n </svg>\n</div>\n", styles: ["button.enabled{color:var(--star-toggle-enabled-color, var(--color-secondary))}button.disabled{color:var(--star-toggle-disabled-color, var(--color-primary))}mat-icon{width:1em;height:1em;font-size:1.5em;margin-top:-.1em;font-variation-settings:\"opsz\" 40;stroke:var(--color-primary-darker)}.star-filled{font-variation-settings:\"FILL\" 1}.star-toggle-overlay{stroke:var(--color-secondary);stroke-width:3.5px;stroke-linecap:round;position:absolute;top:50%;left:50%;width:2.5em;height:2.5em;transform:translate(-50%,-50%);pointer-events:none;stroke-dasharray:5 20;stroke-dashoffset:-15;animation:overlay-dash .8s cubic-bezier(.16,.66,.44,.96) forwards;animation-play-state:paused}@keyframes overlay-dash{to{stroke-dashoffset:7}}\n"] }]
24746
- }], propDecorators: { toggled: [{
25083
+ }], required: [{
24747
25084
  type: Input
24748
25085
  }], disabled: [{
24749
25086
  type: Input
24750
- }], newValue: [{
25087
+ }], valueChange: [{
24751
25088
  type: Output
24752
- }], overlay: [{
25089
+ }], input: [{
24753
25090
  type: ViewChild,
24754
- args: ['starOverlay']
24755
- }] } });
24756
-
24757
- class ViewportIntersectorComponent {
24758
- constructor(vcRef) {
24759
- this.vcRef = vcRef;
24760
- this.isInViewport = new EventEmitter();
24761
- this.entersViewport = this.isInViewport.pipe(filter((inViewport) => inViewport), map$1(() => undefined));
24762
- this.exitsViewport = this.isInViewport.pipe(filter((inViewport) => !inViewport), map$1(() => undefined));
24763
- }
24764
- ngOnInit() {
24765
- const elToObserve = this.vcRef.element.nativeElement;
24766
- this.observeInputElement(elToObserve);
24767
- }
24768
- ngOnDestroy() {
24769
- const elToObserve = this.vcRef.element.nativeElement;
24770
- this.unObserveInputElement(elToObserve);
24771
- }
24772
- observeInputElement(elToObserve) {
24773
- if (!this.observer) {
24774
- this.observer = new IntersectionObserver((entries) => {
24775
- entries.forEach((entry) => {
24776
- this.isInViewport.emit(entry.isIntersecting);
24777
- });
24778
- }, { root: null, threshold: 0 });
24779
- }
24780
- this.observer.observe(elToObserve);
24781
- }
24782
- unObserveInputElement(elToObserve) {
24783
- this.observer?.unobserve(elToObserve);
24784
- }
24785
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ViewportIntersectorComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
24786
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: { isInViewport: "isInViewport", entersViewport: "entersViewport", exitsViewport: "exitsViewport" }, ngImport: i0, template: "<div class=\"w-full h-full\"></div>\n", styles: [""] }); }
24787
- }
24788
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ViewportIntersectorComponent, decorators: [{
24789
- type: Component,
24790
- args: [{ selector: 'gn-ui-viewport-intersector', template: "<div class=\"w-full h-full\"></div>\n" }]
24791
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; }, propDecorators: { isInViewport: [{
24792
- type: Output
24793
- }], entersViewport: [{
24794
- type: Output
24795
- }], exitsViewport: [{
24796
- type: Output
24797
- }] } });
24798
-
24799
- class CheckToggleComponent {
24800
- constructor() {
24801
- this.color = 'primary';
24802
- this.toggled = new EventEmitter();
24803
- }
24804
- toggle(event) {
24805
- this.toggled.emit(event);
24806
- }
24807
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24808
- 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 }); }
24809
- }
24810
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, decorators: [{
24811
- type: Component,
24812
- 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" }]
24813
- }], propDecorators: { title: [{
24814
- type: Input
24815
- }], label: [{
24816
- type: Input
24817
- }], value: [{
24818
- type: Input
24819
- }], color: [{
24820
- type: Input
24821
- }], toggled: [{
24822
- type: Output
24823
- }] } });
24824
-
24825
- const placeholder = 'dropFile';
24826
- marker('dropFile');
24827
- class DragAndDropFileInputComponent {
24828
- constructor() {
24829
- this.placeholder = placeholder;
24830
- this.accept = '*';
24831
- this.fileChange = new EventEmitter();
24832
- this.selectedFile = null;
24833
- }
24834
- get fileName() {
24835
- return this.selectedFile && this.selectedFile.name;
24836
- }
24837
- selectFile(event) {
24838
- this.selectedFile = event.addedFiles[0];
24839
- this.fileChange.emit(this.selectedFile);
24840
- }
24841
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24842
- 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"] }] }); }
24843
- }
24844
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
24845
- type: Component,
24846
- args: [{ selector: 'gn-ui-drag-and-drop-file-input', 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"] }]
24847
- }], propDecorators: { placeholder: [{
24848
- type: Input
24849
- }], accept: [{
24850
- type: Input
24851
- }], fileChange: [{
24852
- type: Output
24853
- }] } });
24854
-
24855
- class NavigationButtonComponent {
24856
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24857
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24858
- }
24859
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
24860
- type: Component,
24861
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
24862
- }], propDecorators: { label: [{
24863
- type: Input
24864
- }], icon: [{
24865
- type: Input
25091
+ args: ['input']
24866
25092
  }] } });
24867
25093
 
24868
25094
  class ColorScaleComponent {
@@ -24970,7 +25196,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24970
25196
 
24971
25197
  class LoadingMaskComponent {
24972
25198
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LoadingMaskComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24973
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: { message: "message" }, ngImport: i0, template: "<div class=\"h-full flex flex-col justify-center items-center relative backdrop\">\n <div class=\"absolute background bg-white inset-0\"></div>\n <mat-spinner [diameter]=\"28\" class=\"relative\"></mat-spinner>\n <span class=\"text-sm text-gray-700 mt-3 relative\">{{ message }}</span>\n</div>\n", styles: ["::ng-deep .mat-spinner circle{stroke:var(--color-gray-700);opacity:.5}.backdrop{background-color:#fff6}@supports ((-webkit-backdrop-filter: blur()) or (backdrop-filter: blur())){.backdrop{background-color:transparent;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}}.background{opacity:.7}\n"], dependencies: [{ kind: "component", type: i1$5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25199
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: { message: "message" }, ngImport: i0, template: "<div class=\"h-full flex flex-col justify-center items-center relative backdrop\">\n <div class=\"absolute background bg-white inset-0\"></div>\n <mat-spinner [diameter]=\"28\" class=\"relative\"></mat-spinner>\n <span class=\"text-sm text-gray-700 mt-3 relative\">{{ message }}</span>\n</div>\n", styles: ["::ng-deep .mat-spinner circle{stroke:var(--color-gray-700);opacity:.5}.backdrop{background-color:#fff6}@supports ((-webkit-backdrop-filter: blur()) or (backdrop-filter: blur())){.backdrop{background-color:transparent;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}}.background{opacity:.7}\n"], dependencies: [{ kind: "component", type: i1$6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24974
25200
  }
24975
25201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LoadingMaskComponent, decorators: [{
24976
25202
  type: Component,
@@ -25066,148 +25292,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25066
25292
  }]
25067
25293
  }] });
25068
25294
 
25069
- class CopyTextButtonComponent {
25070
- constructor() {
25071
- this.displayText = true;
25072
- this.rows = 1;
25295
+ class ViewportIntersectorComponent {
25296
+ constructor(vcRef) {
25297
+ this.vcRef = vcRef;
25298
+ this.isInViewport = new EventEmitter();
25299
+ this.entersViewport = this.isInViewport.pipe(filter((inViewport) => inViewport), map$1(() => undefined));
25300
+ this.exitsViewport = this.isInViewport.pipe(filter((inViewport) => !inViewport), map$1(() => undefined));
25073
25301
  }
25074
- copyText(event) {
25075
- navigator.clipboard.writeText(this.text);
25076
- event.target.blur();
25302
+ ngOnInit() {
25303
+ const elToObserve = this.vcRef.element.nativeElement;
25304
+ this.observeInputElement(elToObserve);
25077
25305
  }
25078
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25079
- 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$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25080
- }
25081
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
25082
- type: Component,
25083
- args: [{ selector: 'gn-ui-copy-text-button', changeDetection: ChangeDetectionStrategy.OnPush, 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" }]
25084
- }], propDecorators: { text: [{
25085
- type: Input
25086
- }], tooltipText: [{
25087
- type: Input
25088
- }], displayText: [{
25089
- type: Input
25090
- }], rows: [{
25091
- type: Input
25092
- }] } });
25093
-
25094
- class CheckboxComponent {
25095
- constructor() {
25096
- this.type = 'default';
25097
- this.checked = false;
25098
- this.indeterminate = false;
25099
- this.changed = new EventEmitter();
25306
+ ngOnDestroy() {
25307
+ const elToObserve = this.vcRef.element.nativeElement;
25308
+ this.unObserveInputElement(elToObserve);
25100
25309
  }
25101
- get classList() {
25102
- return `${this.type}`;
25310
+ observeInputElement(elToObserve) {
25311
+ if (!this.observer) {
25312
+ this.observer = new IntersectionObserver((entries) => {
25313
+ entries.forEach((entry) => {
25314
+ this.isInViewport.emit(entry.isIntersecting);
25315
+ });
25316
+ }, { root: null, threshold: 0 });
25317
+ }
25318
+ this.observer.observe(elToObserve);
25103
25319
  }
25104
- handleClick(event) {
25105
- event.stopPropagation();
25106
- this.checked = !this.checked;
25107
- this.changed.emit(this.checked);
25320
+ unObserveInputElement(elToObserve) {
25321
+ this.observer?.unobserve(elToObserve);
25108
25322
  }
25109
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25110
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25323
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ViewportIntersectorComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
25324
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ViewportIntersectorComponent, selector: "gn-ui-viewport-intersector", outputs: { isInViewport: "isInViewport", entersViewport: "entersViewport", exitsViewport: "exitsViewport" }, ngImport: i0, template: "<div class=\"w-full h-full\"></div>\n", styles: [""] }); }
25111
25325
  }
25112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ViewportIntersectorComponent, decorators: [{
25113
25327
  type: Component,
25114
- args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25115
- }], propDecorators: { type: [{
25116
- type: Input
25117
- }], checked: [{
25118
- type: Input
25119
- }], indeterminate: [{
25120
- type: Input
25121
- }], changed: [{
25328
+ args: [{ selector: 'gn-ui-viewport-intersector', template: "<div class=\"w-full h-full\"></div>\n" }]
25329
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; }, propDecorators: { isInViewport: [{
25122
25330
  type: Output
25123
- }] } });
25124
-
25125
- class SearchInputComponent {
25126
- constructor() {
25127
- this.value = '';
25128
- this.placeholder = '';
25129
- this.rawChange = new Subject();
25130
- this.valueChange = this.rawChange.pipe(distinctUntilChanged$1());
25131
- }
25132
- handleChange($event) {
25133
- const value = $event.target.value;
25134
- this.rawChange.next(value);
25135
- }
25136
- clear() {
25137
- this.value = null;
25138
- this.rawChange.next(null);
25139
- }
25140
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25141
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SearchInputComponent, selector: "gn-ui-search-input", inputs: { value: "value", placeholder: "placeholder" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div class=\"h-full relative text-gray-300\">\n <input\n #input\n class=\"peer h-full appearance-none border border-gray-300 rounded w-full p-2 pl-10 text-gray-700 leading-tight hover:border-primary focus:text-primary focus:outline-none focus:border-primary focus:border-2\"\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n />\n <div\n class=\"absolute inset-y-0 left-0 pl-2.5 flex items-center peer-hover:text-primary peer-focus:text-primary\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </div>\n <button\n *ngIf=\"rawChange | async\"\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary absolute transition-all duration-100 inset-y-0 right-0 pr-2.5\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle\">close</mat-icon>\n </button>\n</div>\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: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25142
- }
25143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchInputComponent, decorators: [{
25144
- type: Component,
25145
- args: [{ selector: 'gn-ui-search-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"h-full relative text-gray-300\">\n <input\n #input\n class=\"peer h-full appearance-none border border-gray-300 rounded w-full p-2 pl-10 text-gray-700 leading-tight hover:border-primary focus:text-primary focus:outline-none focus:border-primary focus:border-2\"\n type=\"text\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n />\n <div\n class=\"absolute inset-y-0 left-0 pl-2.5 flex items-center peer-hover:text-primary peer-focus:text-primary\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </div>\n <button\n *ngIf=\"rawChange | async\"\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary absolute transition-all duration-100 inset-y-0 right-0 pr-2.5\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle\">close</mat-icon>\n </button>\n</div>\n" }]
25146
- }], propDecorators: { value: [{
25147
- type: Input
25148
- }], placeholder: [{
25149
- type: Input
25150
- }], valueChange: [{
25331
+ }], entersViewport: [{
25151
25332
  type: Output
25152
- }] } });
25153
-
25154
- class DateRangePickerComponent {
25155
- startDateSelected(event) {
25156
- this.startDate = event.value;
25157
- }
25158
- endDateSelected(event) {
25159
- this.endDate = event.value;
25160
- }
25161
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25162
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DateRangePickerComponent, 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: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i3$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i3$2.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i3$2.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3$2.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i3$2.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }] }); }
25163
- }
25164
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, decorators: [{
25165
- type: Component,
25166
- args: [{ selector: 'gn-ui-date-range-picker', 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"] }]
25167
- }] });
25168
-
25169
- class EditableLabelDirective {
25170
- constructor(el, renderer) {
25171
- this.el = el;
25172
- this.renderer = renderer;
25173
- this.editableLabelChanged = new EventEmitter();
25174
- }
25175
- ngAfterViewInit() {
25176
- if (this.gnUiEditableLabel !== false) {
25177
- const appendedInput = this.renderer.createElement('input');
25178
- this.renderer.setStyle(appendedInput, 'background', 'inherit');
25179
- this.renderer.setStyle(appendedInput, 'color', 'inherit');
25180
- this.renderer.setStyle(appendedInput, 'font', 'inherit');
25181
- this.renderer.setStyle(appendedInput, 'border', 'inherit');
25182
- this.renderer.setStyle(appendedInput, 'width', '100%');
25183
- this.renderer.setStyle(appendedInput, 'padding', 'inherit');
25184
- this.renderer.setStyle(appendedInput, 'margin', '0');
25185
- this.renderer.setStyle(appendedInput, 'height', 'inherit');
25186
- this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
25187
- this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
25188
- const hostContent = this.el.nativeElement.textContent || '';
25189
- const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
25190
- this.renderer.setProperty(appendedInput, 'value', formattedContent);
25191
- this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
25192
- this.renderer.listen(appendedInput, 'input', (event) => {
25193
- this.editableLabelChanged.emit(event.target.value);
25194
- });
25195
- this.renderer.appendChild(this.el.nativeElement, appendedInput);
25196
- }
25197
- }
25198
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
25199
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: EditableLabelDirective, isStandalone: true, selector: "[gnUiEditableLabel]", inputs: { gnUiEditableLabel: "gnUiEditableLabel" }, outputs: { editableLabelChanged: "editableLabelChanged" }, ngImport: i0 }); }
25200
- }
25201
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25202
- type: Directive,
25203
- args: [{
25204
- selector: '[gnUiEditableLabel]',
25205
- standalone: true,
25206
- }]
25207
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25333
+ }], exitsViewport: [{
25208
25334
  type: Output
25209
- }], gnUiEditableLabel: [{
25210
- type: Input
25211
25335
  }] } });
25212
25336
 
25213
25337
  class FilesDropDirective {
@@ -25399,7 +25523,7 @@ class ImageInputComponent {
25399
25523
  });
25400
25524
  }
25401
25525
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageInputComponent, deps: [{ token: i1.HttpClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25402
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageInputComponent, isStandalone: true, selector: "gn-ui-image-input", inputs: { maxSizeMB: "maxSizeMB", previewUrl: "previewUrl", altText: "altText", uploadProgress: "uploadProgress", uploadError: "uploadError" }, outputs: { fileChange: "fileChange", urlChange: "urlChange", uploadCancel: "uploadCancel", delete: "delete", altTextChange: "altTextChange" }, ngImport: i0, template: "<ng-container *ngIf=\"previewUrl; then withImage; else withoutImage\">\n</ng-container>\n\n<ng-template #withImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <div class=\"flex-1 group relative\">\n <img\n class=\"w-full h-full object-cover border-2 border-gray-300 rounded-lg\"\n [alt]=\"altText\"\n loading=\"lazy\"\n [src]=\"previewUrl\"\n />\n <gn-ui-button\n [extraClass]=\"\n 'bg-gray-200 absolute right-2 bottom-2 invisible group-hover:visible'\n \"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined\">delete</mat-icon>\n </gn-ui-button>\n </div>\n <input\n *ngIf=\"showAltTextInput\"\n type=\"text\"\n class=\"py-3 px-2 border-2 border-gray-300 rounded-lg text-sm font-medium\"\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText\"\n (change)=\"handleAltTextChange($event)\"\n />\n <div class=\"flex flex-row gap-2\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">delete</mat-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"!showAltTextInput\"\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"toggleAltTextInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">add</mat-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #withoutImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n <div class=\"w-14 h-14 rounded-md bg-gray-200 grid\">\n <mat-icon\n *ngIf=\"!dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >image</mat-icon\n >\n <mat-icon\n *ngIf=\"dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >add_box</mat-icon\n >\n <div *ngIf=\"uploadProgress\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n [mode]=\"'determinate'\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n <span\n class=\"text-sm font-medium relative inline-block width-[30px] bottom-[40px] left-[15px]\"\n >\n {{ uploadProgress }}%\n </span>\n </div>\n <mat-icon\n *ngIf=\"uploadError\"\n class=\"material-symbols-outlined place-self-center text-rose-500\"\n >broken_image</mat-icon\n >\n </div>\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\">{{ getPrimaryText() | translate }}</p>\n <p\n class=\"text-sm\"\n [class]=\"\n uploadProgress || uploadError\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick()\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"showUrlInput || uploadProgress || uploadError\"\n />\n </label>\n <div *ngIf=\"!showUrlInput\" class=\"flex-none\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"displayUrlInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">link</mat-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n <div *ngIf=\"showUrlInput\" class=\"flex-none flex flex-col gap-2\">\n <div class=\"h-2\"></div>\n <div class=\"flex gap-2 items-center\">\n <div class=\"flex-1 flex rounded-lg\">\n <span\n class=\"material-symbols-outlined px-4 inline-flex items-center min-w-fit rounded-s-lg border-2 border-e-0 border-gray-300\"\n >link</span\n >\n <input\n type=\"text\"\n class=\"py-3 ps-1 block w-full border-2 border-s-0 border-e-0 border-gray-300 text-sm font-medium\"\n placeholder=\"https://exemple.com/image.jpg\"\n (change)=\"handleUrlChange($event)\"\n />\n <gn-ui-button\n class=\"px-1 inline-flex items-center min-w-fit rounded-e-lg border-2 border-s-0 border-gray-300 text-white\"\n [extraClass]=\"\n urlInputValue && !downloadError ? 'bg-blue-500' : 'bg-gray-500'\n \"\n [disabled]=\"!urlInputValue || downloadError\"\n (buttonClick)=\"downloadUrl()\"\n >\n <mat-icon class=\"material-symbols-outlined\">arrow_upward</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n </div>\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: "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"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i1$5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25526
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageInputComponent, isStandalone: true, selector: "gn-ui-image-input", inputs: { maxSizeMB: "maxSizeMB", previewUrl: "previewUrl", altText: "altText", uploadProgress: "uploadProgress", uploadError: "uploadError" }, outputs: { fileChange: "fileChange", urlChange: "urlChange", uploadCancel: "uploadCancel", delete: "delete", altTextChange: "altTextChange" }, ngImport: i0, template: "<ng-container *ngIf=\"previewUrl; then withImage; else withoutImage\">\n</ng-container>\n\n<ng-template #withImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <div class=\"flex-1 group relative\">\n <img\n class=\"w-full h-full object-cover border-2 border-gray-300 rounded-lg\"\n [alt]=\"altText\"\n loading=\"lazy\"\n [src]=\"previewUrl\"\n />\n <gn-ui-button\n [extraClass]=\"\n 'bg-gray-200 absolute right-2 bottom-2 invisible group-hover:visible'\n \"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined\">delete</mat-icon>\n </gn-ui-button>\n </div>\n <input\n *ngIf=\"showAltTextInput\"\n type=\"text\"\n class=\"py-3 px-2 border-2 border-gray-300 rounded-lg text-sm font-medium\"\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText\"\n (change)=\"handleAltTextChange($event)\"\n />\n <div class=\"flex flex-row gap-2\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"handleDelete()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">delete</mat-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"!showAltTextInput\"\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"toggleAltTextInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">add</mat-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #withoutImage>\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"block flex-1 border-2 border-dashed border-gray-300 rounded-lg p-6 flex flex-col items-center justify-center gap-4\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n <div class=\"w-14 h-14 rounded-md bg-gray-200 grid\">\n <mat-icon\n *ngIf=\"!dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >image</mat-icon\n >\n <mat-icon\n *ngIf=\"dragFilesOver && !uploadProgress && !uploadError\"\n class=\"material-symbols-outlined place-self-center text-blue-500\"\n >add_box</mat-icon\n >\n <div *ngIf=\"uploadProgress\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n [mode]=\"'determinate'\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n <span\n class=\"text-sm font-medium relative inline-block width-[30px] bottom-[40px] left-[15px]\"\n >\n {{ uploadProgress }}%\n </span>\n </div>\n <mat-icon\n *ngIf=\"uploadError\"\n class=\"material-symbols-outlined place-self-center text-rose-500\"\n >broken_image</mat-icon\n >\n </div>\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\">{{ getPrimaryText() | translate }}</p>\n <p\n class=\"text-sm\"\n [class]=\"\n uploadProgress || uploadError\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick()\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"showUrlInput || uploadProgress || uploadError\"\n />\n </label>\n <div *ngIf=\"!showUrlInput\" class=\"flex-none\">\n <gn-ui-button\n [extraClass]=\"'bg-gray-200 font-bold'\"\n (buttonClick)=\"displayUrlInput()\"\n >\n <mat-icon class=\"material-symbols-outlined me-1\">link</mat-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n <div *ngIf=\"showUrlInput\" class=\"flex-none flex flex-col gap-2\">\n <div class=\"h-2\"></div>\n <div class=\"flex gap-2 items-center\">\n <div class=\"flex-1 flex rounded-lg\">\n <span\n class=\"material-symbols-outlined px-4 inline-flex items-center min-w-fit rounded-s-lg border-2 border-e-0 border-gray-300\"\n >link</span\n >\n <input\n type=\"text\"\n class=\"py-3 ps-1 block w-full border-2 border-s-0 border-e-0 border-gray-300 text-sm font-medium\"\n placeholder=\"https://exemple.com/image.jpg\"\n (change)=\"handleUrlChange($event)\"\n />\n <gn-ui-button\n class=\"px-1 inline-flex items-center min-w-fit rounded-e-lg border-2 border-s-0 border-gray-300 text-white\"\n [extraClass]=\"\n urlInputValue && !downloadError ? 'bg-blue-500' : 'bg-gray-500'\n \"\n [disabled]=\"!urlInputValue || downloadError\"\n (buttonClick)=\"downloadUrl()\"\n >\n <mat-icon class=\"material-symbols-outlined\">arrow_upward</mat-icon>\n </gn-ui-button>\n </div>\n </div>\n </div>\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: "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"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i1$6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25403
25527
  }
25404
25528
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageInputComponent, decorators: [{
25405
25529
  type: Component,
@@ -25435,8 +25559,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25435
25559
 
25436
25560
  class UiInputsModule {
25437
25561
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25438
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25439
- AutocompleteComponent,
25562
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [AutocompleteComponent,
25440
25563
  TextInputComponent,
25441
25564
  DragAndDropFileInputComponent,
25442
25565
  ChipsInputComponent,
@@ -25444,11 +25567,9 @@ class UiInputsModule {
25444
25567
  StarToggleComponent,
25445
25568
  DropdownMultiselectComponent,
25446
25569
  ViewportIntersectorComponent,
25447
- CheckToggleComponent,
25448
25570
  CopyTextButtonComponent,
25449
25571
  CheckboxComponent,
25450
- SearchInputComponent,
25451
- DateRangePickerComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
25572
+ SearchInputComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
25452
25573
  FormsModule,
25453
25574
  ReactiveFormsModule,
25454
25575
  TagInputModule,
@@ -25466,7 +25587,10 @@ class UiInputsModule {
25466
25587
  EditableLabelDirective,
25467
25588
  TextAreaComponent,
25468
25589
  ButtonComponent,
25469
- ImageInputComponent], exports: [DropdownSelectorComponent,
25590
+ ImageInputComponent,
25591
+ DropdownSelectorComponent,
25592
+ DateRangePickerComponent,
25593
+ CheckToggleComponent], exports: [DropdownSelectorComponent,
25470
25594
  AutocompleteComponent,
25471
25595
  ButtonComponent,
25472
25596
  TextInputComponent,
@@ -25501,13 +25625,15 @@ class UiInputsModule {
25501
25625
  MatInputModule,
25502
25626
  MatDatepickerModule,
25503
25627
  MatNativeDateModule,
25504
- ImageInputComponent] }); }
25628
+ ImageInputComponent,
25629
+ DropdownSelectorComponent,
25630
+ DateRangePickerComponent,
25631
+ CheckToggleComponent] }); }
25505
25632
  }
25506
25633
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, decorators: [{
25507
25634
  type: NgModule,
25508
25635
  args: [{
25509
25636
  declarations: [
25510
- DropdownSelectorComponent,
25511
25637
  AutocompleteComponent,
25512
25638
  TextInputComponent,
25513
25639
  DragAndDropFileInputComponent,
@@ -25516,11 +25642,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25516
25642
  StarToggleComponent,
25517
25643
  DropdownMultiselectComponent,
25518
25644
  ViewportIntersectorComponent,
25519
- CheckToggleComponent,
25520
25645
  CopyTextButtonComponent,
25521
25646
  CheckboxComponent,
25522
25647
  SearchInputComponent,
25523
- DateRangePickerComponent,
25524
25648
  ],
25525
25649
  imports: [
25526
25650
  CommonModule,
@@ -25544,6 +25668,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25544
25668
  TextAreaComponent,
25545
25669
  ButtonComponent,
25546
25670
  ImageInputComponent,
25671
+ DropdownSelectorComponent,
25672
+ DateRangePickerComponent,
25673
+ CheckToggleComponent,
25547
25674
  ],
25548
25675
  exports: [
25549
25676
  DropdownSelectorComponent,
@@ -25568,34 +25695,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25568
25695
  }]
25569
25696
  }] });
25570
25697
 
25698
+ class PreviousNextButtonsComponent {
25699
+ constructor() {
25700
+ this.directionButtonClicked = new EventEmitter();
25701
+ }
25702
+ previousButtonClicked() {
25703
+ this.directionButtonClicked.next('previous');
25704
+ }
25705
+ nextButtonClicked() {
25706
+ this.directionButtonClicked.next('next');
25707
+ }
25708
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PreviousNextButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25709
+ 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 }); }
25710
+ }
25711
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PreviousNextButtonsComponent, decorators: [{
25712
+ type: Component,
25713
+ 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"] }]
25714
+ }], propDecorators: { isFirst: [{
25715
+ type: Input
25716
+ }], isLast: [{
25717
+ type: Input
25718
+ }], directionButtonClicked: [{
25719
+ type: Output
25720
+ }] } });
25721
+
25571
25722
  class AddLayerFromOgcApiComponent {
25572
25723
  constructor(changeDetectorRef) {
25573
25724
  this.changeDetectorRef = changeDetectorRef;
25574
25725
  this.layerAdded = new EventEmitter();
25575
25726
  this.urlChange = new Subject();
25576
- this.layerUrl = '';
25577
25727
  this.loading = false;
25578
25728
  this.layers = [];
25579
- this.ogcEndpoint = null;
25580
25729
  this.errorMessage = null;
25730
+ this.selectedLayerTypes = {};
25581
25731
  }
25582
25732
  ngOnInit() {
25583
25733
  this.urlChange.pipe(debounceTime$1(700)).subscribe(() => {
25584
25734
  this.loadLayers();
25585
- this.changeDetectorRef.detectChanges(); // manually trigger change detection
25586
25735
  });
25587
25736
  }
25588
25737
  async loadLayers() {
25589
25738
  this.errorMessage = null;
25590
25739
  try {
25591
25740
  this.loading = true;
25592
- if (this.ogcUrl.trim() === '') {
25741
+ if (!this.ogcUrl.trim()) {
25593
25742
  this.layers = [];
25594
25743
  return;
25595
25744
  }
25596
- this.ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl);
25597
- // Currently only supports feature collections
25598
- this.layers = await this.ogcEndpoint.featureCollections;
25745
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl);
25746
+ this.layers = await ogcEndpoint.allCollections;
25747
+ this.setDefaultLayerTypes();
25599
25748
  }
25600
25749
  catch (error) {
25601
25750
  const err = error;
@@ -25607,21 +25756,75 @@ class AddLayerFromOgcApiComponent {
25607
25756
  this.changeDetectorRef.markForCheck();
25608
25757
  }
25609
25758
  }
25610
- async addLayer(layer) {
25611
- this.layerUrl = await this.ogcEndpoint.getCollectionItemsUrl(layer);
25612
- const layerToAdd = {
25613
- name: layer,
25614
- url: this.layerUrl,
25615
- type: MapContextLayerTypeEnum.OGCAPI,
25616
- };
25617
- this.layerAdded.emit({ ...layerToAdd, title: layer });
25759
+ setDefaultLayerTypes() {
25760
+ this.layers.forEach((layer) => {
25761
+ const choices = this.getLayerChoices(layer);
25762
+ if (choices.length > 0) {
25763
+ this.selectedLayerTypes[layer.name] = choices[0].value;
25764
+ }
25765
+ });
25766
+ }
25767
+ getLayerChoices(layer) {
25768
+ const choices = [];
25769
+ if (layer.hasRecords) {
25770
+ choices.push({ label: 'Records', value: 'record' });
25771
+ }
25772
+ if (layer.hasFeatures) {
25773
+ choices.push({ label: 'Features', value: 'features' });
25774
+ }
25775
+ if (layer.hasVectorTiles) {
25776
+ choices.push({ label: 'Vector Tiles', value: 'vectorTiles' });
25777
+ }
25778
+ if (layer.hasMapTiles) {
25779
+ choices.push({ label: 'Map Tiles', value: 'mapTiles' });
25780
+ }
25781
+ return choices;
25782
+ }
25783
+ shouldDisplayLayer(layer) {
25784
+ return (layer.hasRecords ||
25785
+ layer.hasFeatures ||
25786
+ layer.hasVectorTiles ||
25787
+ layer.hasMapTiles);
25788
+ }
25789
+ onLayerTypeSelect(layerName, selectedType) {
25790
+ this.selectedLayerTypes[layerName] = selectedType
25791
+ ? selectedType
25792
+ : this.getLayerChoices(layerName)[0]?.value;
25793
+ }
25794
+ async addLayer(layer, layerType) {
25795
+ try {
25796
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl);
25797
+ let layerUrl;
25798
+ if (layerType === 'vectorTiles') {
25799
+ layerUrl = await ogcEndpoint.getVectorTilesetUrl(layer);
25800
+ }
25801
+ else if (layerType === 'mapTiles') {
25802
+ layerUrl = await ogcEndpoint.getMapTilesetUrl(layer);
25803
+ }
25804
+ else {
25805
+ layerUrl = await ogcEndpoint.getCollectionItemsUrl(layer, {
25806
+ outputFormat: 'json',
25807
+ });
25808
+ }
25809
+ const layerToAdd = {
25810
+ name: layer,
25811
+ url: layerUrl,
25812
+ type: MapContextLayerTypeEnum.OGCAPI,
25813
+ layerType: layerType,
25814
+ };
25815
+ this.layerAdded.emit({ ...layerToAdd, title: layer });
25816
+ }
25817
+ catch (error) {
25818
+ const err = error;
25819
+ console.error('Error adding layer:', err.message);
25820
+ }
25618
25821
  }
25619
25822
  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 }); }
25620
- 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"] }] }); }
25823
+ 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"] }] }); }
25621
25824
  }
25622
25825
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromOgcApiComponent, decorators: [{
25623
25826
  type: Component,
25624
- 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" }]
25827
+ 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"] }]
25625
25828
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { ogcUrl: [{
25626
25829
  type: Input
25627
25830
  }], layerAdded: [{
@@ -26363,7 +26566,8 @@ class ApiCardComponent {
26363
26566
  }
26364
26567
  ngOnInit() {
26365
26568
  this.displayApiFormButton =
26366
- this.link.accessServiceProtocol === 'ogcFeatures' ? true : false;
26569
+ this.link.accessServiceProtocol === 'ogcFeatures' ||
26570
+ this.link.accessServiceProtocol === 'wfs';
26367
26571
  }
26368
26572
  ngOnChanges(changes) {
26369
26573
  this.currentlyActive =
@@ -26376,7 +26580,7 @@ class ApiCardComponent {
26376
26580
  }
26377
26581
  }
26378
26582
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26379
- 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$1.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 }); }
26583
+ 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 }); }
26380
26584
  }
26381
26585
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, decorators: [{
26382
26586
  type: Component,
@@ -26507,7 +26711,7 @@ class DownloadsListComponent {
26507
26711
  return getBadgeColor(getFileFormat(link));
26508
26712
  }
26509
26713
  isFromWfs(link) {
26510
- return link.type === 'service' && link.accessServiceProtocol === 'wfs';
26714
+ return link.type === 'download' && link.accessServiceProtocol === 'wfs';
26511
26715
  }
26512
26716
  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 }); }
26513
26717
  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 }); }
@@ -26539,14 +26743,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26539
26743
  }] } });
26540
26744
 
26541
26745
  class LinkCardComponent {
26746
+ constructor() {
26747
+ this.compact = false;
26748
+ }
26749
+ get title() {
26750
+ if (this.link.name && this.link.description) {
26751
+ return `${this.link.name} | ${this.link.description}`;
26752
+ }
26753
+ return this.link.name || this.link.description || '';
26754
+ }
26542
26755
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26543
- 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 }); }
26756
+ 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 }); }
26544
26757
  }
26545
26758
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, decorators: [{
26546
26759
  type: Component,
26547
- 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" }]
26760
+ 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" }]
26548
26761
  }], propDecorators: { link: [{
26549
26762
  type: Input
26763
+ }], compact: [{
26764
+ type: Input
26550
26765
  }] } });
26551
26766
 
26552
26767
  class MarkdownParserComponent {
@@ -27005,43 +27220,36 @@ const DEFAULT_PARAMS = {
27005
27220
  };
27006
27221
  class RecordApiFormComponent {
27007
27222
  constructor() {
27008
- this.offset$ = new BehaviorSubject('');
27009
- this.limit$ = new BehaviorSubject('');
27010
- this.format$ = new BehaviorSubject('');
27011
- this.formatsList = [
27012
- { label: 'JSON', value: 'json' },
27013
- { label: 'CSV', value: 'csv' },
27014
- ];
27015
- this.apiQueryUrl$ = combineLatest([this.offset$, this.limit$, this.format$]).pipe(map$2(([offset, limit, format]) => {
27016
- let outputUrl;
27017
- if (this.apiBaseUrl) {
27018
- const url = new URL(this.apiBaseUrl);
27019
- const params = { offset: offset, limit: limit, f: format };
27020
- for (const [key, value] of Object.entries(params)) {
27021
- if (value && value !== '0') {
27022
- url.searchParams.set(key, value);
27023
- }
27024
- else {
27025
- url.searchParams.delete(key);
27026
- }
27027
- }
27028
- outputUrl = url.toString();
27029
- }
27030
- return outputUrl;
27031
- }));
27223
+ this.offset$ = new BehaviorSubject(DEFAULT_PARAMS.OFFSET);
27224
+ this.limit$ = new BehaviorSubject(DEFAULT_PARAMS.LIMIT);
27225
+ this.format$ = new BehaviorSubject(DEFAULT_PARAMS.FORMAT);
27226
+ this.endpoint$ = new BehaviorSubject(undefined);
27227
+ this.supportOffset = true;
27228
+ this.outputFormats = [{ value: 'json', label: 'JSON' }];
27229
+ this.apiQueryUrl$ = combineLatest([
27230
+ this.offset$,
27231
+ this.limit$,
27232
+ this.format$,
27233
+ this.endpoint$,
27234
+ ]).pipe(switchMap(([offset, limit, format]) => this.generateApiQueryUrl(offset, limit, format)));
27032
27235
  this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
27033
27236
  this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
27034
27237
  }
27035
27238
  set apiLink(value) {
27036
- this.apiBaseUrl = value ? value.url.href : undefined;
27239
+ this.outputFormats = [{ value: 'json', label: 'JSON' }];
27240
+ this.accessServiceProtocol = value ? value.accessServiceProtocol : undefined;
27241
+ this.apiFeatureType = value ? value.name : undefined;
27242
+ if (value) {
27243
+ this.apiBaseUrl = value.url.href;
27244
+ this.createEndpoint().then(() => this.parseOutputFormats());
27245
+ }
27037
27246
  this.resetUrl();
27038
27247
  }
27039
27248
  setOffset(value) {
27040
27249
  this.offset$.next(value);
27041
27250
  }
27042
27251
  setLimit(value) {
27043
- const newLimit = value === '' ? '-1' : value;
27044
- this.limit$.next(newLimit);
27252
+ this.limit$.next(value === '' ? '-1' : value);
27045
27253
  }
27046
27254
  setFormat(value) {
27047
27255
  this.format$.next(String(value));
@@ -27051,19 +27259,86 @@ class RecordApiFormComponent {
27051
27259
  this.limit$.next(DEFAULT_PARAMS.LIMIT);
27052
27260
  this.format$.next(DEFAULT_PARAMS.FORMAT);
27053
27261
  }
27262
+ async parseOutputFormats() {
27263
+ if (!this.endpoint)
27264
+ return;
27265
+ const apiUrl = this.apiBaseUrl.endsWith('?')
27266
+ ? this.apiBaseUrl.slice(0, -1)
27267
+ : this.apiBaseUrl;
27268
+ const outputFormats = await this.getOutputFormats(apiUrl);
27269
+ const formatsList = outputFormats.itemFormats
27270
+ ? this.mapFormats(outputFormats.itemFormats)
27271
+ : this.mapFormats(outputFormats.outputFormats || []);
27272
+ this.outputFormats = this.outputFormats
27273
+ .concat(formatsList.filter(Boolean))
27274
+ .filter((format, index, self) => index === self.findIndex((t) => t.value === format.value))
27275
+ .sort((a, b) => a.label.localeCompare(b.label));
27276
+ }
27277
+ mapFormats(formats) {
27278
+ return formats.map((format) => {
27279
+ const normalizedFormat = mimeTypeToFormat(format);
27280
+ return normalizedFormat
27281
+ ? { label: normalizedFormat.toUpperCase(), value: normalizedFormat }
27282
+ : null;
27283
+ });
27284
+ }
27285
+ async getOutputFormats(url) {
27286
+ if (!this.endpoint)
27287
+ return {};
27288
+ if (this.endpoint instanceof WfsEndpoint) {
27289
+ this.supportOffset = this.endpoint.supportsStartIndex();
27290
+ return this.endpoint.getServiceInfo();
27291
+ }
27292
+ else {
27293
+ {
27294
+ return (await this.endpoint.getCollectionInfo(this.firstCollection));
27295
+ }
27296
+ }
27297
+ }
27298
+ async createEndpoint() {
27299
+ if (!this.apiBaseUrl || !this.accessServiceProtocol)
27300
+ return;
27301
+ if (this.accessServiceProtocol === 'wfs') {
27302
+ this.endpoint = new WfsEndpoint(this.apiBaseUrl);
27303
+ await this.endpoint.isReady();
27304
+ }
27305
+ else {
27306
+ this.endpoint = new OgcApiEndpoint(this.apiBaseUrl);
27307
+ this.firstCollection = (await this.endpoint.featureCollections)[0];
27308
+ }
27309
+ this.endpoint$.next(this.endpoint);
27310
+ }
27311
+ async generateApiQueryUrl(offset, limit, format) {
27312
+ if (!this.apiBaseUrl || !this.endpoint || !this.apiFeatureType)
27313
+ return '';
27314
+ const options = {
27315
+ outputFormat: format,
27316
+ startIndex: offset ? Number(offset) : undefined,
27317
+ maxFeatures: limit !== '-1' ? Number(limit) : undefined,
27318
+ limit: limit !== '-1' ? Number(limit) : limit === '-1' ? -1 : undefined,
27319
+ offset: offset !== '' ? Number(offset) : undefined,
27320
+ };
27321
+ if (this.endpoint instanceof WfsEndpoint) {
27322
+ options.maxFeatures = limit !== '-1' ? Number(limit) : undefined;
27323
+ return this.endpoint.getFeatureUrl(this.apiFeatureType, options);
27324
+ }
27325
+ else {
27326
+ return await this.endpoint.getCollectionItemsUrl(this.firstCollection, options);
27327
+ }
27328
+ }
27054
27329
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27055
- 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]=\"formatsList\"\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 }); }
27330
+ 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 }); }
27056
27331
  }
27057
27332
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
27058
27333
  type: Component,
27059
- 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]=\"formatsList\"\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"] }]
27334
+ 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"] }]
27060
27335
  }], propDecorators: { apiLink: [{
27061
27336
  type: Input
27062
27337
  }] } });
27063
27338
 
27064
27339
  class RelatedRecordCardComponent {
27065
27340
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27066
- 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$1.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 }); }
27341
+ 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 }); }
27067
27342
  }
27068
27343
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
27069
27344
  type: Component,
@@ -27159,48 +27434,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27159
27434
  }] } });
27160
27435
 
27161
27436
  class CarouselComponent {
27437
+ get isFirstStep() {
27438
+ return this.currentStep === 0;
27439
+ }
27440
+ get isLastStep() {
27441
+ return this.currentStep === this.steps.length - 1;
27442
+ }
27443
+ get stepsCount() {
27444
+ return this.steps.length;
27445
+ }
27162
27446
  constructor(changeDetector) {
27163
27447
  this.changeDetector = changeDetector;
27164
27448
  this.containerClass = '';
27165
- this.stepsContainerClass = '';
27449
+ this.stepsContainerClass = 'w-full bottom-0 top-auto';
27450
+ this.currentStepChange = new EventEmitter();
27166
27451
  this.steps = [];
27167
- this.selectedStep = -1;
27452
+ this.currentStep = 0;
27453
+ this.refreshSteps = () => {
27454
+ this.steps = this.emblaApi.scrollSnapList();
27455
+ this.currentStep = this.emblaApi.selectedScrollSnap();
27456
+ this.currentStepChange.emit(this.currentStep);
27457
+ this.changeDetector.detectChanges();
27458
+ };
27168
27459
  }
27169
27460
  ngAfterViewInit() {
27170
27461
  this.emblaApi = EmblaCarousel(this.carouselOverflowContainer.nativeElement, {
27171
27462
  duration: 15,
27172
27463
  });
27173
- const refreshSteps = () => {
27174
- this.steps = this.emblaApi.scrollSnapList();
27175
- this.selectedStep = this.emblaApi.selectedScrollSnap();
27176
- this.changeDetector.detectChanges();
27177
- };
27178
27464
  this.emblaApi
27179
- .on('init', refreshSteps)
27180
- .on('reInit', refreshSteps)
27181
- .on('select', refreshSteps);
27465
+ .on('init', this.refreshSteps)
27466
+ .on('reInit', this.refreshSteps)
27467
+ .on('select', this.refreshSteps);
27182
27468
  }
27183
27469
  scrollToStep(stepIndex) {
27184
27470
  this.emblaApi.scrollTo(stepIndex);
27185
27471
  }
27472
+ slideToPrevious() {
27473
+ if (this.isFirstStep)
27474
+ return;
27475
+ this.emblaApi.scrollPrev();
27476
+ }
27477
+ slideToNext() {
27478
+ if (this.isLastStep)
27479
+ return;
27480
+ this.emblaApi.scrollNext();
27481
+ }
27186
27482
  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 }); }
27187
- 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 }); }
27483
+ 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 }); }
27188
27484
  }
27189
27485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
27190
27486
  type: Component,
27191
- 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"] }]
27192
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
27487
+ 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"] }]
27488
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { carouselOverflowContainer: [{
27489
+ type: ViewChild,
27490
+ args: ['carouselOverflowContainer']
27491
+ }], containerClass: [{
27193
27492
  type: Input
27194
27493
  }], stepsContainerClass: [{
27195
27494
  type: Input
27196
- }], carouselOverflowContainer: [{
27197
- type: ViewChild,
27198
- args: ['carouselOverflowContainer']
27495
+ }], currentStepChange: [{
27496
+ type: Output
27199
27497
  }] } });
27200
27498
 
27201
27499
  class FormFieldWrapperComponent {
27202
27500
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27203
- 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$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27501
+ 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 }); }
27204
27502
  }
27205
27503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
27206
27504
  type: Component,
@@ -27349,17 +27647,87 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27349
27647
  args: ['innerContainer']
27350
27648
  }] } });
27351
27649
 
27650
+ class BlockListComponent {
27651
+ get pages() {
27652
+ return new Array(this.pagesCount).fill(0).map((_, i) => i);
27653
+ }
27654
+ get isFirstPage() {
27655
+ return this.currentPage === 0;
27656
+ }
27657
+ get isLastPage() {
27658
+ return this.currentPage === this.pagesCount - 1;
27659
+ }
27660
+ get pagesCount() {
27661
+ return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
27662
+ }
27663
+ constructor(changeDetector) {
27664
+ this.changeDetector = changeDetector;
27665
+ this.pageSize = 5;
27666
+ this.containerClass = '';
27667
+ this.paginationContainerClass = 'w-full bottom-0 top-auto';
27668
+ this.minHeight = 0;
27669
+ this.currentPage = 0;
27670
+ this.refreshBlocksVisibility = () => {
27671
+ this.blocks.forEach((block, index) => {
27672
+ block.nativeElement.style.display =
27673
+ index >= this.currentPage * this.pageSize &&
27674
+ index < (this.currentPage + 1) * this.pageSize
27675
+ ? null
27676
+ : 'none';
27677
+ });
27678
+ };
27679
+ }
27680
+ ngAfterViewInit() {
27681
+ this.blocks.changes.subscribe(this.refreshBlocksVisibility);
27682
+ this.refreshBlocksVisibility();
27683
+ // we store the first height as the min-height of the list container
27684
+ this.minHeight = this.blockContainer.nativeElement.clientHeight;
27685
+ this.changeDetector.detectChanges();
27686
+ }
27687
+ goToPage(index) {
27688
+ this.currentPage = Math.max(Math.min(index, this.pagesCount - 1), 0);
27689
+ this.changeDetector.detectChanges();
27690
+ this.refreshBlocksVisibility();
27691
+ }
27692
+ previousPage() {
27693
+ if (this.isFirstPage)
27694
+ return;
27695
+ this.goToPage(this.currentPage - 1);
27696
+ }
27697
+ nextPage() {
27698
+ if (this.isLastPage)
27699
+ return;
27700
+ this.goToPage(this.currentPage + 1);
27701
+ }
27702
+ 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 }); }
27703
+ 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 }); }
27704
+ }
27705
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BlockListComponent, decorators: [{
27706
+ type: Component,
27707
+ 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"] }]
27708
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { pageSize: [{
27709
+ type: Input
27710
+ }], containerClass: [{
27711
+ type: Input
27712
+ }], paginationContainerClass: [{
27713
+ type: Input
27714
+ }], blocks: [{
27715
+ type: ContentChildren,
27716
+ args: ['block', { read: ElementRef }]
27717
+ }], blockContainer: [{
27718
+ type: ViewChild,
27719
+ args: ['blockContainer']
27720
+ }] } });
27721
+
27352
27722
  class UiLayoutModule {
27353
27723
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27354
27724
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, declarations: [ExpandablePanelComponent,
27355
27725
  StickyHeaderComponent,
27356
27726
  AnchorLinkDirective,
27357
- ExpandablePanelButtonComponent,
27358
- CarouselComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
27727
+ ExpandablePanelButtonComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
27359
27728
  StickyHeaderComponent,
27360
27729
  AnchorLinkDirective,
27361
- ExpandablePanelButtonComponent,
27362
- CarouselComponent] }); }
27730
+ ExpandablePanelButtonComponent] }); }
27363
27731
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, imports: [CommonModule, MatIconModule, TranslateModule.forChild()] }); }
27364
27732
  }
27365
27733
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, decorators: [{
@@ -27371,14 +27739,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27371
27739
  StickyHeaderComponent,
27372
27740
  AnchorLinkDirective,
27373
27741
  ExpandablePanelButtonComponent,
27374
- CarouselComponent,
27375
27742
  ],
27376
27743
  exports: [
27377
27744
  ExpandablePanelComponent,
27378
27745
  StickyHeaderComponent,
27379
27746
  AnchorLinkDirective,
27380
27747
  ExpandablePanelButtonComponent,
27381
- CarouselComponent,
27382
27748
  ],
27383
27749
  }]
27384
27750
  }] });
@@ -27388,7 +27754,7 @@ class UserPreviewComponent {
27388
27754
  return (this.user.name + ' ' + this.user.surname).trim();
27389
27755
  }
27390
27756
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27391
- 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$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27757
+ 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 }); }
27392
27758
  }
27393
27759
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserPreviewComponent, decorators: [{
27394
27760
  type: Component,
@@ -27484,17 +27850,15 @@ class UserFeedbackItemComponent {
27484
27850
  this.onNewAnswerValueChange();
27485
27851
  }
27486
27852
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27487
- 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 }); }
27853
+ 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 }); }
27488
27854
  }
27489
27855
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, decorators: [{
27490
27856
  type: Component,
27491
- 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" }]
27857
+ 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" }]
27492
27858
  }], propDecorators: { userFeedbackParent: [{
27493
27859
  type: Input
27494
27860
  }], userFeedBacksAnswers: [{
27495
27861
  type: Input
27496
- }], isActiveUserEditor: [{
27497
- type: Input
27498
27862
  }], activeUser: [{
27499
27863
  type: Input
27500
27864
  }], isLastComment: [{
@@ -27512,7 +27876,6 @@ class UiElementsModule {
27512
27876
  DownloadItemComponent,
27513
27877
  DownloadsListComponent,
27514
27878
  ApiCardComponent,
27515
- LinkCardComponent,
27516
27879
  RelatedRecordCardComponent,
27517
27880
  MetadataContactComponent,
27518
27881
  MetadataCatalogComponent,
@@ -27543,7 +27906,6 @@ class UiElementsModule {
27543
27906
  DownloadItemComponent,
27544
27907
  DownloadsListComponent,
27545
27908
  ApiCardComponent,
27546
- LinkCardComponent,
27547
27909
  RelatedRecordCardComponent,
27548
27910
  MetadataContactComponent,
27549
27911
  MetadataCatalogComponent,
@@ -27597,7 +27959,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27597
27959
  DownloadItemComponent,
27598
27960
  DownloadsListComponent,
27599
27961
  ApiCardComponent,
27600
- LinkCardComponent,
27601
27962
  RelatedRecordCardComponent,
27602
27963
  MetadataContactComponent,
27603
27964
  MetadataCatalogComponent,
@@ -27620,7 +27981,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27620
27981
  DownloadItemComponent,
27621
27982
  DownloadsListComponent,
27622
27983
  ApiCardComponent,
27623
- LinkCardComponent,
27624
27984
  RelatedRecordCardComponent,
27625
27985
  MetadataContactComponent,
27626
27986
  MetadataCatalogComponent,
@@ -28889,7 +29249,7 @@ class ResultsLayoutComponent {
28889
29249
  this.searchFacade.setResultsLayout(layout);
28890
29250
  }
28891
29251
  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 }); }
28892
- 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" }] }); }
29252
+ 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" }] }); }
28893
29253
  }
28894
29254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsLayoutComponent, decorators: [{
28895
29255
  type: Component,
@@ -29097,7 +29457,7 @@ class SortByComponent {
29097
29457
  this.searchService.setSortBy(criteriaAsString.split(','));
29098
29458
  }
29099
29459
  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 }); }
29100
- 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" }] }); }
29460
+ 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" }] }); }
29101
29461
  }
29102
29462
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SortByComponent, decorators: [{
29103
29463
  type: Component,
@@ -29965,7 +30325,7 @@ class AddLayerFromWmsComponent {
29965
30325
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
29966
30326
  }
29967
30327
  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 }); }
29968
- 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" }] }); }
30328
+ 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" }] }); }
29969
30329
  }
29970
30330
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, decorators: [{
29971
30331
  type: Component,
@@ -30116,7 +30476,7 @@ class AddLayerFromWfsComponent {
30116
30476
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
30117
30477
  }
30118
30478
  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 }); }
30119
- 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" }] }); }
30479
+ 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" }] }); }
30120
30480
  }
30121
30481
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
30122
30482
  type: Component,
@@ -30136,7 +30496,7 @@ class LayersPanelComponent {
30136
30496
  this.mapFacade.addLayer(layer);
30137
30497
  }
30138
30498
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, deps: [{ token: MapFacade }], target: i0.ɵɵFactoryTarget.Component }); }
30139
- 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 }); }
30499
+ 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 }); }
30140
30500
  }
30141
30501
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LayersPanelComponent, decorators: [{
30142
30502
  type: Component,
@@ -30605,14 +30965,12 @@ on(setChartConfig, (state, { chartConfig }) => ({
30605
30965
  */
30606
30966
  on(loadUserFeedbacks, (state) => ({
30607
30967
  ...state,
30608
- error: null,
30609
30968
  allUserFeedbacksLoading: true,
30610
30969
  })), on(addUserFeedback, (state) => ({
30611
30970
  ...state,
30612
30971
  addUserFeedbackLoading: true,
30613
30972
  })), on(loadUserFeedbacksSuccess, (state, { userFeedbacks }) => ({
30614
30973
  ...state,
30615
- error: null,
30616
30974
  userFeedbacks: userFeedbacks,
30617
30975
  addUserFeedbackLoading: false,
30618
30976
  allUserFeedbacksLoading: false,
@@ -30994,7 +31352,7 @@ class TableComponent {
30994
31352
  return rowIdPrefix + id;
30995
31353
  }
30996
31354
  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 }); }
30997
- 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$3.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 }); }
31355
+ 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 }); }
30998
31356
  }
30999
31357
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TableComponent, decorators: [{
31000
31358
  type: Component,
@@ -31864,6 +32222,7 @@ marker('wfs.unreachable.http');
31864
32222
  marker('wfs.unreachable.unknown');
31865
32223
  marker('wfs.featuretype.notfound');
31866
32224
  marker('wfs.geojsongml.notsupported');
32225
+ marker('ogc.unreachable.unknown');
31867
32226
  marker('dataset.error.network');
31868
32227
  marker('dataset.error.http');
31869
32228
  marker('dataset.error.parse');
@@ -31943,6 +32302,27 @@ class DataService {
31943
32302
  mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
31944
32303
  }))));
31945
32304
  }
32305
+ async getDownloadLinksFromOgcApiFeatures(ogcApiLink) {
32306
+ const collectionInfo = await this.getDownloadUrlsFromOgcApi(ogcApiLink.url.href);
32307
+ return Object.keys(collectionInfo.bulkDownloadLinks).map((downloadLink) => {
32308
+ return {
32309
+ ...ogcApiLink,
32310
+ type: 'download',
32311
+ url: new URL(collectionInfo.bulkDownloadLinks[downloadLink]),
32312
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(downloadLink)),
32313
+ };
32314
+ });
32315
+ }
32316
+ async getDownloadUrlsFromOgcApi(url) {
32317
+ const endpoint = new OgcApiEndpoint(this.proxy.getProxiedUrl(url));
32318
+ return await endpoint.featureCollections
32319
+ .then((collections) => {
32320
+ return endpoint.getCollectionInfo(collections[0]);
32321
+ })
32322
+ .catch((error) => {
32323
+ throw new Error(`ogc.unreachable.unknown`);
32324
+ });
32325
+ }
31946
32326
  getDownloadLinksFromEsriRest(esriRestLink) {
31947
32327
  return ['json', 'geojson'].map((format) => ({
31948
32328
  ...esriRestLink,
@@ -31986,6 +32366,17 @@ class DataService {
31986
32366
  const url = this.getDownloadUrlFromEsriRest(link.url.toString(), 'geojson');
31987
32367
  return from(openDataset(url, 'geojson')).pipe();
31988
32368
  }
32369
+ else if (link.type === 'service' &&
32370
+ link.accessServiceProtocol === 'ogcFeatures') {
32371
+ return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
32372
+ const geojsonUrl = collectionInfo.jsonDownloadLink;
32373
+ return openDataset(geojsonUrl, 'geojson');
32374
+ }), tap$1((url) => {
32375
+ if (url === null) {
32376
+ throw new Error('wfs.geojsongml.notsupported');
32377
+ }
32378
+ }));
32379
+ }
31989
32380
  return throwError(() => 'protocol not supported');
31990
32381
  }
31991
32382
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -32212,7 +32603,7 @@ class ChartViewComponent {
32212
32603
  this.changeDetector.detectChanges();
32213
32604
  }
32214
32605
  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 }); }
32215
- 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 }); }
32606
+ 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 }); }
32216
32607
  }
32217
32608
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChartViewComponent, decorators: [{
32218
32609
  type: Component,
@@ -32444,7 +32835,8 @@ class MapViewComponent {
32444
32835
  }
32445
32836
  else if ((link.type === 'service' &&
32446
32837
  (link.accessServiceProtocol === 'wfs' ||
32447
- link.accessServiceProtocol === 'esriRest')) ||
32838
+ link.accessServiceProtocol === 'esriRest' ||
32839
+ link.accessServiceProtocol === 'ogcFeatures')) ||
32448
32840
  link.type === 'download') {
32449
32841
  return this.dataService.readAsGeoJson(link).pipe(map$1((data) => ({
32450
32842
  type: MapContextLayerTypeEnum.GEOJSON,
@@ -32457,7 +32849,7 @@ class MapViewComponent {
32457
32849
  this.selectedLinkIndex$.next(link);
32458
32850
  }
32459
32851
  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 }); }
32460
- 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 }); }
32852
+ 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 }); }
32461
32853
  }
32462
32854
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MapViewComponent, decorators: [{
32463
32855
  type: Component,
@@ -32495,7 +32887,7 @@ class DataViewComponent {
32495
32887
  this.selectedLink$.next(link);
32496
32888
  }
32497
32889
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataViewComponent, deps: [{ token: MdViewFacade }], target: i0.ɵɵFactoryTarget.Component }); }
32498
- 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 }); }
32890
+ 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 }); }
32499
32891
  }
32500
32892
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataViewComponent, decorators: [{
32501
32893
  type: Component,
@@ -32589,7 +32981,7 @@ class OrganisationsFilterComponent {
32589
32981
  this.filterByValueChange.next(inputValue);
32590
32982
  }
32591
32983
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationsFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
32592
- 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 }); }
32984
+ 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 }); }
32593
32985
  }
32594
32986
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: OrganisationsFilterComponent, decorators: [{
32595
32987
  type: Component,
@@ -32629,7 +33021,7 @@ class LanguageSwitcherComponent {
32629
33021
  this.translate.use(value);
32630
33022
  }
32631
33023
  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 }); }
32632
- 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"] }] }); }
33024
+ 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"] }] }); }
32633
33025
  }
32634
33026
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
32635
33027
  type: Component,
@@ -33042,7 +33434,7 @@ class DataViewShareComponent {
33042
33434
  this.wcEmbedderBaseUrl = wcEmbedderBaseUrl;
33043
33435
  }
33044
33436
  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 }); }
33045
- 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 }); }
33437
+ 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 }); }
33046
33438
  }
33047
33439
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataViewShareComponent, decorators: [{
33048
33440
  type: Component,
@@ -33171,6 +33563,27 @@ const DEFAULT_FIELDS = [
33171
33563
  },
33172
33564
  onSaveProcess: '${dateNow()}',
33173
33565
  },
33566
+ {
33567
+ model: 'licenses',
33568
+ formFieldConfig: {
33569
+ labelKey: marker('editor.record.form.license'),
33570
+ type: 'list',
33571
+ },
33572
+ },
33573
+ {
33574
+ model: 'resourceUpdated',
33575
+ formFieldConfig: {
33576
+ labelKey: marker('editor.record.form.resourceUpdated'),
33577
+ type: 'date',
33578
+ },
33579
+ },
33580
+ {
33581
+ model: 'updateFrequency',
33582
+ formFieldConfig: {
33583
+ labelKey: marker('editor.record.form.updateFrequency'),
33584
+ type: 'text',
33585
+ },
33586
+ },
33174
33587
  ];
33175
33588
 
33176
33589
  const EDITOR_FEATURE_KEY = 'editor';
@@ -33555,7 +33968,7 @@ class WizardFieldComponent {
33555
33968
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
33556
33969
  },
33557
33970
  { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
33558
- ], 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: i3$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i3$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33971
+ ], 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 }); }
33559
33972
  }
33560
33973
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardFieldComponent, decorators: [{
33561
33974
  type: Component,
@@ -33884,6 +34297,174 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33884
34297
  args: [{ selector: 'gn-ui-form-field-temporal-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-temporal-extent works!</p>\n" }]
33885
34298
  }] });
33886
34299
 
34300
+ class FormFieldLicenseComponent {
34301
+ constructor() {
34302
+ this.choices = [
34303
+ {
34304
+ value: 'cc-by',
34305
+ label: marker('editor.record.form.license.cc-by'),
34306
+ },
34307
+ {
34308
+ value: 'cc-by-sa',
34309
+ label: marker('editor.record.form.license.cc-by-sa'),
34310
+ },
34311
+ {
34312
+ value: 'cc-zero',
34313
+ label: marker('editor.record.form.license.cc-zero'),
34314
+ },
34315
+ {
34316
+ value: 'etalab',
34317
+ label: marker('editor.record.form.license.etalab'),
34318
+ },
34319
+ {
34320
+ value: 'etalab-v2',
34321
+ label: marker('editor.record.form.license.etalab-v2'),
34322
+ },
34323
+ {
34324
+ value: 'odbl',
34325
+ label: marker('editor.record.form.license.odbl'),
34326
+ },
34327
+ {
34328
+ value: 'odc-by',
34329
+ label: marker('editor.record.form.license.odc-by'),
34330
+ },
34331
+ {
34332
+ value: 'pddl',
34333
+ label: marker('editor.record.form.license.pddl'),
34334
+ },
34335
+ {
34336
+ value: 'unknown',
34337
+ label: marker('editor.record.form.license.unknown'),
34338
+ },
34339
+ ];
34340
+ }
34341
+ get selected() {
34342
+ return this.control.value[0]?.text;
34343
+ }
34344
+ onSelectValue(value) {
34345
+ this.control.setValue([{ text: value }]);
34346
+ }
34347
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34348
+ 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 }); }
34349
+ }
34350
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, decorators: [{
34351
+ type: Component,
34352
+ args: [{ selector: 'gn-ui-form-field-license', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [DropdownSelectorComponent], 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" }]
34353
+ }], propDecorators: { control: [{
34354
+ type: Input
34355
+ }], label: [{
34356
+ type: Input
34357
+ }] } });
34358
+
34359
+ class FormFieldResourceUpdatedComponent {
34360
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldResourceUpdatedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34361
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldResourceUpdatedComponent, isStandalone: true, selector: "gn-ui-form-field-resource-updated", inputs: { control: "control" }, ngImport: i0, template: "<gn-ui-date-picker\n [date]=\"control.value\"\n (dateChange)=\"control.setValue($event)\"\n></gn-ui-date-picker>\n", styles: [""], dependencies: [{ kind: "component", type: DatePickerComponent, selector: "gn-ui-date-picker", inputs: ["date"], outputs: ["dateChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34362
+ }
34363
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldResourceUpdatedComponent, decorators: [{
34364
+ type: Component,
34365
+ args: [{ selector: 'gn-ui-form-field-resource-updated', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [DatePickerComponent], template: "<gn-ui-date-picker\n [date]=\"control.value\"\n (dateChange)=\"control.setValue($event)\"\n></gn-ui-date-picker>\n" }]
34366
+ }], propDecorators: { control: [{
34367
+ type: Input
34368
+ }] } });
34369
+
34370
+ class FormFieldUpdateFrequencyComponent {
34371
+ get planned() {
34372
+ return this.control.value !== 'notPlanned';
34373
+ }
34374
+ constructor(translateService) {
34375
+ this.translateService = translateService;
34376
+ this.choices = [
34377
+ {
34378
+ value: 'day.1',
34379
+ label: this.translateService.instant('domain.record.updateFrequency.day', {
34380
+ count: 1,
34381
+ }),
34382
+ },
34383
+ {
34384
+ value: 'day.2',
34385
+ label: this.translateService.instant('domain.record.updateFrequency.day', {
34386
+ count: 2,
34387
+ }),
34388
+ },
34389
+ {
34390
+ value: 'week.1',
34391
+ label: this.translateService.instant('domain.record.updateFrequency.week', {
34392
+ count: 1,
34393
+ }),
34394
+ },
34395
+ {
34396
+ value: 'week.2',
34397
+ label: this.translateService.instant('domain.record.updateFrequency.week', {
34398
+ count: 2,
34399
+ }),
34400
+ },
34401
+ {
34402
+ value: 'month.1',
34403
+ label: this.translateService.instant('domain.record.updateFrequency.month', {
34404
+ count: 1,
34405
+ }),
34406
+ },
34407
+ {
34408
+ value: 'month.2',
34409
+ label: this.translateService.instant('domain.record.updateFrequency.month', {
34410
+ count: 2,
34411
+ }),
34412
+ },
34413
+ {
34414
+ value: 'year.1',
34415
+ label: this.translateService.instant('domain.record.updateFrequency.year', {
34416
+ count: 1,
34417
+ }),
34418
+ },
34419
+ {
34420
+ value: 'year.2',
34421
+ label: this.translateService.instant('domain.record.updateFrequency.year', {
34422
+ count: 2,
34423
+ }),
34424
+ },
34425
+ ];
34426
+ }
34427
+ ngOnInit() {
34428
+ const updatedTimes = this.control.value?.updatedTimes;
34429
+ const per = this.control.value?.per;
34430
+ if (updatedTimes && updatedTimes !== 1 && updatedTimes !== 2) {
34431
+ this.choices = [
34432
+ {
34433
+ value: `${per}.${updatedTimes}`,
34434
+ label: this.translateService.instant(`domain.record.updateFrequency.${per}`, {
34435
+ count: updatedTimes,
34436
+ }),
34437
+ },
34438
+ ...this.choices,
34439
+ ];
34440
+ }
34441
+ }
34442
+ onPlannedToggled() {
34443
+ if (this.planned) {
34444
+ this.control.setValue('notPlanned');
34445
+ }
34446
+ else {
34447
+ this.control.setValue({ updatedTimes: 1, per: 'day' });
34448
+ }
34449
+ }
34450
+ get selectedFrequency() {
34451
+ const { updatedTimes, per } = this.control.value;
34452
+ return `${per}.${updatedTimes}`;
34453
+ }
34454
+ onSelectFrequencyValue(value) {
34455
+ const split = value.split('.');
34456
+ this.control.setValue({ updatedTimes: Number(split[1]), per: split[0] });
34457
+ }
34458
+ 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 }); }
34459
+ 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 }); }
34460
+ }
34461
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldUpdateFrequencyComponent, decorators: [{
34462
+ type: Component,
34463
+ 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" }]
34464
+ }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; }, propDecorators: { control: [{
34465
+ type: Input
34466
+ }] } });
34467
+
33887
34468
  class FormFieldComponent {
33888
34469
  set value(v) {
33889
34470
  this.formControl.setValue(v, {
@@ -33938,8 +34519,20 @@ class FormFieldComponent {
33938
34519
  get isAbstract() {
33939
34520
  return this.model === 'abstract';
33940
34521
  }
34522
+ get isLicenses() {
34523
+ return this.model === 'licenses';
34524
+ }
34525
+ get isResourceUpdated() {
34526
+ return this.model === 'resourceUpdated';
34527
+ }
34528
+ get isUpdateFrequency() {
34529
+ return this.model === 'updateFrequency';
34530
+ }
34531
+ get withoutWrapper() {
34532
+ return this.model === 'title' || this.model === 'abstract';
34533
+ }
33941
34534
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33942
- 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 <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\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=\"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=\"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=\"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</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { 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 }); }
34535
+ 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 }); }
33943
34536
  }
33944
34537
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, decorators: [{
33945
34538
  type: Component,
@@ -33949,6 +34542,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33949
34542
  EditableLabelDirective,
33950
34543
  MatIconModule,
33951
34544
  MatTooltipModule,
34545
+ FormFieldWrapperComponent,
34546
+ FormFieldLicenseComponent,
34547
+ FormFieldResourceUpdatedComponent,
34548
+ FormFieldUpdateFrequencyComponent,
33952
34549
  FormFieldSimpleComponent,
33953
34550
  FormFieldRichComponent,
33954
34551
  FormFieldObjectComponent,
@@ -33957,7 +34554,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33957
34554
  FormFieldFileComponent,
33958
34555
  FormFieldArrayComponent,
33959
34556
  TranslateModule,
33960
- ], template: "<div class=\"flex flex-col h-full\">\n <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\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=\"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=\"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=\"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</div>\n" }]
34557
+ ], 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" }]
33961
34558
  }], ctorParameters: function () { return []; }, propDecorators: { model: [{
33962
34559
  type: Input
33963
34560
  }], config: [{
@@ -34315,7 +34912,7 @@ class DefaultRouterModule {
34315
34912
  };
34316
34913
  }
34317
34914
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
34318
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$4.StoreRouterConnectingModule, i1$8.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
34915
+ 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] }); }
34319
34916
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, providers: [
34320
34917
  RouterFacade,
34321
34918
  {
@@ -34358,5 +34955,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
34358
34955
  * Generated bundle index. Do not edit.
34359
34956
  */
34360
34957
 
34361
- 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, 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 };
34958
+ 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, 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, SearchResultsErrorComponent, 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 };
34362
34959
  //# sourceMappingURL=geonetwork-ui.mjs.map