geonetwork-ui 2.3.0-dev.6083baae → 2.3.0-dev.61774f7d

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 (124) 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-rich/form-field-rich.component.mjs +3 -3
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +24 -10
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +3 -13
  13. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -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/text-area/text-area.component.mjs +27 -4
  30. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +19 -3
  31. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +3 -3
  32. package/esm2022/translations/de.json +15 -0
  33. package/esm2022/translations/en.json +15 -0
  34. package/esm2022/translations/es.json +15 -0
  35. package/esm2022/translations/fr.json +15 -0
  36. package/esm2022/translations/it.json +15 -0
  37. package/esm2022/translations/nl.json +15 -0
  38. package/esm2022/translations/pt.json +15 -0
  39. package/fesm2022/geonetwork-ui.mjs +505 -79
  40. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  41. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  42. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  43. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  44. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  45. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  46. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  47. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  48. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  49. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  50. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  51. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  52. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  53. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  54. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  55. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  56. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  57. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +5 -1
  58. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  59. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -1
  60. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  61. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  62. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  63. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  64. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  65. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
  66. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  67. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  68. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  69. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  70. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  71. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +16 -14
  72. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  73. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  74. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  75. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +22 -0
  76. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  77. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  78. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  79. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +4 -1
  80. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  81. package/package.json +1 -1
  82. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  83. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  84. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  85. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  86. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +34 -7
  87. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  88. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  89. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  90. package/src/libs/common/fixtures/src/index.ts +8 -6
  91. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +1 -1
  92. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  93. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.css +0 -5
  94. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +1 -1
  95. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +24 -0
  96. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +19 -4
  97. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.ts +2 -21
  98. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  99. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  100. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  101. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +49 -8
  102. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
  103. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  104. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  105. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +5 -0
  106. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  107. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  108. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  109. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +63 -0
  110. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  111. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  112. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -1
  113. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +16 -1
  114. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.css +0 -5
  115. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +1 -1
  116. package/tailwind.base.css +7 -0
  117. package/translations/de.json +15 -0
  118. package/translations/en.json +15 -0
  119. package/translations/es.json +15 -0
  120. package/translations/fr.json +15 -0
  121. package/translations/it.json +15 -0
  122. package/translations/nl.json +15 -0
  123. package/translations/pt.json +15 -0
  124. package/translations/sk.json +15 -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",
@@ -17550,6 +17553,14 @@ var de = {
17550
17553
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
17551
17554
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
17552
17555
  "record.metadata.related": "Ähnliche Datensätze",
17556
+ "record.metadata.userFeedbacks": "",
17557
+ "record.metadata.userFeedbacks.anonymousUser": "",
17558
+ "record.metadata.userFeedbacks.sortSelector.label": "",
17559
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
17560
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
17561
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
17562
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
17563
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
17553
17564
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
17554
17565
  "record.metadata.status": "Status",
17555
17566
  "record.metadata.technical": "Technische Informationen",
@@ -17623,6 +17634,12 @@ var de = {
17623
17634
  "table.loading.data": "Daten werden geladen...",
17624
17635
  "table.object.count": "Objekte in diesem Datensatz",
17625
17636
  "table.select.data": "Datenquelle",
17637
+ "timeSincePipe.lessThanAMinute": "",
17638
+ "timeSincePipe.minutesAgo": "",
17639
+ "timeSincePipe.hoursAgo": "",
17640
+ "timeSincePipe.daysAgo": "",
17641
+ "timeSincePipe.monthsAgo": "",
17642
+ "timeSincePipe.yearsAgo": "",
17626
17643
  "tooltip.html.copy": "HTML kopieren",
17627
17644
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
17628
17645
  "tooltip.url.copy": "URL kopieren",
@@ -17641,6 +17658,7 @@ var next$5 = "next";
17641
17658
  var previous$5 = "previous";
17642
17659
  var records$5 = "records";
17643
17660
  var en = {
17661
+ "button.login": "Log in",
17644
17662
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
17645
17663
  "catalog.figures.organisations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
17646
17664
  "chart.aggregation.average": "average",
@@ -17920,6 +17938,14 @@ var en = {
17920
17938
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
17921
17939
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17922
17940
  "record.metadata.related": "Related records",
17941
+ "record.metadata.userFeedbacks": "Questions / Answers",
17942
+ "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
17943
+ "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
17944
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
17945
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
17946
+ "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
17947
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
17948
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
17923
17949
  "record.metadata.sheet": "Original metadata",
17924
17950
  "record.metadata.status": "Status",
17925
17951
  "record.metadata.technical": "Technical information",
@@ -17993,6 +18019,12 @@ var en = {
17993
18019
  "table.loading.data": "Loading data...",
17994
18020
  "table.object.count": "objects in this dataset",
17995
18021
  "table.select.data": "Data source",
18022
+ "timeSincePipe.lessThanAMinute": "Less than a minute ago",
18023
+ "timeSincePipe.minutesAgo": "{value} minute{s} ago",
18024
+ "timeSincePipe.hoursAgo": "{value} hour{s} ago",
18025
+ "timeSincePipe.daysAgo": "{value} day{s} ago",
18026
+ "timeSincePipe.monthsAgo": "{value} month{s} ago",
18027
+ "timeSincePipe.yearsAgo": "{value} year{s} ago",
17996
18028
  "tooltip.html.copy": "Copy HTML",
17997
18029
  "tooltip.id.copy": "Copy unique identifier",
17998
18030
  "tooltip.url.copy": "Copy URL",
@@ -18011,6 +18043,7 @@ var next$4 = "";
18011
18043
  var previous$4 = "";
18012
18044
  var records$4 = "";
18013
18045
  var es = {
18046
+ "button.login": "",
18014
18047
  "catalog.figures.datasets": "conjuntos de datos",
18015
18048
  "catalog.figures.organisations": "organizaciones",
18016
18049
  "chart.aggregation.average": "promedio",
@@ -18290,6 +18323,14 @@ var es = {
18290
18323
  "record.metadata.quality.updateFrequency.failed": "",
18291
18324
  "record.metadata.quality.updateFrequency.success": "",
18292
18325
  "record.metadata.related": "",
18326
+ "record.metadata.userFeedbacks": "",
18327
+ "record.metadata.userFeedbacks.anonymousUser": "",
18328
+ "record.metadata.userFeedbacks.sortSelector.label": "",
18329
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
18330
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
18331
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
18332
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
18333
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
18293
18334
  "record.metadata.sheet": "",
18294
18335
  "record.metadata.status": "",
18295
18336
  "record.metadata.technical": "",
@@ -18363,6 +18404,12 @@ var es = {
18363
18404
  "table.loading.data": "",
18364
18405
  "table.object.count": "",
18365
18406
  "table.select.data": "",
18407
+ "timeSincePipe.lessThanAMinute": "",
18408
+ "timeSincePipe.minutesAgo": "",
18409
+ "timeSincePipe.hoursAgo": "",
18410
+ "timeSincePipe.daysAgo": "",
18411
+ "timeSincePipe.monthsAgo": "",
18412
+ "timeSincePipe.yearsAgo": "",
18366
18413
  "tooltip.html.copy": "",
18367
18414
  "tooltip.id.copy": "",
18368
18415
  "tooltip.url.copy": "",
@@ -18381,6 +18428,7 @@ var next$3 = "suivant";
18381
18428
  var previous$3 = "précédent";
18382
18429
  var records$3 = "enregistrements";
18383
18430
  var fr = {
18431
+ "button.login": "Se connecter",
18384
18432
  "catalog.figures.datasets": "{count, plural, =0{données} one{donnée} other{données}}",
18385
18433
  "catalog.figures.organisations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
18386
18434
  "chart.aggregation.average": "moyenne",
@@ -18660,6 +18708,14 @@ var fr = {
18660
18708
  "record.metadata.quality.updateFrequency.failed": "Fréquence de mise à jour n'est pas renseignée",
18661
18709
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
18662
18710
  "record.metadata.related": "Voir aussi",
18711
+ "record.metadata.userFeedbacks": "Questions / Réponses",
18712
+ "record.metadata.userFeedbacks.anonymousUser": "Pour rédiger un commentaire, veuillez vous identifier.",
18713
+ "record.metadata.userFeedbacks.sortSelector.label": "Trier par ...",
18714
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Les plus récents en premier",
18715
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Les plus anciens en premier",
18716
+ "record.metadata.userFeedbacks.newComment.placeholder": "Rédiger votre commentaire ici...",
18717
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Répondre...",
18718
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publier",
18663
18719
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
18664
18720
  "record.metadata.status": "Statut",
18665
18721
  "record.metadata.technical": "Informations techniques",
@@ -18733,6 +18789,12 @@ var fr = {
18733
18789
  "table.loading.data": "Chargement des données...",
18734
18790
  "table.object.count": "enregistrements dans ces données",
18735
18791
  "table.select.data": "Source de données",
18792
+ "timeSincePipe.lessThanAMinute": "Il y a moins d'une minute",
18793
+ "timeSincePipe.minutesAgo": "Il y a {value} minute{s}",
18794
+ "timeSincePipe.hoursAgo": "Il y a {value} heure{s}",
18795
+ "timeSincePipe.daysAgo": "Il y a {value} jour{s}",
18796
+ "timeSincePipe.monthsAgo": "Il y a {value} mois",
18797
+ "timeSincePipe.yearsAgo": "Il y a {value} an{s}",
18736
18798
  "tooltip.html.copy": "Copier le HTML",
18737
18799
  "tooltip.id.copy": "Copier l'identifiant unique",
18738
18800
  "tooltip.url.copy": "Copier l'URL",
@@ -18751,6 +18813,7 @@ var next$2 = "successivo";
18751
18813
  var previous$2 = "precedente";
18752
18814
  var records$2 = "record";
18753
18815
  var it = {
18816
+ "button.login": "",
18754
18817
  "catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
18755
18818
  "catalog.figures.organisations": "{count, plural, =0{organizzazioni} one{organizzazione} other{organizzazioni}}",
18756
18819
  "chart.aggregation.average": "media",
@@ -19030,6 +19093,14 @@ var it = {
19030
19093
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
19031
19094
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
19032
19095
  "record.metadata.related": "Vedi anche",
19096
+ "record.metadata.userFeedbacks": "",
19097
+ "record.metadata.userFeedbacks.anonymousUser": "",
19098
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19099
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19100
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19101
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19102
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19103
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19033
19104
  "record.metadata.sheet": "Origine del metadata",
19034
19105
  "record.metadata.status": "Stato",
19035
19106
  "record.metadata.technical": "Informazioni tecniche",
@@ -19103,6 +19174,12 @@ var it = {
19103
19174
  "table.loading.data": "Caricamento dei dati...",
19104
19175
  "table.object.count": "record in questi dati",
19105
19176
  "table.select.data": "Sorgente dati",
19177
+ "timeSincePipe.lessThanAMinute": "",
19178
+ "timeSincePipe.minutesAgo": "",
19179
+ "timeSincePipe.hoursAgo": "",
19180
+ "timeSincePipe.daysAgo": "",
19181
+ "timeSincePipe.monthsAgo": "",
19182
+ "timeSincePipe.yearsAgo": "",
19106
19183
  "tooltip.html.copy": "Copiare il HTML",
19107
19184
  "tooltip.id.copy": "Copiare l'identificatore unico",
19108
19185
  "tooltip.url.copy": "Copiare l'URL",
@@ -19121,6 +19198,7 @@ var next$1 = "";
19121
19198
  var previous$1 = "";
19122
19199
  var records$1 = "";
19123
19200
  var nl = {
19201
+ "button.login": "",
19124
19202
  "catalog.figures.datasets": "datasets",
19125
19203
  "catalog.figures.organisations": "organisaties",
19126
19204
  "chart.aggregation.average": "gemiddelde",
@@ -19400,6 +19478,14 @@ var nl = {
19400
19478
  "record.metadata.quality.updateFrequency.failed": "",
19401
19479
  "record.metadata.quality.updateFrequency.success": "",
19402
19480
  "record.metadata.related": "",
19481
+ "record.metadata.userFeedbacks": "",
19482
+ "record.metadata.userFeedbacks.anonymousUser": "",
19483
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19484
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19485
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19486
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19487
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19488
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19403
19489
  "record.metadata.sheet": "",
19404
19490
  "record.metadata.status": "",
19405
19491
  "record.metadata.technical": "",
@@ -19473,6 +19559,12 @@ var nl = {
19473
19559
  "table.loading.data": "",
19474
19560
  "table.object.count": "",
19475
19561
  "table.select.data": "",
19562
+ "timeSincePipe.lessThanAMinute": "",
19563
+ "timeSincePipe.minutesAgo": "",
19564
+ "timeSincePipe.hoursAgo": "",
19565
+ "timeSincePipe.daysAgo": "",
19566
+ "timeSincePipe.monthsAgo": "",
19567
+ "timeSincePipe.yearsAgo": "",
19476
19568
  "tooltip.html.copy": "",
19477
19569
  "tooltip.id.copy": "",
19478
19570
  "tooltip.url.copy": "",
@@ -19491,6 +19583,7 @@ var next = "";
19491
19583
  var previous = "";
19492
19584
  var records = "";
19493
19585
  var pt = {
19586
+ "button.login": "",
19494
19587
  "catalog.figures.datasets": "conjuntos de dados",
19495
19588
  "catalog.figures.organisations": "organizações",
19496
19589
  "chart.aggregation.average": "média",
@@ -19770,6 +19863,14 @@ var pt = {
19770
19863
  "record.metadata.quality.updateFrequency.failed": "",
19771
19864
  "record.metadata.quality.updateFrequency.success": "",
19772
19865
  "record.metadata.related": "",
19866
+ "record.metadata.userFeedbacks": "",
19867
+ "record.metadata.userFeedbacks.anonymousUser": "",
19868
+ "record.metadata.userFeedbacks.sortSelector.label": "",
19869
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
19870
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
19871
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
19872
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
19873
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
19773
19874
  "record.metadata.sheet": "",
19774
19875
  "record.metadata.status": "",
19775
19876
  "record.metadata.technical": "",
@@ -19843,6 +19944,12 @@ var pt = {
19843
19944
  "table.loading.data": "",
19844
19945
  "table.object.count": "",
19845
19946
  "table.select.data": "",
19947
+ "timeSincePipe.lessThanAMinute": "",
19948
+ "timeSincePipe.minutesAgo": "",
19949
+ "timeSincePipe.hoursAgo": "",
19950
+ "timeSincePipe.daysAgo": "",
19951
+ "timeSincePipe.monthsAgo": "",
19952
+ "timeSincePipe.yearsAgo": "",
19846
19953
  "tooltip.html.copy": "",
19847
19954
  "tooltip.id.copy": "",
19848
19955
  "tooltip.url.copy": "",
@@ -19937,11 +20044,11 @@ class Gn4FieldMapper {
19937
20044
  }),
19938
20045
  creationDateForResource: (output, source) => ({
19939
20046
  ...output,
19940
- datasetCreated: toDate(getFirstValue(selectField(source, 'creationDateForResource'))),
20047
+ resourceCreated: toDate(getFirstValue(selectField(source, 'creationDateForResource'))),
19941
20048
  }),
19942
20049
  revisionDateForResource: (output, source) => ({
19943
20050
  ...output,
19944
- datasetUpdated: toDate(getFirstValue(selectField(source, 'revisionDateForResource'))),
20051
+ resourceUpdated: toDate(getFirstValue(selectField(source, 'revisionDateForResource'))),
19945
20052
  }),
19946
20053
  createDate: (output, source) => ({
19947
20054
  ...output,
@@ -21166,6 +21273,16 @@ class GravatarService {
21166
21273
  getProfileIcon(hash) {
21167
21274
  return this.identicon$.pipe(map$1((identicon) => identicon || this.GRAVATAR_IDENTICON), map$1((identicon) => `${this.GRAVATAR_URL}${hash}?d=${identicon}`));
21168
21275
  }
21276
+ async getProfileIconUrl(userId) {
21277
+ let iconUrl = '';
21278
+ try {
21279
+ iconUrl = await firstValueFrom(this.getProfileIcon(userId));
21280
+ }
21281
+ catch (error) {
21282
+ return '';
21283
+ }
21284
+ return iconUrl;
21285
+ }
21169
21286
  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
21287
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: GravatarService, providedIn: 'root' }); }
21171
21288
  }
@@ -21317,6 +21434,39 @@ class Gn4PlatformMapper {
21317
21434
  };
21318
21435
  });
21319
21436
  }
21437
+ userFeedbacksFromApi(userFeedback) {
21438
+ return {
21439
+ uuid: userFeedback.uuid,
21440
+ metadataUUID: userFeedback.metadataUUID,
21441
+ comment: userFeedback.comment,
21442
+ authorUserId: userFeedback.authorUserId.toString(),
21443
+ authorName: userFeedback.authorName,
21444
+ authorEmail: userFeedback.authorEmail,
21445
+ published: userFeedback.published,
21446
+ parentUuid: userFeedback.parentUuid ?? undefined,
21447
+ date: new Date(userFeedback.date),
21448
+ };
21449
+ }
21450
+ userFeedbacksToApi(userFeedback) {
21451
+ return {
21452
+ uuid: userFeedback.uuid,
21453
+ metadataUUID: userFeedback.metadataUUID,
21454
+ comment: userFeedback.comment,
21455
+ authorUserId: Number.parseInt(userFeedback.authorUserId),
21456
+ authorName: userFeedback.authorName,
21457
+ authorEmail: userFeedback.authorEmail,
21458
+ published: userFeedback.published,
21459
+ parentUuid: userFeedback.parentUuid,
21460
+ date: userFeedback.date.getTime().toString(),
21461
+ };
21462
+ }
21463
+ async createUserFeedbackViewModel(baseUserFeedback) {
21464
+ const userAvatarUrl = await this.avatarService.getProfileIconUrl(baseUserFeedback.authorUserId?.toString());
21465
+ return {
21466
+ ...baseUserFeedback,
21467
+ avatarUrl: userAvatarUrl,
21468
+ };
21469
+ }
21320
21470
  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
21471
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformMapper }); }
21322
21472
  }
@@ -21326,7 +21476,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
21326
21476
 
21327
21477
  const minApiVersion = '4.2.2';
21328
21478
  class Gn4PlatformService {
21329
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
21479
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService, userfeedbackApiService) {
21330
21480
  this.siteApiService = siteApiService;
21331
21481
  this.meApi = meApi;
21332
21482
  this.usersApi = usersApi;
@@ -21334,6 +21484,7 @@ class Gn4PlatformService {
21334
21484
  this.toolsApiService = toolsApiService;
21335
21485
  this.registriesApiService = registriesApiService;
21336
21486
  this.langService = langService;
21487
+ this.userfeedbackApiService = userfeedbackApiService;
21337
21488
  this.type = 'GeoNetwork';
21338
21489
  this.keyTranslations$ = this.toolsApiService
21339
21490
  .getTranslationsPackage1('gnui')
@@ -21353,7 +21504,7 @@ class Gn4PlatformService {
21353
21504
  */
21354
21505
  this.thesauri = {};
21355
21506
  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)));
21507
+ this.isUserAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
21357
21508
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
21358
21509
  }
21359
21510
  getType() {
@@ -21366,7 +21517,7 @@ class Gn4PlatformService {
21366
21517
  return this.me$;
21367
21518
  }
21368
21519
  isAnonymous() {
21369
- return this.isAnonymous$;
21520
+ return this.isUserAnonymous$;
21370
21521
  }
21371
21522
  getOrganizations() {
21372
21523
  return undefined;
@@ -21402,12 +21553,23 @@ class Gn4PlatformService {
21402
21553
  .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
21403
21554
  return this.thesauri[uri];
21404
21555
  }
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 }); }
21556
+ getUserFeedbacks(uuid) {
21557
+ return this.userfeedbackApiService
21558
+ .getUserComments(uuid)
21559
+ .pipe(map$1((userFeedbacks) => userFeedbacks.map(this.mapper.userFeedbacksFromApi)));
21560
+ }
21561
+ postUserFeedbacks(userFeedback) {
21562
+ const mappedUserFeedBack = this.mapper.userFeedbacksToApi(userFeedback);
21563
+ return this.userfeedbackApiService
21564
+ .newUserFeedback(mappedUserFeedBack)
21565
+ .pipe(map$1(() => undefined));
21566
+ }
21567
+ 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
21568
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
21407
21569
  }
21408
21570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
21409
21571
  type: Injectable
21410
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
21572
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }, { type: UserfeedbackApiService }]; } });
21411
21573
 
21412
21574
  function provideGn4() {
21413
21575
  return [
@@ -24213,11 +24375,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24213
24375
 
24214
24376
  class TextInputComponent {
24215
24377
  constructor() {
24378
+ this.baseClass = [
24379
+ 'appearance-none',
24380
+ 'border border-gray-300',
24381
+ 'rounded w-full',
24382
+ 'p-2',
24383
+ 'text-gray-700',
24384
+ 'leading-tight',
24385
+ 'focus:outline-none',
24386
+ 'focus:border-primary',
24387
+ ].join(' ');
24216
24388
  this.value = '';
24389
+ this.extraClass = '';
24217
24390
  this.required = false;
24218
24391
  this.rawChange = new Subject();
24219
24392
  this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24220
24393
  }
24394
+ get classList() {
24395
+ return `${this.baseClass} ${this.extraClass}`;
24396
+ }
24221
24397
  ngAfterViewInit() {
24222
24398
  this.checkRequired(this.input.nativeElement.value);
24223
24399
  }
@@ -24230,13 +24406,15 @@ class TextInputComponent {
24230
24406
  this.rawChange.next(value);
24231
24407
  }
24232
24408
  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"] }); }
24409
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextInputComponent, selector: "gn-ui-text-input", inputs: { value: "value", extraClass: "extraClass", hint: "hint", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input\n #input\n [class]=\"classList\"\n type=\"text\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [placeholder]=\"hint\"\n [attr.aria-label]=\"hint\"\n [attr.required]=\"required || null\"\n/>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
24234
24410
  }
24235
24411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextInputComponent, decorators: [{
24236
24412
  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"] }]
24413
+ args: [{ selector: 'gn-ui-text-input', template: "<input\n #input\n [class]=\"classList\"\n type=\"text\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [placeholder]=\"hint\"\n [attr.aria-label]=\"hint\"\n [attr.required]=\"required || null\"\n/>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
24238
24414
  }], propDecorators: { value: [{
24239
24415
  type: Input
24416
+ }], extraClass: [{
24417
+ type: Input
24240
24418
  }], hint: [{
24241
24419
  type: Input
24242
24420
  }], required: [{
@@ -24317,9 +24495,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24317
24495
  class TextAreaComponent {
24318
24496
  constructor() {
24319
24497
  this.value = '';
24498
+ this.disabled = false;
24499
+ this.extraClass = '';
24320
24500
  this.required = false;
24321
24501
  this.rawChange = new Subject();
24322
24502
  this.valueChange = this.rawChange.pipe(distinctUntilChanged());
24503
+ this.baseClasses = [
24504
+ 'w-full',
24505
+ 'pt-2',
24506
+ 'pl-2',
24507
+ 'resize-none',
24508
+ 'border',
24509
+ 'border-gray-800',
24510
+ 'rounded italic',
24511
+ 'leading-tight',
24512
+ 'focus:outline-none',
24513
+ 'focus:bg-background',
24514
+ 'focus:border-primary',
24515
+ ].join(' ');
24516
+ this.disabledClasses = ['cursor-not-allowed'].join(' ');
24517
+ }
24518
+ get classList() {
24519
+ return `${this.baseClasses} ${this.extraClass} ${this.disabled ? this.disabledClasses : ''}`;
24323
24520
  }
24324
24521
  ngAfterViewInit() {
24325
24522
  this.checkRequired(this.input.nativeElement.value);
@@ -24333,12 +24530,16 @@ class TextAreaComponent {
24333
24530
  this.rawChange.next(value);
24334
24531
  }
24335
24532
  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"] }); }
24533
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", disabled: "disabled", extraClass: "extraClass", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [class]=\"classList\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
24337
24534
  }
24338
24535
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
24339
24536
  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: [{
24537
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n [class]=\"classList\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
24538
+ }], ctorParameters: function () { return []; }, propDecorators: { value: [{
24539
+ type: Input
24540
+ }], disabled: [{
24541
+ type: Input
24542
+ }], extraClass: [{
24342
24543
  type: Input
24343
24544
  }], placeholder: [{
24344
24545
  type: Input
@@ -25416,7 +25617,7 @@ class AddLayerFromOgcApiComponent {
25416
25617
  this.layerAdded.emit({ ...layerToAdd, title: layer });
25417
25618
  }
25418
25619
  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"] }] }); }
25620
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromOgcApiComponent, isStandalone: true, selector: "gn-ui-add-layer-from-ogc-api", inputs: { ogcUrl: "ogcUrl" }, outputs: { layerAdded: "layerAdded" }, ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"ogcUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.ogc.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer }}\n </p>\n <gn-ui-button\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }] }); }
25420
25621
  }
25421
25622
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromOgcApiComponent, decorators: [{
25422
25623
  type: Component,
@@ -26372,7 +26573,7 @@ class MarkdownEditorComponent {
26372
26573
  this.textContentChanged.emit(this.textContent);
26373
26574
  }
26374
26575
  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 }); }
26576
+ 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
26577
  }
26377
26578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownEditorComponent, decorators: [{
26378
26579
  type: Component,
@@ -26851,7 +27052,7 @@ class RecordApiFormComponent {
26851
27052
  this.format$.next(DEFAULT_PARAMS.FORMAT);
26852
27053
  }
26853
27054
  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 }); }
27055
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26855
27056
  }
26856
27057
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
26857
27058
  type: Component,
@@ -26999,11 +27200,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26999
27200
 
27000
27201
  class FormFieldWrapperComponent {
27001
27202
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27002
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".icon-small{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27203
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27003
27204
  }
27004
27205
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
27005
27206
  type: Component,
27006
- args: [{ selector: 'gn-ui-form-field-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatIconModule, MatTooltipModule], template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".icon-small{font-size:16px;height:16px;width:16px}\n"] }]
27207
+ args: [{ selector: 'gn-ui-form-field-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatIconModule, MatTooltipModule], template: "<div class=\"h-full flex flex-col\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
27007
27208
  }], propDecorators: { label: [{
27008
27209
  type: Input
27009
27210
  }], hint: [{
@@ -27198,6 +27399,112 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27198
27399
  type: Input
27199
27400
  }] } });
27200
27401
 
27402
+ class TimeSincePipe {
27403
+ constructor(translate) {
27404
+ this.translate = translate;
27405
+ }
27406
+ transform(value) {
27407
+ if (isNaN(value.getTime())) {
27408
+ throw new Error('Invalid Date');
27409
+ }
27410
+ const maintenant = new Date();
27411
+ let locale;
27412
+ switch (this.translate.currentLang) {
27413
+ case 'fr':
27414
+ locale = fr$1;
27415
+ break;
27416
+ case 'de':
27417
+ locale = de$1;
27418
+ break;
27419
+ case 'es':
27420
+ locale = es$1;
27421
+ break;
27422
+ case 'it':
27423
+ locale = it$1;
27424
+ break;
27425
+ case 'nl':
27426
+ locale = nl$1;
27427
+ break;
27428
+ case 'pt':
27429
+ locale = pt$1;
27430
+ break;
27431
+ case 'sk':
27432
+ locale = sk;
27433
+ break;
27434
+ case 'en':
27435
+ default:
27436
+ locale = enUS;
27437
+ break;
27438
+ }
27439
+ return formatDistance(value, maintenant, {
27440
+ addSuffix: true,
27441
+ locale: locale,
27442
+ });
27443
+ }
27444
+ 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 }); }
27445
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TimeSincePipe, isStandalone: true, name: "timeSince" }); }
27446
+ }
27447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TimeSincePipe, decorators: [{
27448
+ type: Pipe,
27449
+ args: [{
27450
+ name: 'timeSince',
27451
+ standalone: true,
27452
+ }]
27453
+ }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
27454
+
27455
+ class UserFeedbackItemComponent {
27456
+ constructor() {
27457
+ this.newUserFeedbackAnswer = new EventEmitter();
27458
+ this.isAnAnswer = false;
27459
+ this.newAnswer = '';
27460
+ this.isAnswerEmpty = true;
27461
+ }
27462
+ ngOnInit() {
27463
+ this.isAnAnswer = !!this.userFeedbackParent.parentUuid;
27464
+ }
27465
+ onNewAnswerValueChange() {
27466
+ this.isAnswerEmpty = this.newAnswer.length === 0;
27467
+ }
27468
+ publishNewAnswer() {
27469
+ if (this.newAnswer.trim() === '')
27470
+ return;
27471
+ const newAnswer = {
27472
+ ...this.userFeedbackParent,
27473
+ uuid: undefined,
27474
+ published: true,
27475
+ comment: this.newAnswer,
27476
+ parentUuid: this.userFeedbackParent.uuid,
27477
+ authorUserId: this.activeUser?.id,
27478
+ authorEmail: this.activeUser?.email,
27479
+ date: new Date(),
27480
+ authorName: `${this.activeUser?.name} ${this.activeUser?.surname}`,
27481
+ };
27482
+ this.newUserFeedbackAnswer.emit(newAnswer);
27483
+ this.newAnswer = '';
27484
+ this.onNewAnswerValueChange();
27485
+ }
27486
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27487
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: { userFeedbackParent: "userFeedbackParent", userFeedBacksAnswers: "userFeedBacksAnswers", isActiveUserEditor: "isActiveUserEditor", activeUser: "activeUser", isLastComment: "isLastComment", isAddUserFeedbackLoading: "isAddUserFeedbackLoading" }, outputs: { newUserFeedbackAnswer: "newUserFeedbackAnswer" }, ngImport: i0, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"isActiveUserEditor\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: UserFeedbackItemComponent, selector: "gn-ui-user-feedback-item", inputs: ["userFeedbackParent", "userFeedBacksAnswers", "isActiveUserEditor", "activeUser", "isLastComment", "isAddUserFeedbackLoading"], outputs: ["newUserFeedbackAnswer"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: TimeSincePipe, name: "timeSince" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27488
+ }
27489
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UserFeedbackItemComponent, decorators: [{
27490
+ type: Component,
27491
+ args: [{ selector: 'gn-ui-user-feedback-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"userFeedbackParent.published\"\n class=\"flex flex-col bg-white rounded w-full\"\n [ngClass]=\"[isAnAnswer ? 'ps-4 ' : 'p-4']\"\n>\n <div class=\"flex flex-row\">\n <div class=\"avatar\">\n <img\n class=\"rounded-full\"\n [src]=\"userFeedbackParent.avatarUrl\"\n alt=\"avatar\"\n />\n </div>\n <div class=\"p-4 flex flex-col\">\n <span>{{ userFeedbackParent.authorName }}</span>\n <span> {{ userFeedbackParent.date | timeSince }}</span>\n </div>\n </div>\n <div data-cy=\"commentText\" class=\"mt-4 whitespace-pre-line\">\n {{ userFeedbackParent.comment }}\n </div>\n <div\n class=\"w-full\"\n *ngFor=\"let userFeedBacksAnswer of userFeedBacksAnswers; let last = last\"\n >\n <hr class=\"-mx-4 my-6\" />\n <gn-ui-user-feedback-item\n [userFeedbackParent]=\"userFeedBacksAnswer\"\n [isLastComment]=\"last\"\n ></gn-ui-user-feedback-item>\n </div>\n\n <div *ngIf=\"isActiveUserEditor\" class=\"mt-2 flex flex-col\">\n <hr class=\"-mx-4 my-4\" />\n <div\n id=\"new-comment-buttons\"\n class=\"flex flex-row gap-2 items-center justify-end\"\n >\n <gn-ui-text-area\n [disabled]=\"isAddUserFeedbackLoading\"\n [(value)]=\"newAnswer\"\n (valueChange)=\"onNewAnswerValueChange()\"\n (keyup.control.enter)=\"publishNewAnswer()\"\n [placeholder]=\"\n 'record.metadata.userFeedbacks.newAnswer.placeholder' | translate\n \"\n class=\"grow\"\n extraClass=\"bg-transparent border-0 placeholder-primary-darker text-primary-darker h-9\"\n ></gn-ui-text-area>\n <div *ngIf=\"!isAnswerEmpty\" class=\"flex flex-row justify-end\">\n <gn-ui-button\n [disabled]=\"isAddUserFeedbackLoading\"\n [type]=\"'outline'\"\n (buttonClick)=\"publishNewAnswer()\"\n [title]=\"\n 'record.metadata.userFeedbacks.newAnswer.buttonTitle' | translate\n \"\n extraClass=\"!p-[0.5em] text-primary-darker border-primary-darker h-9\"\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"!isAddUserFeedbackLoading\"\n >\n send\n </mat-icon>\n <ng-container *ngIf=\"isAddUserFeedbackLoading\">\n <div class=\"flex justify-center w-full\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n </ng-container>\n </gn-ui-button>\n </div>\n </div>\n </div>\n</div>\n" }]
27492
+ }], propDecorators: { userFeedbackParent: [{
27493
+ type: Input
27494
+ }], userFeedBacksAnswers: [{
27495
+ type: Input
27496
+ }], isActiveUserEditor: [{
27497
+ type: Input
27498
+ }], activeUser: [{
27499
+ type: Input
27500
+ }], isLastComment: [{
27501
+ type: Input
27502
+ }], isAddUserFeedbackLoading: [{
27503
+ type: Input
27504
+ }], newUserFeedbackAnswer: [{
27505
+ type: Output
27506
+ }] } });
27507
+
27201
27508
  class UiElementsModule {
27202
27509
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
27203
27510
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, declarations: [MetadataInfoComponent,
@@ -27219,6 +27526,7 @@ class UiElementsModule {
27219
27526
  PaginationButtonsComponent,
27220
27527
  MaxLinesComponent,
27221
27528
  RecordApiFormComponent,
27529
+ UserFeedbackItemComponent,
27222
27530
  ImageOverlayPreviewComponent], imports: [CommonModule,
27223
27531
  MatIconModule,
27224
27532
  MatTooltipModule,
@@ -27229,7 +27537,8 @@ class UiElementsModule {
27229
27537
  FormsModule,
27230
27538
  NgOptimizedImage,
27231
27539
  MarkdownParserComponent,
27232
- ThumbnailComponent], exports: [MetadataInfoComponent,
27540
+ ThumbnailComponent,
27541
+ TimeSincePipe], exports: [MetadataInfoComponent,
27233
27542
  ContentGhostComponent,
27234
27543
  DownloadItemComponent,
27235
27544
  DownloadsListComponent,
@@ -27249,6 +27558,7 @@ class UiElementsModule {
27249
27558
  MaxLinesComponent,
27250
27559
  RecordApiFormComponent,
27251
27560
  MarkdownParserComponent,
27561
+ UserFeedbackItemComponent,
27252
27562
  ImageOverlayPreviewComponent] }); }
27253
27563
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiElementsModule, imports: [CommonModule,
27254
27564
  MatIconModule,
@@ -27279,6 +27589,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27279
27589
  NgOptimizedImage,
27280
27590
  MarkdownParserComponent,
27281
27591
  ThumbnailComponent,
27592
+ TimeSincePipe,
27282
27593
  ],
27283
27594
  declarations: [
27284
27595
  MetadataInfoComponent,
@@ -27300,6 +27611,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27300
27611
  PaginationButtonsComponent,
27301
27612
  MaxLinesComponent,
27302
27613
  RecordApiFormComponent,
27614
+ UserFeedbackItemComponent,
27303
27615
  ImageOverlayPreviewComponent,
27304
27616
  ],
27305
27617
  exports: [
@@ -27323,6 +27635,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27323
27635
  MaxLinesComponent,
27324
27636
  RecordApiFormComponent,
27325
27637
  MarkdownParserComponent,
27638
+ UserFeedbackItemComponent,
27326
27639
  ImageOverlayPreviewComponent,
27327
27640
  ],
27328
27641
  }]
@@ -29652,7 +29965,7 @@ class AddLayerFromWmsComponent {
29652
29965
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
29653
29966
  }
29654
29967
  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" }] }); }
29968
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWmsComponent, selector: "gn-ui-add-layer-from-wms", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wmsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wms.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container\n *ngFor=\"let layer of layers\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: layer\n }\"\n ></ng-container>\n</div>\n\n<ng-template #layerTreeItem let-layer=\"layer\">\n <div class=\"flex items-center justify-between layer-tree-item my-2\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n <div *ngIf=\"layer.children?.length > 0\" class=\"ml-4\">\n <ng-container\n *ngFor=\"let child of layer.children\"\n [ngTemplateOutlet]=\"layerTreeItem\"\n [ngTemplateOutletContext]=\"{\n layer: child\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29656
29969
  }
29657
29970
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWmsComponent, decorators: [{
29658
29971
  type: Component,
@@ -29803,7 +30116,7 @@ class AddLayerFromWfsComponent {
29803
30116
  this.mapFacade.addLayer({ ...layerToAdd, title: layer.title });
29804
30117
  }
29805
30118
  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" }] }); }
30119
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AddLayerFromWfsComponent, selector: "gn-ui-add-layer-from-wfs", ngImport: i0, template: "<div class=\"flex items-center mb-5\">\n <gn-ui-text-input\n [(value)]=\"wfsUrl\"\n (valueChange)=\"urlChange.next($event)\"\n [hint]=\"'map.wfs.urlInput.hint' | translate\"\n class=\"w-96\"\n >\n </gn-ui-text-input>\n</div>\n\n<div *ngIf=\"errorMessage\" class=\"text-red-500 mt-2\">\n {{ errorMessage }}\n</div>\n\n<div *ngIf=\"loading\">\n <p class=\"loading-message\" translate>map.loading.service</p>\n</div>\n\n<div *ngIf=\"!loading && layers.length > 0\">\n <h2 class=\"font-bold\" translate>map.layers.available</h2>\n <ng-container *ngFor=\"let layer of layers\">\n <div class=\"flex items-center justify-between my-2 layer-item-tree\">\n <p class=\"max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap\">\n {{ layer.title }}\n </p>\n <gn-ui-button\n *ngIf=\"layer.name\"\n class=\"layer-add-btn\"\n type=\"primary\"\n (buttonClick)=\"addLayer(layer)\"\n extraClass=\"text-sm !px-2 !py-1\"\n translate\n ><span translate> map.layer.add </span></gn-ui-button\n >\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }] }); }
29807
30120
  }
29808
30121
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AddLayerFromWfsComponent, decorators: [{
29809
30122
  type: Component,
@@ -30198,31 +30511,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
30198
30511
  ], 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
30512
  }], ctorParameters: function () { return [{ type: NotificationsService }]; } });
30200
30513
 
30514
+ /*
30515
+ Metadata actions
30516
+ */
30201
30517
  const loadFullMetadata = createAction('[Metadata view] Load full metadata', props());
30202
30518
  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());
30519
+ const loadFullMetadataSuccess = createAction('[Metadata view] Load full metadata success', props());
30520
+ const loadFullMetadataFailure = createAction('[Metadata view] Load full metadata failure', props());
30521
+ const closeMetadata = createAction('[Metadata view] close');
30522
+ /*
30523
+ Related actions
30524
+ */
30205
30525
  const setRelated = createAction('[Metadata view] Set related records', props());
30526
+ /*
30527
+ ChartConfig actions
30528
+ */
30206
30529
  const setChartConfig = createAction('[Metadata view] Set chart config', props());
30207
- const close = createAction('[Metadata view] close');
30530
+ /*
30531
+ User Feedbacks actions
30532
+ */
30533
+ const addUserFeedback = createAction('[Metadata view] Add UserFeedback', props());
30534
+ const addUserFeedbackSuccess = createAction('[Metadata view] Add UserFeedback Success', props());
30535
+ const addUserFeedbackFailure = createAction('[Metadata view] Add UserFeedback Failure', props());
30536
+ const loadUserFeedbacks = createAction('[Metadata view] Load UserFeedbacks', props());
30537
+ const loadUserFeedbacksSuccess = createAction('[Metadata view] Load UserFeedbacks Success', props());
30538
+ const loadUserFeedbacksFailure = createAction('[Metadata view] Load UserFeedbacks Failure', props());
30208
30539
 
30209
30540
  var mdview_actions = /*#__PURE__*/Object.freeze({
30210
30541
  __proto__: null,
30211
- close: close,
30212
- loadFullFailure: loadFullFailure,
30542
+ addUserFeedback: addUserFeedback,
30543
+ addUserFeedbackFailure: addUserFeedbackFailure,
30544
+ addUserFeedbackSuccess: addUserFeedbackSuccess,
30545
+ closeMetadata: closeMetadata,
30213
30546
  loadFullMetadata: loadFullMetadata,
30214
- loadFullSuccess: loadFullSuccess,
30547
+ loadFullMetadataFailure: loadFullMetadataFailure,
30548
+ loadFullMetadataSuccess: loadFullMetadataSuccess,
30549
+ loadUserFeedbacks: loadUserFeedbacks,
30550
+ loadUserFeedbacksFailure: loadUserFeedbacksFailure,
30551
+ loadUserFeedbacksSuccess: loadUserFeedbacksSuccess,
30215
30552
  setChartConfig: setChartConfig,
30216
30553
  setIncompleteMetadata: setIncompleteMetadata,
30217
30554
  setRelated: setRelated
30218
30555
  });
30219
30556
 
30220
- const MD_VIEW_FEATURE_STATE_KEY = 'mdView';
30221
- const initialMdviewState = {
30557
+ const METADATA_VIEW_FEATURE_STATE_KEY = 'metadataView';
30558
+ const initialMetadataViewState = {
30222
30559
  error: null,
30223
30560
  loadingFull: false,
30561
+ allUserFeedbacksLoading: false,
30562
+ addUserFeedbackLoading: false,
30224
30563
  };
30225
- const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (state) => ({
30564
+ const metadataViewReducer = createReducer(initialMetadataViewState,
30565
+ /*
30566
+ Metadata reducers
30567
+ */
30568
+ on(loadFullMetadata, (state) => ({
30226
30569
  ...state,
30227
30570
  error: null,
30228
30571
  loadingFull: true,
@@ -30230,38 +30573,82 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
30230
30573
  ...state,
30231
30574
  error: null,
30232
30575
  metadata: incomplete,
30233
- })), on(loadFullSuccess, (state, { full }) => ({
30576
+ })), on(loadFullMetadataSuccess, (state, { full }) => ({
30234
30577
  ...state,
30235
30578
  error: null,
30236
30579
  metadata: full,
30237
30580
  loadingFull: false,
30238
- })), on(loadFullFailure, (state, { otherError, notFound }) => ({
30581
+ })), on(loadFullMetadataFailure, (state, { otherError, notFound }) => ({
30239
30582
  ...state,
30240
30583
  error: { otherError, notFound },
30241
30584
  loadingFull: false,
30242
- })), on(setRelated, (state, { related }) => ({
30585
+ })), on(closeMetadata, (state) => {
30586
+ const { metadata, related, userFeedbacks, ...stateWithoutMetadata } = state;
30587
+ return stateWithoutMetadata;
30588
+ }),
30589
+ /*
30590
+ Related reducers
30591
+ */
30592
+ on(setRelated, (state, { related }) => ({
30243
30593
  ...state,
30244
30594
  related,
30245
- })), on(setChartConfig, (state, { chartConfig }) => ({
30595
+ })),
30596
+ /*
30597
+ ChartConfig reducers
30598
+ */
30599
+ on(setChartConfig, (state, { chartConfig }) => ({
30246
30600
  ...state,
30247
30601
  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);
30602
+ })),
30603
+ /*
30604
+ UserFeedbacks reducers
30605
+ */
30606
+ on(loadUserFeedbacks, (state) => ({
30607
+ ...state,
30608
+ error: null,
30609
+ allUserFeedbacksLoading: true,
30610
+ })), on(addUserFeedback, (state) => ({
30611
+ ...state,
30612
+ addUserFeedbackLoading: true,
30613
+ })), on(loadUserFeedbacksSuccess, (state, { userFeedbacks }) => ({
30614
+ ...state,
30615
+ error: null,
30616
+ userFeedbacks: userFeedbacks,
30617
+ addUserFeedbackLoading: false,
30618
+ allUserFeedbacksLoading: false,
30619
+ })), on(loadUserFeedbacksFailure, (state, { otherError, notFound }) => ({
30620
+ ...state,
30621
+ error: { otherError, notFound },
30622
+ addUserFeedbackLoading: false,
30623
+ allUserFeedbacksLoading: false,
30624
+ })));
30625
+ function reducer$1(metadataViewState, action) {
30626
+ return metadataViewReducer(metadataViewState, action);
30255
30627
  }
30256
30628
 
30257
- const getMdViewState = createFeatureSelector(MD_VIEW_FEATURE_STATE_KEY);
30629
+ const getMdViewState = createFeatureSelector(METADATA_VIEW_FEATURE_STATE_KEY);
30630
+ /*
30631
+ Metadata selectors
30632
+ */
30258
30633
  const getMetadataUuid = createSelector(getMdViewState, (state) => state.metadata ? state.metadata.uniqueIdentifier : null);
30259
30634
  const getMetadata = createSelector(getMdViewState, (state) => state.metadata);
30260
30635
  const getMetadataIsIncomplete = createSelector(getMdViewState, (state) => (state.metadata ? state.loadingFull : null));
30261
30636
  const getMetadataIsLoading = createSelector(getMdViewState, (state) => state.loadingFull);
30262
30637
  const getMetadataError = createSelector(getMdViewState, (state) => state.error);
30638
+ /*
30639
+ Related selectors
30640
+ */
30263
30641
  const getRelated = createSelector(getMdViewState, (state) => state.related);
30642
+ /*
30643
+ Metadata selectors
30644
+ */
30264
30645
  const getChartConfig = createSelector(getMdViewState, (state) => state.chartConfig);
30646
+ /*
30647
+ UserFeedback selectors
30648
+ */
30649
+ const getUserFeedbacks = createSelector(getMdViewState, (state) => state.userFeedbacks);
30650
+ const getAllUserFeedbacksLoading = createSelector(getMdViewState, (state) => state.allUserFeedbacksLoading);
30651
+ const getAddUserFeedbacksLoading = createSelector(getMdViewState, (state) => state.addUserFeedbackLoading);
30265
30652
 
30266
30653
  /**
30267
30654
  * The Metadata View Facade is used to render complete metadata records.
@@ -30270,11 +30657,12 @@ const getChartConfig = createSelector(getMdViewState, (state) => state.chartConf
30270
30657
  * To clear the current record use the `close()` method.
30271
30658
  */
30272
30659
  class MdViewFacade {
30273
- constructor(store, linkClassifier) {
30660
+ constructor(store, linkClassifier, avatarService) {
30274
30661
  this.store = store;
30275
30662
  this.linkClassifier = linkClassifier;
30663
+ this.avatarService = avatarService;
30276
30664
  this.isPresent$ = this.store.pipe(select(getMetadataUuid), map$1((uuid) => !!uuid));
30277
- this.isLoading$ = this.store.pipe(select(getMetadataIsLoading));
30665
+ this.isMetadataLoading$ = this.store.pipe(select(getMetadataIsLoading));
30278
30666
  this.metadata$ = this.store.pipe(select(getMetadata), filter((md) => !!md));
30279
30667
  this.isIncomplete$ = this.store.pipe(select(getMetadataIsIncomplete), filter((incomplete) => incomplete !== null));
30280
30668
  this.error$ = this.store.pipe(select(getMetadataError));
@@ -30288,6 +30676,9 @@ class MdViewFacade {
30288
30676
  this.geoDataLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.GEODATA))));
30289
30677
  this.landingPageLinks$ = this.metadata$.pipe(map$1((record) => ('landingPage' in record ? [record.landingPage] : [])));
30290
30678
  this.otherLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.UNKNOWN))));
30679
+ this.userFeedbacks$ = this.store.pipe(select(getUserFeedbacks));
30680
+ this.isAllUserFeedbackLoading$ = this.store.pipe(select(getAllUserFeedbacksLoading));
30681
+ this.isAddUserFeedbackLoading$ = this.store.pipe(select(getAddUserFeedbacksLoading));
30291
30682
  }
30292
30683
  /**
30293
30684
  * This will show an incomplete record (e.g. from a search result) as a preview
@@ -30302,39 +30693,73 @@ class MdViewFacade {
30302
30693
  loadFull(uuid) {
30303
30694
  this.store.dispatch(loadFullMetadata({ uuid }));
30304
30695
  }
30305
- close() {
30306
- this.store.dispatch(close());
30696
+ closeMetadata() {
30697
+ this.store.dispatch(closeMetadata());
30307
30698
  }
30308
30699
  setChartConfig(chartConfig) {
30309
30700
  this.store.dispatch(setChartConfig({ chartConfig }));
30310
30701
  }
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 }); }
30702
+ /**
30703
+ * UserFeedbacks
30704
+ */
30705
+ addUserFeedback(userFeedback) {
30706
+ this.store.dispatch(addUserFeedback({ userFeedback }));
30707
+ }
30708
+ loadUserFeedbacks(datasetUuid) {
30709
+ this.store.dispatch(loadUserFeedbacks({ datasetUuid }));
30710
+ }
30711
+ 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
30712
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade }); }
30313
30713
  }
30314
30714
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewFacade, decorators: [{
30315
30715
  type: Injectable
30316
- }], ctorParameters: function () { return [{ type: i1$2.Store }, { type: LinkClassifierService }]; } });
30716
+ }], ctorParameters: function () { return [{ type: i1$2.Store }, { type: LinkClassifierService }, { type: AvatarServiceInterface }]; } });
30317
30717
 
30318
30718
  class MdViewEffects {
30319
- constructor(actions$, recordsRepository) {
30719
+ constructor(actions$, recordsRepository, platformServiceInterface) {
30320
30720
  this.actions$ = actions$;
30321
30721
  this.recordsRepository = recordsRepository;
30322
- this.loadFull$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getByUniqueIdentifier(uuid)), map$1((record) => {
30722
+ this.platformServiceInterface = platformServiceInterface;
30723
+ /*
30724
+ Metadata effects
30725
+ */
30726
+ this.loadFullMetadata$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadata), switchMap$1(({ uuid }) => this.recordsRepository.getByUniqueIdentifier(uuid)), map$1((record) => {
30323
30727
  if (record === null) {
30324
- return loadFullFailure({ notFound: true });
30728
+ return loadFullMetadataFailure({ notFound: true });
30325
30729
  }
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) => {
30730
+ return loadFullMetadataSuccess({ full: record });
30731
+ }), catchError((error) => of(loadFullMetadataFailure({ otherError: error.message })))));
30732
+ /*
30733
+ Related effects
30734
+ */
30735
+ this.loadRelatedRecords$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSimilarRecords(full)), map$1((related) => {
30329
30736
  return setRelated({ related });
30330
30737
  }), catchError((error) => of(setRelated({ related: null })))));
30738
+ /*
30739
+ UserFeedback effects
30740
+ */
30741
+ this.loadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(loadUserFeedbacks), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
30742
+ otherError: error.message,
30743
+ })))))));
30744
+ this.reloadUserFeedbacks$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedbackSuccess), exhaustMap(({ datasetUuid }) => this.platformServiceInterface.getUserFeedbacks(datasetUuid).pipe(map$1((userFeedbacks) => loadUserFeedbacksSuccess({ userFeedbacks })), catchError((error) => of(loadUserFeedbacksFailure({
30745
+ otherError: error.message,
30746
+ })))))));
30747
+ this.addUserFeedback$ = createEffect(() => this.actions$.pipe(ofType(addUserFeedback), mergeMap$1((action) => this.platformServiceInterface
30748
+ .postUserFeedbacks(action.userFeedback)
30749
+ .pipe(map$1(() => addUserFeedbackSuccess({
30750
+ datasetUuid: action.userFeedback.metadataUUID,
30751
+ })), catchError((error) => {
30752
+ return of(addUserFeedbackFailure({
30753
+ otherError: error.message,
30754
+ }));
30755
+ })))));
30331
30756
  }
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 }); }
30757
+ 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
30758
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects }); }
30334
30759
  }
30335
30760
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MdViewEffects, decorators: [{
30336
30761
  type: Injectable
30337
- }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }]; } });
30762
+ }], ctorParameters: function () { return [{ type: i1$8.Actions }, { type: RecordsRepositoryInterface }, { type: PlatformServiceInterface }]; } });
30338
30763
 
30339
30764
  class FigureComponent {
30340
30765
  constructor() {
@@ -32653,7 +33078,7 @@ class FeatureRecordModule {
32653
33078
  DataViewWebComponentComponent,
32654
33079
  DataViewShareComponent] }); }
32655
33080
  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),
33081
+ StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer$1),
32657
33082
  EffectsModule.forFeature([MdViewEffects]),
32658
33083
  UiLayoutModule,
32659
33084
  FeatureMapModule,
@@ -32681,7 +33106,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32681
33106
  ],
32682
33107
  imports: [
32683
33108
  CommonModule,
32684
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
33109
+ StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer$1),
32685
33110
  EffectsModule.forFeature([MdViewEffects]),
32686
33111
  UiLayoutModule,
32687
33112
  FeatureMapModule,
@@ -33130,7 +33555,7 @@ class WizardFieldComponent {
33130
33555
  deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
33131
33556
  },
33132
33557
  { 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 }); }
33558
+ ], viewQueries: [{ propertyName: "searchText", first: true, predicate: ["searchText"], descendants: true }, { propertyName: "chips", first: true, predicate: ["chips"], descendants: true }, { propertyName: "textArea", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-1\">\n <span [class]=\"wizardFieldConfig.icon + ' pr-10'\"></span>\n <div class=\"flex flex-col flex-1\">\n <div translate class=\"text-xl font-bold pb-1\">\n {{ wizardFieldConfig.label }}\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.TEXT === wizardFieldConfig.type\"\n >\n <gn-ui-text-input\n #searchText\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n hint=\"\"\n ></gn-ui-text-input>\n </div>\n <div\n class=\"flex-1 w-11/12\"\n *ngIf=\"wizardFieldType.CHIPS === wizardFieldConfig.type\"\n >\n <gn-ui-chips-input\n #chips\n [selectedItems]=\"wizardFieldData\"\n placeholder=\"\"\n [id]=\"wizardFieldConfig.id\"\n [url]=\"wizardFieldConfig.options.url\"\n [loadOnce]=\"wizardFieldConfig.options.loadOnce\"\n ></gn-ui-chips-input>\n </div>\n <div\n class=\"h-32 w-11/12\"\n *ngIf=\"wizardFieldType.TEXT_AREA === wizardFieldConfig.type\"\n >\n <gn-ui-text-area\n #textArea\n [id]=\"wizardFieldConfig.id\"\n [value]=\"wizardFieldData\"\n [required]=\"wizardFieldConfig.required || false\"\n placeholder=\"\"\n ></gn-ui-text-area>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DATA_PICKER === wizardFieldConfig.type\"\n >\n <input\n [id]=\"wizardFieldConfig.id\"\n type=\"text\"\n (click)=\"datepicker.open()\"\n class=\"rounded p-2 text-gray-700 w-full leading-tight focus:outline-none focus:border-primary\"\n [value]=\"wizardFieldData\"\n [matDatepicker]=\"datepicker\"\n (dateChange)=\"onDateChange($event)\"\n />\n <mat-datepicker #datepicker></mat-datepicker>\n </div>\n <div\n class=\"w-1/2 h-12\"\n *ngIf=\"wizardFieldType.DROPDOWN === wizardFieldConfig.type\"\n >\n <gn-ui-dropdown-selector\n #dropdown\n [id]=\"wizardFieldConfig.id\"\n [title]=\"''\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n [showTitle]=\"false\"\n [choices]=\"dropdownChoices\"\n [selected]=\"wizardFieldData\"\n ariaName=\"search-sort-by\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex:1}gn-ui-text-input::ng-deep input,input[type=text]{height:100%;background:white;color:#000;font-style:italic;border-width:2px;border-color:var(--color-primary)}gn-ui-text-area::ng-deep textarea{border-width:2px;border-color:var(--color-primary)}gn-ui-dropdown-selector::ng-deep div{height:100%}gn-ui-dropdown-selector::ng-deep select{height:100%;border-width:2px;border-color:var(--color-primary);background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: ["value", "disabled", "extraClass", "placeholder", "required"], outputs: ["valueChange"] }, { kind: "component", type: ChipsInputComponent, selector: "gn-ui-chips-input", inputs: ["url", "placeholder", "selectedItems", "required", "loadOnce", "autocompleteItems"], outputs: ["itemsChange"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i3$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33134
33559
  }
33135
33560
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: WizardFieldComponent, decorators: [{
33136
33561
  type: Component,
@@ -33400,7 +33825,7 @@ class FormFieldRichComponent {
33400
33825
  this.control.setValue(textContent);
33401
33826
  }
33402
33827
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldRichComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33403
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldRichComponent, isStandalone: true, selector: "gn-ui-form-field-rich", inputs: { control: "control", label: "label", hint: "hint", helperText: "helperText", placeholder: "placeholder" }, ngImport: i0, template: "<gn-ui-form-field-wrapper [label]=\"label\" [hint]=\"hint\">\n <gn-ui-button\n form-field-interaction\n [extraClass]=\"getButtonExtraClass()\"\n (buttonClick)=\"togglePreview()\"\n >\n <span class=\"material-symbols-outlined mr-1 icon-small\">{{\n preview ? 'visibility' : 'visibility_off'\n }}</span>\n {{ preview ? 'WYSIWYG' : 'Markdown' }}\n </gn-ui-button>\n <gn-ui-markdown-editor\n class=\"h-full\"\n [preview]=\"preview\"\n [helperText]=\"helperText\"\n [placeholder]=\"placeholder\"\n [textContent]=\"control.value\"\n (textContentChanged)=\"handleTextContentChanged($event)\"\n ></gn-ui-markdown-editor>\n</gn-ui-form-field-wrapper>\n", styles: [".icon-small{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: MarkdownEditorComponent, selector: "gn-ui-markdown-editor", inputs: ["preview", "helperText", "placeholder", "textContent"], outputs: ["textContentChanged"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33828
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldRichComponent, isStandalone: true, selector: "gn-ui-form-field-rich", inputs: { control: "control", label: "label", hint: "hint", helperText: "helperText", placeholder: "placeholder" }, ngImport: i0, template: "<gn-ui-form-field-wrapper [label]=\"label\" [hint]=\"hint\">\n <gn-ui-button\n form-field-interaction\n [extraClass]=\"getButtonExtraClass()\"\n (buttonClick)=\"togglePreview()\"\n >\n <span class=\"material-symbols-outlined mr-1 gn-ui-icon-small\">{{\n preview ? 'visibility' : 'visibility_off'\n }}</span>\n {{ preview ? 'WYSIWYG' : 'Markdown' }}\n </gn-ui-button>\n <gn-ui-markdown-editor\n class=\"h-full\"\n [preview]=\"preview\"\n [helperText]=\"helperText\"\n [placeholder]=\"placeholder\"\n [textContent]=\"control.value\"\n (textContentChanged)=\"handleTextContentChanged($event)\"\n ></gn-ui-markdown-editor>\n</gn-ui-form-field-wrapper>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: MarkdownEditorComponent, selector: "gn-ui-markdown-editor", inputs: ["preview", "helperText", "placeholder", "textContent"], outputs: ["textContentChanged"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33404
33829
  }
33405
33830
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldRichComponent, decorators: [{
33406
33831
  type: Component,
@@ -33410,7 +33835,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33410
33835
  MarkdownEditorComponent,
33411
33836
  FormFieldWrapperComponent,
33412
33837
  ButtonComponent,
33413
- ], template: "<gn-ui-form-field-wrapper [label]=\"label\" [hint]=\"hint\">\n <gn-ui-button\n form-field-interaction\n [extraClass]=\"getButtonExtraClass()\"\n (buttonClick)=\"togglePreview()\"\n >\n <span class=\"material-symbols-outlined mr-1 icon-small\">{{\n preview ? 'visibility' : 'visibility_off'\n }}</span>\n {{ preview ? 'WYSIWYG' : 'Markdown' }}\n </gn-ui-button>\n <gn-ui-markdown-editor\n class=\"h-full\"\n [preview]=\"preview\"\n [helperText]=\"helperText\"\n [placeholder]=\"placeholder\"\n [textContent]=\"control.value\"\n (textContentChanged)=\"handleTextContentChanged($event)\"\n ></gn-ui-markdown-editor>\n</gn-ui-form-field-wrapper>\n", styles: [".icon-small{font-size:16px;height:16px;width:16px}\n"] }]
33838
+ ], template: "<gn-ui-form-field-wrapper [label]=\"label\" [hint]=\"hint\">\n <gn-ui-button\n form-field-interaction\n [extraClass]=\"getButtonExtraClass()\"\n (buttonClick)=\"togglePreview()\"\n >\n <span class=\"material-symbols-outlined mr-1 gn-ui-icon-small\">{{\n preview ? 'visibility' : 'visibility_off'\n }}</span>\n {{ preview ? 'WYSIWYG' : 'Markdown' }}\n </gn-ui-button>\n <gn-ui-markdown-editor\n class=\"h-full\"\n [preview]=\"preview\"\n [helperText]=\"helperText\"\n [placeholder]=\"placeholder\"\n [textContent]=\"control.value\"\n (textContentChanged)=\"handleTextContentChanged($event)\"\n ></gn-ui-markdown-editor>\n</gn-ui-form-field-wrapper>\n" }]
33414
33839
  }], propDecorators: { control: [{
33415
33840
  type: Input
33416
33841
  }], label: [{
@@ -33469,6 +33894,9 @@ class FormFieldComponent {
33469
33894
  this.formControl = new FormControl();
33470
33895
  this.valueChange = this.formControl.valueChanges;
33471
33896
  }
33897
+ focusTitleInput() {
33898
+ this.titleInput.nativeElement.children[0].focus();
33899
+ }
33472
33900
  get simpleType() {
33473
33901
  return this.config.type;
33474
33902
  }
@@ -33504,15 +33932,23 @@ class FormFieldComponent {
33504
33932
  get isFieldInvalid() {
33505
33933
  return !this.config.locked && this.config.invalid;
33506
33934
  }
33935
+ get isTitle() {
33936
+ return this.model === 'title';
33937
+ }
33507
33938
  get isAbstract() {
33508
33939
  return this.model === 'abstract';
33509
33940
  }
33510
33941
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33511
- 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" }, 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=\"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: "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: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33942
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { model: "model", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full\">\n <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: ["gnUiEditableLabel"], outputs: ["editableLabelChanged"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "control", "readonly", "invalid", "placeholder", "options"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["control", "label", "hint", "helperText", "placeholder"] }, { kind: "component", type: FormFieldObjectComponent, selector: "gn-ui-form-field-object" }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldTemporalExtentComponent, selector: "gn-ui-form-field-temporal-extent" }, { kind: "component", type: FormFieldFileComponent, selector: "gn-ui-form-field-file", inputs: ["control", "readonly", "invalid", "placeholder"] }, { kind: "component", type: FormFieldArrayComponent, selector: "gn-ui-form-field-array" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33512
33943
  }
33513
33944
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FormFieldComponent, decorators: [{
33514
33945
  type: Component,
33515
33946
  args: [{ selector: 'gn-ui-form-field', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
33947
+ CommonModule,
33948
+ ReactiveFormsModule,
33949
+ EditableLabelDirective,
33950
+ MatIconModule,
33951
+ MatTooltipModule,
33516
33952
  FormFieldSimpleComponent,
33517
33953
  FormFieldRichComponent,
33518
33954
  FormFieldObjectComponent,
@@ -33520,11 +33956,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33520
33956
  FormFieldTemporalExtentComponent,
33521
33957
  FormFieldFileComponent,
33522
33958
  FormFieldArrayComponent,
33523
- CommonModule,
33524
- ReactiveFormsModule,
33525
33959
  TranslateModule,
33526
- MatIconModule,
33527
- ], 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=\"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" }]
33960
+ ], template: "<div class=\"flex flex-col h-full\">\n <div class=\"mb-2 flex flex-row\">\n <label class=\"grow\">\n <span class=\"font-medium field-label\">{{\n config.labelKey | translate\n }}</span>\n <span *ngIf=\"config.hintKey\" class=\"text-gray-900 text-sm\">\n - {{ config.hintKey | translate }}\n </span>\n </label>\n <mat-icon\n *ngIf=\"isFieldOk\"\n class=\"material-symbols-outlined text-[#c6d950] icon-ok\"\n >check_circle</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldLocked\"\n class=\"material-symbols-outlined text-blue-400 icon-locked\"\n >lock</mat-icon\n >\n <mat-icon\n *ngIf=\"isFieldInvalid\"\n class=\"material-symbols-outlined text-pink-500 icon-invalid\"\n >cancel</mat-icon\n >\n </div>\n <ng-container *ngIf=\"isTitle\">\n <div class=\"flex justify-between items-center gap-3\">\n <h2\n #titleInput\n class=\"grow text-3xl font-normal\"\n [gnUiEditableLabel]=\"true\"\n (editableLabelChanged)=\"formControl.setValue($event)\"\n >\n {{ formControl.value }}\n </h2>\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isSimpleField\">\n <gn-ui-form-field-simple\n [type]=\"simpleType\"\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngIf=\"isFileField\">\n <gn-ui-form-field-file\n [control]=\"formControl\"\n [readonly]=\"isFieldLocked\"\n [invalid]=\"isFieldInvalid\"\n ></gn-ui-form-field-file>\n </ng-container>\n <ng-container *ngIf=\"isAbstract\">\n <gn-ui-form-field-rich\n class=\"h-[8rem]\"\n [control]=\"formControl\"\n [label]=\"config.labelKey | translate\"\n [hint]=\"config.hintKey | translate\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngIf=\"isArrayField\">\n <gn-ui-form-field-array></gn-ui-form-field-array>\n </ng-container>\n <ng-container *ngIf=\"isObjectField\">\n <gn-ui-form-field-object></gn-ui-form-field-object>\n </ng-container>\n <ng-container *ngIf=\"isSpatialExtentField\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngIf=\"isTemporalExtentField\">\n <gn-ui-form-field-temporal-extent></gn-ui-form-field-temporal-extent>\n </ng-container>\n <div\n *ngIf=\"isFieldInvalid && config.invalidHintKey\"\n class=\"mt-2 text-pink-500 text-sm field-invalid-hint\"\n >\n {{ config.invalidHintKey | translate }}\n </div>\n</div>\n" }]
33528
33961
  }], ctorParameters: function () { return []; }, propDecorators: { model: [{
33529
33962
  type: Input
33530
33963
  }], config: [{
@@ -33533,6 +33966,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
33533
33966
  type: Input
33534
33967
  }], valueChange: [{
33535
33968
  type: Output
33969
+ }], titleInput: [{
33970
+ type: ViewChild,
33971
+ args: ['titleInput']
33536
33972
  }] } });
33537
33973
 
33538
33974
  class RecordFormComponent {
@@ -33554,17 +33990,7 @@ class RecordFormComponent {
33554
33990
  }
33555
33991
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
33556
33992
  type: Component,
33557
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
33558
- CommonModule,
33559
- FormFieldComponent,
33560
- FormFieldArrayComponent,
33561
- FormFieldFileComponent,
33562
- FormFieldObjectComponent,
33563
- FormFieldRichComponent,
33564
- FormFieldSimpleComponent,
33565
- FormFieldSpatialExtentComponent,
33566
- FormFieldTemporalExtentComponent,
33567
- ], template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [model]=\"field.config.model\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n" }]
33993
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent], template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [model]=\"field.config.model\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n" }]
33568
33994
  }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
33569
33995
 
33570
33996
  const ROUTER_STATE_KEY = 'router';
@@ -33862,7 +34288,7 @@ class RouterEffects {
33862
34288
  * the search results happens
33863
34289
  */
33864
34290
  this.navigateToSearch$ = createEffect(() => this._actions$.pipe(navigation(this.routerConfig.searchRouteComponent, {
33865
- run: () => close(),
34291
+ run: () => closeMetadata(),
33866
34292
  })));
33867
34293
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
33868
34294
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });