geonetwork-ui 2.3.0-dev.c22cb78a → 2.3.0-dev.e07c5606

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 (130) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
  2. package/esm2022/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.mjs +1 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +12 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +36 -3
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +19 -7
  6. package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/user-feedbacks.model.mjs +2 -0
  8. package/esm2022/libs/common/domain/src/lib/model/user/index.mjs +2 -0
  9. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +15 -6
  12. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  13. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +9 -1
  14. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +1 -1
  15. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  16. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  17. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +4 -4
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +22 -7
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +52 -17
  22. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
  23. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
  24. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +2 -2
  25. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +1 -1
  26. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -2
  27. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
  28. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +62 -0
  29. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
  30. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
  31. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +19 -3
  32. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +7 -6
  33. package/esm2022/translations/de.json +25 -0
  34. package/esm2022/translations/en.json +25 -0
  35. package/esm2022/translations/es.json +25 -0
  36. package/esm2022/translations/fr.json +25 -0
  37. package/esm2022/translations/it.json +25 -0
  38. package/esm2022/translations/nl.json +25 -0
  39. package/esm2022/translations/pt.json +25 -0
  40. package/fesm2022/geonetwork-ui.mjs +644 -68
  41. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  42. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  43. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  44. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  45. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  46. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  47. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  48. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  49. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  50. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  51. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  52. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  53. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  54. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  55. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  56. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  57. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  58. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  59. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  60. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +3 -1
  61. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  62. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  63. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  64. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  65. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  67. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  68. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
  69. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  70. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  71. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  72. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  73. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  74. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +16 -14
  75. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  76. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  77. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  78. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +22 -0
  79. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  80. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
  81. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  82. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  83. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  84. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +4 -1
  85. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  86. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  87. package/package.json +1 -1
  88. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  89. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  90. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  91. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  92. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +34 -7
  93. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  94. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  95. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  96. package/src/libs/common/fixtures/src/index.ts +8 -6
  97. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +1 -1
  98. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  99. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  100. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  101. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  102. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +28 -33
  103. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +11 -0
  104. package/src/libs/feature/editor/src/lib/fields.config.ts +8 -0
  105. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  106. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  107. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  108. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +49 -8
  109. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
  110. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  111. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  112. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -0
  113. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  114. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  115. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  116. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +63 -0
  117. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
  118. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  119. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  120. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -1
  121. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +16 -1
  122. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +1 -1
  123. package/translations/de.json +25 -0
  124. package/translations/en.json +25 -0
  125. package/translations/es.json +25 -0
  126. package/translations/fr.json +25 -0
  127. package/translations/it.json +25 -0
  128. package/translations/nl.json +25 -0
  129. package/translations/pt.json +25 -0
  130. package/translations/sk.json +25 -0
@@ -1,7 +1,7 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
2
  import format from 'date-fns/format';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ElementRef, ViewChildren, ViewContainerRef, HostBinding, ContentChild, ContentChildren, TemplateRef, Host, inject } from '@angular/core';
4
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ElementRef, ViewChildren, ViewContainerRef, HostBinding, ContentChild, ContentChildren, TemplateRef, Host, Pipe, inject } from '@angular/core';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
7
  import * as i1$1 from '@ngx-translate/core';
@@ -12,7 +12,7 @@ import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestF
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, Subscription, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, debounceTime as debounceTime$1, animationFrameScheduler, from, tap as tap$2, Observable, buffer, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, filter as filter$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, firstValueFrom, Subject, merge, throwError, BehaviorSubject, fromEvent, timer, Subscription, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, debounceTime as debounceTime$1, animationFrameScheduler, from, tap as tap$2, Observable, buffer, combineLatestWith, catchError as catchError$1, takeUntil, exhaustMap, mergeMap as mergeMap$1, EMPTY, withLatestFrom as withLatestFrom$1, filter as filter$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
18
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule, Store } from '@ngrx/store';
@@ -73,6 +73,8 @@ import Duration from 'duration-relativetimeformat';
73
73
  import * as basicLightbox from 'basiclightbox';
74
74
  import { marked } from 'marked';
75
75
  import EmblaCarousel from 'embla-carousel';
76
+ import { formatDistance } from 'date-fns';
77
+ import { enUS, sk, pt as pt$1, nl as nl$1, it as it$1, es as es$1, de as de$1, fr as fr$1 } from 'date-fns/locale';
76
78
  import * as i1$8 from '@ngrx/effects';
77
79
  import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
78
80
  import tippy from 'tippy.js';
@@ -17271,6 +17273,7 @@ var next$6 = "weiter";
17271
17273
  var previous$6 = "zurück";
17272
17274
  var records$6 = "Datensätze";
17273
17275
  var de = {
17276
+ "button.login": "",
17274
17277
  "catalog.figures.datasets": "{count, plural, =0{Datensätze} one{Datensatz} other{Datensätze}}",
17275
17278
  "catalog.figures.organisations": "{count, plural, =0{Organisationen} one{Organisation} other{Organisationen}}",
17276
17279
  "chart.aggregation.average": "Durchschnitt",
@@ -17416,6 +17419,16 @@ var de = {
17416
17419
  "downloads.format.unknown": "unbekannt",
17417
17420
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
17418
17421
  dropFile: dropFile$6,
17422
+ "editor.record.form.license": "Lizenz",
17423
+ "editor.record.form.license.cc-by": "",
17424
+ "editor.record.form.license.cc-by-sa": "",
17425
+ "editor.record.form.license.cc-zero": "",
17426
+ "editor.record.form.license.etalab": "",
17427
+ "editor.record.form.license.etalab-v2": "",
17428
+ "editor.record.form.license.odbl": "",
17429
+ "editor.record.form.license.odc-by": "",
17430
+ "editor.record.form.license.pddl": "",
17431
+ "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
17419
17432
  "editor.record.loadError.body": "",
17420
17433
  "editor.record.loadError.closeMessage": "",
17421
17434
  "editor.record.loadError.title": "",
@@ -17550,6 +17563,14 @@ var de = {
17550
17563
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
17551
17564
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
17552
17565
  "record.metadata.related": "Ähnliche Datensätze",
17566
+ "record.metadata.userFeedbacks": "",
17567
+ "record.metadata.userFeedbacks.anonymousUser": "",
17568
+ "record.metadata.userFeedbacks.sortSelector.label": "",
17569
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
17570
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
17571
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
17572
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
17573
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
17553
17574
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
17554
17575
  "record.metadata.status": "Status",
17555
17576
  "record.metadata.technical": "Technische Informationen",
@@ -17623,6 +17644,12 @@ var de = {
17623
17644
  "table.loading.data": "Daten werden geladen...",
17624
17645
  "table.object.count": "Objekte in diesem Datensatz",
17625
17646
  "table.select.data": "Datenquelle",
17647
+ "timeSincePipe.lessThanAMinute": "",
17648
+ "timeSincePipe.minutesAgo": "",
17649
+ "timeSincePipe.hoursAgo": "",
17650
+ "timeSincePipe.daysAgo": "",
17651
+ "timeSincePipe.monthsAgo": "",
17652
+ "timeSincePipe.yearsAgo": "",
17626
17653
  "tooltip.html.copy": "HTML kopieren",
17627
17654
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
17628
17655
  "tooltip.url.copy": "URL kopieren",
@@ -17641,6 +17668,7 @@ var next$5 = "next";
17641
17668
  var previous$5 = "previous";
17642
17669
  var records$5 = "records";
17643
17670
  var en = {
17671
+ "button.login": "Log in",
17644
17672
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
17645
17673
  "catalog.figures.organisations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
17646
17674
  "chart.aggregation.average": "average",
@@ -17786,6 +17814,16 @@ var en = {
17786
17814
  "downloads.format.unknown": "unknown",
17787
17815
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17788
17816
  dropFile: dropFile$5,
17817
+ "editor.record.form.license": "License",
17818
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
17819
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
17820
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
17821
+ "editor.record.form.license.etalab": "Open Licence (Etalab)",
17822
+ "editor.record.form.license.etalab-v2": "Open Licence v2.0 (Etalab)",
17823
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
17824
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
17825
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
17826
+ "editor.record.form.license.unknown": "Unknown or absent",
17789
17827
  "editor.record.loadError.body": "The record could not be loaded:",
17790
17828
  "editor.record.loadError.closeMessage": "Understood",
17791
17829
  "editor.record.loadError.title": "Error loading record",
@@ -17920,6 +17958,14 @@ var en = {
17920
17958
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17921
17959
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17922
17960
  "record.metadata.related": "Related records",
17961
+ "record.metadata.userFeedbacks": "Questions / Answers",
17962
+ "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
17963
+ "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
17964
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
17965
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
17966
+ "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
17967
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
17968
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
17923
17969
  "record.metadata.sheet": "Original metadata",
17924
17970
  "record.metadata.status": "Status",
17925
17971
  "record.metadata.technical": "Technical information",
@@ -17993,6 +18039,12 @@ var en = {
17993
18039
  "table.loading.data": "Loading data...",
17994
18040
  "table.object.count": "objects in this dataset",
17995
18041
  "table.select.data": "Data source",
18042
+ "timeSincePipe.lessThanAMinute": "Less than a minute ago",
18043
+ "timeSincePipe.minutesAgo": "{value} minute{s} ago",
18044
+ "timeSincePipe.hoursAgo": "{value} hour{s} ago",
18045
+ "timeSincePipe.daysAgo": "{value} day{s} ago",
18046
+ "timeSincePipe.monthsAgo": "{value} month{s} ago",
18047
+ "timeSincePipe.yearsAgo": "{value} year{s} ago",
17996
18048
  "tooltip.html.copy": "Copy HTML",
17997
18049
  "tooltip.id.copy": "Copy unique identifier",
17998
18050
  "tooltip.url.copy": "Copy URL",
@@ -18011,6 +18063,7 @@ var next$4 = "";
18011
18063
  var previous$4 = "";
18012
18064
  var records$4 = "";
18013
18065
  var es = {
18066
+ "button.login": "",
18014
18067
  "catalog.figures.datasets": "conjuntos de datos",
18015
18068
  "catalog.figures.organisations": "organizaciones",
18016
18069
  "chart.aggregation.average": "promedio",
@@ -18156,6 +18209,16 @@ var es = {
18156
18209
  "downloads.format.unknown": "",
18157
18210
  "downloads.wfs.featuretype.not.found": "",
18158
18211
  dropFile: dropFile$4,
18212
+ "editor.record.form.license": "",
18213
+ "editor.record.form.license.cc-by": "",
18214
+ "editor.record.form.license.cc-by-sa": "",
18215
+ "editor.record.form.license.cc-zero": "",
18216
+ "editor.record.form.license.etalab": "",
18217
+ "editor.record.form.license.etalab-v2": "",
18218
+ "editor.record.form.license.odbl": "",
18219
+ "editor.record.form.license.odc-by": "",
18220
+ "editor.record.form.license.pddl": "",
18221
+ "editor.record.form.license.unknown": "",
18159
18222
  "editor.record.loadError.body": "",
18160
18223
  "editor.record.loadError.closeMessage": "",
18161
18224
  "editor.record.loadError.title": "",
@@ -18290,6 +18353,14 @@ var es = {
18290
18353
  "record.metadata.quality.updateFrequency.failed": "",
18291
18354
  "record.metadata.quality.updateFrequency.success": "",
18292
18355
  "record.metadata.related": "",
18356
+ "record.metadata.userFeedbacks": "",
18357
+ "record.metadata.userFeedbacks.anonymousUser": "",
18358
+ "record.metadata.userFeedbacks.sortSelector.label": "",
18359
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
18360
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
18361
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
18362
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
18363
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
18293
18364
  "record.metadata.sheet": "",
18294
18365
  "record.metadata.status": "",
18295
18366
  "record.metadata.technical": "",
@@ -18363,6 +18434,12 @@ var es = {
18363
18434
  "table.loading.data": "",
18364
18435
  "table.object.count": "",
18365
18436
  "table.select.data": "",
18437
+ "timeSincePipe.lessThanAMinute": "",
18438
+ "timeSincePipe.minutesAgo": "",
18439
+ "timeSincePipe.hoursAgo": "",
18440
+ "timeSincePipe.daysAgo": "",
18441
+ "timeSincePipe.monthsAgo": "",
18442
+ "timeSincePipe.yearsAgo": "",
18366
18443
  "tooltip.html.copy": "",
18367
18444
  "tooltip.id.copy": "",
18368
18445
  "tooltip.url.copy": "",
@@ -18381,6 +18458,7 @@ var next$3 = "suivant";
18381
18458
  var previous$3 = "précédent";
18382
18459
  var records$3 = "enregistrements";
18383
18460
  var fr = {
18461
+ "button.login": "Se connecter",
18384
18462
  "catalog.figures.datasets": "{count, plural, =0{données} one{donnée} other{données}}",
18385
18463
  "catalog.figures.organisations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
18386
18464
  "chart.aggregation.average": "moyenne",
@@ -18526,6 +18604,16 @@ var fr = {
18526
18604
  "downloads.format.unknown": "inconnu",
18527
18605
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
18528
18606
  dropFile: dropFile$3,
18607
+ "editor.record.form.license": "Licence",
18608
+ "editor.record.form.license.cc-by": "",
18609
+ "editor.record.form.license.cc-by-sa": "",
18610
+ "editor.record.form.license.cc-zero": "",
18611
+ "editor.record.form.license.etalab": "Licence Ouverte (Etalab)",
18612
+ "editor.record.form.license.etalab-v2": "Licence Ouverte v2.0 (Etalab)",
18613
+ "editor.record.form.license.odbl": "",
18614
+ "editor.record.form.license.odc-by": "",
18615
+ "editor.record.form.license.pddl": "",
18616
+ "editor.record.form.license.unknown": "Non-reconnue ou absente",
18529
18617
  "editor.record.loadError.body": "",
18530
18618
  "editor.record.loadError.closeMessage": "",
18531
18619
  "editor.record.loadError.title": "",
@@ -18660,6 +18748,14 @@ var fr = {
18660
18748
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
18661
18749
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
18662
18750
  "record.metadata.related": "Voir aussi",
18751
+ "record.metadata.userFeedbacks": "Questions / Réponses",
18752
+ "record.metadata.userFeedbacks.anonymousUser": "Pour rédiger un commentaire, veuillez vous identifier.",
18753
+ "record.metadata.userFeedbacks.sortSelector.label": "Trier par ...",
18754
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Les plus récents en premier",
18755
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Les plus anciens en premier",
18756
+ "record.metadata.userFeedbacks.newComment.placeholder": "Rédiger votre commentaire ici...",
18757
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Répondre...",
18758
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publier",
18663
18759
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
18664
18760
  "record.metadata.status": "Statut",
18665
18761
  "record.metadata.technical": "Informations techniques",
@@ -18733,6 +18829,12 @@ var fr = {
18733
18829
  "table.loading.data": "Chargement des données...",
18734
18830
  "table.object.count": "enregistrements dans ces données",
18735
18831
  "table.select.data": "Source de données",
18832
+ "timeSincePipe.lessThanAMinute": "Il y a moins d'une minute",
18833
+ "timeSincePipe.minutesAgo": "Il y a {value} minute{s}",
18834
+ "timeSincePipe.hoursAgo": "Il y a {value} heure{s}",
18835
+ "timeSincePipe.daysAgo": "Il y a {value} jour{s}",
18836
+ "timeSincePipe.monthsAgo": "Il y a {value} mois",
18837
+ "timeSincePipe.yearsAgo": "Il y a {value} an{s}",
18736
18838
  "tooltip.html.copy": "Copier le HTML",
18737
18839
  "tooltip.id.copy": "Copier l'identifiant unique",
18738
18840
  "tooltip.url.copy": "Copier l'URL",
@@ -18751,6 +18853,7 @@ var next$2 = "successivo";
18751
18853
  var previous$2 = "precedente";
18752
18854
  var records$2 = "record";
18753
18855
  var it = {
18856
+ "button.login": "",
18754
18857
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
18755
18858
  "catalog.figures.organisations": "{count, plural, =0{organizzazioni} one{organizzazione} other{organizzazioni}}",
18756
18859
  "chart.aggregation.average": "media",
@@ -18896,6 +18999,16 @@ var it = {
18896
18999
  "downloads.format.unknown": "sconosciuto",
18897
19000
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18898
19001
  dropFile: dropFile$2,
19002
+ "editor.record.form.license": "Licenza",
19003
+ "editor.record.form.license.cc-by": "",
19004
+ "editor.record.form.license.cc-by-sa": "",
19005
+ "editor.record.form.license.cc-zero": "",
19006
+ "editor.record.form.license.etalab": "Licenza aperta (Etalab)",
19007
+ "editor.record.form.license.etalab-v2": "Licenza aperta v2.0 (Etalab)",
19008
+ "editor.record.form.license.odbl": "",
19009
+ "editor.record.form.license.odc-by": "",
19010
+ "editor.record.form.license.pddl": "",
19011
+ "editor.record.form.license.unknown": "Non riconosciuta o assente",
18899
19012
  "editor.record.loadError.body": "",
18900
19013
  "editor.record.loadError.closeMessage": "",
18901
19014
  "editor.record.loadError.title": "",
@@ -19030,6 +19143,14 @@ var it = {
19030
19143
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
19031
19144
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
19032
19145
  "record.metadata.related": "Vedi anche",
19146
+ "record.metadata.userFeedbacks": "",
19147
+ "record.metadata.userFeedbacks.anonymousUser": "",
19148
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19149
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19150
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19151
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19152
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19153
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19033
19154
  "record.metadata.sheet": "Origine del metadata",
19034
19155
  "record.metadata.status": "Stato",
19035
19156
  "record.metadata.technical": "Informazioni tecniche",
@@ -19103,6 +19224,12 @@ var it = {
19103
19224
  "table.loading.data": "Caricamento dei dati...",
19104
19225
  "table.object.count": "record in questi dati",
19105
19226
  "table.select.data": "Sorgente dati",
19227
+ "timeSincePipe.lessThanAMinute": "",
19228
+ "timeSincePipe.minutesAgo": "",
19229
+ "timeSincePipe.hoursAgo": "",
19230
+ "timeSincePipe.daysAgo": "",
19231
+ "timeSincePipe.monthsAgo": "",
19232
+ "timeSincePipe.yearsAgo": "",
19106
19233
  "tooltip.html.copy": "Copiare il HTML",
19107
19234
  "tooltip.id.copy": "Copiare l'identificatore unico",
19108
19235
  "tooltip.url.copy": "Copiare l'URL",
@@ -19121,6 +19248,7 @@ var next$1 = "";
19121
19248
  var previous$1 = "";
19122
19249
  var records$1 = "";
19123
19250
  var nl = {
19251
+ "button.login": "",
19124
19252
  "catalog.figures.datasets": "datasets",
19125
19253
  "catalog.figures.organisations": "organisaties",
19126
19254
  "chart.aggregation.average": "gemiddelde",
@@ -19266,6 +19394,16 @@ var nl = {
19266
19394
  "downloads.format.unknown": "",
19267
19395
  "downloads.wfs.featuretype.not.found": "",
19268
19396
  dropFile: dropFile$1,
19397
+ "editor.record.form.license": "",
19398
+ "editor.record.form.license.cc-by": "",
19399
+ "editor.record.form.license.cc-by-sa": "",
19400
+ "editor.record.form.license.cc-zero": "",
19401
+ "editor.record.form.license.etalab": "",
19402
+ "editor.record.form.license.etalab-v2": "",
19403
+ "editor.record.form.license.odbl": "",
19404
+ "editor.record.form.license.odc-by": "",
19405
+ "editor.record.form.license.pddl": "",
19406
+ "editor.record.form.license.unknown": "",
19269
19407
  "editor.record.loadError.body": "",
19270
19408
  "editor.record.loadError.closeMessage": "",
19271
19409
  "editor.record.loadError.title": "",
@@ -19400,6 +19538,14 @@ var nl = {
19400
19538
  "record.metadata.quality.updateFrequency.failed": "",
19401
19539
  "record.metadata.quality.updateFrequency.success": "",
19402
19540
  "record.metadata.related": "",
19541
+ "record.metadata.userFeedbacks": "",
19542
+ "record.metadata.userFeedbacks.anonymousUser": "",
19543
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19544
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19545
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19546
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19547
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19548
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19403
19549
  "record.metadata.sheet": "",
19404
19550
  "record.metadata.status": "",
19405
19551
  "record.metadata.technical": "",
@@ -19473,6 +19619,12 @@ var nl = {
19473
19619
  "table.loading.data": "",
19474
19620
  "table.object.count": "",
19475
19621
  "table.select.data": "",
19622
+ "timeSincePipe.lessThanAMinute": "",
19623
+ "timeSincePipe.minutesAgo": "",
19624
+ "timeSincePipe.hoursAgo": "",
19625
+ "timeSincePipe.daysAgo": "",
19626
+ "timeSincePipe.monthsAgo": "",
19627
+ "timeSincePipe.yearsAgo": "",
19476
19628
  "tooltip.html.copy": "",
19477
19629
  "tooltip.id.copy": "",
19478
19630
  "tooltip.url.copy": "",
@@ -19491,6 +19643,7 @@ var next = "";
19491
19643
  var previous = "";
19492
19644
  var records = "";
19493
19645
  var pt = {
19646
+ "button.login": "",
19494
19647
  "catalog.figures.datasets": "conjuntos de dados",
19495
19648
  "catalog.figures.organisations": "organizações",
19496
19649
  "chart.aggregation.average": "média",
@@ -19636,6 +19789,16 @@ var pt = {
19636
19789
  "downloads.format.unknown": "",
19637
19790
  "downloads.wfs.featuretype.not.found": "",
19638
19791
  dropFile: dropFile,
19792
+ "editor.record.form.license": "",
19793
+ "editor.record.form.license.cc-by": "",
19794
+ "editor.record.form.license.cc-by-sa": "",
19795
+ "editor.record.form.license.cc-zero": "",
19796
+ "editor.record.form.license.etalab": "",
19797
+ "editor.record.form.license.etalab-v2": "",
19798
+ "editor.record.form.license.odbl": "",
19799
+ "editor.record.form.license.odc-by": "",
19800
+ "editor.record.form.license.pddl": "",
19801
+ "editor.record.form.license.unknown": "",
19639
19802
  "editor.record.loadError.body": "",
19640
19803
  "editor.record.loadError.closeMessage": "",
19641
19804
  "editor.record.loadError.title": "",
@@ -19770,6 +19933,14 @@ var pt = {
19770
19933
  "record.metadata.quality.updateFrequency.failed": "",
19771
19934
  "record.metadata.quality.updateFrequency.success": "",
19772
19935
  "record.metadata.related": "",
19936
+ "record.metadata.userFeedbacks": "",
19937
+ "record.metadata.userFeedbacks.anonymousUser": "",
19938
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19939
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19940
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19941
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19942
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19943
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19773
19944
  "record.metadata.sheet": "",
19774
19945
  "record.metadata.status": "",
19775
19946
  "record.metadata.technical": "",
@@ -19843,6 +20014,12 @@ var pt = {
19843
20014
  "table.loading.data": "",
19844
20015
  "table.object.count": "",
19845
20016
  "table.select.data": "",
20017
+ "timeSincePipe.lessThanAMinute": "",
20018
+ "timeSincePipe.minutesAgo": "",
20019
+ "timeSincePipe.hoursAgo": "",
20020
+ "timeSincePipe.daysAgo": "",
20021
+ "timeSincePipe.monthsAgo": "",
20022
+ "timeSincePipe.yearsAgo": "",
19846
20023
  "tooltip.html.copy": "",
19847
20024
  "tooltip.id.copy": "",
19848
20025
  "tooltip.url.copy": "",
@@ -19937,11 +20114,11 @@ class Gn4FieldMapper {
19937
20114
  }),
19938
20115
  creationDateForResource: (output, source) => ({
19939
20116
  ...output,
19940
- datasetCreated: toDate(getFirstValue(selectField(source, 'creationDateForResource'))),
20117
+ resourceCreated: toDate(getFirstValue(selectField(source, 'creationDateForResource'))),
19941
20118
  }),
19942
20119
  revisionDateForResource: (output, source) => ({
19943
20120
  ...output,
19944
- datasetUpdated: toDate(getFirstValue(selectField(source, 'revisionDateForResource'))),
20121
+ resourceUpdated: toDate(getFirstValue(selectField(source, 'revisionDateForResource'))),
19945
20122
  }),
19946
20123
  createDate: (output, source) => ({
19947
20124
  ...output,
@@ -21166,6 +21343,16 @@ class GravatarService {
21166
21343
  getProfileIcon(hash) {
21167
21344
  return this.identicon$.pipe(map$1((identicon) => identicon || this.GRAVATAR_IDENTICON), map$1((identicon) => `${this.GRAVATAR_URL}${hash}?d=${identicon}`));
21168
21345
  }
21346
+ async getProfileIconUrl(userId) {
21347
+ let iconUrl = '';
21348
+ try {
21349
+ iconUrl = await firstValueFrom(this.getProfileIcon(userId));
21350
+ }
21351
+ catch (error) {
21352
+ return '';
21353
+ }
21354
+ return iconUrl;
21355
+ }
21169
21356
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GravatarService, deps: [{ token: Gn4SettingsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21170
21357
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GravatarService, providedIn: 'root' }); }
21171
21358
  }
@@ -21317,6 +21504,39 @@ class Gn4PlatformMapper {
21317
21504
  };
21318
21505
  });
21319
21506
  }
21507
+ userFeedbacksFromApi(userFeedback) {
21508
+ return {
21509
+ uuid: userFeedback.uuid,
21510
+ metadataUUID: userFeedback.metadataUUID,
21511
+ comment: userFeedback.comment,
21512
+ authorUserId: userFeedback.authorUserId.toString(),
21513
+ authorName: userFeedback.authorName,
21514
+ authorEmail: userFeedback.authorEmail,
21515
+ published: userFeedback.published,
21516
+ parentUuid: userFeedback.parentUuid ?? undefined,
21517
+ date: new Date(userFeedback.date),
21518
+ };
21519
+ }
21520
+ userFeedbacksToApi(userFeedback) {
21521
+ return {
21522
+ uuid: userFeedback.uuid,
21523
+ metadataUUID: userFeedback.metadataUUID,
21524
+ comment: userFeedback.comment,
21525
+ authorUserId: Number.parseInt(userFeedback.authorUserId),
21526
+ authorName: userFeedback.authorName,
21527
+ authorEmail: userFeedback.authorEmail,
21528
+ published: userFeedback.published,
21529
+ parentUuid: userFeedback.parentUuid,
21530
+ date: userFeedback.date.getTime().toString(),
21531
+ };
21532
+ }
21533
+ async createUserFeedbackViewModel(baseUserFeedback) {
21534
+ const userAvatarUrl = await this.avatarService.getProfileIconUrl(baseUserFeedback.authorUserId?.toString());
21535
+ return {
21536
+ ...baseUserFeedback,
21537
+ avatarUrl: userAvatarUrl,
21538
+ };
21539
+ }
21320
21540
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformMapper, deps: [{ token: AvatarServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
21321
21541
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformMapper }); }
21322
21542
  }
@@ -21326,7 +21546,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21326
21546
 
21327
21547
  const minApiVersion = '4.2.2';
21328
21548
  class Gn4PlatformService {
21329
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
21549
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService) {
21330
21550
  this.siteApiService = siteApiService;
21331
21551
  this.meApi = meApi;
21332
21552
  this.usersApi = usersApi;
@@ -21334,6 +21554,7 @@ class Gn4PlatformService {
21334
21554
  this.toolsApiService = toolsApiService;
21335
21555
  this.registriesApiService = registriesApiService;
21336
21556
  this.langService = langService;
21557
+ this.userfeedbackApiService = userfeedbackApiService;
21337
21558
  this.type = 'GeoNetwork';
21338
21559
  this.keyTranslations$ = this.toolsApiService
21339
21560
  .getTranslationsPackage1('gnui')
@@ -21353,7 +21574,7 @@ class Gn4PlatformService {
21353
21574
  */
21354
21575
  this.thesauri = {};
21355
21576
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
21356
- this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
21577
+ this.isUserAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
21357
21578
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
21358
21579
  }
21359
21580
  getType() {
@@ -21366,7 +21587,7 @@ class Gn4PlatformService {
21366
21587
  return this.me$;
21367
21588
  }
21368
21589
  isAnonymous() {
21369
- return this.isAnonymous$;
21590
+ return this.isUserAnonymous$;
21370
21591
  }
21371
21592
  getOrganizations() {
21372
21593
  return undefined;
@@ -21402,12 +21623,23 @@ class Gn4PlatformService {
21402
21623
  .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
21403
21624
  return this.thesauri[uri];
21404
21625
  }
21405
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21626
+ getUserFeedbacks(uuid) {
21627
+ return this.userfeedbackApiService
21628
+ .getUserComments(uuid)
21629
+ .pipe(map$1((userFeedbacks) => userFeedbacks.map(this.mapper.userFeedbacksFromApi)));
21630
+ }
21631
+ postUserFeedbacks(userFeedback) {
21632
+ const mappedUserFeedBack = this.mapper.userFeedbacksToApi(userFeedback);
21633
+ return this.userfeedbackApiService
21634
+ .newUserFeedback(mappedUserFeedBack)
21635
+ .pipe(map$1(() => undefined));
21636
+ }
21637
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }, { token: UserfeedbackApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
21406
21638
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
21407
21639
  }
21408
21640
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
21409
21641
  type: Injectable
21410
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
21642
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }]; } });
21411
21643
 
21412
21644
  function provideGn4() {
21413
21645
  return [
@@ -23995,11 +24227,17 @@ class DropdownSelectorComponent {
23995
24227
  }
23996
24228
  }
23997
24229
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23998
- 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 }); }
24230
+ 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$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: "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 }); }
23999
24231
  }
24000
24232
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24001
24233
  type: Component,
24002
- 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" }]
24234
+ args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
24235
+ CommonModule,
24236
+ ButtonComponent,
24237
+ OverlayModule,
24238
+ MatIconModule,
24239
+ TranslateModule,
24240
+ ], 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" }]
24003
24241
  }], propDecorators: { title: [{
24004
24242
  type: Input
24005
24243
  }], showTitle: [{
@@ -24213,11 +24451,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24213
24451
 
24214
24452
  class TextInputComponent {
24215
24453
  constructor() {
24454
+ this.baseClass = [
24455
+ 'appearance-none',
24456
+ 'border border-gray-300',
24457
+ 'rounded w-full',
24458
+ 'p-2',
24459
+ 'text-gray-700',
24460
+ 'leading-tight',
24461
+ 'focus:outline-none',
24462
+ 'focus:border-primary',
24463
+ ].join(' ');
24216
24464
  this.value = '';
24465
+ this.extraClass = '';
24217
24466
  this.required = false;
24218
24467
  this.rawChange = new Subject();
24219
24468
  this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24220
24469
  }
24470
+ get classList() {
24471
+ return `${this.baseClass} ${this.extraClass}`;
24472
+ }
24221
24473
  ngAfterViewInit() {
24222
24474
  this.checkRequired(this.input.nativeElement.value);
24223
24475
  }
@@ -24230,13 +24482,15 @@ class TextInputComponent {
24230
24482
  this.rawChange.next(value);
24231
24483
  }
24232
24484
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextInputComponent, selector: "gn-ui-text-input", inputs: { value: "value", hint: "hint", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input\n #input\n class=\"appearance-none border border-gray-300 rounded w-full p-2 text-gray-700 leading-tight focus:outline-none focus:border-primary\"\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"] }); }
24485
+ 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"] }); }
24234
24486
  }
24235
24487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, decorators: [{
24236
24488
  type: Component,
24237
- args: [{ selector: 'gn-ui-text-input', template: "<input\n #input\n class=\"appearance-none border border-gray-300 rounded w-full p-2 text-gray-700 leading-tight focus:outline-none focus:border-primary\"\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"] }]
24489
+ 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"] }]
24238
24490
  }], propDecorators: { value: [{
24239
24491
  type: Input
24492
+ }], extraClass: [{
24493
+ type: Input
24240
24494
  }], hint: [{
24241
24495
  type: Input
24242
24496
  }], required: [{
@@ -24317,9 +24571,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24317
24571
  class TextAreaComponent {
24318
24572
  constructor() {
24319
24573
  this.value = '';
24574
+ this.disabled = false;
24575
+ this.extraClass = '';
24320
24576
  this.required = false;
24321
24577
  this.rawChange = new Subject();
24322
24578
  this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24579
+ this.baseClasses = [
24580
+ 'w-full',
24581
+ 'pt-2',
24582
+ 'pl-2',
24583
+ 'resize-none',
24584
+ 'border',
24585
+ 'border-gray-800',
24586
+ 'rounded italic',
24587
+ 'leading-tight',
24588
+ 'focus:outline-none',
24589
+ 'focus:bg-background',
24590
+ 'focus:border-primary',
24591
+ ].join(' ');
24592
+ this.disabledClasses = ['cursor-not-allowed'].join(' ');
24593
+ }
24594
+ get classList() {
24595
+ return `${this.baseClasses} ${this.extraClass} ${this.disabled ? this.disabledClasses : ''}`;
24323
24596
  }
24324
24597
  ngAfterViewInit() {
24325
24598
  this.checkRequired(this.input.nativeElement.value);
@@ -24333,12 +24606,16 @@ class TextAreaComponent {
24333
24606
  this.rawChange.next(value);
24334
24607
  }
24335
24608
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24336
- 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", 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 [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
24609
+ 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"] }); }
24337
24610
  }
24338
24611
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
24339
24612
  type: Component,
24340
- args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
24341
- }], propDecorators: { value: [{
24613
+ 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"] }]
24614
+ }], ctorParameters: function () { return []; }, propDecorators: { value: [{
24615
+ type: Input
24616
+ }], disabled: [{
24617
+ type: Input
24618
+ }], extraClass: [{
24342
24619
  type: Input
24343
24620
  }], placeholder: [{
24344
24621
  type: Input
@@ -25234,8 +25511,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25234
25511
 
25235
25512
  class UiInputsModule {
25236
25513
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25237
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25238
- AutocompleteComponent,
25514
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [AutocompleteComponent,
25239
25515
  TextInputComponent,
25240
25516
  DragAndDropFileInputComponent,
25241
25517
  ChipsInputComponent,
@@ -25265,7 +25541,8 @@ class UiInputsModule {
25265
25541
  EditableLabelDirective,
25266
25542
  TextAreaComponent,
25267
25543
  ButtonComponent,
25268
- ImageInputComponent], exports: [DropdownSelectorComponent,
25544
+ ImageInputComponent,
25545
+ DropdownSelectorComponent], exports: [DropdownSelectorComponent,
25269
25546
  AutocompleteComponent,
25270
25547
  ButtonComponent,
25271
25548
  TextInputComponent,
@@ -25300,13 +25577,13 @@ class UiInputsModule {
25300
25577
  MatInputModule,
25301
25578
  MatDatepickerModule,
25302
25579
  MatNativeDateModule,
25303
- ImageInputComponent] }); }
25580
+ ImageInputComponent,
25581
+ DropdownSelectorComponent] }); }
25304
25582
  }
25305
25583
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, decorators: [{
25306
25584
  type: NgModule,
25307
25585
  args: [{
25308
25586
  declarations: [
25309
- DropdownSelectorComponent,
25310
25587
  AutocompleteComponent,
25311
25588
  TextInputComponent,
25312
25589
  DragAndDropFileInputComponent,
@@ -25343,6 +25620,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25343
25620
  TextAreaComponent,
25344
25621
  ButtonComponent,
25345
25622
  ImageInputComponent,
25623
+ DropdownSelectorComponent,
25346
25624
  ],
25347
25625
  exports: [
25348
25626
  DropdownSelectorComponent,
@@ -25416,7 +25694,7 @@ class AddLayerFromOgcApiComponent {
25416
25694
  this.layerAdded.emit({ ...layerToAdd, title: layer });
25417
25695
  }
25418
25696
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromOgcApiComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25419
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromOgcApiComponent, isStandalone: true, selector: "gn-ui-add-layer-from-ogc-api", inputs: { ogcUrl: "ogcUrl" }, outputs: { layerAdded: "layerAdded" }, ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"ogcUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.ogc.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer }}\n </p>\n <gn-ui-button\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }] }); }
25697
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromOgcApiComponent, isStandalone: true, selector: "gn-ui-add-layer-from-ogc-api", inputs: { ogcUrl: "ogcUrl" }, outputs: { layerAdded: "layerAdded" }, ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"ogcUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.ogc.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer }}\n </p>\n <gn-ui-button\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }] }); }
25420
25698
  }
25421
25699
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromOgcApiComponent, decorators: [{
25422
25700
  type: Component,
@@ -26372,7 +26650,7 @@ class MarkdownEditorComponent {
26372
26650
  this.textContentChanged.emit(this.textContent);
26373
26651
  }
26374
26652
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26375
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownEditorComponent, isStandalone: true, selector: "gn-ui-markdown-editor", inputs: { preview: "preview", helperText: "helperText", placeholder: "placeholder", textContent: "textContent" }, outputs: { textContentChanged: "textContentChanged" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <p class=\"flex-none mb-2 font-medium text-sm text-gray-900\">\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26653
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownEditorComponent, isStandalone: true, selector: "gn-ui-markdown-editor", inputs: { preview: "preview", helperText: "helperText", placeholder: "placeholder", textContent: "textContent" }, outputs: { textContentChanged: "textContentChanged" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <p class=\"flex-none mb-2 font-medium text-sm text-gray-900\">\n {{ helperText }}\n </p>\n <div class=\"flex-1\" [hidden]=\"preview\">\n <gn-ui-text-area\n [placeholder]=\"placeholder\"\n [value]=\"textContent\"\n (valueChange)=\"textContentChangedHandler($event)\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"flex-1 border border-gray-800 rounded overflow-y-scroll\"\n [hidden]=\"!preview\"\n >\n <gn-ui-markdown-parser [textContent]=\"textContent\"></gn-ui-markdown-parser>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26376
26654
  }
26377
26655
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownEditorComponent, decorators: [{
26378
26656
  type: Component,
@@ -26851,7 +27129,7 @@ class RecordApiFormComponent {
26851
27129
  this.format$.next(DEFAULT_PARAMS.FORMAT);
26852
27130
  }
26853
27131
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26854
- 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", "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 }); }
27132
+ 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 }); }
26855
27133
  }
26856
27134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
26857
27135
  type: Component,
@@ -27198,6 +27476,112 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27198
27476
  type: Input
27199
27477
  }] } });
27200
27478
 
27479
+ class TimeSincePipe {
27480
+ constructor(translate) {
27481
+ this.translate = translate;
27482
+ }
27483
+ transform(value) {
27484
+ if (isNaN(value.getTime())) {
27485
+ throw new Error('Invalid Date');
27486
+ }
27487
+ const maintenant = new Date();
27488
+ let locale;
27489
+ switch (this.translate.currentLang) {
27490
+ case 'fr':
27491
+ locale = fr$1;
27492
+ break;
27493
+ case 'de':
27494
+ locale = de$1;
27495
+ break;
27496
+ case 'es':
27497
+ locale = es$1;
27498
+ break;
27499
+ case 'it':
27500
+ locale = it$1;
27501
+ break;
27502
+ case 'nl':
27503
+ locale = nl$1;
27504
+ break;
27505
+ case 'pt':
27506
+ locale = pt$1;
27507
+ break;
27508
+ case 'sk':
27509
+ locale = sk;
27510
+ break;
27511
+ case 'en':
27512
+ default:
27513
+ locale = enUS;
27514
+ break;
27515
+ }
27516
+ return formatDistance(value, maintenant, {
27517
+ addSuffix: true,
27518
+ locale: locale,
27519
+ });
27520
+ }
27521
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TimeSincePipe, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Pipe }); }
27522
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TimeSincePipe, isStandalone: true, name: "timeSince" }); }
27523
+ }
27524
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TimeSincePipe, decorators: [{
27525
+ type: Pipe,
27526
+ args: [{
27527
+ name: 'timeSince',
27528
+ standalone: true,
27529
+ }]
27530
+ }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
27531
+
27532
+ class UserFeedbackItemComponent {
27533
+ constructor() {
27534
+ this.newUserFeedbackAnswer = new EventEmitter();
27535
+ this.isAnAnswer = false;
27536
+ this.newAnswer = '';
27537
+ this.isAnswerEmpty = true;
27538
+ }
27539
+ ngOnInit() {
27540
+ this.isAnAnswer = !!this.userFeedbackParent.parentUuid;
27541
+ }
27542
+ onNewAnswerValueChange() {
27543
+ this.isAnswerEmpty = this.newAnswer.length === 0;
27544
+ }
27545
+ publishNewAnswer() {
27546
+ if (this.newAnswer.trim() === '')
27547
+ return;
27548
+ const newAnswer = {
27549
+ ...this.userFeedbackParent,
27550
+ uuid: undefined,
27551
+ published: true,
27552
+ comment: this.newAnswer,
27553
+ parentUuid: this.userFeedbackParent.uuid,
27554
+ authorUserId: this.activeUser?.id,
27555
+ authorEmail: this.activeUser?.email,
27556
+ date: new Date(),
27557
+ authorName: `${this.activeUser?.name} ${this.activeUser?.surname}`,
27558
+ };
27559
+ this.newUserFeedbackAnswer.emit(newAnswer);
27560
+ this.newAnswer = '';
27561
+ this.onNewAnswerValueChange();
27562
+ }
27563
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27564
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: { userFeedbackParent: "userFeedbackParent", userFeedBacksAnswers: "userFeedBacksAnswers", isActiveUserEditor: "isActiveUserEditor", activeUser: "activeUser", isLastComment: "isLastComment", isAddUserFeedbackLoading: "isAddUserFeedbackLoading" }, outputs: { newUserFeedbackAnswer: "newUserFeedbackAnswer" }, ngImport: i0, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"isActiveUserEditor\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: ["userFeedbackParent", "userFeedBacksAnswers", "isActiveUserEditor", "activeUser", "isLastComment", "isAddUserFeedbackLoading"], outputs: ["newUserFeedbackAnswer"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: TimeSincePipe, name: "timeSince" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27565
+ }
27566
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, decorators: [{
27567
+ type: Component,
27568
+ args: [{ selector: 'gn-ui-user-feedback-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"isActiveUserEditor\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n" }]
27569
+ }], propDecorators: { userFeedbackParent: [{
27570
+ type: Input
27571
+ }], userFeedBacksAnswers: [{
27572
+ type: Input
27573
+ }], isActiveUserEditor: [{
27574
+ type: Input
27575
+ }], activeUser: [{
27576
+ type: Input
27577
+ }], isLastComment: [{
27578
+ type: Input
27579
+ }], isAddUserFeedbackLoading: [{
27580
+ type: Input
27581
+ }], newUserFeedbackAnswer: [{
27582
+ type: Output
27583
+ }] } });
27584
+
27201
27585
  class UiElementsModule {
27202
27586
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27203
27587
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -27219,6 +27603,7 @@ class UiElementsModule {
27219
27603
  PaginationButtonsComponent,
27220
27604
  MaxLinesComponent,
27221
27605
  RecordApiFormComponent,
27606
+ UserFeedbackItemComponent,
27222
27607
  ImageOverlayPreviewComponent], imports: [CommonModule,
27223
27608
  MatIconModule,
27224
27609
  MatTooltipModule,
@@ -27229,7 +27614,8 @@ class UiElementsModule {
27229
27614
  FormsModule,
27230
27615
  NgOptimizedImage,
27231
27616
  MarkdownParserComponent,
27232
- ThumbnailComponent], exports: [MetadataInfoComponent,
27617
+ ThumbnailComponent,
27618
+ TimeSincePipe], exports: [MetadataInfoComponent,
27233
27619
  ContentGhostComponent,
27234
27620
  DownloadItemComponent,
27235
27621
  DownloadsListComponent,
@@ -27249,6 +27635,7 @@ class UiElementsModule {
27249
27635
  MaxLinesComponent,
27250
27636
  RecordApiFormComponent,
27251
27637
  MarkdownParserComponent,
27638
+ UserFeedbackItemComponent,
27252
27639
  ImageOverlayPreviewComponent] }); }
27253
27640
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, imports: [CommonModule,
27254
27641
  MatIconModule,
@@ -27279,6 +27666,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27279
27666
  NgOptimizedImage,
27280
27667
  MarkdownParserComponent,
27281
27668
  ThumbnailComponent,
27669
+ TimeSincePipe,
27282
27670
  ],
27283
27671
  declarations: [
27284
27672
  MetadataInfoComponent,
@@ -27300,6 +27688,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27300
27688
  PaginationButtonsComponent,
27301
27689
  MaxLinesComponent,
27302
27690
  RecordApiFormComponent,
27691
+ UserFeedbackItemComponent,
27303
27692
  ImageOverlayPreviewComponent,
27304
27693
  ],
27305
27694
  exports: [
@@ -27323,6 +27712,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27323
27712
  MaxLinesComponent,
27324
27713
  RecordApiFormComponent,
27325
27714
  MarkdownParserComponent,
27715
+ UserFeedbackItemComponent,
27326
27716
  ImageOverlayPreviewComponent,
27327
27717
  ],
27328
27718
  }]
@@ -29652,7 +30042,7 @@ class AddLayerFromWmsComponent {
29652
30042
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
29653
30043
  }
29654
30044
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
29655
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30045
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29656
30046
  }
29657
30047
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, decorators: [{
29658
30048
  type: Component,
@@ -29803,7 +30193,7 @@ class AddLayerFromWfsComponent {
29803
30193
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
29804
30194
  }
29805
30195
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, deps: [{ token: MapFacade }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
29806
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
30196
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29807
30197
  }
29808
30198
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
29809
30199
  type: Component,
@@ -30198,31 +30588,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30198
30588
  ], template: "<div class=\"flex flex-col gap-6 p-6 items-start pointer-events-none\">\n <gn-ui-notification\n *ngFor=\"\n let notification of notificationsService.notifications$ | async;\n trackBy: trackById\n \"\n class=\"max-w-full pointer-events-auto\"\n [text]=\"notification.text\"\n [type]=\"notification.type\"\n [title]=\"notification.title\"\n [closeMessage]=\"notification.closeMessage\"\n (notificationClose)=\"\n notificationsService.removeNotificationById(notification.id)\n \"\n [@enterExit]\n ></gn-ui-notification>\n</div>\n" }]
30199
30589
  }], ctorParameters: function () { return [{ type: NotificationsService }]; } });
30200
30590
 
30591
+ /*
30592
+ Metadata actions
30593
+ */
30201
30594
  const loadFullMetadata = createAction('[Metadata view] Load full metadata', props());
30202
30595
  const setIncompleteMetadata = createAction('[Metadata view] Set incomplete metadata', props());
30203
- const loadFullSuccess = createAction('[Metadata view] Load full success', props());
30204
- const loadFullFailure = createAction('[Metadata view] Load full failure', props());
30596
+ const loadFullMetadataSuccess = createAction('[Metadata view] Load full metadata success', props());
30597
+ const loadFullMetadataFailure = createAction('[Metadata view] Load full metadata failure', props());
30598
+ const closeMetadata = createAction('[Metadata view] close');
30599
+ /*
30600
+ Related actions
30601
+ */
30205
30602
  const setRelated = createAction('[Metadata view] Set related records', props());
30603
+ /*
30604
+ ChartConfig actions
30605
+ */
30206
30606
  const setChartConfig = createAction('[Metadata view] Set chart config', props());
30207
- const close = createAction('[Metadata view] close');
30607
+ /*
30608
+ User Feedbacks actions
30609
+ */
30610
+ const addUserFeedback = createAction('[Metadata view] Add UserFeedback', props());
30611
+ const addUserFeedbackSuccess = createAction('[Metadata view] Add UserFeedback Success', props());
30612
+ const addUserFeedbackFailure = createAction('[Metadata view] Add UserFeedback Failure', props());
30613
+ const loadUserFeedbacks = createAction('[Metadata view] Load UserFeedbacks', props());
30614
+ const loadUserFeedbacksSuccess = createAction('[Metadata view] Load UserFeedbacks Success', props());
30615
+ const loadUserFeedbacksFailure = createAction('[Metadata view] Load UserFeedbacks Failure', props());
30208
30616
 
30209
30617
  var mdview_actions = /*#__PURE__*/Object.freeze({
30210
30618
  __proto__: null,
30211
- close: close,
30212
- loadFullFailure: loadFullFailure,
30619
+ addUserFeedback: addUserFeedback,
30620
+ addUserFeedbackFailure: addUserFeedbackFailure,
30621
+ addUserFeedbackSuccess: addUserFeedbackSuccess,
30622
+ closeMetadata: closeMetadata,
30213
30623
  loadFullMetadata: loadFullMetadata,
30214
- loadFullSuccess: loadFullSuccess,
30624
+ loadFullMetadataFailure: loadFullMetadataFailure,
30625
+ loadFullMetadataSuccess: loadFullMetadataSuccess,
30626
+ loadUserFeedbacks: loadUserFeedbacks,
30627
+ loadUserFeedbacksFailure: loadUserFeedbacksFailure,
30628
+ loadUserFeedbacksSuccess: loadUserFeedbacksSuccess,
30215
30629
  setChartConfig: setChartConfig,
30216
30630
  setIncompleteMetadata: setIncompleteMetadata,
30217
30631
  setRelated: setRelated
30218
30632
  });
30219
30633
 
30220
- const MD_VIEW_FEATURE_STATE_KEY = 'mdView';
30221
- const initialMdviewState = {
30634
+ const METADATA_VIEW_FEATURE_STATE_KEY = 'metadataView';
30635
+ const initialMetadataViewState = {
30222
30636
  error: null,
30223
30637
  loadingFull: false,
30638
+ allUserFeedbacksLoading: false,
30639
+ addUserFeedbackLoading: false,
30224
30640
  };
30225
- const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (state) => ({
30641
+ const metadataViewReducer = createReducer(initialMetadataViewState,
30642
+ /*
30643
+ Metadata reducers
30644
+ */
30645
+ on(loadFullMetadata, (state) => ({
30226
30646
  ...state,
30227
30647
  error: null,
30228
30648
  loadingFull: true,
@@ -30230,38 +30650,82 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
30230
30650
  ...state,
30231
30651
  error: null,
30232
30652
  metadata: incomplete,
30233
- })), on(loadFullSuccess, (state, { full }) => ({
30653
+ })), on(loadFullMetadataSuccess, (state, { full }) => ({
30234
30654
  ...state,
30235
30655
  error: null,
30236
30656
  metadata: full,
30237
30657
  loadingFull: false,
30238
- })), on(loadFullFailure, (state, { otherError, notFound }) => ({
30658
+ })), on(loadFullMetadataFailure, (state, { otherError, notFound }) => ({
30239
30659
  ...state,
30240
30660
  error: { otherError, notFound },
30241
30661
  loadingFull: false,
30242
- })), on(setRelated, (state, { related }) => ({
30662
+ })), on(closeMetadata, (state) => {
30663
+ const { metadata, related, userFeedbacks, ...stateWithoutMetadata } = state;
30664
+ return stateWithoutMetadata;
30665
+ }),
30666
+ /*
30667
+ Related reducers
30668
+ */
30669
+ on(setRelated, (state, { related }) => ({
30243
30670
  ...state,
30244
30671
  related,
30245
- })), on(setChartConfig, (state, { chartConfig }) => ({
30672
+ })),
30673
+ /*
30674
+ ChartConfig reducers
30675
+ */
30676
+ on(setChartConfig, (state, { chartConfig }) => ({
30246
30677
  ...state,
30247
30678
  chartConfig,
30248
- })), on(close, (state) => {
30249
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
30250
- const { metadata, related, ...stateWithoutMd } = state;
30251
- return stateWithoutMd;
30252
- }));
30253
- function reducer$1(state, action) {
30254
- return mdViewReducer(state, action);
30679
+ })),
30680
+ /*
30681
+ UserFeedbacks reducers
30682
+ */
30683
+ on(loadUserFeedbacks, (state) => ({
30684
+ ...state,
30685
+ error: null,
30686
+ allUserFeedbacksLoading: true,
30687
+ })), on(addUserFeedback, (state) => ({
30688
+ ...state,
30689
+ addUserFeedbackLoading: true,
30690
+ })), on(loadUserFeedbacksSuccess, (state, { userFeedbacks }) => ({
30691
+ ...state,
30692
+ error: null,
30693
+ userFeedbacks: userFeedbacks,
30694
+ addUserFeedbackLoading: false,
30695
+ allUserFeedbacksLoading: false,
30696
+ })), on(loadUserFeedbacksFailure, (state, { otherError, notFound }) => ({
30697
+ ...state,
30698
+ error: { otherError, notFound },
30699
+ addUserFeedbackLoading: false,
30700
+ allUserFeedbacksLoading: false,
30701
+ })));
30702
+ function reducer$1(metadataViewState, action) {
30703
+ return metadataViewReducer(metadataViewState, action);
30255
30704
  }
30256
30705
 
30257
- const getMdViewState = createFeatureSelector(MD_VIEW_FEATURE_STATE_KEY);
30706
+ const getMdViewState = createFeatureSelector(METADATA_VIEW_FEATURE_STATE_KEY);
30707
+ /*
30708
+ Metadata selectors
30709
+ */
30258
30710
  const getMetadataUuid = createSelector(getMdViewState, (state) => state.metadata ? state.metadata.uniqueIdentifier : null);
30259
30711
  const getMetadata = createSelector(getMdViewState, (state) => state.metadata);
30260
30712
  const getMetadataIsIncomplete = createSelector(getMdViewState, (state) => (state.metadata ? state.loadingFull : null));
30261
30713
  const getMetadataIsLoading = createSelector(getMdViewState, (state) => state.loadingFull);
30262
30714
  const getMetadataError = createSelector(getMdViewState, (state) => state.error);
30715
+ /*
30716
+ Related selectors
30717
+ */
30263
30718
  const getRelated = createSelector(getMdViewState, (state) => state.related);
30719
+ /*
30720
+ Metadata selectors
30721
+ */
30264
30722
  const getChartConfig = createSelector(getMdViewState, (state) => state.chartConfig);
30723
+ /*
30724
+ UserFeedback selectors
30725
+ */
30726
+ const getUserFeedbacks = createSelector(getMdViewState, (state) => state.userFeedbacks);
30727
+ const getAllUserFeedbacksLoading = createSelector(getMdViewState, (state) => state.allUserFeedbacksLoading);
30728
+ const getAddUserFeedbacksLoading = createSelector(getMdViewState, (state) => state.addUserFeedbackLoading);
30265
30729
 
30266
30730
  /**
30267
30731
  * The Metadata View Facade is used to render complete metadata records.
@@ -30270,11 +30734,12 @@ const getChartConfig = createSelector(getMdViewState, (state) => state.chartConf
30270
30734
  * To clear the current record use the `close()` method.
30271
30735
  */
30272
30736
  class MdViewFacade {
30273
- constructor(store, linkClassifier) {
30737
+ constructor(store, linkClassifier, avatarService) {
30274
30738
  this.store = store;
30275
30739
  this.linkClassifier = linkClassifier;
30740
+ this.avatarService = avatarService;
30276
30741
  this.isPresent$ = this.store.pipe(select(getMetadataUuid), map$1((uuid) => !!uuid));
30277
- this.isLoading$ = this.store.pipe(select(getMetadataIsLoading));
30742
+ this.isMetadataLoading$ = this.store.pipe(select(getMetadataIsLoading));
30278
30743
  this.metadata$ = this.store.pipe(select(getMetadata), filter((md) => !!md));
30279
30744
  this.isIncomplete$ = this.store.pipe(select(getMetadataIsIncomplete), filter((incomplete) => incomplete !== null));
30280
30745
  this.error$ = this.store.pipe(select(getMetadataError));
@@ -30288,6 +30753,9 @@ class MdViewFacade {
30288
30753
  this.geoDataLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.GEODATA))));
30289
30754
  this.landingPageLinks$ = this.metadata$.pipe(map$1((record) => ('landingPage' in record ? [record.landingPage] : [])));
30290
30755
  this.otherLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.UNKNOWN))));
30756
+ this.userFeedbacks$ = this.store.pipe(select(getUserFeedbacks));
30757
+ this.isAllUserFeedbackLoading$ = this.store.pipe(select(getAllUserFeedbacksLoading));
30758
+ this.isAddUserFeedbackLoading$ = this.store.pipe(select(getAddUserFeedbacksLoading));
30291
30759
  }
30292
30760
  /**
30293
30761
  * This will show an incomplete record (e.g. from a search result) as a preview
@@ -30302,39 +30770,73 @@ class MdViewFacade {
30302
30770
  loadFull(uuid) {
30303
30771
  this.store.dispatch(loadFullMetadata({ uuid }));
30304
30772
  }
30305
- close() {
30306
- this.store.dispatch(close());
30773
+ closeMetadata() {
30774
+ this.store.dispatch(closeMetadata());
30307
30775
  }
30308
30776
  setChartConfig(chartConfig) {
30309
30777
  this.store.dispatch(setChartConfig({ chartConfig }));
30310
30778
  }
30311
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, deps: [{ token: i1$2.Store }, { token: LinkClassifierService }], target: i0.ɵɵFactoryTarget.Injectable }); }
30779
+ /**
30780
+ * UserFeedbacks
30781
+ */
30782
+ addUserFeedback(userFeedback) {
30783
+ this.store.dispatch(addUserFeedback({ userFeedback }));
30784
+ }
30785
+ loadUserFeedbacks(datasetUuid) {
30786
+ this.store.dispatch(loadUserFeedbacks({ datasetUuid }));
30787
+ }
30788
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, deps: [{ token: i1$2.Store }, { token: LinkClassifierService }, { token: AvatarServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
30312
30789
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade }); }
30313
30790
  }
30314
30791
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, decorators: [{
30315
30792
  type: Injectable
30316
- }], ctorParameters: function () { return [{ type: i1$2.Store }, { type: LinkClassifierService }]; } });
30793
+ }], ctorParameters: function () { return [{ type: i1$2.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }]; } });
30317
30794
 
30318
30795
  class MdViewEffects {
30319
- constructor(actions$, recordsRepository) {
30796
+ constructor(actions$, recordsRepository, platformServiceInterface) {
30320
30797
  this.actions$ = actions$;
30321
30798
  this.recordsRepository = recordsRepository;
30322
- this.loadFull$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getByUniqueIdentifier(uuid)), map$1((record) => {
30799
+ this.platformServiceInterface = platformServiceInterface;
30800
+ /*
30801
+ Metadata effects
30802
+ */
30803
+ this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getByUniqueIdentifier(uuid)), map$1((record) => {
30323
30804
  if (record === null) {
30324
- return loadFullFailure({ notFound: true });
30805
+ return loadFullMetadataFailure({ notFound: true });
30325
30806
  }
30326
- return loadFullSuccess({ full: record });
30327
- }), catchError((error) => of(loadFullFailure({ otherError: error.message })))));
30328
- this.loadRelatedRecords$ = createEffect(() => this.actions$.pipe(ofType(loadFullSuccess), switchMap$1(({ full }) => this.recordsRepository.getSimilarRecords(full)), map$1((related) => {
30807
+ return loadFullMetadataSuccess({ full: record });
30808
+ }), catchError((error) => of(loadFullMetadataFailure({ otherError: error.message })))));
30809
+ /*
30810
+ Related effects
30811
+ */
30812
+ this.loadRelatedRecords$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSimilarRecords(full)), map$1((related) => {
30329
30813
  return setRelated({ related });
30330
30814
  }), catchError((error) => of(setRelated({ related: null })))));
30815
+ /*
30816
+ UserFeedback effects
30817
+ */
30818
+ this.loadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(loadUserFeedbacks), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
30819
+ otherError: error.message,
30820
+ })))))));
30821
+ this.reloadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedbackSuccess), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
30822
+ otherError: error.message,
30823
+ })))))));
30824
+ this.addUserFeedback$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedback), mergeMap$1((action) => this.platformServiceInterface
30825
+ .postUserFeedbacks(action.userFeedback)
30826
+ .pipe(map$1(() => addUserFeedbackSuccess({
30827
+ datasetUuid: action.userFeedback.metadataUUID,
30828
+ })), catchError((error) => {
30829
+ return of(addUserFeedbackFailure({
30830
+ otherError: error.message,
30831
+ }));
30832
+ })))));
30331
30833
  }
30332
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$8.Actions }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
30834
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, deps: [{ token: i1$8.Actions }, { token: RecordsRepositoryInterface }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
30333
30835
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects }); }
30334
30836
  }
30335
30837
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, decorators: [{
30336
30838
  type: Injectable
30337
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }]; } });
30839
+ }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
30338
30840
 
30339
30841
  class FigureComponent {
30340
30842
  constructor() {
@@ -32653,7 +33155,7 @@ class FeatureRecordModule {
32653
33155
  DataViewWebComponentComponent,
32654
33156
  DataViewShareComponent] }); }
32655
33157
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureRecordModule, providers: [MdViewFacade], imports: [CommonModule,
32656
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
33158
+ StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer$1),
32657
33159
  EffectsModule.forFeature([MdViewEffects]),
32658
33160
  UiLayoutModule,
32659
33161
  FeatureMapModule,
@@ -32681,7 +33183,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32681
33183
  ],
32682
33184
  imports: [
32683
33185
  CommonModule,
32684
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
33186
+ StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer$1),
32685
33187
  EffectsModule.forFeature([MdViewEffects]),
32686
33188
  UiLayoutModule,
32687
33189
  FeatureMapModule,
@@ -32746,6 +33248,13 @@ const DEFAULT_FIELDS = [
32746
33248
  },
32747
33249
  onSaveProcess: '${dateNow()}',
32748
33250
  },
33251
+ {
33252
+ model: 'licenses',
33253
+ formFieldConfig: {
33254
+ labelKey: marker('editor.record.form.license'),
33255
+ type: 'list',
33256
+ },
33257
+ },
32749
33258
  ];
32750
33259
 
32751
33260
  const EDITOR_FEATURE_KEY = 'editor';
@@ -33130,7 +33639,7 @@ class WizardFieldComponent {
33130
33639
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
33131
33640
  },
33132
33641
  { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
33133
- ], 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", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "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 }); }
33642
+ ], 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 }); }
33134
33643
  }
33135
33644
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardFieldComponent, decorators: [{
33136
33645
  type: Component,
@@ -33459,6 +33968,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33459
33968
  args: [{ selector: 'gn-ui-form-field-temporal-extent', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<p>form-field-temporal-extent works!</p>\n" }]
33460
33969
  }] });
33461
33970
 
33971
+ class FormFieldLicenseComponent {
33972
+ constructor() {
33973
+ this.choices = [
33974
+ {
33975
+ value: 'cc-by',
33976
+ label: marker('editor.record.form.license.cc-by'),
33977
+ },
33978
+ {
33979
+ value: 'cc-by-sa',
33980
+ label: marker('editor.record.form.license.cc-by-sa'),
33981
+ },
33982
+ {
33983
+ value: 'cc-zero',
33984
+ label: marker('editor.record.form.license.cc-zero'),
33985
+ },
33986
+ {
33987
+ value: 'etalab',
33988
+ label: marker('editor.record.form.license.etalab'),
33989
+ },
33990
+ {
33991
+ value: 'etalab-v2',
33992
+ label: marker('editor.record.form.license.etalab-v2'),
33993
+ },
33994
+ {
33995
+ value: 'odbl',
33996
+ label: marker('editor.record.form.license.odbl'),
33997
+ },
33998
+ {
33999
+ value: 'odc-by',
34000
+ label: marker('editor.record.form.license.odc-by'),
34001
+ },
34002
+ {
34003
+ value: 'pddl',
34004
+ label: marker('editor.record.form.license.pddl'),
34005
+ },
34006
+ {
34007
+ value: 'unknown',
34008
+ label: marker('editor.record.form.license.unknown'),
34009
+ },
34010
+ ];
34011
+ }
34012
+ get selected() {
34013
+ return this.control.value[0]?.text;
34014
+ }
34015
+ onSelectValue(value) {
34016
+ this.control.setValue([{ text: value }]);
34017
+ }
34018
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34019
+ 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 }); }
34020
+ }
34021
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldLicenseComponent, decorators: [{
34022
+ type: Component,
34023
+ 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" }]
34024
+ }], propDecorators: { control: [{
34025
+ type: Input
34026
+ }], label: [{
34027
+ type: Input
34028
+ }] } });
34029
+
33462
34030
  class FormFieldComponent {
33463
34031
  set value(v) {
33464
34032
  this.formControl.setValue(v, {
@@ -33513,8 +34081,14 @@ class FormFieldComponent {
33513
34081
  get isAbstract() {
33514
34082
  return this.model === 'abstract';
33515
34083
  }
34084
+ get isLicenses() {
34085
+ return this.model === 'licenses';
34086
+ }
34087
+ get withoutWrapper() {
34088
+ return this.model === 'title' || this.model === 'abstract';
34089
+ }
33516
34090
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33517
- 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 }); }
34091
+ 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=\"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$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { 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: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["control", "label"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33518
34092
  }
33519
34093
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, decorators: [{
33520
34094
  type: Component,
@@ -33524,6 +34098,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33524
34098
  EditableLabelDirective,
33525
34099
  MatIconModule,
33526
34100
  MatTooltipModule,
34101
+ FormFieldWrapperComponent,
33527
34102
  FormFieldSimpleComponent,
33528
34103
  FormFieldRichComponent,
33529
34104
  FormFieldObjectComponent,
@@ -33531,8 +34106,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33531
34106
  FormFieldTemporalExtentComponent,
33532
34107
  FormFieldFileComponent,
33533
34108
  FormFieldArrayComponent,
34109
+ FormFieldLicenseComponent,
33534
34110
  TranslateModule,
33535
- ], 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" }]
34111
+ ], 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=\"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" }]
33536
34112
  }], ctorParameters: function () { return []; }, propDecorators: { model: [{
33537
34113
  type: Input
33538
34114
  }], config: [{
@@ -33863,7 +34439,7 @@ class RouterEffects {
33863
34439
  * the search results happens
33864
34440
  */
33865
34441
  this.navigateToSearch$ = createEffect(() => this._actions$.pipe(navigation(this.routerConfig.searchRouteComponent, {
33866
- run: () => close(),
34442
+ run: () => closeMetadata(),
33867
34443
  })));
33868
34444
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
33869
34445
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });