geonetwork-ui 2.3.0-dev.61774f7d → 2.3.0-dev.89188551

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 (120) hide show
  1. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +35 -2
  2. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  3. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  4. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +20 -6
  5. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +16 -1
  6. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -2
  7. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +1 -1
  8. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  9. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  10. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +37 -8
  11. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +1 -6
  12. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  13. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  14. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  15. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
  16. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  17. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -9
  18. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  19. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  20. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  21. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  22. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  23. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  24. package/esm2022/translations/de.json +20 -14
  25. package/esm2022/translations/en.json +20 -14
  26. package/esm2022/translations/es.json +20 -14
  27. package/esm2022/translations/fr.json +20 -14
  28. package/esm2022/translations/it.json +20 -14
  29. package/esm2022/translations/nl.json +20 -14
  30. package/esm2022/translations/pt.json +20 -14
  31. package/fesm2022/geonetwork-ui.mjs +1198 -833
  32. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  33. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  34. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  35. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  36. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  37. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  38. 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
  39. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +3 -0
  40. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  41. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  42. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  43. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  44. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  45. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  46. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  47. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +4 -2
  48. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  49. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
  50. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  51. package/libs/ui/inputs/src/index.d.ts +15 -14
  52. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  53. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  54. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  55. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  56. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  57. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
  58. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  59. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  60. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  61. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  62. package/libs/ui/layout/src/index.d.ts +1 -0
  63. package/libs/ui/layout/src/index.d.ts.map +1 -1
  64. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  65. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  66. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  67. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  68. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  69. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  70. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  71. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  72. package/package.json +1 -1
  73. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  74. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +2 -2
  75. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
  76. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  77. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  78. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  79. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  80. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  81. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  82. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +33 -33
  83. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +16 -0
  84. package/src/libs/feature/editor/src/lib/fields.config.ts +15 -0
  85. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  86. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +0 -1
  87. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  88. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  89. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  90. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +1 -1
  91. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +43 -5
  92. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +0 -2
  93. package/src/libs/ui/inputs/src/index.ts +15 -14
  94. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  95. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  96. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  97. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  98. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
  99. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  100. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  101. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  102. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  103. package/src/libs/ui/layout/src/index.ts +1 -0
  104. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  105. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  106. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  107. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +7 -4
  108. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  109. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  110. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  111. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  112. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  113. package/translations/de.json +20 -14
  114. package/translations/en.json +20 -14
  115. package/translations/es.json +20 -14
  116. package/translations/fr.json +20 -14
  117. package/translations/it.json +20 -14
  118. package/translations/nl.json +20 -14
  119. package/translations/pt.json +20 -14
  120. package/translations/sk.json +20 -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';
@@ -44,28 +44,27 @@ import { bbox } from 'ol/loadingstrategy';
44
44
  import WMTS from 'ol/source/WMTS';
45
45
  import * as i2$3 from '@angular/material/tabs';
46
46
  import { MatTabsModule } from '@angular/material/tabs';
47
- import * as i1$4 from '@angular/cdk/overlay';
48
- import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
49
47
  import * as i2$1 from '@angular/forms';
50
48
  import { UntypedFormControl, FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms';
51
- import * as i5 from 'ngx-chips';
52
- import { TagInputModule } from 'ngx-chips';
53
49
  import * as i4 from '@angular/material/autocomplete';
54
50
  import { MatAutocompleteTrigger, MatAutocomplete, MatAutocompleteModule } from '@angular/material/autocomplete';
55
- import * as i5$1 from '@angular/material/core';
51
+ import * as i5 from '@angular/material/core';
56
52
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
57
- import * as i3 from 'ngx-dropzone';
58
- import { NgxDropzoneModule } from 'ngx-dropzone';
59
- import * as i1$5 from '@angular/material/progress-spinner';
60
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
61
- import * as i1$6 from '@angular/material/checkbox';
53
+ import * as i1$4 from '@angular/material/checkbox';
62
54
  import { MatCheckboxModule } from '@angular/material/checkbox';
63
- import * as i3$1 from '@angular/material/tooltip';
55
+ import * as i5$1 from 'ngx-chips';
56
+ import { TagInputModule } from 'ngx-chips';
57
+ import * as i3 from '@angular/material/tooltip';
64
58
  import { MatTooltipModule } from '@angular/material/tooltip';
65
- import * as i2$2 from '@angular/material/form-field';
66
- import { MatFormFieldModule } from '@angular/material/form-field';
67
- import * as i3$2 from '@angular/material/datepicker';
59
+ import * as i2$2 from '@angular/material/datepicker';
68
60
  import { MatDatepickerModule } from '@angular/material/datepicker';
61
+ import * as i3$1 from 'ngx-dropzone';
62
+ import { NgxDropzoneModule } from 'ngx-dropzone';
63
+ import * as i1$5 from '@angular/cdk/overlay';
64
+ import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
65
+ import * as i1$6 from '@angular/material/progress-spinner';
66
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
67
+ import { MatFormFieldModule } from '@angular/material/form-field';
69
68
  import { MatInputModule } from '@angular/material/input';
70
69
  import * as i1$7 from '@angular/router';
71
70
  import { RouterModule, RouterLink, RouteReuseStrategy } from '@angular/router';
@@ -89,14 +88,14 @@ import * as i2$4 from '@angular/material/sort';
89
88
  import { MatSort, MatSortModule } from '@angular/material/sort';
90
89
  import * as i1$9 from '@angular/material/table';
91
90
  import { MatTableModule } from '@angular/material/table';
92
- import * as i3$3 from 'ng-table-virtual-scroll';
91
+ import * as i3$2 from 'ng-table-virtual-scroll';
93
92
  import { TableVirtualScrollDataSource, TableVirtualScrollModule } from 'ng-table-virtual-scroll';
94
93
  import * as Papa from 'papaparse';
95
94
  import parseDate from 'date-fns/parse';
96
95
  import parseIsoDate from 'date-fns/parseISO';
97
96
  import { WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
98
97
  import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
99
- import * as i3$4 from '@ngrx/router-store';
98
+ import * as i3$3 from '@ngrx/router-store';
100
99
  import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
101
100
  import { navigation } from '@ngrx/router-store/data-persistence';
102
101
 
@@ -17419,6 +17418,17 @@ var de = {
17419
17418
  "downloads.format.unknown": "unbekannt",
17420
17419
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
17421
17420
  dropFile: dropFile$6,
17421
+ "editor.record.form.license": "Lizenz",
17422
+ "editor.record.form.license.cc-by": "",
17423
+ "editor.record.form.license.cc-by-sa": "",
17424
+ "editor.record.form.license.cc-zero": "",
17425
+ "editor.record.form.license.etalab": "",
17426
+ "editor.record.form.license.etalab-v2": "",
17427
+ "editor.record.form.license.odbl": "",
17428
+ "editor.record.form.license.odc-by": "",
17429
+ "editor.record.form.license.pddl": "",
17430
+ "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17431
+ "editor.record.form.resourceUpdated": "",
17422
17432
  "editor.record.loadError.body": "",
17423
17433
  "editor.record.loadError.closeMessage": "",
17424
17434
  "editor.record.loadError.title": "",
@@ -17489,6 +17499,7 @@ var de = {
17489
17499
  "multiselect.filter.placeholder": "Suche",
17490
17500
  "nav.back": "Zurück",
17491
17501
  next: next$6,
17502
+ "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
17492
17503
  "organisation.filter.placeholder": "Ergebnisse filtern",
17493
17504
  "organisation.sort.sortBy": "Sortieren nach:",
17494
17505
  "organisations.hits.found": "{hits, plural, =0{Keine Organisation gefunden} other{{hits} von {total} Organisationen angezeigt}}",
@@ -17553,14 +17564,6 @@ var de = {
17553
17564
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
17554
17565
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
17555
17566
  "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
17567
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
17565
17568
  "record.metadata.status": "Status",
17566
17569
  "record.metadata.technical": "Technische Informationen",
@@ -17575,6 +17578,14 @@ var de = {
17575
17578
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
17576
17579
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
17577
17580
  "record.metadata.usage": "Nutzung und Einschränkungen",
17581
+ "record.metadata.userFeedbacks": "",
17582
+ "record.metadata.userFeedbacks.anonymousUser": "",
17583
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
17584
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
17585
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
17586
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
17587
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
17588
+ "record.metadata.userFeedbacks.sortSelector.label": "",
17578
17589
  "record.more.details": "Weitere Details",
17579
17590
  "record.tab.chart": "Diagramm",
17580
17591
  "record.tab.data": "Tabelle",
@@ -17634,12 +17645,6 @@ var de = {
17634
17645
  "table.loading.data": "Daten werden geladen...",
17635
17646
  "table.object.count": "Objekte in diesem Datensatz",
17636
17647
  "table.select.data": "Datenquelle",
17637
- "timeSincePipe.lessThanAMinute": "",
17638
- "timeSincePipe.minutesAgo": "",
17639
- "timeSincePipe.hoursAgo": "",
17640
- "timeSincePipe.daysAgo": "",
17641
- "timeSincePipe.monthsAgo": "",
17642
- "timeSincePipe.yearsAgo": "",
17643
17648
  "tooltip.html.copy": "HTML kopieren",
17644
17649
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
17645
17650
  "tooltip.url.copy": "URL kopieren",
@@ -17804,6 +17809,17 @@ var en = {
17804
17809
  "downloads.format.unknown": "unknown",
17805
17810
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17806
17811
  dropFile: dropFile$5,
17812
+ "editor.record.form.license": "License",
17813
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17814
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17815
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
17816
+ "editor.record.form.license.etalab": "Open Licence (Etalab)",
17817
+ "editor.record.form.license.etalab-v2": "Open Licence v2.0 (Etalab)",
17818
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
17819
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17820
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
17821
+ "editor.record.form.license.unknown": "Unknown or absent",
17822
+ "editor.record.form.resourceUpdated": "Last update date",
17807
17823
  "editor.record.loadError.body": "The record could not be loaded:",
17808
17824
  "editor.record.loadError.closeMessage": "Understood",
17809
17825
  "editor.record.loadError.title": "Error loading record",
@@ -17874,6 +17890,7 @@ var en = {
17874
17890
  "multiselect.filter.placeholder": "Search",
17875
17891
  "nav.back": "Back",
17876
17892
  next: next$5,
17893
+ "ogc.unreachable.unknown": "The service could not be reached",
17877
17894
  "organisation.filter.placeholder": "Filter results",
17878
17895
  "organisation.sort.sortBy": "Sort by:",
17879
17896
  "organisations.hits.found": "{hits, plural, =0{No organizations found} other{{hits} out of {total} organizations shown}}",
@@ -17938,14 +17955,6 @@ var en = {
17938
17955
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17939
17956
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17940
17957
  "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
17958
  "record.metadata.sheet": "Original metadata",
17950
17959
  "record.metadata.status": "Status",
17951
17960
  "record.metadata.technical": "Technical information",
@@ -17960,6 +17969,14 @@ var en = {
17960
17969
  "record.metadata.updateFrequency": "Data Update Frequency",
17961
17970
  "record.metadata.updatedOn": "Last Data Information Update",
17962
17971
  "record.metadata.usage": "License and Conditions",
17972
+ "record.metadata.userFeedbacks": "Questions / Answers",
17973
+ "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
17974
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
17975
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
17976
+ "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
17977
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
17978
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
17979
+ "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
17963
17980
  "record.more.details": "Read more",
17964
17981
  "record.tab.chart": "Chart",
17965
17982
  "record.tab.data": "Table",
@@ -18019,12 +18036,6 @@ var en = {
18019
18036
  "table.loading.data": "Loading data...",
18020
18037
  "table.object.count": "objects in this dataset",
18021
18038
  "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
18039
  "tooltip.html.copy": "Copy HTML",
18029
18040
  "tooltip.id.copy": "Copy unique identifier",
18030
18041
  "tooltip.url.copy": "Copy URL",
@@ -18189,6 +18200,17 @@ var es = {
18189
18200
  "downloads.format.unknown": "",
18190
18201
  "downloads.wfs.featuretype.not.found": "",
18191
18202
  dropFile: dropFile$4,
18203
+ "editor.record.form.license": "",
18204
+ "editor.record.form.license.cc-by": "",
18205
+ "editor.record.form.license.cc-by-sa": "",
18206
+ "editor.record.form.license.cc-zero": "",
18207
+ "editor.record.form.license.etalab": "",
18208
+ "editor.record.form.license.etalab-v2": "",
18209
+ "editor.record.form.license.odbl": "",
18210
+ "editor.record.form.license.odc-by": "",
18211
+ "editor.record.form.license.pddl": "",
18212
+ "editor.record.form.license.unknown": "",
18213
+ "editor.record.form.resourceUpdated": "",
18192
18214
  "editor.record.loadError.body": "",
18193
18215
  "editor.record.loadError.closeMessage": "",
18194
18216
  "editor.record.loadError.title": "",
@@ -18259,6 +18281,7 @@ var es = {
18259
18281
  "multiselect.filter.placeholder": "",
18260
18282
  "nav.back": "",
18261
18283
  next: next$4,
18284
+ "ogc.unreachable.unknown": "",
18262
18285
  "organisation.filter.placeholder": "",
18263
18286
  "organisation.sort.sortBy": "",
18264
18287
  "organisations.hits.found": "",
@@ -18323,14 +18346,6 @@ var es = {
18323
18346
  "record.metadata.quality.updateFrequency.failed": "",
18324
18347
  "record.metadata.quality.updateFrequency.success": "",
18325
18348
  "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
18349
  "record.metadata.sheet": "",
18335
18350
  "record.metadata.status": "",
18336
18351
  "record.metadata.technical": "",
@@ -18345,6 +18360,14 @@ var es = {
18345
18360
  "record.metadata.updateFrequency": "",
18346
18361
  "record.metadata.updatedOn": "",
18347
18362
  "record.metadata.usage": "",
18363
+ "record.metadata.userFeedbacks": "",
18364
+ "record.metadata.userFeedbacks.anonymousUser": "",
18365
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
18366
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
18367
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
18368
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
18369
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
18370
+ "record.metadata.userFeedbacks.sortSelector.label": "",
18348
18371
  "record.more.details": "",
18349
18372
  "record.tab.chart": "",
18350
18373
  "record.tab.data": "",
@@ -18404,12 +18427,6 @@ var es = {
18404
18427
  "table.loading.data": "",
18405
18428
  "table.object.count": "",
18406
18429
  "table.select.data": "",
18407
- "timeSincePipe.lessThanAMinute": "",
18408
- "timeSincePipe.minutesAgo": "",
18409
- "timeSincePipe.hoursAgo": "",
18410
- "timeSincePipe.daysAgo": "",
18411
- "timeSincePipe.monthsAgo": "",
18412
- "timeSincePipe.yearsAgo": "",
18413
18430
  "tooltip.html.copy": "",
18414
18431
  "tooltip.id.copy": "",
18415
18432
  "tooltip.url.copy": "",
@@ -18574,6 +18591,17 @@ var fr = {
18574
18591
  "downloads.format.unknown": "inconnu",
18575
18592
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
18576
18593
  dropFile: dropFile$3,
18594
+ "editor.record.form.license": "Licence",
18595
+ "editor.record.form.license.cc-by": "",
18596
+ "editor.record.form.license.cc-by-sa": "",
18597
+ "editor.record.form.license.cc-zero": "",
18598
+ "editor.record.form.license.etalab": "Licence Ouverte (Etalab)",
18599
+ "editor.record.form.license.etalab-v2": "Licence Ouverte v2.0 (Etalab)",
18600
+ "editor.record.form.license.odbl": "",
18601
+ "editor.record.form.license.odc-by": "",
18602
+ "editor.record.form.license.pddl": "",
18603
+ "editor.record.form.license.unknown": "Non-reconnue ou absente",
18604
+ "editor.record.form.resourceUpdated": "Date de dernière révision",
18577
18605
  "editor.record.loadError.body": "",
18578
18606
  "editor.record.loadError.closeMessage": "",
18579
18607
  "editor.record.loadError.title": "",
@@ -18644,6 +18672,7 @@ var fr = {
18644
18672
  "multiselect.filter.placeholder": "Rechercher",
18645
18673
  "nav.back": "Retour",
18646
18674
  next: next$3,
18675
+ "ogc.unreachable.unknown": "Le service n'est pas accessible",
18647
18676
  "organisation.filter.placeholder": "Filtrer les résultats",
18648
18677
  "organisation.sort.sortBy": "Trier par :",
18649
18678
  "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 +18737,6 @@ var fr = {
18708
18737
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
18709
18738
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
18710
18739
  "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
18740
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
18720
18741
  "record.metadata.status": "Statut",
18721
18742
  "record.metadata.technical": "Informations techniques",
@@ -18730,6 +18751,14 @@ var fr = {
18730
18751
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
18731
18752
  "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
18732
18753
  "record.metadata.usage": "Licences et conditions d'utilisation",
18754
+ "record.metadata.userFeedbacks": "Questions / Réponses",
18755
+ "record.metadata.userFeedbacks.anonymousUser": "Pour rédiger un commentaire, veuillez vous identifier.",
18756
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publier",
18757
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Répondre...",
18758
+ "record.metadata.userFeedbacks.newComment.placeholder": "Rédiger votre commentaire ici...",
18759
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Les plus récents en premier",
18760
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Les plus anciens en premier",
18761
+ "record.metadata.userFeedbacks.sortSelector.label": "Trier par ...",
18733
18762
  "record.more.details": "Détails",
18734
18763
  "record.tab.chart": "Graphique",
18735
18764
  "record.tab.data": "Tableau",
@@ -18789,12 +18818,6 @@ var fr = {
18789
18818
  "table.loading.data": "Chargement des données...",
18790
18819
  "table.object.count": "enregistrements dans ces données",
18791
18820
  "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
18821
  "tooltip.html.copy": "Copier le HTML",
18799
18822
  "tooltip.id.copy": "Copier l'identifiant unique",
18800
18823
  "tooltip.url.copy": "Copier l'URL",
@@ -18959,6 +18982,17 @@ var it = {
18959
18982
  "downloads.format.unknown": "sconosciuto",
18960
18983
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18961
18984
  dropFile: dropFile$2,
18985
+ "editor.record.form.license": "Licenza",
18986
+ "editor.record.form.license.cc-by": "",
18987
+ "editor.record.form.license.cc-by-sa": "",
18988
+ "editor.record.form.license.cc-zero": "",
18989
+ "editor.record.form.license.etalab": "Licenza aperta (Etalab)",
18990
+ "editor.record.form.license.etalab-v2": "Licenza aperta v2.0 (Etalab)",
18991
+ "editor.record.form.license.odbl": "",
18992
+ "editor.record.form.license.odc-by": "",
18993
+ "editor.record.form.license.pddl": "",
18994
+ "editor.record.form.license.unknown": "Non riconosciuta o assente",
18995
+ "editor.record.form.resourceUpdated": "",
18962
18996
  "editor.record.loadError.body": "",
18963
18997
  "editor.record.loadError.closeMessage": "",
18964
18998
  "editor.record.loadError.title": "",
@@ -19029,6 +19063,7 @@ var it = {
19029
19063
  "multiselect.filter.placeholder": "Cerca",
19030
19064
  "nav.back": "Indietro",
19031
19065
  next: next$2,
19066
+ "ogc.unreachable.unknown": "Il servizio non è accessibile",
19032
19067
  "organisation.filter.placeholder": "Filtra i risultati",
19033
19068
  "organisation.sort.sortBy": "Ordina per:",
19034
19069
  "organisations.hits.found": "{hits, plural, =0{Nessuna organizzazione trovata} one{1 organizzazione su {total} visualizzata} other{{hits} organizzazioni su {total} visualizzate}}",
@@ -19093,14 +19128,6 @@ var it = {
19093
19128
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
19094
19129
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
19095
19130
  "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
19131
  "record.metadata.sheet": "Origine del metadata",
19105
19132
  "record.metadata.status": "Stato",
19106
19133
  "record.metadata.technical": "Informazioni tecniche",
@@ -19115,6 +19142,14 @@ var it = {
19115
19142
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
19116
19143
  "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
19117
19144
  "record.metadata.usage": "Licenze e limiti di utilizzo",
19145
+ "record.metadata.userFeedbacks": "",
19146
+ "record.metadata.userFeedbacks.anonymousUser": "",
19147
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19148
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19149
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19150
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19151
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19152
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19118
19153
  "record.more.details": "Dettagli",
19119
19154
  "record.tab.chart": "Grafico",
19120
19155
  "record.tab.data": "Tabella",
@@ -19174,12 +19209,6 @@ var it = {
19174
19209
  "table.loading.data": "Caricamento dei dati...",
19175
19210
  "table.object.count": "record in questi dati",
19176
19211
  "table.select.data": "Sorgente dati",
19177
- "timeSincePipe.lessThanAMinute": "",
19178
- "timeSincePipe.minutesAgo": "",
19179
- "timeSincePipe.hoursAgo": "",
19180
- "timeSincePipe.daysAgo": "",
19181
- "timeSincePipe.monthsAgo": "",
19182
- "timeSincePipe.yearsAgo": "",
19183
19212
  "tooltip.html.copy": "Copiare il HTML",
19184
19213
  "tooltip.id.copy": "Copiare l'identificatore unico",
19185
19214
  "tooltip.url.copy": "Copiare l'URL",
@@ -19344,6 +19373,17 @@ var nl = {
19344
19373
  "downloads.format.unknown": "",
19345
19374
  "downloads.wfs.featuretype.not.found": "",
19346
19375
  dropFile: dropFile$1,
19376
+ "editor.record.form.license": "",
19377
+ "editor.record.form.license.cc-by": "",
19378
+ "editor.record.form.license.cc-by-sa": "",
19379
+ "editor.record.form.license.cc-zero": "",
19380
+ "editor.record.form.license.etalab": "",
19381
+ "editor.record.form.license.etalab-v2": "",
19382
+ "editor.record.form.license.odbl": "",
19383
+ "editor.record.form.license.odc-by": "",
19384
+ "editor.record.form.license.pddl": "",
19385
+ "editor.record.form.license.unknown": "",
19386
+ "editor.record.form.resourceUpdated": "",
19347
19387
  "editor.record.loadError.body": "",
19348
19388
  "editor.record.loadError.closeMessage": "",
19349
19389
  "editor.record.loadError.title": "",
@@ -19414,6 +19454,7 @@ var nl = {
19414
19454
  "multiselect.filter.placeholder": "",
19415
19455
  "nav.back": "",
19416
19456
  next: next$1,
19457
+ "ogc.unreachable.unknown": "",
19417
19458
  "organisation.filter.placeholder": "",
19418
19459
  "organisation.sort.sortBy": "",
19419
19460
  "organisations.hits.found": "",
@@ -19478,14 +19519,6 @@ var nl = {
19478
19519
  "record.metadata.quality.updateFrequency.failed": "",
19479
19520
  "record.metadata.quality.updateFrequency.success": "",
19480
19521
  "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
19522
  "record.metadata.sheet": "",
19490
19523
  "record.metadata.status": "",
19491
19524
  "record.metadata.technical": "",
@@ -19500,6 +19533,14 @@ var nl = {
19500
19533
  "record.metadata.updateFrequency": "",
19501
19534
  "record.metadata.updatedOn": "",
19502
19535
  "record.metadata.usage": "",
19536
+ "record.metadata.userFeedbacks": "",
19537
+ "record.metadata.userFeedbacks.anonymousUser": "",
19538
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19539
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19540
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19541
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19542
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19543
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19503
19544
  "record.more.details": "",
19504
19545
  "record.tab.chart": "",
19505
19546
  "record.tab.data": "",
@@ -19559,12 +19600,6 @@ var nl = {
19559
19600
  "table.loading.data": "",
19560
19601
  "table.object.count": "",
19561
19602
  "table.select.data": "",
19562
- "timeSincePipe.lessThanAMinute": "",
19563
- "timeSincePipe.minutesAgo": "",
19564
- "timeSincePipe.hoursAgo": "",
19565
- "timeSincePipe.daysAgo": "",
19566
- "timeSincePipe.monthsAgo": "",
19567
- "timeSincePipe.yearsAgo": "",
19568
19603
  "tooltip.html.copy": "",
19569
19604
  "tooltip.id.copy": "",
19570
19605
  "tooltip.url.copy": "",
@@ -19729,6 +19764,17 @@ var pt = {
19729
19764
  "downloads.format.unknown": "",
19730
19765
  "downloads.wfs.featuretype.not.found": "",
19731
19766
  dropFile: dropFile,
19767
+ "editor.record.form.license": "",
19768
+ "editor.record.form.license.cc-by": "",
19769
+ "editor.record.form.license.cc-by-sa": "",
19770
+ "editor.record.form.license.cc-zero": "",
19771
+ "editor.record.form.license.etalab": "",
19772
+ "editor.record.form.license.etalab-v2": "",
19773
+ "editor.record.form.license.odbl": "",
19774
+ "editor.record.form.license.odc-by": "",
19775
+ "editor.record.form.license.pddl": "",
19776
+ "editor.record.form.license.unknown": "",
19777
+ "editor.record.form.resourceUpdated": "",
19732
19778
  "editor.record.loadError.body": "",
19733
19779
  "editor.record.loadError.closeMessage": "",
19734
19780
  "editor.record.loadError.title": "",
@@ -19799,6 +19845,7 @@ var pt = {
19799
19845
  "multiselect.filter.placeholder": "",
19800
19846
  "nav.back": "",
19801
19847
  next: next,
19848
+ "ogc.unreachable.unknown": "",
19802
19849
  "organisation.filter.placeholder": "",
19803
19850
  "organisation.sort.sortBy": "",
19804
19851
  "organisations.hits.found": "",
@@ -19863,14 +19910,6 @@ var pt = {
19863
19910
  "record.metadata.quality.updateFrequency.failed": "",
19864
19911
  "record.metadata.quality.updateFrequency.success": "",
19865
19912
  "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
19913
  "record.metadata.sheet": "",
19875
19914
  "record.metadata.status": "",
19876
19915
  "record.metadata.technical": "",
@@ -19885,6 +19924,14 @@ var pt = {
19885
19924
  "record.metadata.updateFrequency": "",
19886
19925
  "record.metadata.updatedOn": "",
19887
19926
  "record.metadata.usage": "",
19927
+ "record.metadata.userFeedbacks": "",
19928
+ "record.metadata.userFeedbacks.anonymousUser": "",
19929
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19930
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19931
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19932
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19933
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19934
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19888
19935
  "record.more.details": "",
19889
19936
  "record.tab.chart": "",
19890
19937
  "record.tab.data": "",
@@ -19944,12 +19991,6 @@ var pt = {
19944
19991
  "table.loading.data": "",
19945
19992
  "table.object.count": "",
19946
19993
  "table.select.data": "",
19947
- "timeSincePipe.lessThanAMinute": "",
19948
- "timeSincePipe.minutesAgo": "",
19949
- "timeSincePipe.hoursAgo": "",
19950
- "timeSincePipe.daysAgo": "",
19951
- "timeSincePipe.monthsAgo": "",
19952
- "timeSincePipe.yearsAgo": "",
19953
19994
  "tooltip.html.copy": "",
19954
19995
  "tooltip.id.copy": "",
19955
19996
  "tooltip.url.copy": "",
@@ -22296,6 +22337,27 @@ const FORMATS = {
22296
22337
  color: '#de630b',
22297
22338
  mimeTypes: ['application/x-dxf', 'image/x-dxf'],
22298
22339
  },
22340
+ html: {
22341
+ extensions: ['html', 'htm'],
22342
+ priority: 12,
22343
+ color: '#f2bb3a',
22344
+ mimeTypes: ['text/html'],
22345
+ },
22346
+ fgb: {
22347
+ extensions: ['fgb', 'flatgeobuf'],
22348
+ priority: 13,
22349
+ color: '#f2bb3a',
22350
+ mimeTypes: ['application/flatgeobuf'],
22351
+ },
22352
+ jsonfg: {
22353
+ extensions: ['jsonfg', 'jsonfgc'],
22354
+ priority: 14,
22355
+ color: '#f2bb3a',
22356
+ mimeTypes: [
22357
+ 'application/vnd.ogc.fg+json',
22358
+ 'application/vnd.ogc.fg+json;compatibility=geojson',
22359
+ ],
22360
+ },
22299
22361
  };
22300
22362
  function getFormatPriority(linkFormat) {
22301
22363
  for (const format in FORMATS) {
@@ -22427,7 +22489,7 @@ class LinkClassifierService {
22427
22489
  case 'wmts':
22428
22490
  return [LinkUsage.API, LinkUsage.MAP_API];
22429
22491
  case 'ogcFeatures':
22430
- return [LinkUsage.API];
22492
+ return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA];
22431
22493
  default:
22432
22494
  return [LinkUsage.UNKNOWN];
22433
22495
  }
@@ -23973,6 +24035,173 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23973
24035
  type: Input
23974
24036
  }] } });
23975
24037
 
24038
+ class PopupAlertComponent {
24039
+ constructor(changeDetector) {
24040
+ this.changeDetector = changeDetector;
24041
+ this.type = 'info';
24042
+ this.position = 'top';
24043
+ this.expanded = false;
24044
+ this.timeout = null;
24045
+ }
24046
+ get showDuration() {
24047
+ const chars = this.content.nativeElement.innerHTML.length;
24048
+ return Math.max(3000, chars * 20);
24049
+ }
24050
+ ngOnInit() {
24051
+ this.expandAndClose();
24052
+ }
24053
+ expand() {
24054
+ this.expanded = true;
24055
+ this.changeDetector.detectChanges();
24056
+ clearTimeout(this.timeout);
24057
+ }
24058
+ expandAndClose() {
24059
+ this.expanded = true;
24060
+ this.changeDetector.detectChanges();
24061
+ clearTimeout(this.timeout);
24062
+ this.timeout = setTimeout(() => {
24063
+ this.expanded = false;
24064
+ this.changeDetector.detectChanges();
24065
+ }, this.showDuration);
24066
+ }
24067
+ 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 }); }
24068
+ 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 }); }
24069
+ }
24070
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PopupAlertComponent, decorators: [{
24071
+ type: Component,
24072
+ 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"] }]
24073
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { icon: [{
24074
+ type: Input
24075
+ }], type: [{
24076
+ type: Input
24077
+ }], position: [{
24078
+ type: Input
24079
+ }], content: [{
24080
+ type: ViewChild,
24081
+ args: ['content']
24082
+ }] } });
24083
+
24084
+ class AutocompleteComponent {
24085
+ constructor(cdRef) {
24086
+ this.cdRef = cdRef;
24087
+ this.clearOnSelection = false;
24088
+ this.autoFocus = false;
24089
+ this.itemSelected = new EventEmitter();
24090
+ this.inputSubmitted = new EventEmitter();
24091
+ this.inputCleared = new EventEmitter();
24092
+ this.control = new UntypedFormControl();
24093
+ this.subscription = new Subscription();
24094
+ this.cancelEnter = true;
24095
+ this.selectionSubject = new ReplaySubject(1);
24096
+ this.lastInputValue$ = new ReplaySubject(1);
24097
+ this.error = null;
24098
+ this.displayWithFn = (item) => item;
24099
+ }
24100
+ ngOnChanges(changes) {
24101
+ const { value } = changes;
24102
+ if (value) {
24103
+ const previousTextValue = this.displayWithFn(value.previousValue);
24104
+ const currentTextValue = this.displayWithFn(value.currentValue);
24105
+ if (previousTextValue !== currentTextValue) {
24106
+ this.updateInputValue(value.currentValue);
24107
+ }
24108
+ }
24109
+ }
24110
+ ngOnInit() {
24111
+ 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) => {
24112
+ this.error = error.message;
24113
+ return of([]);
24114
+ }), finalize(() => (this.searching = false)));
24115
+ this.subscription = this.control.valueChanges.subscribe((any) => {
24116
+ if (any !== '') {
24117
+ this.cancelEnter = false;
24118
+ }
24119
+ });
24120
+ this.control.valueChanges
24121
+ .pipe(filter((value) => typeof value === 'string'))
24122
+ .subscribe(this.lastInputValue$);
24123
+ }
24124
+ ngAfterViewInit() {
24125
+ this.autocomplete.optionSelected.subscribe(this.selectionSubject);
24126
+ if (this.autoFocus) {
24127
+ this.inputRef.nativeElement.focus();
24128
+ this.cdRef.detectChanges();
24129
+ }
24130
+ }
24131
+ ngOnDestroy() {
24132
+ this.subscription.unsubscribe();
24133
+ }
24134
+ updateInputValue(value) {
24135
+ if (value) {
24136
+ this.control.setValue(value);
24137
+ }
24138
+ if (this.inputRef) {
24139
+ this.inputRef.nativeElement.value = value?.title || '';
24140
+ }
24141
+ }
24142
+ clear() {
24143
+ this.inputRef.nativeElement.value = '';
24144
+ this.inputCleared.emit();
24145
+ this.selectionSubject
24146
+ .pipe(take(1))
24147
+ .subscribe((selection) => selection && selection.option.deselect());
24148
+ this.inputRef.nativeElement.focus();
24149
+ this.triggerRef.closePanel();
24150
+ }
24151
+ handleEnter(any) {
24152
+ if (!this.cancelEnter) {
24153
+ this.inputSubmitted.emit(any);
24154
+ this.triggerRef.closePanel();
24155
+ }
24156
+ }
24157
+ handleClickSearch() {
24158
+ this.inputSubmitted.emit(this.inputRef.nativeElement.value);
24159
+ this.triggerRef.closePanel();
24160
+ }
24161
+ handleSelection(event) {
24162
+ this.cancelEnter = true;
24163
+ this.itemSelected.emit(event.option.value);
24164
+ if (this.clearOnSelection) {
24165
+ this.lastInputValue$.pipe(first()).subscribe((any) => {
24166
+ this.inputRef.nativeElement.value = any;
24167
+ });
24168
+ }
24169
+ }
24170
+ 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 }); }
24171
+ 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 }); }
24172
+ }
24173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
24174
+ type: Component,
24175
+ 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"] }]
24176
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
24177
+ type: Input
24178
+ }], action: [{
24179
+ type: Input
24180
+ }], value: [{
24181
+ type: Input
24182
+ }], clearOnSelection: [{
24183
+ type: Input
24184
+ }], autoFocus: [{
24185
+ type: Input
24186
+ }], itemSelected: [{
24187
+ type: Output
24188
+ }], inputSubmitted: [{
24189
+ type: Output
24190
+ }], inputCleared: [{
24191
+ type: Output
24192
+ }], triggerRef: [{
24193
+ type: ViewChild,
24194
+ args: [MatAutocompleteTrigger]
24195
+ }], autocomplete: [{
24196
+ type: ViewChild,
24197
+ args: [MatAutocomplete]
24198
+ }], inputRef: [{
24199
+ type: ViewChild,
24200
+ args: ['searchInput']
24201
+ }], displayWithFn: [{
24202
+ type: Input
24203
+ }] } });
24204
+
23976
24205
  class ButtonComponent {
23977
24206
  constructor() {
23978
24207
  this.btnClass = 'gn-ui-btn-default';
@@ -24024,171 +24253,213 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24024
24253
  type: Output
24025
24254
  }] } });
24026
24255
 
24027
- const DEFAULT_ROW_NUMBERS = 6;
24028
- class DropdownSelectorComponent {
24256
+ class CheckToggleComponent {
24029
24257
  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;
24258
+ this.color = 'primary';
24259
+ this.toggled = new EventEmitter();
24073
24260
  }
24074
- onSelectValue(choice) {
24075
- this.closeOverlay();
24076
- this.selected = choice.value;
24077
- this.selectValue.emit(this.selected);
24261
+ toggle(event) {
24262
+ this.toggled.emit(event);
24078
24263
  }
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
- ]);
24264
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24265
+ 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 }); }
24266
+ }
24267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, decorators: [{
24268
+ type: Component,
24269
+ 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" }]
24270
+ }], propDecorators: { title: [{
24271
+ type: Input
24272
+ }], label: [{
24273
+ type: Input
24274
+ }], value: [{
24275
+ type: Input
24276
+ }], color: [{
24277
+ type: Input
24278
+ }], toggled: [{
24279
+ type: Output
24280
+ }] } });
24281
+
24282
+ class CheckboxComponent {
24283
+ constructor() {
24284
+ this.type = 'default';
24285
+ this.checked = false;
24286
+ this.indeterminate = false;
24287
+ this.changed = new EventEmitter();
24091
24288
  }
24092
- closeOverlay() {
24093
- this.overlayOpen = false;
24289
+ get classList() {
24290
+ return `${this.type}`;
24094
24291
  }
24095
- focusFirstItem() {
24096
- this.choiceInputs.get(0).nativeElement.focus();
24292
+ handleClick(event) {
24293
+ event.stopPropagation();
24294
+ this.checked = !this.checked;
24295
+ this.changed.emit(this.checked);
24097
24296
  }
24098
- focusLastItem() {
24099
- this.choiceInputs.get(this.choiceInputs.length - 1).nativeElement.focus();
24297
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24298
+ 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 }); }
24299
+ }
24300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
24301
+ type: Component,
24302
+ 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"] }]
24303
+ }], propDecorators: { type: [{
24304
+ type: Input
24305
+ }], checked: [{
24306
+ type: Input
24307
+ }], indeterminate: [{
24308
+ type: Input
24309
+ }], changed: [{
24310
+ type: Output
24311
+ }] } });
24312
+
24313
+ class ChipsInputComponent {
24314
+ onChange(event) {
24315
+ this.rawChange.next(event);
24100
24316
  }
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();
24317
+ constructor(http, translate) {
24318
+ this.http = http;
24319
+ this.translate = translate;
24320
+ this.required = false;
24321
+ this.loadOnce = false;
24322
+ this.autocompleteItems = [];
24323
+ this.invalid = false;
24324
+ this.items = [];
24325
+ this.requestAutocompleteItems = (text) => {
24326
+ if (this.url) {
24327
+ if (this.loadOnce && this.loadedItems) {
24328
+ return this.loadedItems;
24329
+ }
24330
+ const url = this.url(text);
24331
+ const lang = LANG_2_TO_3_MAPPER[this.translate.currentLang.slice(0, 2)];
24332
+ return this.http
24333
+ .get(url.replace('${lang}', lang))
24334
+ .pipe(map$1((item) => item.map((i) => i.values[lang])));
24114
24335
  }
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
- }
24336
+ else {
24337
+ return of(this.autocompleteItems || []);
24338
+ }
24339
+ };
24340
+ this.rawChange = new Subject();
24341
+ this.itemsChange = this.rawChange.pipe(distinctUntilChanged());
24342
+ this.subscription = new Subscription();
24124
24343
  }
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();
24344
+ ngOnInit() {
24345
+ if (this.loadOnce) {
24346
+ this.loadedItems = this.requestAutocompleteItems('*').pipe(shareReplay(1));
24139
24347
  }
24348
+ this.items = this.selectedItems;
24349
+ this.subscription = this.rawChange
24350
+ .pipe(tap$1((v) => (this.invalid = v.length === 0)))
24351
+ .subscribe();
24352
+ this.rawChange.next(this.items);
24140
24353
  }
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();
24354
+ ngOnDestroy() {
24355
+ this.subscription.unsubscribe();
24149
24356
  }
24150
- get focusedIndex() {
24151
- return this.choiceInputs.reduce((prev, curr, curIndex) => curr.nativeElement === document.activeElement ? curIndex : prev, -1);
24357
+ 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 }); }
24358
+ 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"] }] }); }
24359
+ }
24360
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChipsInputComponent, decorators: [{
24361
+ type: Component,
24362
+ 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"] }]
24363
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i1$1.TranslateService }]; }, propDecorators: { url: [{
24364
+ type: Input
24365
+ }], placeholder: [{
24366
+ type: Input
24367
+ }], selectedItems: [{
24368
+ type: Input
24369
+ }], required: [{
24370
+ type: Input
24371
+ }], loadOnce: [{
24372
+ type: Input
24373
+ }], autocompleteItems: [{
24374
+ type: Input
24375
+ }], itemsChange: [{
24376
+ type: Output
24377
+ }] } });
24378
+
24379
+ class CopyTextButtonComponent {
24380
+ constructor() {
24381
+ this.displayText = true;
24382
+ this.rows = 1;
24152
24383
  }
24153
- selectIfEnter(event, choice) {
24154
- if (event.code === 'Enter') {
24155
- event.preventDefault();
24156
- this.onSelectValue(choice);
24157
- }
24384
+ copyText(event) {
24385
+ navigator.clipboard.writeText(this.text);
24386
+ event.target.blur();
24158
24387
  }
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 }); }
24388
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24389
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: { text: "text", tooltipText: "tooltipText", displayText: "displayText", rows: "rows" }, ngImport: i0, template: "<div class=\"flex\">\n <input\n *ngIf=\"displayText && rows <= 1\"\n type=\"text\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 truncate\"\n value=\"{{ text }}\"\n readonly\n />\n <textarea\n *ngIf=\"displayText && rows > 1\"\n [rows]=\"rows\"\n class=\"grow py-2 px-4 bg-gray-200 opacity-50 rounded-l-md border border-gray-300 overflow-y-auto h-max\"\n readonly\n >{{ text }}</textarea\n >\n <button\n type=\"button\"\n (click)=\"copyText($event)\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"tooltipText\"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n >content_copy</mat-icon\n >\n </button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24161
24390
  }
24162
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24391
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CopyTextButtonComponent, decorators: [{
24163
24392
  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: [{
24393
+ 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" }]
24394
+ }], propDecorators: { text: [{
24168
24395
  type: Input
24169
- }], ariaName: [{
24396
+ }], tooltipText: [{
24170
24397
  type: Input
24171
- }], choices: [{
24398
+ }], displayText: [{
24172
24399
  type: Input
24173
- }], selected: [{
24400
+ }], rows: [{
24174
24401
  type: Input
24175
- }], maxRows: [{
24402
+ }] } });
24403
+
24404
+ class DatePickerComponent {
24405
+ constructor() {
24406
+ this.dateChange = new EventEmitter();
24407
+ }
24408
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24409
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DatePickerComponent, isStandalone: true, selector: "gn-ui-date-picker", inputs: { date: "date" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between pl-3 rounded-lg border border-gray-300 bg-white\"\n>\n <input\n [matDatepicker]=\"picker\"\n [value]=\"date\"\n (dateChange)=\"dateChange.emit($event.value)\"\n />\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n</div>\n<mat-datepicker #picker></mat-datepicker>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] }); }
24410
+ }
24411
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DatePickerComponent, decorators: [{
24412
+ type: Component,
24413
+ 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"] }]
24414
+ }], propDecorators: { date: [{
24176
24415
  type: Input
24177
- }], extraBtnClass: [{
24416
+ }], dateChange: [{
24417
+ type: Output
24418
+ }] } });
24419
+
24420
+ class DateRangePickerComponent {
24421
+ startDateSelected(event) {
24422
+ this.startDate = event.value;
24423
+ }
24424
+ endDateSelected(event) {
24425
+ this.endDate = event.value;
24426
+ }
24427
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24428
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DateRangePickerComponent, isStandalone: true, selector: "gn-ui-date-range-picker", ngImport: i0, template: "<div\n class=\"flex items-center justify-center w-64 h-11 rounded-lg border border-gray-300 bg-white\"\n>\n <div class=\"w-48 flex justify-between\">\n <mat-date-range-input [rangePicker]=\"picker\" class=\"w-full\">\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matStartDate\n placeholder=\"Start date\"\n (dateInput)=\"startDateSelected($event)\"\n />\n <input\n class=\"w-24 text-black font-basierCircle text-base font-medium text-center\"\n matEndDate\n placeholder=\"End date\"\n (dateInput)=\"endDateSelected($event)\"\n />\n </mat-date-range-input>\n </div>\n <mat-datepicker-toggle matSuffix [for]=\"picker\">\n <mat-icon>calendar_today</mat-icon>\n </mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n</div>\n", styles: ["mat-datepicker-toggle{@apply text-primary;}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2$2.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2$2.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2$2.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2$2.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }] }); }
24429
+ }
24430
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DateRangePickerComponent, decorators: [{
24431
+ type: Component,
24432
+ 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"] }]
24433
+ }] });
24434
+
24435
+ const placeholder = 'dropFile';
24436
+ marker('dropFile');
24437
+ class DragAndDropFileInputComponent {
24438
+ constructor() {
24439
+ this.placeholder = placeholder;
24440
+ this.accept = '*';
24441
+ this.fileChange = new EventEmitter();
24442
+ this.selectedFile = null;
24443
+ }
24444
+ get fileName() {
24445
+ return this.selectedFile && this.selectedFile.name;
24446
+ }
24447
+ selectFile(event) {
24448
+ this.selectedFile = event.addedFiles[0];
24449
+ this.fileChange.emit(this.selectedFile);
24450
+ }
24451
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24452
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: { placeholder: "placeholder", accept: "accept" }, outputs: { fileChange: "fileChange" }, ngImport: i0, template: "<div class=\"flex h-full\">\n <ngx-dropzone\n class=\"flex-1\"\n multiple=\"false\"\n (change)=\"selectFile($event)\"\n [accept]=\"accept\"\n >\n <div *ngIf=\"!fileName\" class=\"text-gray-900 pl-2 py-2\" translate=\"\">\n {{ placeholder }}\n </div>\n\n <div *ngIf=\"fileName\" class=\"text-gray-900 pl-2 py-2\">{{ fileName }}</div>\n </ngx-dropzone>\n</div>\n", styles: ["ngx-dropzone{height:auto;border:none}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3$1.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }] }); }
24453
+ }
24454
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
24455
+ type: Component,
24456
+ 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"] }]
24457
+ }], propDecorators: { placeholder: [{
24178
24458
  type: Input
24179
- }], minWidth: [{
24459
+ }], accept: [{
24180
24460
  type: Input
24181
- }], selectValue: [{
24461
+ }], fileChange: [{
24182
24462
  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
24463
  }] } });
24193
24464
 
24194
24465
  class DropdownMultiselectComponent {
@@ -24336,13 +24607,13 @@ class DropdownMultiselectComponent {
24336
24607
  propagateToDocumentOnly(event);
24337
24608
  this.setFocus();
24338
24609
  }
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 }); }
24610
+ 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 }); }
24611
+ 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
24612
  }
24342
24613
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24343
24614
  type: Component,
24344
24615
  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: [{
24616
+ }], ctorParameters: function () { return [{ type: i1$5.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24346
24617
  type: Input
24347
24618
  }], choices: [{
24348
24619
  type: Input
@@ -24373,350 +24644,263 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24373
24644
  args: ['checkBox', { read: ElementRef }]
24374
24645
  }] } });
24375
24646
 
24376
- class TextInputComponent {
24647
+ const DEFAULT_ROW_NUMBERS = 6;
24648
+ class DropdownSelectorComponent {
24377
24649
  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());
24650
+ this.showTitle = true;
24651
+ this.extraBtnClass = '';
24652
+ this.minWidth = '';
24653
+ this.selectValue = new EventEmitter();
24654
+ this.overlayOpen = false;
24655
+ this.overlayWidth = 'auto';
24656
+ this.overlayMaxHeight = 'none';
24657
+ this.overlayPositions = [
24658
+ {
24659
+ originX: 'start',
24660
+ originY: 'bottom',
24661
+ overlayX: 'start',
24662
+ overlayY: 'top',
24663
+ offsetY: 8,
24664
+ },
24665
+ {
24666
+ originX: 'start',
24667
+ originY: 'top',
24668
+ overlayX: 'start',
24669
+ overlayY: 'bottom',
24670
+ offsetY: -8,
24671
+ },
24672
+ ];
24393
24673
  }
24394
- get classList() {
24395
- return `${this.baseClass} ${this.extraClass}`;
24674
+ get selectedChoice() {
24675
+ return (this.choices.find((choice) => choice.value === this.selected) ??
24676
+ this.choices[0]);
24396
24677
  }
24397
- ngAfterViewInit() {
24398
- this.checkRequired(this.input.nativeElement.value);
24678
+ get id() {
24679
+ return this.title.toLowerCase().replace(/[^a-z]+/g, '-');
24399
24680
  }
24400
- checkRequired(value) {
24401
- this.input.nativeElement.classList.toggle('invalid', this.required && value === '');
24681
+ getChoiceLabel() {
24682
+ return this.selectedChoice?.label;
24402
24683
  }
24403
- handleChange($event) {
24404
- const value = $event.target.value;
24405
- this.checkRequired(value);
24406
- this.rawChange.next(value);
24684
+ ngOnInit() {
24685
+ if (!this.maxRows)
24686
+ this.maxRows = DEFAULT_ROW_NUMBERS;
24687
+ if (!this.choices || this.choices.length === 0) {
24688
+ this.choices = [];
24689
+ }
24407
24690
  }
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"] }); }
24410
- }
24411
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, decorators: [{
24412
- 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: [{
24415
- type: Input
24416
- }], extraClass: [{
24417
- type: Input
24418
- }], hint: [{
24419
- type: Input
24420
- }], required: [{
24421
- type: Input
24422
- }], valueChange: [{
24423
- type: Output
24424
- }], input: [{
24425
- type: ViewChild,
24426
- args: ['input']
24427
- }] } });
24428
-
24429
- class ChipsInputComponent {
24430
- onChange(event) {
24431
- this.rawChange.next(event);
24691
+ isSelected(choice) {
24692
+ return choice === this.selectedChoice;
24432
24693
  }
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 || []);
24694
+ onSelectValue(choice) {
24695
+ this.closeOverlay();
24696
+ this.selected = choice.value;
24697
+ this.selectValue.emit(this.selected);
24698
+ }
24699
+ openOverlay() {
24700
+ this.overlayWidth =
24701
+ this.overlayOrigin.elementRef.nativeElement.getBoundingClientRect()
24702
+ .width + 'px';
24703
+ this.overlayMaxHeight = this.maxRows
24704
+ ? `${this.maxRows * 29 + 60}px`
24705
+ : 'none';
24706
+ this.overlayOpen = true;
24707
+ return Promise.all([
24708
+ firstValueFrom(this.overlay.attach),
24709
+ firstValueFrom(this.choiceInputs.changes),
24710
+ ]);
24711
+ }
24712
+ closeOverlay() {
24713
+ this.overlayOpen = false;
24714
+ }
24715
+ focusFirstItem() {
24716
+ this.choiceInputs.get(0).nativeElement.focus();
24717
+ }
24718
+ focusLastItem() {
24719
+ this.choiceInputs.get(this.choiceInputs.length - 1).nativeElement.focus();
24720
+ }
24721
+ async handleTriggerKeydown(event) {
24722
+ const keyCode = event.code;
24723
+ const isOpenKey = keyCode === 'ArrowDown' ||
24724
+ keyCode === 'ArrowUp' ||
24725
+ keyCode === 'ArrowLeft' ||
24726
+ keyCode === 'ArrowRight' ||
24727
+ keyCode === 'Enter' ||
24728
+ keyCode === 'Space';
24729
+ const isCloseKey = keyCode === 'Escape';
24730
+ if (isOpenKey) {
24731
+ event.preventDefault();
24732
+ if (!this.overlayOpen) {
24733
+ await this.openOverlay();
24454
24734
  }
24455
- };
24456
- this.rawChange = new Subject();
24457
- this.itemsChange = this.rawChange.pipe(distinctUntilChanged());
24458
- this.subscription = new Subscription();
24735
+ if (keyCode === 'ArrowLeft' || keyCode === 'ArrowUp')
24736
+ this.focusLastItem();
24737
+ else
24738
+ this.focusFirstItem();
24739
+ }
24740
+ else if (this.overlayOpen && isCloseKey) {
24741
+ event.preventDefault();
24742
+ this.closeOverlay();
24743
+ }
24459
24744
  }
24460
- ngOnInit() {
24461
- if (this.loadOnce) {
24462
- this.loadedItems = this.requestAutocompleteItems('*').pipe(shareReplay(1));
24745
+ handleOverlayKeydown(event) {
24746
+ if (!this.overlayOpen)
24747
+ return;
24748
+ const keyCode = event.code;
24749
+ if (keyCode === 'ArrowDown' || keyCode === 'ArrowRight') {
24750
+ event.preventDefault();
24751
+ this.shiftItemFocus(1);
24752
+ }
24753
+ else if (keyCode === 'ArrowLeft' || keyCode === 'ArrowUp') {
24754
+ event.preventDefault();
24755
+ this.shiftItemFocus(-1);
24756
+ }
24757
+ else if (keyCode === 'Escape') {
24758
+ this.closeOverlay();
24463
24759
  }
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);
24469
24760
  }
24470
- ngOnDestroy() {
24471
- this.subscription.unsubscribe();
24761
+ shiftItemFocus(shift) {
24762
+ const index = this.focusedIndex;
24763
+ if (index === -1)
24764
+ return;
24765
+ const max = this.choiceInputs.length;
24766
+ // modulo, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder
24767
+ const newIndex = (((index + shift) % max) + max) % max;
24768
+ this.choiceInputs.get(newIndex).nativeElement.focus();
24472
24769
  }
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"] }] }); }
24770
+ get focusedIndex() {
24771
+ return this.choiceInputs.reduce((prev, curr, curIndex) => curr.nativeElement === document.activeElement ? curIndex : prev, -1);
24772
+ }
24773
+ selectIfEnter(event, choice) {
24774
+ if (event.code === 'Enter') {
24775
+ event.preventDefault();
24776
+ this.onSelectValue(choice);
24777
+ }
24778
+ }
24779
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24780
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, isStandalone: true, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$5.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24475
24781
  }
24476
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ChipsInputComponent, decorators: [{
24782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24477
24783
  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: [{
24784
+ args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
24785
+ CommonModule,
24786
+ ButtonComponent,
24787
+ OverlayModule,
24788
+ MatIconModule,
24789
+ TranslateModule,
24790
+ ], 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" }]
24791
+ }], propDecorators: { title: [{
24480
24792
  type: Input
24481
- }], placeholder: [{
24793
+ }], showTitle: [{
24482
24794
  type: Input
24483
- }], selectedItems: [{
24795
+ }], ariaName: [{
24484
24796
  type: Input
24485
- }], required: [{
24797
+ }], choices: [{
24486
24798
  type: Input
24487
- }], loadOnce: [{
24799
+ }], selected: [{
24488
24800
  type: Input
24489
- }], autocompleteItems: [{
24801
+ }], maxRows: [{
24490
24802
  type: Input
24491
- }], itemsChange: [{
24803
+ }], extraBtnClass: [{
24804
+ type: Input
24805
+ }], minWidth: [{
24806
+ type: Input
24807
+ }], selectValue: [{
24492
24808
  type: Output
24809
+ }], overlayOrigin: [{
24810
+ type: ViewChild,
24811
+ args: ['overlayOrigin']
24812
+ }], overlay: [{
24813
+ type: ViewChild,
24814
+ args: [CdkConnectedOverlay]
24815
+ }], choiceInputs: [{
24816
+ type: ViewChildren,
24817
+ args: ['choiceInputs', { read: ElementRef }]
24493
24818
  }] } });
24494
24819
 
24495
- class TextAreaComponent {
24496
- constructor() {
24497
- this.value = '';
24498
- this.disabled = false;
24499
- this.extraClass = '';
24500
- this.required = false;
24501
- this.rawChange = new Subject();
24502
- this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24503
- this.baseClasses = [
24504
- 'w-full',
24505
- 'pt-2',
24506
- 'pl-2',
24507
- 'resize-none',
24508
- 'border',
24509
- 'border-gray-800',
24510
- 'rounded italic',
24511
- 'leading-tight',
24512
- 'focus:outline-none',
24513
- 'focus:bg-background',
24514
- 'focus:border-primary',
24515
- ].join(' ');
24516
- this.disabledClasses = ['cursor-not-allowed'].join(' ');
24517
- }
24518
- get classList() {
24519
- return `${this.baseClasses} ${this.extraClass} ${this.disabled ? this.disabledClasses : ''}`;
24820
+ class EditableLabelDirective {
24821
+ constructor(el, renderer) {
24822
+ this.el = el;
24823
+ this.renderer = renderer;
24824
+ this.editableLabelChanged = new EventEmitter();
24520
24825
  }
24521
24826
  ngAfterViewInit() {
24522
- this.checkRequired(this.input.nativeElement.value);
24523
- }
24524
- checkRequired(value) {
24525
- this.input.nativeElement.classList.toggle('invalid', this.required && value === '');
24526
- }
24527
- handleChange($event) {
24528
- const value = $event.target.value;
24529
- this.checkRequired(value);
24530
- this.rawChange.next(value);
24827
+ if (this.gnUiEditableLabel !== false) {
24828
+ const appendedInput = this.renderer.createElement('input');
24829
+ this.renderer.setStyle(appendedInput, 'background', 'inherit');
24830
+ this.renderer.setStyle(appendedInput, 'color', 'inherit');
24831
+ this.renderer.setStyle(appendedInput, 'font', 'inherit');
24832
+ this.renderer.setStyle(appendedInput, 'border', 'inherit');
24833
+ this.renderer.setStyle(appendedInput, 'width', '100%');
24834
+ this.renderer.setStyle(appendedInput, 'padding', 'inherit');
24835
+ this.renderer.setStyle(appendedInput, 'margin', '0');
24836
+ this.renderer.setStyle(appendedInput, 'height', 'inherit');
24837
+ this.renderer.setStyle(appendedInput, 'line-height', 'inherit');
24838
+ this.renderer.setStyle(appendedInput, 'text-decoration', 'inherit');
24839
+ const hostContent = this.el.nativeElement.textContent || '';
24840
+ const formattedContent = hostContent.replace(/\s+/g, ' ').trim();
24841
+ this.renderer.setProperty(appendedInput, 'value', formattedContent);
24842
+ this.renderer.setProperty(this.el.nativeElement, 'innerHTML', '');
24843
+ this.renderer.listen(appendedInput, 'input', (event) => {
24844
+ this.editableLabelChanged.emit(event.target.value);
24845
+ });
24846
+ this.renderer.appendChild(this.el.nativeElement, appendedInput);
24847
+ }
24531
24848
  }
24532
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24533
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", disabled: "disabled", extraClass: "extraClass", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [class]=\"classList\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
24849
+ 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 }); }
24850
+ 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 }); }
24534
24851
  }
24535
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
24536
- type: Component,
24537
- args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [class]=\"classList\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
24538
- }], ctorParameters: function () { return []; }, propDecorators: { value: [{
24539
- type: Input
24540
- }], disabled: [{
24541
- type: Input
24542
- }], extraClass: [{
24543
- type: Input
24544
- }], placeholder: [{
24545
- type: Input
24546
- }], required: [{
24547
- type: Input
24548
- }], valueChange: [{
24852
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
24853
+ type: Directive,
24854
+ args: [{
24855
+ selector: '[gnUiEditableLabel]',
24856
+ standalone: true,
24857
+ }]
24858
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
24549
24859
  type: Output
24550
- }], input: [{
24551
- type: ViewChild,
24552
- args: ['input']
24860
+ }], gnUiEditableLabel: [{
24861
+ type: Input
24553
24862
  }] } });
24554
24863
 
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 }); }
24864
+ class NavigationButtonComponent {
24865
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24866
+ 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 }); }
24586
24867
  }
24587
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PopupAlertComponent, decorators: [{
24868
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
24588
24869
  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: [{
24870
+ 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"] }]
24871
+ }], propDecorators: { label: [{
24593
24872
  type: Input
24594
- }], position: [{
24873
+ }], icon: [{
24595
24874
  type: Input
24596
- }], content: [{
24597
- type: ViewChild,
24598
- args: ['content']
24599
24875
  }] } });
24600
24876
 
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
- }
24626
- }
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$);
24640
- }
24641
- 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();
24877
+ class SearchInputComponent {
24878
+ constructor() {
24879
+ this.value = '';
24880
+ this.placeholder = '';
24881
+ this.rawChange = new Subject();
24882
+ this.valueChange = this.rawChange.pipe(distinctUntilChanged$1());
24650
24883
  }
24651
- updateInputValue(value) {
24652
- if (value) {
24653
- this.control.setValue(value);
24654
- }
24655
- if (this.inputRef) {
24656
- this.inputRef.nativeElement.value = value?.title || '';
24657
- }
24884
+ handleChange($event) {
24885
+ const value = $event.target.value;
24886
+ this.rawChange.next(value);
24658
24887
  }
24659
24888
  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
- }
24673
- }
24674
- handleClickSearch() {
24675
- this.inputSubmitted.emit(this.inputRef.nativeElement.value);
24676
- this.triggerRef.closePanel();
24677
- }
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
- }
24889
+ this.value = null;
24890
+ this.rawChange.next(null);
24686
24891
  }
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 }); }
24892
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24893
+ 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 }); }
24689
24894
  }
24690
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
24895
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchInputComponent, decorators: [{
24691
24896
  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: [{
24897
+ 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" }]
24898
+ }], propDecorators: { value: [{
24700
24899
  type: Input
24701
- }], autoFocus: [{
24900
+ }], placeholder: [{
24702
24901
  type: Input
24703
- }], itemSelected: [{
24704
- type: Output
24705
- }], inputSubmitted: [{
24706
- type: Output
24707
- }], inputCleared: [{
24902
+ }], valueChange: [{
24708
24903
  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: [{
24719
- type: Input
24720
24904
  }] } });
24721
24905
 
24722
24906
  class StarToggleComponent {
@@ -24754,115 +24938,117 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24754
24938
  args: ['starOverlay']
24755
24939
  }] } });
24756
24940
 
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);
24941
+ class TextAreaComponent {
24942
+ constructor() {
24943
+ this.value = '';
24944
+ this.disabled = false;
24945
+ this.extraClass = '';
24946
+ this.required = false;
24947
+ this.rawChange = new Subject();
24948
+ this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24949
+ this.baseClasses = [
24950
+ 'w-full',
24951
+ 'pt-2',
24952
+ 'pl-2',
24953
+ 'resize-none',
24954
+ 'border',
24955
+ 'border-gray-800',
24956
+ 'rounded italic',
24957
+ 'leading-tight',
24958
+ 'focus:outline-none',
24959
+ 'focus:bg-background',
24960
+ 'focus:border-primary',
24961
+ ].join(' ');
24962
+ this.disabledClasses = ['cursor-not-allowed'].join(' ');
24771
24963
  }
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);
24964
+ get classList() {
24965
+ return `${this.baseClasses} ${this.extraClass} ${this.disabled ? this.disabledClasses : ''}`;
24781
24966
  }
24782
- unObserveInputElement(elToObserve) {
24783
- this.observer?.unobserve(elToObserve);
24967
+ ngAfterViewInit() {
24968
+ this.checkRequired(this.input.nativeElement.value);
24784
24969
  }
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();
24970
+ checkRequired(value) {
24971
+ this.input.nativeElement.classList.toggle('invalid', this.required && value === '');
24803
24972
  }
24804
- toggle(event) {
24805
- this.toggled.emit(event);
24973
+ handleChange($event) {
24974
+ const value = $event.target.value;
24975
+ this.checkRequired(value);
24976
+ this.rawChange.next(value);
24806
24977
  }
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 }); }
24978
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24979
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", disabled: "disabled", extraClass: "extraClass", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [class]=\"classList\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
24809
24980
  }
24810
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckToggleComponent, decorators: [{
24981
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
24811
24982
  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: [{
24983
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [class]=\"classList\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
24984
+ }], ctorParameters: function () { return []; }, propDecorators: { value: [{
24814
24985
  type: Input
24815
- }], label: [{
24986
+ }], disabled: [{
24816
24987
  type: Input
24817
- }], value: [{
24988
+ }], extraClass: [{
24818
24989
  type: Input
24819
- }], color: [{
24990
+ }], placeholder: [{
24820
24991
  type: Input
24821
- }], toggled: [{
24992
+ }], required: [{
24993
+ type: Input
24994
+ }], valueChange: [{
24822
24995
  type: Output
24996
+ }], input: [{
24997
+ type: ViewChild,
24998
+ args: ['input']
24823
24999
  }] } });
24824
25000
 
24825
- const placeholder = 'dropFile';
24826
- marker('dropFile');
24827
- class DragAndDropFileInputComponent {
25001
+ class TextInputComponent {
24828
25002
  constructor() {
24829
- this.placeholder = placeholder;
24830
- this.accept = '*';
24831
- this.fileChange = new EventEmitter();
24832
- this.selectedFile = null;
25003
+ this.baseClass = [
25004
+ 'appearance-none',
25005
+ 'border border-gray-300',
25006
+ 'rounded w-full',
25007
+ 'p-2',
25008
+ 'text-gray-700',
25009
+ 'leading-tight',
25010
+ 'focus:outline-none',
25011
+ 'focus:border-primary',
25012
+ ].join(' ');
25013
+ this.value = '';
25014
+ this.extraClass = '';
25015
+ this.required = false;
25016
+ this.rawChange = new Subject();
25017
+ this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24833
25018
  }
24834
- get fileName() {
24835
- return this.selectedFile && this.selectedFile.name;
25019
+ get classList() {
25020
+ return `${this.baseClass} ${this.extraClass}`;
24836
25021
  }
24837
- selectFile(event) {
24838
- this.selectedFile = event.addedFiles[0];
24839
- this.fileChange.emit(this.selectedFile);
25022
+ ngAfterViewInit() {
25023
+ this.checkRequired(this.input.nativeElement.value);
24840
25024
  }
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"] }] }); }
25025
+ checkRequired(value) {
25026
+ this.input.nativeElement.classList.toggle('invalid', this.required && value === '');
25027
+ }
25028
+ handleChange($event) {
25029
+ const value = $event.target.value;
25030
+ this.checkRequired(value);
25031
+ this.rawChange.next(value);
25032
+ }
25033
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25034
+ 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"] }); }
24843
25035
  }
24844
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DragAndDropFileInputComponent, decorators: [{
25036
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, decorators: [{
24845
25037
  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: [{
25038
+ 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"] }]
25039
+ }], propDecorators: { value: [{
24848
25040
  type: Input
24849
- }], accept: [{
25041
+ }], extraClass: [{
24850
25042
  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: [{
25043
+ }], hint: [{
24863
25044
  type: Input
24864
- }], icon: [{
25045
+ }], required: [{
24865
25046
  type: Input
25047
+ }], valueChange: [{
25048
+ type: Output
25049
+ }], input: [{
25050
+ type: ViewChild,
25051
+ args: ['input']
24866
25052
  }] } });
24867
25053
 
24868
25054
  class ColorScaleComponent {
@@ -24970,7 +25156,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24970
25156
 
24971
25157
  class LoadingMaskComponent {
24972
25158
  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 }); }
25159
+ 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
25160
  }
24975
25161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LoadingMaskComponent, decorators: [{
24976
25162
  type: Component,
@@ -25066,148 +25252,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25066
25252
  }]
25067
25253
  }] });
25068
25254
 
25069
- class CopyTextButtonComponent {
25070
- constructor() {
25071
- this.displayText = true;
25072
- this.rows = 1;
25255
+ class ViewportIntersectorComponent {
25256
+ constructor(vcRef) {
25257
+ this.vcRef = vcRef;
25258
+ this.isInViewport = new EventEmitter();
25259
+ this.entersViewport = this.isInViewport.pipe(filter((inViewport) => inViewport), map$1(() => undefined));
25260
+ this.exitsViewport = this.isInViewport.pipe(filter((inViewport) => !inViewport), map$1(() => undefined));
25073
25261
  }
25074
- copyText(event) {
25075
- navigator.clipboard.writeText(this.text);
25076
- event.target.blur();
25262
+ ngOnInit() {
25263
+ const elToObserve = this.vcRef.element.nativeElement;
25264
+ this.observeInputElement(elToObserve);
25077
25265
  }
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();
25266
+ ngOnDestroy() {
25267
+ const elToObserve = this.vcRef.element.nativeElement;
25268
+ this.unObserveInputElement(elToObserve);
25100
25269
  }
25101
- get classList() {
25102
- return `${this.type}`;
25270
+ observeInputElement(elToObserve) {
25271
+ if (!this.observer) {
25272
+ this.observer = new IntersectionObserver((entries) => {
25273
+ entries.forEach((entry) => {
25274
+ this.isInViewport.emit(entry.isIntersecting);
25275
+ });
25276
+ }, { root: null, threshold: 0 });
25277
+ }
25278
+ this.observer.observe(elToObserve);
25103
25279
  }
25104
- handleClick(event) {
25105
- event.stopPropagation();
25106
- this.checked = !this.checked;
25107
- this.changed.emit(this.checked);
25280
+ unObserveInputElement(elToObserve) {
25281
+ this.observer?.unobserve(elToObserve);
25108
25282
  }
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 }); }
25283
+ 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 }); }
25284
+ 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
25285
  }
25112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ViewportIntersectorComponent, decorators: [{
25113
25287
  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: [{
25288
+ args: [{ selector: 'gn-ui-viewport-intersector', template: "<div class=\"w-full h-full\"></div>\n" }]
25289
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; }, propDecorators: { isInViewport: [{
25122
25290
  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: [{
25291
+ }], entersViewport: [{
25151
25292
  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: [{
25293
+ }], exitsViewport: [{
25208
25294
  type: Output
25209
- }], gnUiEditableLabel: [{
25210
- type: Input
25211
25295
  }] } });
25212
25296
 
25213
25297
  class FilesDropDirective {
@@ -25399,7 +25483,7 @@ class ImageInputComponent {
25399
25483
  });
25400
25484
  }
25401
25485
  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 }); }
25486
+ 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
25487
  }
25404
25488
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageInputComponent, decorators: [{
25405
25489
  type: Component,
@@ -25435,8 +25519,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25435
25519
 
25436
25520
  class UiInputsModule {
25437
25521
  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,
25522
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [AutocompleteComponent,
25440
25523
  TextInputComponent,
25441
25524
  DragAndDropFileInputComponent,
25442
25525
  ChipsInputComponent,
@@ -25447,8 +25530,7 @@ class UiInputsModule {
25447
25530
  CheckToggleComponent,
25448
25531
  CopyTextButtonComponent,
25449
25532
  CheckboxComponent,
25450
- SearchInputComponent,
25451
- DateRangePickerComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
25533
+ SearchInputComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
25452
25534
  FormsModule,
25453
25535
  ReactiveFormsModule,
25454
25536
  TagInputModule,
@@ -25466,7 +25548,9 @@ class UiInputsModule {
25466
25548
  EditableLabelDirective,
25467
25549
  TextAreaComponent,
25468
25550
  ButtonComponent,
25469
- ImageInputComponent], exports: [DropdownSelectorComponent,
25551
+ ImageInputComponent,
25552
+ DropdownSelectorComponent,
25553
+ DateRangePickerComponent], exports: [DropdownSelectorComponent,
25470
25554
  AutocompleteComponent,
25471
25555
  ButtonComponent,
25472
25556
  TextInputComponent,
@@ -25501,13 +25585,14 @@ class UiInputsModule {
25501
25585
  MatInputModule,
25502
25586
  MatDatepickerModule,
25503
25587
  MatNativeDateModule,
25504
- ImageInputComponent] }); }
25588
+ ImageInputComponent,
25589
+ DropdownSelectorComponent,
25590
+ DateRangePickerComponent] }); }
25505
25591
  }
25506
25592
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, decorators: [{
25507
25593
  type: NgModule,
25508
25594
  args: [{
25509
25595
  declarations: [
25510
- DropdownSelectorComponent,
25511
25596
  AutocompleteComponent,
25512
25597
  TextInputComponent,
25513
25598
  DragAndDropFileInputComponent,
@@ -25520,7 +25605,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25520
25605
  CopyTextButtonComponent,
25521
25606
  CheckboxComponent,
25522
25607
  SearchInputComponent,
25523
- DateRangePickerComponent,
25524
25608
  ],
25525
25609
  imports: [
25526
25610
  CommonModule,
@@ -25544,6 +25628,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25544
25628
  TextAreaComponent,
25545
25629
  ButtonComponent,
25546
25630
  ImageInputComponent,
25631
+ DropdownSelectorComponent,
25632
+ DateRangePickerComponent,
25547
25633
  ],
25548
25634
  exports: [
25549
25635
  DropdownSelectorComponent,
@@ -25568,6 +25654,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25568
25654
  }]
25569
25655
  }] });
25570
25656
 
25657
+ class PreviousNextButtonsComponent {
25658
+ constructor() {
25659
+ this.directionButtonClicked = new EventEmitter();
25660
+ }
25661
+ previousButtonClicked() {
25662
+ this.directionButtonClicked.next('previous');
25663
+ }
25664
+ nextButtonClicked() {
25665
+ this.directionButtonClicked.next('next');
25666
+ }
25667
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PreviousNextButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25668
+ 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 }); }
25669
+ }
25670
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PreviousNextButtonsComponent, decorators: [{
25671
+ type: Component,
25672
+ 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"] }]
25673
+ }], propDecorators: { isFirst: [{
25674
+ type: Input
25675
+ }], isLast: [{
25676
+ type: Input
25677
+ }], directionButtonClicked: [{
25678
+ type: Output
25679
+ }] } });
25680
+
25571
25681
  class AddLayerFromOgcApiComponent {
25572
25682
  constructor(changeDetectorRef) {
25573
25683
  this.changeDetectorRef = changeDetectorRef;
@@ -26376,7 +26486,7 @@ class ApiCardComponent {
26376
26486
  }
26377
26487
  }
26378
26488
  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 }); }
26489
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ApiCardComponent, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden\"\n [ngClass]=\"{ 'cursor-pointer': displayApiFormButton }\"\n (click)=\"openRecordApiFormPanel()\"\n>\n <div\n class=\"font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]\"\n >\n {{ link.name || link.description }}\n </div>\n <div class=\"\">\n <div class=\"flex flex-row justify-between\">\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive\n }\"\n >{{ link.accessServiceProtocol }}</span\n >\n <gn-ui-copy-text-button\n *ngIf=\"!displayApiFormButton\"\n [text]=\"link.url.toString()\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <button\n *ngIf=\"displayApiFormButton\"\n type=\"button\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText\n }\"\n mat-raised-button\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n >\n <mat-icon\n class=\"material-symbols-outlined pointer-events-none align-middle card-icon\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive\n }\"\n >more_horiz</mat-icon\n >\n </button>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26380
26490
  }
26381
26491
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ApiCardComponent, decorators: [{
26382
26492
  type: Component,
@@ -26507,7 +26617,7 @@ class DownloadsListComponent {
26507
26617
  return getBadgeColor(getFileFormat(link));
26508
26618
  }
26509
26619
  isFromWfs(link) {
26510
- return link.type === 'service' && link.accessServiceProtocol === 'wfs';
26620
+ return link.type === 'download' && link.accessServiceProtocol === 'wfs';
26511
26621
  }
26512
26622
  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
26623
  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 +26649,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26539
26649
  }] } });
26540
26650
 
26541
26651
  class LinkCardComponent {
26652
+ constructor() {
26653
+ this.compact = false;
26654
+ }
26655
+ get title() {
26656
+ if (this.link.name && this.link.description) {
26657
+ return `${this.link.name} | ${this.link.description}`;
26658
+ }
26659
+ return this.link.name || this.link.description || '';
26660
+ }
26542
26661
  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 }); }
26662
+ 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
26663
  }
26545
26664
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, decorators: [{
26546
26665
  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" }]
26666
+ 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
26667
  }], propDecorators: { link: [{
26549
26668
  type: Input
26669
+ }], compact: [{
26670
+ type: Input
26550
26671
  }] } });
26551
26672
 
26552
26673
  class MarkdownParserComponent {
@@ -27008,10 +27129,7 @@ class RecordApiFormComponent {
27008
27129
  this.offset$ = new BehaviorSubject('');
27009
27130
  this.limit$ = new BehaviorSubject('');
27010
27131
  this.format$ = new BehaviorSubject('');
27011
- this.formatsList = [
27012
- { label: 'JSON', value: 'json' },
27013
- { label: 'CSV', value: 'csv' },
27014
- ];
27132
+ this.outputFormats = [{ value: 'json', label: 'JSON' }];
27015
27133
  this.apiQueryUrl$ = combineLatest([this.offset$, this.limit$, this.format$]).pipe(map$2(([offset, limit, format]) => {
27016
27134
  let outputUrl;
27017
27135
  if (this.apiBaseUrl) {
@@ -27033,7 +27151,11 @@ class RecordApiFormComponent {
27033
27151
  this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
27034
27152
  }
27035
27153
  set apiLink(value) {
27036
- this.apiBaseUrl = value ? value.url.href : undefined;
27154
+ this.outputFormats = [{ value: 'json', label: 'JSON' }];
27155
+ if (value) {
27156
+ this.apiBaseUrl = value.url.href;
27157
+ this.parseOutputFormats();
27158
+ }
27037
27159
  this.resetUrl();
27038
27160
  }
27039
27161
  setOffset(value) {
@@ -27051,19 +27173,45 @@ class RecordApiFormComponent {
27051
27173
  this.limit$.next(DEFAULT_PARAMS.LIMIT);
27052
27174
  this.format$.next(DEFAULT_PARAMS.FORMAT);
27053
27175
  }
27176
+ parseOutputFormats() {
27177
+ const apiUrl = this.apiBaseUrl.slice(-1) === '?'
27178
+ ? this.apiBaseUrl.slice(0, -1)
27179
+ : this.apiBaseUrl;
27180
+ this.getOutputFormats(apiUrl).then((outputFormats) => {
27181
+ const formatsList = outputFormats.itemFormats.map((format) => {
27182
+ const normalizedFormat = mimeTypeToFormat(format);
27183
+ if (normalizedFormat) {
27184
+ return {
27185
+ label: normalizedFormat?.toUpperCase(),
27186
+ value: normalizedFormat,
27187
+ };
27188
+ }
27189
+ return null;
27190
+ });
27191
+ this.outputFormats = this.outputFormats.concat(formatsList.filter(Boolean));
27192
+ this.outputFormats = this.outputFormats
27193
+ .filter((format, index, self) => index === self.findIndex((t) => t.value === format.value))
27194
+ .sort((a, b) => a.label.localeCompare(b.label));
27195
+ });
27196
+ }
27197
+ async getOutputFormats(url) {
27198
+ const endpoint = await new OgcApiEndpoint(url);
27199
+ const firstCollection = (await endpoint.featureCollections)[0];
27200
+ return endpoint.getCollectionInfo(firstCollection);
27201
+ }
27054
27202
  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 }); }
27203
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27056
27204
  }
27057
27205
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
27058
27206
  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"] }]
27207
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
27060
27208
  }], propDecorators: { apiLink: [{
27061
27209
  type: Input
27062
27210
  }] } });
27063
27211
 
27064
27212
  class RelatedRecordCardComponent {
27065
27213
  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 }); }
27214
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RelatedRecordCardComponent, selector: "gn-ui-related-record-card", inputs: { record: "record" }, ngImport: i0, template: "<a\n class=\"w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]\"\n [routerLink]=\"['/dataset', record.uniqueIdentifier]\"\n target=\"_blank\"\n>\n <div class=\"h-52 bg-gray-100\">\n <gn-ui-thumbnail\n class=\"h-52 w-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col justify-between h-44 px-5 pt-4 pb-6\">\n <h4\n class=\"max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden\"\n >\n {{ record.title }}\n </h4>\n <div>\n <button\n mat-raised-button\n [matTooltip]=\"'tooltip.url.open' | translate\"\n matTooltipPosition=\"above\"\n >\n <mat-icon class=\"material-symbols-outlined align-middle text-secondary\"\n >open_in_new</mat-icon\n >\n </button>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1$7.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27067
27215
  }
27068
27216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
27069
27217
  type: Component,
@@ -27159,48 +27307,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27159
27307
  }] } });
27160
27308
 
27161
27309
  class CarouselComponent {
27310
+ get isFirstStep() {
27311
+ return this.currentStep === 0;
27312
+ }
27313
+ get isLastStep() {
27314
+ return this.currentStep === this.steps.length - 1;
27315
+ }
27316
+ get stepsCount() {
27317
+ return this.steps.length;
27318
+ }
27162
27319
  constructor(changeDetector) {
27163
27320
  this.changeDetector = changeDetector;
27164
27321
  this.containerClass = '';
27165
- this.stepsContainerClass = '';
27322
+ this.stepsContainerClass = 'w-full bottom-0 top-auto';
27323
+ this.currentStepChange = new EventEmitter();
27166
27324
  this.steps = [];
27167
- this.selectedStep = -1;
27325
+ this.currentStep = 0;
27326
+ this.refreshSteps = () => {
27327
+ this.steps = this.emblaApi.scrollSnapList();
27328
+ this.currentStep = this.emblaApi.selectedScrollSnap();
27329
+ this.currentStepChange.emit(this.currentStep);
27330
+ this.changeDetector.detectChanges();
27331
+ };
27168
27332
  }
27169
27333
  ngAfterViewInit() {
27170
27334
  this.emblaApi = EmblaCarousel(this.carouselOverflowContainer.nativeElement, {
27171
27335
  duration: 15,
27172
27336
  });
27173
- const refreshSteps = () => {
27174
- this.steps = this.emblaApi.scrollSnapList();
27175
- this.selectedStep = this.emblaApi.selectedScrollSnap();
27176
- this.changeDetector.detectChanges();
27177
- };
27178
27337
  this.emblaApi
27179
- .on('init', refreshSteps)
27180
- .on('reInit', refreshSteps)
27181
- .on('select', refreshSteps);
27338
+ .on('init', this.refreshSteps)
27339
+ .on('reInit', this.refreshSteps)
27340
+ .on('select', this.refreshSteps);
27182
27341
  }
27183
27342
  scrollToStep(stepIndex) {
27184
27343
  this.emblaApi.scrollTo(stepIndex);
27185
27344
  }
27345
+ slideToPrevious() {
27346
+ if (this.isFirstStep)
27347
+ return;
27348
+ this.emblaApi.scrollPrev();
27349
+ }
27350
+ slideToNext() {
27351
+ if (this.isLastStep)
27352
+ return;
27353
+ this.emblaApi.scrollNext();
27354
+ }
27186
27355
  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 }); }
27356
+ 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}.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
27357
  }
27189
27358
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
27190
27359
  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: [{
27360
+ 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}.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"] }]
27361
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { carouselOverflowContainer: [{
27362
+ type: ViewChild,
27363
+ args: ['carouselOverflowContainer']
27364
+ }], containerClass: [{
27193
27365
  type: Input
27194
27366
  }], stepsContainerClass: [{
27195
27367
  type: Input
27196
- }], carouselOverflowContainer: [{
27197
- type: ViewChild,
27198
- args: ['carouselOverflowContainer']
27368
+ }], currentStepChange: [{
27369
+ type: Output
27199
27370
  }] } });
27200
27371
 
27201
27372
  class FormFieldWrapperComponent {
27202
27373
  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 }); }
27374
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27204
27375
  }
27205
27376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
27206
27377
  type: Component,
@@ -27349,17 +27520,87 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27349
27520
  args: ['innerContainer']
27350
27521
  }] } });
27351
27522
 
27523
+ class BlockListComponent {
27524
+ get pages() {
27525
+ return new Array(this.pagesCount).fill(0).map((_, i) => i);
27526
+ }
27527
+ get isFirstPage() {
27528
+ return this.currentPage === 0;
27529
+ }
27530
+ get isLastPage() {
27531
+ return this.currentPage === this.pagesCount - 1;
27532
+ }
27533
+ get pagesCount() {
27534
+ return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
27535
+ }
27536
+ constructor(changeDetector) {
27537
+ this.changeDetector = changeDetector;
27538
+ this.pageSize = 5;
27539
+ this.containerClass = '';
27540
+ this.paginationContainerClass = 'w-full bottom-0 top-auto';
27541
+ this.minHeight = 0;
27542
+ this.currentPage = 0;
27543
+ this.refreshBlocksVisibility = () => {
27544
+ this.blocks.forEach((block, index) => {
27545
+ block.nativeElement.style.display =
27546
+ index >= this.currentPage * this.pageSize &&
27547
+ index < (this.currentPage + 1) * this.pageSize
27548
+ ? null
27549
+ : 'none';
27550
+ });
27551
+ };
27552
+ }
27553
+ ngAfterViewInit() {
27554
+ this.blocks.changes.subscribe(this.refreshBlocksVisibility);
27555
+ this.refreshBlocksVisibility();
27556
+ // we store the first height as the min-height of the list container
27557
+ this.minHeight = this.blockContainer.nativeElement.clientHeight;
27558
+ this.changeDetector.detectChanges();
27559
+ }
27560
+ goToPage(index) {
27561
+ this.currentPage = Math.max(Math.min(index, this.pagesCount - 1), 0);
27562
+ this.changeDetector.detectChanges();
27563
+ this.refreshBlocksVisibility();
27564
+ }
27565
+ previousPage() {
27566
+ if (this.isFirstPage)
27567
+ return;
27568
+ this.goToPage(this.currentPage - 1);
27569
+ }
27570
+ nextPage() {
27571
+ if (this.isLastPage)
27572
+ return;
27573
+ this.goToPage(this.currentPage + 1);
27574
+ }
27575
+ 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 }); }
27576
+ 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 }); }
27577
+ }
27578
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BlockListComponent, decorators: [{
27579
+ type: Component,
27580
+ 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"] }]
27581
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { pageSize: [{
27582
+ type: Input
27583
+ }], containerClass: [{
27584
+ type: Input
27585
+ }], paginationContainerClass: [{
27586
+ type: Input
27587
+ }], blocks: [{
27588
+ type: ContentChildren,
27589
+ args: ['block', { read: ElementRef }]
27590
+ }], blockContainer: [{
27591
+ type: ViewChild,
27592
+ args: ['blockContainer']
27593
+ }] } });
27594
+
27352
27595
  class UiLayoutModule {
27353
27596
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27354
27597
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, declarations: [ExpandablePanelComponent,
27355
27598
  StickyHeaderComponent,
27356
27599
  AnchorLinkDirective,
27357
- ExpandablePanelButtonComponent,
27358
- CarouselComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
27600
+ ExpandablePanelButtonComponent], imports: [CommonModule, MatIconModule, i1$1.TranslateModule], exports: [ExpandablePanelComponent,
27359
27601
  StickyHeaderComponent,
27360
27602
  AnchorLinkDirective,
27361
- ExpandablePanelButtonComponent,
27362
- CarouselComponent] }); }
27603
+ ExpandablePanelButtonComponent] }); }
27363
27604
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, imports: [CommonModule, MatIconModule, TranslateModule.forChild()] }); }
27364
27605
  }
27365
27606
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiLayoutModule, decorators: [{
@@ -27371,14 +27612,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27371
27612
  StickyHeaderComponent,
27372
27613
  AnchorLinkDirective,
27373
27614
  ExpandablePanelButtonComponent,
27374
- CarouselComponent,
27375
27615
  ],
27376
27616
  exports: [
27377
27617
  ExpandablePanelComponent,
27378
27618
  StickyHeaderComponent,
27379
27619
  AnchorLinkDirective,
27380
27620
  ExpandablePanelButtonComponent,
27381
- CarouselComponent,
27382
27621
  ],
27383
27622
  }]
27384
27623
  }] });
@@ -27388,7 +27627,7 @@ class UserPreviewComponent {
27388
27627
  return (this.user.name + ' ' + this.user.surname).trim();
27389
27628
  }
27390
27629
  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 }); }
27630
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: UserPreviewComponent, selector: "gn-ui-user-preview", inputs: { user: "user", avatarPlaceholder: "avatarPlaceholder" }, ngImport: i0, template: "<figure class=\"text-center\">\n <div\n class=\"w-12 h-12 border border-primary rounded-full capitalize\"\n [matTooltip]=\"userFullName\"\n >\n <gn-ui-avatar\n [avatarUrl]=\"user.profileIcon\"\n [avatarPlaceholder]=\"avatarPlaceholder\"\n ></gn-ui-avatar>\n </div>\n</figure>\n", dependencies: [{ kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AvatarComponent, selector: "gn-ui-avatar", inputs: ["avatarUrl", "avatarPlaceholder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27392
27631
  }
27393
27632
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserPreviewComponent, decorators: [{
27394
27633
  type: Component,
@@ -27512,7 +27751,6 @@ class UiElementsModule {
27512
27751
  DownloadItemComponent,
27513
27752
  DownloadsListComponent,
27514
27753
  ApiCardComponent,
27515
- LinkCardComponent,
27516
27754
  RelatedRecordCardComponent,
27517
27755
  MetadataContactComponent,
27518
27756
  MetadataCatalogComponent,
@@ -27543,7 +27781,6 @@ class UiElementsModule {
27543
27781
  DownloadItemComponent,
27544
27782
  DownloadsListComponent,
27545
27783
  ApiCardComponent,
27546
- LinkCardComponent,
27547
27784
  RelatedRecordCardComponent,
27548
27785
  MetadataContactComponent,
27549
27786
  MetadataCatalogComponent,
@@ -27597,7 +27834,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27597
27834
  DownloadItemComponent,
27598
27835
  DownloadsListComponent,
27599
27836
  ApiCardComponent,
27600
- LinkCardComponent,
27601
27837
  RelatedRecordCardComponent,
27602
27838
  MetadataContactComponent,
27603
27839
  MetadataCatalogComponent,
@@ -27620,7 +27856,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27620
27856
  DownloadItemComponent,
27621
27857
  DownloadsListComponent,
27622
27858
  ApiCardComponent,
27623
- LinkCardComponent,
27624
27859
  RelatedRecordCardComponent,
27625
27860
  MetadataContactComponent,
27626
27861
  MetadataCatalogComponent,
@@ -30994,7 +31229,7 @@ class TableComponent {
30994
31229
  return rowIdPrefix + id;
30995
31230
  }
30996
31231
  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 }); }
31232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TableComponent, isStandalone: true, selector: "gn-ui-table", inputs: { data: "data", activeId: "activeId" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"border border-gray-300 rounded-lg overflow-hidden bg-white h-full\">\n <cdk-virtual-scroll-viewport\n tvsItemSize=\"48\"\n headerHeight=\"56\"\n style=\"height: calc(100% - 37px)\"\n >\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z8\" matSort>\n <ng-container *ngFor=\"let prop of properties\" [matColumnDef]=\"prop\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ prop }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[prop] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"row.id === activeId\"\n ></tr>\n </table>\n </cdk-virtual-scroll-viewport>\n <div class=\"text-gray-900 border-t border-gray-300 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n</div>\n", styles: ["table{width:100%;background:white}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:whitesmoke}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i1$9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$4.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$4.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: TableVirtualScrollModule }, { kind: "directive", type: i3$2.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i4$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30998
31233
  }
30999
31234
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TableComponent, decorators: [{
31000
31235
  type: Component,
@@ -31864,6 +32099,7 @@ marker('wfs.unreachable.http');
31864
32099
  marker('wfs.unreachable.unknown');
31865
32100
  marker('wfs.featuretype.notfound');
31866
32101
  marker('wfs.geojsongml.notsupported');
32102
+ marker('ogc.unreachable.unknown');
31867
32103
  marker('dataset.error.network');
31868
32104
  marker('dataset.error.http');
31869
32105
  marker('dataset.error.parse');
@@ -31943,6 +32179,27 @@ class DataService {
31943
32179
  mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(format)),
31944
32180
  }))));
31945
32181
  }
32182
+ async getDownloadLinksFromOgcApiFeatures(ogcApiLink) {
32183
+ const collectionInfo = await this.getDownloadUrlsFromOgcApi(ogcApiLink.url.href);
32184
+ return Object.keys(collectionInfo.bulkDownloadLinks).map((downloadLink) => {
32185
+ return {
32186
+ ...ogcApiLink,
32187
+ type: 'download',
32188
+ url: new URL(collectionInfo.bulkDownloadLinks[downloadLink]),
32189
+ mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(downloadLink)),
32190
+ };
32191
+ });
32192
+ }
32193
+ async getDownloadUrlsFromOgcApi(url) {
32194
+ const endpoint = new OgcApiEndpoint(this.proxy.getProxiedUrl(url));
32195
+ return await endpoint.featureCollections
32196
+ .then((collections) => {
32197
+ return endpoint.getCollectionInfo(collections[0]);
32198
+ })
32199
+ .catch((error) => {
32200
+ throw new Error(`ogc.unreachable.unknown`);
32201
+ });
32202
+ }
31946
32203
  getDownloadLinksFromEsriRest(esriRestLink) {
31947
32204
  return ['json', 'geojson'].map((format) => ({
31948
32205
  ...esriRestLink,
@@ -31986,6 +32243,17 @@ class DataService {
31986
32243
  const url = this.getDownloadUrlFromEsriRest(link.url.toString(), 'geojson');
31987
32244
  return from(openDataset(url, 'geojson')).pipe();
31988
32245
  }
32246
+ else if (link.type === 'service' &&
32247
+ link.accessServiceProtocol === 'ogcFeatures') {
32248
+ return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
32249
+ const geojsonUrl = collectionInfo.jsonDownloadLink;
32250
+ return openDataset(geojsonUrl, 'geojson');
32251
+ }), tap$1((url) => {
32252
+ if (url === null) {
32253
+ throw new Error('wfs.geojsongml.notsupported');
32254
+ }
32255
+ }));
32256
+ }
31989
32257
  return throwError(() => 'protocol not supported');
31990
32258
  }
31991
32259
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DataService, deps: [{ token: ProxyService }], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -32444,7 +32712,8 @@ class MapViewComponent {
32444
32712
  }
32445
32713
  else if ((link.type === 'service' &&
32446
32714
  (link.accessServiceProtocol === 'wfs' ||
32447
- link.accessServiceProtocol === 'esriRest')) ||
32715
+ link.accessServiceProtocol === 'esriRest' ||
32716
+ link.accessServiceProtocol === 'ogcFeatures')) ||
32448
32717
  link.type === 'download') {
32449
32718
  return this.dataService.readAsGeoJson(link).pipe(map$1((data) => ({
32450
32719
  type: MapContextLayerTypeEnum.GEOJSON,
@@ -33171,6 +33440,20 @@ const DEFAULT_FIELDS = [
33171
33440
  },
33172
33441
  onSaveProcess: '${dateNow()}',
33173
33442
  },
33443
+ {
33444
+ model: 'licenses',
33445
+ formFieldConfig: {
33446
+ labelKey: marker('editor.record.form.license'),
33447
+ type: 'list',
33448
+ },
33449
+ },
33450
+ {
33451
+ model: 'resourceUpdated',
33452
+ formFieldConfig: {
33453
+ labelKey: marker('editor.record.form.resourceUpdated'),
33454
+ type: 'date',
33455
+ },
33456
+ },
33174
33457
  ];
33175
33458
 
33176
33459
  const EDITOR_FEATURE_KEY = 'editor';
@@ -33555,7 +33838,7 @@ class WizardFieldComponent {
33555
33838
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
33556
33839
  },
33557
33840
  { 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 }); }
33841
+ ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i2$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33559
33842
  }
33560
33843
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardFieldComponent, decorators: [{
33561
33844
  type: Component,
@@ -33884,6 +34167,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33884
34167
  args: [{ selector: 'gn-ui-form-field-temporal-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-temporal-extent works!</p>\n" }]
33885
34168
  }] });
33886
34169
 
34170
+ class FormFieldLicenseComponent {
34171
+ constructor() {
34172
+ this.choices = [
34173
+ {
34174
+ value: 'cc-by',
34175
+ label: marker('editor.record.form.license.cc-by'),
34176
+ },
34177
+ {
34178
+ value: 'cc-by-sa',
34179
+ label: marker('editor.record.form.license.cc-by-sa'),
34180
+ },
34181
+ {
34182
+ value: 'cc-zero',
34183
+ label: marker('editor.record.form.license.cc-zero'),
34184
+ },
34185
+ {
34186
+ value: 'etalab',
34187
+ label: marker('editor.record.form.license.etalab'),
34188
+ },
34189
+ {
34190
+ value: 'etalab-v2',
34191
+ label: marker('editor.record.form.license.etalab-v2'),
34192
+ },
34193
+ {
34194
+ value: 'odbl',
34195
+ label: marker('editor.record.form.license.odbl'),
34196
+ },
34197
+ {
34198
+ value: 'odc-by',
34199
+ label: marker('editor.record.form.license.odc-by'),
34200
+ },
34201
+ {
34202
+ value: 'pddl',
34203
+ label: marker('editor.record.form.license.pddl'),
34204
+ },
34205
+ {
34206
+ value: 'unknown',
34207
+ label: marker('editor.record.form.license.unknown'),
34208
+ },
34209
+ ];
34210
+ }
34211
+ get selected() {
34212
+ return this.control.value[0]?.text;
34213
+ }
34214
+ onSelectValue(value) {
34215
+ this.control.setValue([{ text: value }]);
34216
+ }
34217
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34218
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldLicenseComponent, isStandalone: true, selector: "gn-ui-form-field-license", inputs: { control: "control", label: "label" }, ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"label\"\n [showTitle]=\"false\"\n [choices]=\"choices\"\n [selected]=\"selected\"\n (selectValue)=\"onSelectValue($event)\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34219
+ }
34220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, decorators: [{
34221
+ type: Component,
34222
+ 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" }]
34223
+ }], propDecorators: { control: [{
34224
+ type: Input
34225
+ }], label: [{
34226
+ type: Input
34227
+ }] } });
34228
+
34229
+ class FormFieldResourceUpdatedComponent {
34230
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldResourceUpdatedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34231
+ 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 }); }
34232
+ }
34233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldResourceUpdatedComponent, decorators: [{
34234
+ type: Component,
34235
+ 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" }]
34236
+ }], propDecorators: { control: [{
34237
+ type: Input
34238
+ }] } });
34239
+
33887
34240
  class FormFieldComponent {
33888
34241
  set value(v) {
33889
34242
  this.formControl.setValue(v, {
@@ -33938,8 +34291,17 @@ class FormFieldComponent {
33938
34291
  get isAbstract() {
33939
34292
  return this.model === 'abstract';
33940
34293
  }
34294
+ get isLicenses() {
34295
+ return this.model === 'licenses';
34296
+ }
34297
+ get isResourceUpdated() {
34298
+ return this.model === 'resourceUpdated';
34299
+ }
34300
+ get withoutWrapper() {
34301
+ return this.model === 'title' || this.model === 'abstract';
34302
+ }
33941
34303
  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 }); }
34304
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "component", type: FormFieldResourceUpdatedComponent, selector: "gn-ui-form-field-resource-updated", inputs: ["control"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldObjectComponent, selector: "gn-ui-form-field-object" }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldTemporalExtentComponent, selector: "gn-ui-form-field-temporal-extent" }, { kind: "component", type: FormFieldFileComponent, selector: "gn-ui-form-field-file", inputs: ["control", "readonly", "invalid", "placeholder"] }, { kind: "component", type: FormFieldArrayComponent, selector: "gn-ui-form-field-array" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33943
34305
  }
33944
34306
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, decorators: [{
33945
34307
  type: Component,
@@ -33949,6 +34311,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33949
34311
  EditableLabelDirective,
33950
34312
  MatIconModule,
33951
34313
  MatTooltipModule,
34314
+ FormFieldWrapperComponent,
34315
+ FormFieldLicenseComponent,
34316
+ FormFieldResourceUpdatedComponent,
33952
34317
  FormFieldSimpleComponent,
33953
34318
  FormFieldRichComponent,
33954
34319
  FormFieldObjectComponent,
@@ -33957,7 +34322,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33957
34322
  FormFieldFileComponent,
33958
34323
  FormFieldArrayComponent,
33959
34324
  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" }]
34325
+ ], template: "<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isLicenses\">\n <gn-ui-form-field-license\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n ></gn-ui-form-field-license>\n </ng-container>\n <ng-container *ngIf=\"isResourceUpdated\">\n <gn-ui-form-field-resource-updated\n [control]=\"formControl\"\n ></gn-ui-form-field-resource-updated>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</ng-template>\n" }]
33961
34326
  }], ctorParameters: function () { return []; }, propDecorators: { model: [{
33962
34327
  type: Input
33963
34328
  }], config: [{
@@ -34315,7 +34680,7 @@ class DefaultRouterModule {
34315
34680
  };
34316
34681
  }
34317
34682
  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] }); }
34683
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$2.StoreFeatureModule, i3$3.StoreRouterConnectingModule, i1$8.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
34319
34684
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DefaultRouterModule, providers: [
34320
34685
  RouterFacade,
34321
34686
  {
@@ -34358,5 +34723,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
34358
34723
  * Generated bundle index. Do not edit.
34359
34724
  */
34360
34725
 
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 };
34726
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, 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, 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, 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, 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 };
34362
34727
  //# sourceMappingURL=geonetwork-ui.mjs.map