geonetwork-ui 2.2.0-dev.6695ae4d → 2.2.0-dev.70a9dc16

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 (218) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +27 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +23 -11
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +4 -2
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +12 -9
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +33 -8
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +31 -14
  9. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -2
  10. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  12. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  13. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  16. package/esm2022/libs/feature/editor/src/index.mjs +6 -1
  17. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +8 -0
  18. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +26 -0
  19. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +30 -0
  20. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +2 -0
  21. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +42 -0
  22. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +13 -0
  23. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +13 -0
  24. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +16 -4
  25. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +34 -0
  26. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +2 -0
  27. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +15 -11
  28. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +22 -44
  29. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  30. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +13 -13
  31. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +3 -3
  32. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  33. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  34. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  35. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -3
  36. package/esm2022/libs/ui/elements/src/lib/max-lines/max-lines.component.mjs +5 -3
  37. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  38. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +19 -7
  39. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -4
  40. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +3 -3
  41. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +4 -4
  42. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +9 -9
  43. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  44. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +3 -3
  45. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.component.mjs +4 -2
  46. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.model.mjs +1 -1
  47. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  48. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  49. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +6 -6
  50. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  51. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +18 -1
  52. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  53. package/esm2022/libs/util/shared/src/lib/utils/temporal-extent-union.mjs +32 -0
  54. package/esm2022/translations/de.json +37 -27
  55. package/esm2022/translations/en.json +29 -19
  56. package/esm2022/translations/es.json +26 -16
  57. package/esm2022/translations/fr.json +47 -37
  58. package/esm2022/translations/it.json +41 -31
  59. package/esm2022/translations/nl.json +27 -17
  60. package/esm2022/translations/pt.json +26 -16
  61. package/fesm2022/geonetwork-ui.mjs +835 -409
  62. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  63. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +2 -0
  64. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  67. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +4 -5
  68. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  69. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  70. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  71. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  72. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +3 -3
  73. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  74. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +1 -1
  75. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  76. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  77. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  78. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  79. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  80. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  81. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  82. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +16 -2
  83. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  84. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  85. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  86. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  87. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  88. package/libs/feature/editor/src/index.d.ts +5 -0
  89. package/libs/feature/editor/src/index.d.ts.map +1 -1
  90. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +23 -0
  91. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -0
  92. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +15 -0
  93. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -0
  94. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +19 -0
  95. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -0
  96. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +2 -0
  97. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -0
  98. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +18 -0
  99. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -0
  100. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +15 -0
  101. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -0
  102. package/libs/feature/editor/src/lib/expressions.d.ts +4 -0
  103. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -0
  104. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +3 -1
  105. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  106. package/libs/feature/editor/src/lib/fields.config.d.ts +3 -0
  107. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -0
  108. package/libs/feature/editor/src/lib/models/fields.model.d.ts +15 -0
  109. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +1 -0
  110. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts +10 -5
  111. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  112. package/libs/feature/editor/src/lib/services/editor.service.d.ts +3 -13
  113. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  114. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  115. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  116. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  117. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  118. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  119. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  120. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  121. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +1 -1
  122. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +9 -3
  123. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  124. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  125. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  126. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  127. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  128. package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +1 -1
  129. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts +0 -1
  130. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +1 -1
  131. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  132. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  133. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -40
  134. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +1 -1
  135. package/libs/util/i18n/src/lib/i18n.constants.d.ts +17 -0
  136. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  137. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  138. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  139. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +5 -0
  140. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -0
  141. package/package.json +1 -1
  142. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +57 -2
  143. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +52 -6
  144. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +207 -20
  145. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +29 -0
  146. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +30 -11
  147. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +3 -1
  148. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +4 -5
  149. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  150. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +11 -9
  151. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +58 -20
  152. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +86 -38
  153. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -1
  154. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  155. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  156. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  157. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +20 -3
  158. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  159. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  160. package/src/libs/common/fixtures/src/lib/elasticsearch/full-response.ts +1 -1
  161. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  162. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +52 -10
  163. package/src/libs/feature/editor/src/index.ts +5 -0
  164. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +24 -0
  165. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +49 -0
  166. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +30 -0
  167. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +1 -0
  168. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +68 -0
  169. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +39 -0
  170. package/src/libs/feature/editor/src/lib/expressions.ts +16 -0
  171. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +11 -0
  172. package/src/libs/feature/editor/src/lib/fields.config.ts +35 -0
  173. package/src/libs/feature/editor/src/lib/models/fields.model.ts +29 -0
  174. package/src/libs/feature/editor/src/lib/record-form/record-form.component.html +9 -7
  175. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +11 -5
  176. package/src/libs/feature/editor/src/lib/services/editor.service.ts +34 -73
  177. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  178. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +12 -12
  179. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  180. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  181. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  182. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  183. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  184. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  185. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  186. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  187. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.html +5 -1
  188. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.ts +1 -0
  189. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  190. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +113 -25
  191. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +20 -3
  192. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  193. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  194. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  195. package/src/libs/ui/inputs/src/lib/button/button.component.css +0 -5
  196. package/src/libs/ui/inputs/src/lib/button/button.component.html +0 -1
  197. package/src/libs/ui/inputs/src/lib/button/button.component.ts +7 -6
  198. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  199. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +3 -1
  200. package/src/libs/ui/inputs/src/lib/form-field/form-field.component.ts +3 -1
  201. package/src/libs/ui/inputs/src/lib/form-field/form-field.model.ts +0 -1
  202. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  203. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  204. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  205. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  206. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -0
  207. package/src/libs/util/i18n/src/lib/i18n.constants.ts +18 -0
  208. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  209. package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +32 -0
  210. package/tailwind.base.css +44 -15
  211. package/translations/de.json +37 -27
  212. package/translations/en.json +29 -19
  213. package/translations/es.json +26 -16
  214. package/translations/fr.json +47 -37
  215. package/translations/it.json +41 -31
  216. package/translations/nl.json +27 -17
  217. package/translations/pt.json +26 -16
  218. package/translations/sk.json +118 -108
@@ -1,21 +1,21 @@
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, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, ElementRef, ViewChildren } from '@angular/core';
4
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, ElementRef, ViewChildren, 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';
8
8
  import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
10
10
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
11
- import { map as map$1, shareReplay, filter, tap as tap$1, startWith, switchMap as switchMap$1, catchError, take, withLatestFrom, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
11
+ import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestFrom, switchMap as switchMap$1, catchError, take, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
15
15
  import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, from, Subscription, animationFrameScheduler, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
- import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
18
+ import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule, Store } from '@ngrx/store';
19
19
  import Map$1 from 'ol/Map';
20
20
  import * as i2 from '@angular/material/icon';
21
21
  import { MatIconModule } from '@angular/material/icon';
@@ -75,7 +75,7 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
75
75
  import { MatInputModule } from '@angular/material/input';
76
76
  import * as basicLightbox from 'basiclightbox';
77
77
  import * as i1$8 from '@ngrx/effects';
78
- import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
78
+ import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
79
79
  import tippy from 'tippy.js';
80
80
  import { valid as valid$1 } from 'geojson-validation';
81
81
  import { Polygon } from 'ol/geom';
@@ -587,6 +587,20 @@ function matchMimeType(format) {
587
587
  return format || null;
588
588
  }
589
589
 
590
+ function getKeywordTypeFromKeywordTypeCode(typeCode) {
591
+ if (!typeCode)
592
+ return 'other';
593
+ switch (typeCode) {
594
+ case 'theme':
595
+ case 'place':
596
+ case 'temporal':
597
+ case 'other':
598
+ return typeCode;
599
+ default:
600
+ return 'other';
601
+ }
602
+ }
603
+
590
604
  function extractCharacterString() {
591
605
  return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
592
606
  }
@@ -818,6 +832,9 @@ function readOwnerOrganization(rootEl) {
818
832
  function readRecordUpdated(rootEl) {
819
833
  return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
820
834
  }
835
+ function readRecordPublished(rootEl) {
836
+ return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
837
+ }
821
838
  function readTitle(rootEl) {
822
839
  return pipe(findIdentification(), findNestedElement('gmd:citation', 'gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
823
840
  }
@@ -833,14 +850,35 @@ function readDatasetUpdated(rootEl) {
833
850
  function readContacts(rootEl) {
834
851
  return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
835
852
  }
836
- function readKeywordsOfType(isTheme) {
837
- return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), filterArray(pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => isTheme === values.indexOf('theme') > -1))), mapArray(findChildrenElement('gmd:keyword')), flattenArray(), mapArray(extractCharacterString()));
853
+ // from gmd:thesaurusName
854
+ function readThesaurus(rootEl) {
855
+ if (!rootEl)
856
+ return null;
857
+ const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
858
+ const id = pipe(findIdentifier, extractCharacterString())(rootEl);
859
+ const url = pipe(findIdentifier, extractUrl())(rootEl);
860
+ const name = pipe(findNestedElement('gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
861
+ return {
862
+ id,
863
+ ...(name && { name }),
864
+ ...(url && { url }),
865
+ };
838
866
  }
839
- function readKeywords(rootEl) {
840
- return readKeywordsOfType(false)(rootEl);
867
+ // from gmd:MD_Keywords
868
+ function readKeywordGroup(rootEl) {
869
+ const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
870
+ const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
871
+ return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
872
+ const label = extractCharacterString()(el);
873
+ return {
874
+ ...(thesaurus ? { thesaurus } : {}),
875
+ label,
876
+ type,
877
+ };
878
+ }))(rootEl);
841
879
  }
842
- function readThemes(rootEl) {
843
- return readKeywordsOfType(true)(rootEl);
880
+ function readKeywords(rootEl) {
881
+ return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), mapArray(readKeywordGroup), flattenArray())(rootEl);
844
882
  }
845
883
  function readStatus(rootEl) {
846
884
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
@@ -860,7 +898,7 @@ function readLicenses(rootEl) {
860
898
  }
861
899
  // not used yet
862
900
  function readIsoTopics(rootEl) {
863
- return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', false), mapArray(readText()))(rootEl);
901
+ return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', true), mapArray(readText()))(rootEl);
864
902
  }
865
903
  function readSpatialRepresentation(rootEl) {
866
904
  return pipe(findIdentification(), findNestedElement('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), readAttribute('codeListValue'), map(getSpatialRepresentationFromCode))(rootEl);
@@ -1076,15 +1114,32 @@ function updateCitationDate(date, type) {
1076
1114
  function appendCitationDate(date, type) {
1077
1115
  return appendChildren(pipe(createElement('gmd:date'), createChild('gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createElement('gmd:dateType'), createChild('gmd:CI_DateTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), addAttribute('codeListValue', type)))));
1078
1116
  }
1079
- function removeKeywords(type) {
1080
- return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords'), filterArray(pipe(findNestedElement('gmd:MD_Keywords', 'gmd:type', 'gmd:MD_KeywordTypeCode'), readAttribute('codeListValue'),
1081
- // if a specific type is targeted, compare with it; otherwise remove keywords if they have no type defined
1082
- map((typeValue) => (type !== null ? type === typeValue : true))))));
1083
- }
1084
- function appendKeywords(keywords, type) {
1085
- return appendChildren(pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), type !== null
1086
- ? appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', type)))
1087
- : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1117
+ function removeKeywords() {
1118
+ return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords')));
1119
+ }
1120
+ // returns a <gmd:thesaurusName> element
1121
+ function createThesaurus(thesaurus) {
1122
+ return pipe(createElement('gmd:thesaurusName'), createChild('gmd:CI_Citation'), appendChildren(pipe(createElement('gmd:title'), writeCharacterString(thesaurus.name || thesaurus.id)), pipe(createElement('gmd:identifier'), createChild('gmd:MD_Identifier'), appendChildren(pipe(createElement('gmd:code'), thesaurus.url
1123
+ ? writeAnchor(thesaurus.url, thesaurus.id)
1124
+ : writeCharacterString(thesaurus.id))))));
1125
+ }
1126
+ function appendKeywords(keywords) {
1127
+ const keywordsByThesaurus = keywords.reduce((acc, keyword) => {
1128
+ const thesaurusId = keyword.thesaurus?.id;
1129
+ const type = keyword.type;
1130
+ let existingGroup = acc.find((group) => group[0].thesaurus
1131
+ ? group[0].thesaurus.id === thesaurusId
1132
+ : group[0].type === type);
1133
+ if (!existingGroup) {
1134
+ existingGroup = [];
1135
+ acc.push(existingGroup);
1136
+ }
1137
+ existingGroup.push(keyword);
1138
+ return acc;
1139
+ }, []);
1140
+ return appendChildren(...keywordsByThesaurus.map((keywords) => pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', keywords[0].type))), keywords[0].thesaurus
1141
+ ? appendChildren(createThesaurus(keywords[0].thesaurus))
1142
+ : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword.label)))))));
1088
1143
  }
1089
1144
  function createConstraint(constraint, type) {
1090
1145
  if (type === 'security') {
@@ -1201,10 +1256,10 @@ function writeContacts(record, rootEl) {
1201
1256
  pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact)))))(rootEl);
1202
1257
  }
1203
1258
  function writeKeywords(record, rootEl) {
1204
- pipe(findOrCreateIdentification(), removeKeywords(null), appendKeywords(record.keywords, null))(rootEl);
1259
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1205
1260
  }
1206
- function writeThemes(record, rootEl) {
1207
- pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1261
+ function writeTopics(record, rootEl) {
1262
+ pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(createElement('gmd:topicCategory'), createChild('gmd:MD_TopicCategoryCode'), setTextContent(topic)))))(rootEl);
1208
1263
  }
1209
1264
  function writeLicenses(record, rootEl) {
1210
1265
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
@@ -1312,15 +1367,14 @@ function toModel(xml) {
1312
1367
  const contacts = readContacts(rootEl);
1313
1368
  const recordUpdated = readRecordUpdated(rootEl);
1314
1369
  const recordCreated = recordUpdated;
1370
+ const recordPublished = readRecordPublished(rootEl);
1315
1371
  const keywords = readKeywords(rootEl);
1316
- const themes = readThemes(rootEl);
1372
+ const topics = readIsoTopics(rootEl);
1317
1373
  const legalConstraints = readLegalConstraints(rootEl);
1318
1374
  const otherConstraints = readOtherConstraints(rootEl);
1319
1375
  const securityConstraints = readSecurityConstraints(rootEl);
1320
1376
  const licenses = readLicenses(rootEl);
1321
1377
  const overviews = readOverviews(rootEl);
1322
- // not used yet
1323
- const isoTopics = readIsoTopics(rootEl);
1324
1378
  if (kind === 'dataset') {
1325
1379
  const status = readStatus(rootEl);
1326
1380
  const datasetCreated = readDatasetCreated(rootEl);
@@ -1334,8 +1388,10 @@ function toModel(xml) {
1334
1388
  return {
1335
1389
  uniqueIdentifier,
1336
1390
  kind,
1391
+ languages: [],
1337
1392
  recordCreated,
1338
1393
  recordUpdated,
1394
+ recordPublished,
1339
1395
  status,
1340
1396
  title,
1341
1397
  abstract,
@@ -1343,7 +1399,7 @@ function toModel(xml) {
1343
1399
  contacts,
1344
1400
  contactsForResource: [],
1345
1401
  keywords,
1346
- themes,
1402
+ topics,
1347
1403
  licenses,
1348
1404
  legalConstraints,
1349
1405
  securityConstraints,
@@ -1364,14 +1420,16 @@ function toModel(xml) {
1364
1420
  return {
1365
1421
  uniqueIdentifier,
1366
1422
  kind,
1423
+ languages: [],
1367
1424
  recordCreated,
1368
1425
  recordUpdated,
1426
+ recordPublished,
1369
1427
  title,
1370
1428
  abstract,
1371
1429
  ownerOrganization,
1372
1430
  contacts,
1373
1431
  keywords,
1374
- themes,
1432
+ topics,
1375
1433
  licenses,
1376
1434
  legalConstraints,
1377
1435
  securityConstraints,
@@ -1400,7 +1458,7 @@ function toXml(record, originalXml) {
1400
1458
  writeAbstract(record, rootEl);
1401
1459
  fieldChanged('contacts') && writeContacts(record, rootEl);
1402
1460
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1403
- fieldChanged('themes') && writeThemes(record, rootEl);
1461
+ fieldChanged('topics') && writeTopics(record, rootEl);
1404
1462
  fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1405
1463
  fieldChanged('securityConstraints') &&
1406
1464
  writeSecurityConstraints(record, rootEl);
@@ -1472,6 +1530,31 @@ const mapContact = (sourceContact, lang3) => {
1472
1530
  ...(phone && { phone }),
1473
1531
  };
1474
1532
  };
1533
+ const mapKeywords = (thesauri, language) => {
1534
+ const keywords = [];
1535
+ for (const thesaurusId in thesauri) {
1536
+ const rawThesaurus = thesauri[thesaurusId];
1537
+ let thesaurus = null;
1538
+ if (rawThesaurus.id) {
1539
+ const thesaurusSource = { ...rawThesaurus };
1540
+ const url = getAsUrl(selectField(thesaurusSource, 'link'));
1541
+ const name = selectField(thesaurusSource, 'title');
1542
+ thesaurus = {
1543
+ id: rawThesaurus.id,
1544
+ ...(name && { name }),
1545
+ ...(url && { url }),
1546
+ };
1547
+ }
1548
+ for (const keyword of rawThesaurus.keywords) {
1549
+ keywords.push({
1550
+ label: selectTranslatedValue(keyword, language),
1551
+ type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
1552
+ ...(thesaurus && { thesaurus }),
1553
+ });
1554
+ }
1555
+ }
1556
+ return keywords;
1557
+ };
1475
1558
 
1476
1559
  /**
1477
1560
  * Custom HttpParameterCodec
@@ -16458,6 +16541,23 @@ const LANG_3_TO_2_MAPPER = {
16458
16541
  chi: 'zh',
16459
16542
  slo: 'sk',
16460
16543
  };
16544
+ const LANGUAGE_NAMES = {
16545
+ en: 'English',
16546
+ nl: 'Nederlands',
16547
+ fr: 'Français',
16548
+ de: 'Deutsch',
16549
+ ko: '한국어',
16550
+ es: 'Español',
16551
+ cs: 'Čeština',
16552
+ ca: 'Català',
16553
+ fi: 'Suomi',
16554
+ is: 'Íslenska',
16555
+ it: 'Italiano',
16556
+ pt: 'Português',
16557
+ ru: 'Русский',
16558
+ zh: '中文',
16559
+ sk: 'Slovenčina',
16560
+ };
16461
16561
  // Caution: changing this can break language selection from third parties!
16462
16562
  const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language';
16463
16563
  const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce((mapperObject, langEntry) => {
@@ -16580,7 +16680,7 @@ var de = {
16580
16680
  "chart.type.line": "Liniendiagramm",
16581
16681
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16582
16682
  "chart.type.pie": "Kreisdiagramm",
16583
- "dashboard.createRecord": "",
16683
+ "dashboard.createRecord": "Neuer Eintrag",
16584
16684
  "dashboard.labels.mySpace": "Mein Bereich",
16585
16685
  "dashboard.records.all": "Katalog",
16586
16686
  "dashboard.records.myDraft": "Meine Entwürfe",
@@ -16593,8 +16693,8 @@ var de = {
16593
16693
  "dashboard.records.userEmail": "E-Mail",
16594
16694
  "dashboard.records.username": "Benutzername",
16595
16695
  "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16596
- "dashboard.results.listMetadata": "",
16597
- "dashboard.results.listResources": "",
16696
+ "dashboard.results.listMetadata": "Metadaten anzeigen",
16697
+ "dashboard.results.listResources": "Ressourcen anzeigen",
16598
16698
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16599
16699
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16600
16700
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16708,6 +16808,8 @@ var de = {
16708
16808
  "downloads.format.unknown": "unbekannt",
16709
16809
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16710
16810
  dropFile: dropFile$6,
16811
+ "editor.record.publish": "",
16812
+ "editor.record.upToDate": "",
16711
16813
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16712
16814
  "facets.block.title.OrgForResource": "Organisation",
16713
16815
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -16721,28 +16823,28 @@ var de = {
16721
16823
  "facets.block.title.tag.default": "Stichwort",
16722
16824
  "facets.block.title.th_regions_tree.default": "Regionen",
16723
16825
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Anmelden</a>, um auf diese Funktion zuzugreifen</div>",
16724
- "language.ca": "Català",
16725
- "language.cs": "Čeština",
16826
+ "language.ca": "Katalanisch",
16827
+ "language.cs": "Tschechisch",
16726
16828
  "language.de": "Deutsch",
16727
- "language.en": "English",
16728
- "language.es": "Español",
16729
- "language.fi": "Suomi",
16730
- "language.fr": "Français",
16731
- "language.is": "Íslenska",
16732
- "language.it": "Italiano",
16733
- "language.ko": "한국어",
16734
- "language.nl": "Nederlands",
16735
- "language.pt": "Português",
16736
- "language.ru": "Русский",
16737
- "language.sk": "Slovenčina",
16738
- "language.zh": "中文",
16829
+ "language.en": "Englisch",
16830
+ "language.es": "Spanisch",
16831
+ "language.fi": "Finnisch",
16832
+ "language.fr": "Französisch",
16833
+ "language.is": "Isländisch",
16834
+ "language.it": "Italienisch",
16835
+ "language.ko": "Koreanisch",
16836
+ "language.nl": "Niederländisch",
16837
+ "language.pt": "Portugiesisch",
16838
+ "language.ru": "Russisch",
16839
+ "language.sk": "Slowakisch",
16840
+ "language.zh": "Chinesisch",
16739
16841
  "map.add.layer": "Eine Ebene hinzufügen",
16740
16842
  "map.add.layer.catalog": "Aus dem Katalog",
16741
16843
  "map.add.layer.file": "Aus einer Datei",
16742
16844
  "map.add.layer.wfs": "Aus WFS",
16743
16845
  "map.add.layer.wms": "Aus WMS",
16744
16846
  "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16745
- "map.geocoding.placeholder": "",
16847
+ "map.geocoding.placeholder": "Nach einem Ort suchen",
16746
16848
  "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16747
16849
  "map.layer.add": "Hinzufügen",
16748
16850
  "map.layers.available": "Verfügbare Layer",
@@ -16786,17 +16888,20 @@ var de = {
16786
16888
  "record.metadata.author": "Autor",
16787
16889
  "record.metadata.catalog": "Katalog",
16788
16890
  "record.metadata.contact": "Kontakt",
16789
- "record.metadata.details": "Technische Informationen",
16891
+ "record.metadata.creation": "Erstellungsdatum",
16892
+ "record.metadata.details": "Über die Daten",
16790
16893
  "record.metadata.download": "Downloads",
16791
16894
  "record.metadata.formats": "Formate",
16792
16895
  "record.metadata.keywords": "Stichworte",
16793
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16896
+ "record.metadata.languages": "Sprachen",
16897
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
16794
16898
  "record.metadata.links": "Links",
16795
16899
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16796
- "record.metadata.origin": "Über die Daten",
16797
- "record.metadata.otherConstraints": "",
16798
- "record.metadata.owner": "",
16900
+ "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
16901
+ "record.metadata.owner": "Herkunftskatalog",
16799
16902
  "record.metadata.preview": "Vorschau",
16903
+ "record.metadata.producer": "Datenproduzent",
16904
+ "record.metadata.publication": "Veröffentlichungsdatum",
16800
16905
  "record.metadata.publications": "Veröffentlichungen",
16801
16906
  "record.metadata.quality": "Metadatenqualität",
16802
16907
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
@@ -16818,13 +16923,17 @@ var de = {
16818
16923
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16819
16924
  "record.metadata.related": "Ähnliche Datensätze",
16820
16925
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16821
- "record.metadata.status": "",
16822
- "record.metadata.themes": "Kategorien",
16926
+ "record.metadata.status": "Status",
16927
+ "record.metadata.technical": "Technische Informationen",
16928
+ "record.metadata.temporalExtent": "Zeitlicher Umfang",
16929
+ "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
16930
+ "record.metadata.temporalExtent.sinceDate": "Seit {start}",
16931
+ "record.metadata.temporalExtent.untilDate": "Bis {end}",
16823
16932
  "record.metadata.title": "Titel",
16933
+ "record.metadata.topics": "Kategorien",
16824
16934
  "record.metadata.type": "Geographischer Datensatz",
16825
16935
  "record.metadata.uniqueId": "Eindeutige Kennung",
16826
16936
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16827
- "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16828
16937
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
16829
16938
  "record.metadata.usage": "Nutzung und Einschränkungen",
16830
16939
  "record.more.details": "Weitere Details",
@@ -16856,6 +16965,7 @@ var de = {
16856
16965
  "search.filters.isSpatial": "Ist räumliche Daten",
16857
16966
  "search.filters.isSpatial.no": "nicht räumlich",
16858
16967
  "search.filters.isSpatial.yes": "räumlich",
16968
+ "search.filters.keyword": "Schlüsselwort",
16859
16969
  "search.filters.license": "Lizenz",
16860
16970
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16861
16971
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16886,7 +16996,7 @@ var de = {
16886
16996
  "table.object.count": "Objekte in diesem Datensatz",
16887
16997
  "table.select.data": "Datenquelle",
16888
16998
  "tooltip.html.copy": "HTML kopieren",
16889
- "tooltip.id.copy": "",
16999
+ "tooltip.id.copy": "Eindeutige Kennung kopieren",
16890
17000
  "tooltip.url.copy": "URL kopieren",
16891
17001
  "tooltip.url.open": "URL öffnen",
16892
17002
  "ui.readLess": "Weniger lesen",
@@ -17048,6 +17158,8 @@ var en = {
17048
17158
  "downloads.format.unknown": "unknown",
17049
17159
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17050
17160
  dropFile: dropFile$5,
17161
+ "editor.record.publish": "Publish this record",
17162
+ "editor.record.upToDate": "This record is up to date",
17051
17163
  "externalviewer.dataset.unnamed": "Datahub layer",
17052
17164
  "facets.block.title.OrgForResource": "Organisation",
17053
17165
  "facets.block.title.availableInServices": "Available for",
@@ -17061,21 +17173,21 @@ var en = {
17061
17173
  "facets.block.title.tag.default": "Tag",
17062
17174
  "facets.block.title.th_regions_tree.default": "Regions",
17063
17175
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
17064
- "language.ca": "Català",
17065
- "language.cs": "Čeština",
17066
- "language.de": "Deutsch",
17176
+ "language.ca": "Catalan",
17177
+ "language.cs": "Czech",
17178
+ "language.de": "German",
17067
17179
  "language.en": "English",
17068
- "language.es": "Español",
17069
- "language.fi": "Suomi",
17070
- "language.fr": "Français",
17071
- "language.is": "Íslenska",
17072
- "language.it": "Italiano",
17073
- "language.ko": "한국어",
17074
- "language.nl": "Nederlands",
17075
- "language.pt": "Português",
17076
- "language.ru": "Русский",
17077
- "language.sk": "Slovenčina",
17078
- "language.zh": "中文",
17180
+ "language.es": "Spanish",
17181
+ "language.fi": "Finnish",
17182
+ "language.fr": "French",
17183
+ "language.is": "Icelandic",
17184
+ "language.it": "Italian",
17185
+ "language.ko": "Korean",
17186
+ "language.nl": "Dutch",
17187
+ "language.pt": "Portuguese",
17188
+ "language.ru": "Russian",
17189
+ "language.sk": "Slovak",
17190
+ "language.zh": "Chinese",
17079
17191
  "map.add.layer": "Add a layer",
17080
17192
  "map.add.layer.catalog": "From the catalog",
17081
17193
  "map.add.layer.file": "From a file",
@@ -17126,17 +17238,20 @@ var en = {
17126
17238
  "record.metadata.author": "Author",
17127
17239
  "record.metadata.catalog": "Catalog",
17128
17240
  "record.metadata.contact": "Contact",
17129
- "record.metadata.details": "Technical information",
17241
+ "record.metadata.creation": "Date of creation",
17242
+ "record.metadata.details": "About the data",
17130
17243
  "record.metadata.download": "Downloads",
17131
17244
  "record.metadata.formats": "Formats",
17132
17245
  "record.metadata.keywords": "Keywords",
17133
- "record.metadata.lastUpdate": "Last updated on",
17246
+ "record.metadata.languages": "Languages",
17247
+ "record.metadata.lastUpdate": "Last updated on {date}",
17134
17248
  "record.metadata.links": "Links",
17135
17249
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17136
- "record.metadata.origin": "About the data",
17137
17250
  "record.metadata.otherConstraints": "Additional Conditions",
17138
17251
  "record.metadata.owner": "Catalog of origin",
17139
17252
  "record.metadata.preview": "Preview",
17253
+ "record.metadata.producer": "Data producer",
17254
+ "record.metadata.publication": "Date of publication",
17140
17255
  "record.metadata.publications": "publications",
17141
17256
  "record.metadata.quality": "Metadata Quality",
17142
17257
  "record.metadata.quality.contact.failed": "Contact is not specified",
@@ -17159,12 +17274,16 @@ var en = {
17159
17274
  "record.metadata.related": "Related records",
17160
17275
  "record.metadata.sheet": "Original metadata",
17161
17276
  "record.metadata.status": "Status",
17162
- "record.metadata.themes": "Categories",
17277
+ "record.metadata.technical": "Technical information",
17278
+ "record.metadata.temporalExtent": "Temporal extent",
17279
+ "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
17280
+ "record.metadata.temporalExtent.sinceDate": "Since { start }",
17281
+ "record.metadata.temporalExtent.untilDate": "Until { end }",
17163
17282
  "record.metadata.title": "Title",
17283
+ "record.metadata.topics": "Categories",
17164
17284
  "record.metadata.type": "Geographical dataset",
17165
17285
  "record.metadata.uniqueId": "Unique Identifier",
17166
17286
  "record.metadata.updateFrequency": "Data Update Frequency",
17167
- "record.metadata.updateStatus": "Data Update Status",
17168
17287
  "record.metadata.updatedOn": "Last Data Information Update",
17169
17288
  "record.metadata.usage": "License and Conditions",
17170
17289
  "record.more.details": "Read more",
@@ -17196,6 +17315,7 @@ var en = {
17196
17315
  "search.filters.isSpatial": "Is spatial data",
17197
17316
  "search.filters.isSpatial.no": "non spatial",
17198
17317
  "search.filters.isSpatial.yes": "spatial",
17318
+ "search.filters.keyword": "Keyword",
17199
17319
  "search.filters.license": "License",
17200
17320
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17201
17321
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17388,6 +17508,8 @@ var es = {
17388
17508
  "downloads.format.unknown": "",
17389
17509
  "downloads.wfs.featuretype.not.found": "",
17390
17510
  dropFile: dropFile$4,
17511
+ "editor.record.publish": "",
17512
+ "editor.record.upToDate": "",
17391
17513
  "externalviewer.dataset.unnamed": "",
17392
17514
  "facets.block.title.OrgForResource": "",
17393
17515
  "facets.block.title.availableInServices": "",
@@ -17401,21 +17523,21 @@ var es = {
17401
17523
  "facets.block.title.tag.default": "",
17402
17524
  "facets.block.title.th_regions_tree.default": "",
17403
17525
  "favorite.not.authenticated.tooltip": "",
17404
- "language.ca": "Català",
17405
- "language.cs": "Čeština",
17406
- "language.de": "Deutsch",
17407
- "language.en": "English",
17526
+ "language.ca": "Catalán",
17527
+ "language.cs": "Checo",
17528
+ "language.de": "Alemán",
17529
+ "language.en": "Inglés",
17408
17530
  "language.es": "Español",
17409
- "language.fi": "Suomi",
17410
- "language.fr": "Français",
17411
- "language.is": "Íslenska",
17531
+ "language.fi": "Finlandés",
17532
+ "language.fr": "Francés",
17533
+ "language.is": "Islandés",
17412
17534
  "language.it": "Italiano",
17413
- "language.ko": "한국어",
17414
- "language.nl": "Nederlands",
17415
- "language.pt": "Português",
17416
- "language.ru": "Русский",
17417
- "language.sk": "Slovenčina",
17418
- "language.zh": "中文",
17535
+ "language.ko": "Coreano",
17536
+ "language.nl": "Neerlandés",
17537
+ "language.pt": "Portugués",
17538
+ "language.ru": "Ruso",
17539
+ "language.sk": "Eslovaco",
17540
+ "language.zh": "Chino",
17419
17541
  "map.add.layer": "",
17420
17542
  "map.add.layer.catalog": "",
17421
17543
  "map.add.layer.file": "",
@@ -17466,17 +17588,20 @@ var es = {
17466
17588
  "record.metadata.author": "",
17467
17589
  "record.metadata.catalog": "",
17468
17590
  "record.metadata.contact": "",
17591
+ "record.metadata.creation": "",
17469
17592
  "record.metadata.details": "",
17470
17593
  "record.metadata.download": "",
17471
17594
  "record.metadata.formats": "",
17472
17595
  "record.metadata.keywords": "",
17596
+ "record.metadata.languages": "",
17473
17597
  "record.metadata.lastUpdate": "",
17474
17598
  "record.metadata.links": "",
17475
17599
  "record.metadata.noUsage": "",
17476
- "record.metadata.origin": "",
17477
17600
  "record.metadata.otherConstraints": "",
17478
17601
  "record.metadata.owner": "",
17479
17602
  "record.metadata.preview": "",
17603
+ "record.metadata.producer": "",
17604
+ "record.metadata.publication": "",
17480
17605
  "record.metadata.publications": "",
17481
17606
  "record.metadata.quality": "",
17482
17607
  "record.metadata.quality.contact.failed": "",
@@ -17499,12 +17624,16 @@ var es = {
17499
17624
  "record.metadata.related": "",
17500
17625
  "record.metadata.sheet": "",
17501
17626
  "record.metadata.status": "",
17502
- "record.metadata.themes": "",
17627
+ "record.metadata.technical": "",
17628
+ "record.metadata.temporalExtent": "",
17629
+ "record.metadata.temporalExtent.fromDateToDate": "",
17630
+ "record.metadata.temporalExtent.sinceDate": "",
17631
+ "record.metadata.temporalExtent.untilDate": "",
17503
17632
  "record.metadata.title": "",
17633
+ "record.metadata.topics": "",
17504
17634
  "record.metadata.type": "",
17505
17635
  "record.metadata.uniqueId": "",
17506
17636
  "record.metadata.updateFrequency": "",
17507
- "record.metadata.updateStatus": "",
17508
17637
  "record.metadata.updatedOn": "",
17509
17638
  "record.metadata.usage": "",
17510
17639
  "record.more.details": "",
@@ -17536,6 +17665,7 @@ var es = {
17536
17665
  "search.filters.isSpatial": "",
17537
17666
  "search.filters.isSpatial.no": "",
17538
17667
  "search.filters.isSpatial.yes": "",
17668
+ "search.filters.keyword": "",
17539
17669
  "search.filters.license": "",
17540
17670
  "search.filters.license.cc-by": "",
17541
17671
  "search.filters.license.cc-by-sa": "",
@@ -17600,7 +17730,7 @@ var fr = {
17600
17730
  "chart.type.line": "ligne",
17601
17731
  "chart.type.lineSmooth": "ligne lisse",
17602
17732
  "chart.type.pie": "camembert",
17603
- "dashboard.createRecord": "",
17733
+ "dashboard.createRecord": "Nouvel enregistrement",
17604
17734
  "dashboard.labels.mySpace": "Mon espace",
17605
17735
  "dashboard.records.all": "Catalogue",
17606
17736
  "dashboard.records.myDraft": "Mes brouillons",
@@ -17613,8 +17743,8 @@ var fr = {
17613
17743
  "dashboard.records.userEmail": "Email",
17614
17744
  "dashboard.records.username": "Nom d'utilisateur",
17615
17745
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17616
- "dashboard.results.listMetadata": "",
17617
- "dashboard.results.listResources": "",
17746
+ "dashboard.results.listMetadata": "Afficher les métadonnées",
17747
+ "dashboard.results.listResources": "Afficher les ressources",
17618
17748
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17619
17749
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17620
17750
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17728,6 +17858,8 @@ var fr = {
17728
17858
  "downloads.format.unknown": "inconnu",
17729
17859
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
17730
17860
  dropFile: dropFile$3,
17861
+ "editor.record.publish": "",
17862
+ "editor.record.upToDate": "",
17731
17863
  "externalviewer.dataset.unnamed": "Couche du datahub",
17732
17864
  "facets.block.title.OrgForResource": "Organisation",
17733
17865
  "facets.block.title.availableInServices": "Disponible pour",
@@ -17741,38 +17873,38 @@ var fr = {
17741
17873
  "facets.block.title.tag.default": "Tag",
17742
17874
  "facets.block.title.th_regions_tree.default": "Régions",
17743
17875
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
17744
- "language.ca": "Català",
17745
- "language.cs": "Čeština",
17746
- "language.de": "Deutsch",
17747
- "language.en": "English",
17748
- "language.es": "Español",
17749
- "language.fi": "Suomi",
17876
+ "language.ca": "Catalan",
17877
+ "language.cs": "Tchèque",
17878
+ "language.de": "Allemand",
17879
+ "language.en": "Anglais",
17880
+ "language.es": "Espagnol",
17881
+ "language.fi": "Finnois",
17750
17882
  "language.fr": "Français",
17751
- "language.is": "Íslenska",
17752
- "language.it": "Italiano",
17753
- "language.ko": "한국어",
17754
- "language.nl": "Nederlands",
17755
- "language.pt": "Português",
17756
- "language.ru": "Русский",
17757
- "language.sk": "Slovenčina",
17758
- "language.zh": "中文",
17759
- "map.add.layer": "",
17760
- "map.add.layer.catalog": "",
17761
- "map.add.layer.file": "",
17762
- "map.add.layer.wfs": "",
17763
- "map.add.layer.wms": "",
17764
- "map.addFromFile.placeholder": "",
17765
- "map.geocoding.placeholder": "",
17766
- "map.help.addFromFile": "",
17767
- "map.layer.add": "",
17768
- "map.layers.available": "",
17769
- "map.layers.list": "",
17883
+ "language.is": "Islandais",
17884
+ "language.it": "Italien",
17885
+ "language.ko": "Coréen",
17886
+ "language.nl": "Néerlandais",
17887
+ "language.pt": "Portugais",
17888
+ "language.ru": "Russe",
17889
+ "language.sk": "Slovaque",
17890
+ "language.zh": "Chinois",
17891
+ "map.add.layer": "Ajouter une couche",
17892
+ "map.add.layer.catalog": "Du catalogue",
17893
+ "map.add.layer.file": "À partir d'un fichier",
17894
+ "map.add.layer.wfs": "Depuis un service WFS",
17895
+ "map.add.layer.wms": "Depuis un service WMS",
17896
+ "map.addFromFile.placeholder": "Cliquez ou déposez un fichier ici",
17897
+ "map.geocoding.placeholder": "Rechercher un lieu",
17898
+ "map.help.addFromFile": "Cliquez ou glissez-déposez un fichier pour l'ajouter à la carte (supporte actuellement uniquement le format GeoJSON).",
17899
+ "map.layer.add": "Ajouter",
17900
+ "map.layers.available": "Couches disponibles",
17901
+ "map.layers.list": "Couches",
17770
17902
  "map.loading.data": "Chargement des données...",
17771
- "map.loading.service": "",
17903
+ "map.loading.service": "Chargement du service...",
17772
17904
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17773
17905
  "map.select.layer": "Source de données",
17774
- "map.wfs.urlInput.hint": "",
17775
- "map.wms.urlInput.hint": "",
17906
+ "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
17907
+ "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
17776
17908
  "multiselect.filter.placeholder": "Rechercher",
17777
17909
  "nav.back": "Retour",
17778
17910
  next: next$3,
@@ -17806,17 +17938,20 @@ var fr = {
17806
17938
  "record.metadata.author": "Auteur",
17807
17939
  "record.metadata.catalog": "Catalogue",
17808
17940
  "record.metadata.contact": "Contact",
17809
- "record.metadata.details": "Informations techniques",
17941
+ "record.metadata.creation": "Date de création",
17942
+ "record.metadata.details": "A propos de la donnée",
17810
17943
  "record.metadata.download": "Téléchargements",
17811
17944
  "record.metadata.formats": "Formats",
17812
17945
  "record.metadata.keywords": "Mots clés",
17813
- "record.metadata.lastUpdate": "Mis à jour le",
17946
+ "record.metadata.languages": "Langues",
17947
+ "record.metadata.lastUpdate": "Mis à jour le {date}",
17814
17948
  "record.metadata.links": "Liens",
17815
17949
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17816
- "record.metadata.origin": "À propos des données",
17817
17950
  "record.metadata.otherConstraints": "Limitations d'usage",
17818
17951
  "record.metadata.owner": "Catalogue d'origine",
17819
17952
  "record.metadata.preview": "Aperçu",
17953
+ "record.metadata.producer": "Producteur de la donnée",
17954
+ "record.metadata.publication": "Date de publication",
17820
17955
  "record.metadata.publications": "données",
17821
17956
  "record.metadata.quality": "Qualité des métadonnées",
17822
17957
  "record.metadata.quality.contact.failed": "Contact n'est pas renseigné",
@@ -17838,13 +17973,17 @@ var fr = {
17838
17973
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17839
17974
  "record.metadata.related": "Voir aussi",
17840
17975
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17841
- "record.metadata.status": "",
17842
- "record.metadata.themes": "Catégories",
17976
+ "record.metadata.status": "Statut",
17977
+ "record.metadata.technical": "Informations techniques",
17978
+ "record.metadata.temporalExtent": "Etendue temporelle",
17979
+ "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
17980
+ "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
17981
+ "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
17843
17982
  "record.metadata.title": "Titre",
17983
+ "record.metadata.topics": "Catégories",
17844
17984
  "record.metadata.type": "Donnée géographique",
17845
17985
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17846
17986
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17847
- "record.metadata.updateStatus": "Statut de mise à jour des données",
17848
17987
  "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17849
17988
  "record.metadata.usage": "Licences et conditions d'utilisation",
17850
17989
  "record.more.details": "Détails",
@@ -17876,6 +18015,7 @@ var fr = {
17876
18015
  "search.filters.isSpatial": "Données spatiales",
17877
18016
  "search.filters.isSpatial.no": "non-géolocalisées",
17878
18017
  "search.filters.isSpatial.yes": "géolocalisées",
18018
+ "search.filters.keyword": "Mot-clé",
17879
18019
  "search.filters.license": "Licence",
17880
18020
  "search.filters.license.cc-by": "cc-by",
17881
18021
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -17940,7 +18080,7 @@ var it = {
17940
18080
  "chart.type.line": "grafico a linee",
17941
18081
  "chart.type.lineSmooth": "grafico a linea liscia",
17942
18082
  "chart.type.pie": "grafico a torta",
17943
- "dashboard.createRecord": "",
18083
+ "dashboard.createRecord": "Crea un record",
17944
18084
  "dashboard.labels.mySpace": "Il mio spazio",
17945
18085
  "dashboard.records.all": "Catalogo",
17946
18086
  "dashboard.records.myDraft": "Le mie bozze",
@@ -17953,8 +18093,8 @@ var it = {
17953
18093
  "dashboard.records.userEmail": "Email",
17954
18094
  "dashboard.records.username": "Nome utente",
17955
18095
  "dashboard.records.users": "utenti",
17956
- "dashboard.results.listMetadata": "",
17957
- "dashboard.results.listResources": "",
18096
+ "dashboard.results.listMetadata": "Elenco dei metadati",
18097
+ "dashboard.results.listResources": "Elenco delle risorse",
17958
18098
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
17959
18099
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
17960
18100
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18068,6 +18208,8 @@ var it = {
18068
18208
  "downloads.format.unknown": "sconosciuto",
18069
18209
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18070
18210
  dropFile: dropFile$2,
18211
+ "editor.record.publish": "",
18212
+ "editor.record.upToDate": "",
18071
18213
  "externalviewer.dataset.unnamed": "Layer del datahub",
18072
18214
  "facets.block.title.OrgForResource": "Organizzazione",
18073
18215
  "facets.block.title.availableInServices": "Disponibile per",
@@ -18081,38 +18223,38 @@ var it = {
18081
18223
  "facets.block.title.tag.default": "Tag",
18082
18224
  "facets.block.title.th_regions_tree.default": "Regioni",
18083
18225
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> per accedere a questa funzionalità</div>",
18084
- "language.ca": "Català",
18085
- "language.cs": "Čeština",
18086
- "language.de": "Deutsch",
18087
- "language.en": "English",
18088
- "language.es": "Español",
18089
- "language.fi": "Suomi",
18090
- "language.fr": "Français",
18091
- "language.is": "Íslenska",
18226
+ "language.ca": "Catalano",
18227
+ "language.cs": "Ceco",
18228
+ "language.de": "Tedesco",
18229
+ "language.en": "Inglese",
18230
+ "language.es": "Spagnolo",
18231
+ "language.fi": "Finlandese",
18232
+ "language.fr": "Francese",
18233
+ "language.is": "Islandese",
18092
18234
  "language.it": "Italiano",
18093
- "language.ko": "한국어",
18094
- "language.nl": "Nederlands",
18095
- "language.pt": "Português",
18096
- "language.ru": "Русский",
18097
- "language.sk": "Slovenčina",
18098
- "language.zh": "中文",
18235
+ "language.ko": "Coreano",
18236
+ "language.nl": "Olandese",
18237
+ "language.pt": "Portoghese",
18238
+ "language.ru": "Russo",
18239
+ "language.sk": "Slovacco",
18240
+ "language.zh": "Cinese",
18099
18241
  "map.add.layer": "Aggiungere un layer",
18100
18242
  "map.add.layer.catalog": "Dal catalogo",
18101
18243
  "map.add.layer.file": "Da un file",
18102
18244
  "map.add.layer.wfs": "Da un WFS",
18103
18245
  "map.add.layer.wms": "Da un WMS",
18104
- "map.addFromFile.placeholder": "",
18105
- "map.geocoding.placeholder": "",
18106
- "map.help.addFromFile": "",
18107
- "map.layer.add": "",
18108
- "map.layers.available": "",
18246
+ "map.addFromFile.placeholder": "Clicca o trascina un file qui",
18247
+ "map.geocoding.placeholder": "Cerca un luogo",
18248
+ "map.help.addFromFile": "Clicca o trascina un file per aggiungerlo alla mappa (attualmente supporta solo il formato GeoJSON)",
18249
+ "map.layer.add": "Aggiungi",
18250
+ "map.layers.available": "Layer disponibili",
18109
18251
  "map.layers.list": "Layers",
18110
18252
  "map.loading.data": "Caricamento dati...",
18111
- "map.loading.service": "",
18253
+ "map.loading.service": "Caricamento del servizio...",
18112
18254
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18113
18255
  "map.select.layer": "Sorgente dati",
18114
- "map.wfs.urlInput.hint": "",
18115
- "map.wms.urlInput.hint": "",
18256
+ "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
18257
+ "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
18116
18258
  "multiselect.filter.placeholder": "Cerca",
18117
18259
  "nav.back": "Indietro",
18118
18260
  next: next$2,
@@ -18146,17 +18288,20 @@ var it = {
18146
18288
  "record.metadata.author": "Autore",
18147
18289
  "record.metadata.catalog": "Catalogo",
18148
18290
  "record.metadata.contact": "Contatto",
18149
- "record.metadata.details": "Informazioni tecniche",
18291
+ "record.metadata.creation": "Data di creazione",
18292
+ "record.metadata.details": "A proposito del dati",
18150
18293
  "record.metadata.download": "Download",
18151
18294
  "record.metadata.formats": "Formati",
18152
18295
  "record.metadata.keywords": "Parole chiave",
18153
- "record.metadata.lastUpdate": "Ultimo aggiornamento",
18296
+ "record.metadata.languages": "Lingue",
18297
+ "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
18154
18298
  "record.metadata.links": "Collegamenti",
18155
18299
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18156
- "record.metadata.origin": "Informazioni sui dati",
18157
18300
  "record.metadata.otherConstraints": "Limitazioni di uso",
18158
18301
  "record.metadata.owner": "Catalogo originale",
18159
18302
  "record.metadata.preview": "Anteprima",
18303
+ "record.metadata.producer": "Produttore dei dati",
18304
+ "record.metadata.publication": "Data di pubblicazione",
18160
18305
  "record.metadata.publications": "pubblicazioni",
18161
18306
  "record.metadata.quality": "Qualità dei metadati",
18162
18307
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
@@ -18178,13 +18323,17 @@ var it = {
18178
18323
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18179
18324
  "record.metadata.related": "Vedi anche",
18180
18325
  "record.metadata.sheet": "Origine del metadata",
18181
- "record.metadata.status": "",
18182
- "record.metadata.themes": "Categorie",
18326
+ "record.metadata.status": "Stato",
18327
+ "record.metadata.technical": "Informazioni tecniche",
18328
+ "record.metadata.temporalExtent": "Periodo di tempo",
18329
+ "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
18330
+ "record.metadata.temporalExtent.sinceDate": "Dal {start}",
18331
+ "record.metadata.temporalExtent.untilDate": "Fino a {end}",
18183
18332
  "record.metadata.title": "Titolo",
18333
+ "record.metadata.topics": "Categorie",
18184
18334
  "record.metadata.type": "Dati geografici",
18185
18335
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18186
18336
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18187
- "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18188
18337
  "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18189
18338
  "record.metadata.usage": "Licenze e limiti di utilizzo",
18190
18339
  "record.more.details": "Dettagli",
@@ -18216,6 +18365,7 @@ var it = {
18216
18365
  "search.filters.isSpatial": "Dati spaziali",
18217
18366
  "search.filters.isSpatial.no": "Non geolocalizzati",
18218
18367
  "search.filters.isSpatial.yes": "Geolocalizzati",
18368
+ "search.filters.keyword": "Parola chiave",
18219
18369
  "search.filters.license": "Licenza",
18220
18370
  "search.filters.license.cc-by": "cc-by",
18221
18371
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18408,6 +18558,8 @@ var nl = {
18408
18558
  "downloads.format.unknown": "",
18409
18559
  "downloads.wfs.featuretype.not.found": "",
18410
18560
  dropFile: dropFile$1,
18561
+ "editor.record.publish": "",
18562
+ "editor.record.upToDate": "",
18411
18563
  "externalviewer.dataset.unnamed": "",
18412
18564
  "facets.block.title.OrgForResource": "",
18413
18565
  "facets.block.title.availableInServices": "",
@@ -18421,21 +18573,21 @@ var nl = {
18421
18573
  "facets.block.title.tag.default": "",
18422
18574
  "facets.block.title.th_regions_tree.default": "",
18423
18575
  "favorite.not.authenticated.tooltip": "",
18424
- "language.ca": "Català",
18425
- "language.cs": "Čeština",
18426
- "language.de": "Deutsch",
18427
- "language.en": "English",
18428
- "language.es": "Español",
18429
- "language.fi": "Suomi",
18430
- "language.fr": "Français",
18431
- "language.is": "Íslenska",
18432
- "language.it": "Italiano",
18433
- "language.ko": "한국어",
18576
+ "language.ca": "Catalaans",
18577
+ "language.cs": "Tsjechisch",
18578
+ "language.de": "Duits",
18579
+ "language.en": "Engels",
18580
+ "language.es": "Spaans",
18581
+ "language.fi": "Fins",
18582
+ "language.fr": "Frans",
18583
+ "language.is": "IJslands",
18584
+ "language.it": "Italiaans",
18585
+ "language.ko": "Koreaans",
18434
18586
  "language.nl": "Nederlands",
18435
- "language.pt": "Português",
18436
- "language.ru": "Русский",
18437
- "language.sk": "Slovenčina",
18438
- "language.zh": "中文",
18587
+ "language.pt": "Portugees",
18588
+ "language.ru": "Russisch",
18589
+ "language.sk": "Slowaaks",
18590
+ "language.zh": "Chinees",
18439
18591
  "map.add.layer": "",
18440
18592
  "map.add.layer.catalog": "",
18441
18593
  "map.add.layer.file": "",
@@ -18486,17 +18638,20 @@ var nl = {
18486
18638
  "record.metadata.author": "",
18487
18639
  "record.metadata.catalog": "",
18488
18640
  "record.metadata.contact": "",
18641
+ "record.metadata.creation": "",
18489
18642
  "record.metadata.details": "",
18490
18643
  "record.metadata.download": "",
18491
18644
  "record.metadata.formats": "",
18492
18645
  "record.metadata.keywords": "",
18646
+ "record.metadata.languages": "",
18493
18647
  "record.metadata.lastUpdate": "",
18494
18648
  "record.metadata.links": "",
18495
18649
  "record.metadata.noUsage": "",
18496
- "record.metadata.origin": "",
18497
18650
  "record.metadata.otherConstraints": "",
18498
18651
  "record.metadata.owner": "",
18499
18652
  "record.metadata.preview": "",
18653
+ "record.metadata.producer": "",
18654
+ "record.metadata.publication": "",
18500
18655
  "record.metadata.publications": "",
18501
18656
  "record.metadata.quality": "",
18502
18657
  "record.metadata.quality.contact.failed": "",
@@ -18519,12 +18674,16 @@ var nl = {
18519
18674
  "record.metadata.related": "",
18520
18675
  "record.metadata.sheet": "",
18521
18676
  "record.metadata.status": "",
18522
- "record.metadata.themes": "",
18677
+ "record.metadata.technical": "",
18678
+ "record.metadata.temporalExtent": "",
18679
+ "record.metadata.temporalExtent.fromDateToDate": "",
18680
+ "record.metadata.temporalExtent.sinceDate": "",
18681
+ "record.metadata.temporalExtent.untilDate": "",
18523
18682
  "record.metadata.title": "",
18683
+ "record.metadata.topics": "",
18524
18684
  "record.metadata.type": "",
18525
18685
  "record.metadata.uniqueId": "",
18526
18686
  "record.metadata.updateFrequency": "",
18527
- "record.metadata.updateStatus": "",
18528
18687
  "record.metadata.updatedOn": "",
18529
18688
  "record.metadata.usage": "",
18530
18689
  "record.more.details": "",
@@ -18556,6 +18715,7 @@ var nl = {
18556
18715
  "search.filters.isSpatial": "",
18557
18716
  "search.filters.isSpatial.no": "",
18558
18717
  "search.filters.isSpatial.yes": "",
18718
+ "search.filters.keyword": "",
18559
18719
  "search.filters.license": "",
18560
18720
  "search.filters.license.cc-by": "",
18561
18721
  "search.filters.license.cc-by-sa": "",
@@ -18748,6 +18908,8 @@ var pt = {
18748
18908
  "downloads.format.unknown": "",
18749
18909
  "downloads.wfs.featuretype.not.found": "",
18750
18910
  dropFile: dropFile,
18911
+ "editor.record.publish": "",
18912
+ "editor.record.upToDate": "",
18751
18913
  "externalviewer.dataset.unnamed": "",
18752
18914
  "facets.block.title.OrgForResource": "",
18753
18915
  "facets.block.title.availableInServices": "",
@@ -18761,21 +18923,21 @@ var pt = {
18761
18923
  "facets.block.title.tag.default": "",
18762
18924
  "facets.block.title.th_regions_tree.default": "",
18763
18925
  "favorite.not.authenticated.tooltip": "",
18764
- "language.ca": "Català",
18765
- "language.cs": "Čeština",
18766
- "language.de": "Deutsch",
18767
- "language.en": "English",
18768
- "language.es": "Español",
18769
- "language.fi": "Suomi",
18770
- "language.fr": "Français",
18771
- "language.is": "Íslenska",
18926
+ "language.ca": "Catalão",
18927
+ "language.cs": "Tcheco",
18928
+ "language.de": "Alemão",
18929
+ "language.en": "Inglês",
18930
+ "language.es": "Espanhol",
18931
+ "language.fi": "Finlandês",
18932
+ "language.fr": "Francês",
18933
+ "language.is": "Islandês",
18772
18934
  "language.it": "Italiano",
18773
- "language.ko": "한국어",
18774
- "language.nl": "Nederlands",
18935
+ "language.ko": "Coreano",
18936
+ "language.nl": "Holandês",
18775
18937
  "language.pt": "Português",
18776
- "language.ru": "Русский",
18777
- "language.sk": "Slovenčina",
18778
- "language.zh": "中文",
18938
+ "language.ru": "Russo",
18939
+ "language.sk": "Eslovaco",
18940
+ "language.zh": "Chinês",
18779
18941
  "map.add.layer": "",
18780
18942
  "map.add.layer.catalog": "",
18781
18943
  "map.add.layer.file": "",
@@ -18826,17 +18988,20 @@ var pt = {
18826
18988
  "record.metadata.author": "",
18827
18989
  "record.metadata.catalog": "",
18828
18990
  "record.metadata.contact": "",
18991
+ "record.metadata.creation": "",
18829
18992
  "record.metadata.details": "",
18830
18993
  "record.metadata.download": "",
18831
18994
  "record.metadata.formats": "",
18832
18995
  "record.metadata.keywords": "",
18996
+ "record.metadata.languages": "",
18833
18997
  "record.metadata.lastUpdate": "",
18834
18998
  "record.metadata.links": "",
18835
18999
  "record.metadata.noUsage": "",
18836
- "record.metadata.origin": "",
18837
19000
  "record.metadata.otherConstraints": "",
18838
19001
  "record.metadata.owner": "",
18839
19002
  "record.metadata.preview": "",
19003
+ "record.metadata.producer": "",
19004
+ "record.metadata.publication": "",
18840
19005
  "record.metadata.publications": "",
18841
19006
  "record.metadata.quality": "",
18842
19007
  "record.metadata.quality.contact.failed": "",
@@ -18859,12 +19024,16 @@ var pt = {
18859
19024
  "record.metadata.related": "",
18860
19025
  "record.metadata.sheet": "",
18861
19026
  "record.metadata.status": "",
18862
- "record.metadata.themes": "",
19027
+ "record.metadata.technical": "",
19028
+ "record.metadata.temporalExtent": "",
19029
+ "record.metadata.temporalExtent.fromDateToDate": "",
19030
+ "record.metadata.temporalExtent.sinceDate": "",
19031
+ "record.metadata.temporalExtent.untilDate": "",
18863
19032
  "record.metadata.title": "",
19033
+ "record.metadata.topics": "",
18864
19034
  "record.metadata.type": "",
18865
19035
  "record.metadata.uniqueId": "",
18866
19036
  "record.metadata.updateFrequency": "",
18867
- "record.metadata.updateStatus": "",
18868
19037
  "record.metadata.updatedOn": "",
18869
19038
  "record.metadata.usage": "",
18870
19039
  "record.more.details": "",
@@ -18896,6 +19065,7 @@ var pt = {
18896
19065
  "search.filters.isSpatial": "",
18897
19066
  "search.filters.isSpatial.no": "",
18898
19067
  "search.filters.isSpatial.yes": "",
19068
+ "search.filters.keyword": "",
18899
19069
  "search.filters.license": "",
18900
19070
  "search.filters.license.cc-by": "",
18901
19071
  "search.filters.license.cc-by-sa": "",
@@ -19004,8 +19174,8 @@ class Gn4FieldMapper {
19004
19174
  },
19005
19175
  cl_topic: (output, source) => ({
19006
19176
  ...output,
19007
- themes: [
19008
- ...(output.themes || []),
19177
+ topics: [
19178
+ ...(output.topics || []),
19009
19179
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
19010
19180
  ],
19011
19181
  }),
@@ -19029,6 +19199,18 @@ class Gn4FieldMapper {
19029
19199
  ...output,
19030
19200
  recordUpdated: toDate(selectField(source, 'changeDate')),
19031
19201
  }),
19202
+ publicationDateForResource: (output, source) => ({
19203
+ ...output,
19204
+ recordPublished: toDate(selectField(source, 'publicationDateForResource')),
19205
+ }),
19206
+ resourceLanguage: (output, source) => {
19207
+ const langList = getAsArray(selectField(source, 'resourceLanguage'));
19208
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
19209
+ return {
19210
+ ...output,
19211
+ languages,
19212
+ };
19213
+ },
19032
19214
  link: (output, source) => {
19033
19215
  const rawLinks = getAsArray(selectField(source, 'link'));
19034
19216
  const distributions = rawLinks
@@ -19060,14 +19242,14 @@ class Gn4FieldMapper {
19060
19242
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19061
19243
  }, output);
19062
19244
  },
19063
- tag: (output, source) => ({
19245
+ allKeywords: (output, source) => ({
19064
19246
  ...output,
19065
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19247
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19066
19248
  }),
19067
19249
  inspireTheme: (output, source) => ({
19068
19250
  ...output,
19069
- themes: [
19070
- ...(output.themes || []),
19251
+ topics: [
19252
+ ...(output.topics || []),
19071
19253
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19072
19254
  ],
19073
19255
  }),
@@ -19121,8 +19303,8 @@ class Gn4FieldMapper {
19121
19303
  ],
19122
19304
  };
19123
19305
  },
19124
- resourceTemporalDateRange: (output, source) => {
19125
- const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19306
+ resourceTemporalExtentDateRange: (output, source) => {
19307
+ const ranges = getAsArray(selectField(source, 'resourceTemporalExtentDateRange'));
19126
19308
  return {
19127
19309
  ...output,
19128
19310
  temporalExtents: ranges.map((range) => {
@@ -19279,6 +19461,7 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19279
19461
  status: null,
19280
19462
  lineage: null,
19281
19463
  recordUpdated: null,
19464
+ recordPublished: null,
19282
19465
  ownerOrganization: null,
19283
19466
  licenses: [],
19284
19467
  legalConstraints: [],
@@ -19287,10 +19470,11 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19287
19470
  contacts: [],
19288
19471
  contactsForResource: [],
19289
19472
  keywords: [],
19290
- themes: [],
19473
+ topics: [],
19291
19474
  spatialExtents: [],
19292
19475
  temporalExtents: [],
19293
19476
  overviews: [],
19477
+ languages: [],
19294
19478
  };
19295
19479
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19296
19480
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -19450,7 +19634,7 @@ class ElasticsearchService {
19450
19634
  },
19451
19635
  };
19452
19636
  }
19453
- getRelatedRecordPayload(title, uuid, size = 6, _source = ES_SOURCE_SUMMARY) {
19637
+ getRelatedRecordPayload(title, uuid, size = 6, _source = [...ES_SOURCE_SUMMARY, 'allKeywords', 'createDate']) {
19454
19638
  return {
19455
19639
  query: {
19456
19640
  bool: {
@@ -20055,11 +20239,18 @@ class OrganizationsFromMetadataService {
20055
20239
  if (!allContactOrgs.length)
20056
20240
  return of(record);
20057
20241
  const ownerOrganization = allContactOrgs[0];
20058
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20242
+ // read the owner group as well to have a fallback logo
20243
+ const groupId = selectField(source, 'groupOwner');
20244
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20245
+ return group.id === Number(groupId);
20246
+ })));
20247
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20059
20248
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20249
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20060
20250
  return {
20061
20251
  ...record,
20062
20252
  ownerOrganization: {
20253
+ logoUrl,
20063
20254
  ...ownerOrganization,
20064
20255
  ...recordOrganisation,
20065
20256
  },
@@ -20370,12 +20561,21 @@ class Gn4PlatformMapper {
20370
20561
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20371
20562
  return { ...apiUser, id: id.toString() };
20372
20563
  }
20373
- thesaurusFromApi(thesaurus) {
20564
+ thesaurusFromApi(thesaurus, lang3) {
20374
20565
  return thesaurus.map((keyword) => {
20375
- const { uri, value } = keyword;
20566
+ let key = keyword.uri;
20567
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20568
+ if (key.indexOf('@@@') > -1) {
20569
+ key = key.split('@@@')[1];
20570
+ }
20571
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20572
+ const description = lang3 && lang3 in keyword.definitions
20573
+ ? keyword.definitions[lang3]
20574
+ : keyword.definition;
20376
20575
  return {
20377
- key: uri,
20378
- label: value,
20576
+ key,
20577
+ label,
20578
+ description,
20379
20579
  };
20380
20580
  });
20381
20581
  }
@@ -20388,13 +20588,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20388
20588
 
20389
20589
  const minApiVersion = '4.2.2';
20390
20590
  class Gn4PlatformService {
20391
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20591
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20392
20592
  this.siteApiService = siteApiService;
20393
20593
  this.meApi = meApi;
20394
20594
  this.usersApi = usersApi;
20395
20595
  this.mapper = mapper;
20396
20596
  this.toolsApiService = toolsApiService;
20397
20597
  this.registriesApiService = registriesApiService;
20598
+ this.langService = langService;
20398
20599
  this.type = 'GeoNetwork';
20399
20600
  this.keyTranslations$ = this.toolsApiService
20400
20601
  .getTranslationsPackage1('gnui')
@@ -20408,6 +20609,11 @@ class Gn4PlatformService {
20408
20609
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20409
20610
  }
20410
20611
  }), shareReplay(1));
20612
+ /**
20613
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20614
+ * @private
20615
+ */
20616
+ this.thesauri = {};
20411
20617
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20412
20618
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20413
20619
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20434,19 +20640,36 @@ class Gn4PlatformService {
20434
20640
  return this.users$;
20435
20641
  }
20436
20642
  translateKey(key) {
20643
+ // if the key is a URI, use the registries API to look for the translation
20644
+ if (key.match(/^https?:\/\//)) {
20645
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20646
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20647
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20648
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20649
+ for (const item of thesaurus) {
20650
+ if (item.key === key)
20651
+ return item.label;
20652
+ }
20653
+ return key;
20654
+ }));
20655
+ }
20437
20656
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20438
20657
  }
20439
- getThesaurusByLang(thesaurusName, lang) {
20440
- return this.registriesApiService
20441
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20442
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20658
+ getThesaurusByUri(uri) {
20659
+ if (this.thesauri[uri]) {
20660
+ return this.thesauri[uri];
20661
+ }
20662
+ this.thesauri[uri] = this.registriesApiService
20663
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20664
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20665
+ return this.thesauri[uri];
20443
20666
  }
20444
- 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 }], target: i0.ɵɵFactoryTarget.Injectable }); }
20667
+ 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 }); }
20445
20668
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20446
20669
  }
20447
20670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20448
20671
  type: Injectable
20449
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20672
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20450
20673
 
20451
20674
  function provideGn4() {
20452
20675
  return [
@@ -20482,7 +20705,7 @@ const MAP_FEATURE_KEY = 'map';
20482
20705
  const initialMapState = {
20483
20706
  layers: [],
20484
20707
  };
20485
- const reducer$2 = createReducer(initialMapState, on(addLayer, (state, action) => {
20708
+ const reducer$3 = createReducer(initialMapState, on(addLayer, (state, action) => {
20486
20709
  const layers = [...state.layers];
20487
20710
  const layerWithInfo = { ...action.layer, loading: false, error: null };
20488
20711
  if (!('atIndex' in action))
@@ -20531,7 +20754,7 @@ const reducer$2 = createReducer(initialMapState, on(addLayer, (state, action) =>
20531
20754
  : layer),
20532
20755
  })));
20533
20756
  function mapReducer(state, action) {
20534
- return reducer$2(state, action);
20757
+ return reducer$3(state, action);
20535
20758
  }
20536
20759
 
20537
20760
  // Lookup the 'Map' feature state managed by NgRx
@@ -20994,6 +21217,38 @@ function createFuzzyFilter(pattern) {
20994
21217
  };
20995
21218
  }
20996
21219
 
21220
+ function getTemporalRangeUnion(ranges) {
21221
+ let earliestStartDate = Infinity;
21222
+ let latestEndDate = -Infinity;
21223
+ if (ranges.length) {
21224
+ for (let i = 0; i < ranges.length; i++) {
21225
+ const rangeStart = ranges[i].start
21226
+ ? new Date(ranges[i].start).getTime()
21227
+ : -Infinity;
21228
+ const rangeEnd = ranges[i].end
21229
+ ? new Date(ranges[i].end).getTime()
21230
+ : Infinity;
21231
+ if (rangeStart < earliestStartDate) {
21232
+ earliestStartDate = rangeStart;
21233
+ }
21234
+ if (rangeEnd > latestEndDate) {
21235
+ latestEndDate = rangeEnd;
21236
+ }
21237
+ }
21238
+ return {
21239
+ start: earliestStartDate !== -Infinity
21240
+ ? new Date(earliestStartDate).toLocaleDateString()
21241
+ : undefined,
21242
+ end: latestEndDate !== Infinity
21243
+ ? new Date(latestEndDate).toLocaleDateString()
21244
+ : undefined,
21245
+ };
21246
+ }
21247
+ else {
21248
+ return undefined;
21249
+ }
21250
+ }
21251
+
20997
21252
  marker('downloads.wfs.featuretype.not.found');
20998
21253
  const FORMATS = {
20999
21254
  csv: {
@@ -22524,6 +22779,9 @@ class MapContextService {
22524
22779
  if (mapConfig) {
22525
22780
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22526
22781
  }
22782
+ else {
22783
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22784
+ }
22527
22785
  if (!mapContext.view?.extent &&
22528
22786
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22529
22787
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22634,6 +22892,11 @@ class MapContextService {
22634
22892
  }
22635
22893
  return view;
22636
22894
  }
22895
+ addDefaultBaselayerContext(layers) {
22896
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22897
+ ? layers
22898
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22899
+ }
22637
22900
  mergeMapConfigWithContext(mapContext, mapConfig) {
22638
22901
  return {
22639
22902
  ...mapContext,
@@ -23180,11 +23443,11 @@ class ThumbnailComponent {
23180
23443
  }
23181
23444
  }
23182
23445
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, deps: [{ token: THUMBNAIL_PLACEHOLDER, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
23183
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23446
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23184
23447
  }
23185
23448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23186
23449
  type: Component,
23187
- args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23450
+ args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23188
23451
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23189
23452
  type: Optional
23190
23453
  }, {
@@ -23312,8 +23575,7 @@ class MetadataQualityComponent {
23312
23575
  : this.calculatedQualityScore;
23313
23576
  }
23314
23577
  get calculatedQualityScore() {
23315
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23316
- this.items.length);
23578
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23317
23579
  }
23318
23580
  showMenu() {
23319
23581
  this.isMenuShown = true;
@@ -23331,7 +23593,7 @@ class MetadataQualityComponent {
23331
23593
  this.items = [];
23332
23594
  this.add('title', !!this.metadata?.title);
23333
23595
  this.add('description', !!this.metadata?.abstract);
23334
- this.add('topic', this.metadata?.themes?.length > 0);
23596
+ this.add('topic', this.metadata?.topics?.length > 0);
23335
23597
  this.add('keywords', this.metadata?.keywords?.length > 0);
23336
23598
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23337
23599
  this.add('organisation', !!contact?.organization);
@@ -23779,6 +24041,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23779
24041
  type: Input
23780
24042
  }] } });
23781
24043
 
24044
+ class MarkdownParserComponent {
24045
+ get parsedMarkdown() {
24046
+ return marked.parse(this.textContent);
24047
+ }
24048
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24049
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24050
+ }
24051
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24052
+ type: Component,
24053
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
24054
+ }], propDecorators: { textContent: [{
24055
+ type: Input
24056
+ }] } });
24057
+
23782
24058
  class ContentGhostComponent {
23783
24059
  constructor() {
23784
24060
  this.ghostClass = '';
@@ -23918,14 +24194,16 @@ class MaxLinesComponent {
23918
24194
  return result;
23919
24195
  }
23920
24196
  ngOnDestroy() {
24197
+ if (!this.observer)
24198
+ return;
23921
24199
  this.observer.unobserve(this.container.nativeElement.children[0]);
23922
24200
  }
23923
24201
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
23924
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24202
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23925
24203
  }
23926
24204
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, decorators: [{
23927
24205
  type: Component,
23928
- args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
24206
+ args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
23929
24207
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
23930
24208
  type: Input
23931
24209
  }], container: [{
@@ -23933,20 +24211,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23933
24211
  args: ['container']
23934
24212
  }] } });
23935
24213
 
23936
- class MarkdownParserComponent {
23937
- get parsedMarkdown() {
23938
- return marked.parse(this.textContent);
23939
- }
23940
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23941
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23942
- }
23943
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23944
- type: Component,
23945
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
23946
- }], propDecorators: { textContent: [{
23947
- type: Input
23948
- }] } });
23949
-
23950
24214
  class MetadataInfoComponent {
23951
24215
  constructor() {
23952
24216
  this.keyword = new EventEmitter();
@@ -23994,6 +24258,16 @@ class MetadataInfoComponent {
23994
24258
  return undefined;
23995
24259
  }
23996
24260
  }
24261
+ get temporalExtent() {
24262
+ const temporalExtents = this.metadata.temporalExtents;
24263
+ return getTemporalRangeUnion(temporalExtents);
24264
+ }
24265
+ get shownOrganization() {
24266
+ return this.metadata.ownerOrganization;
24267
+ }
24268
+ get resourceContact() {
24269
+ return this.metadata.contactsForResource?.[0];
24270
+ }
23997
24271
  fieldReady(propName) {
23998
24272
  return !this.incomplete || propName in this.metadata;
23999
24273
  }
@@ -24001,11 +24275,11 @@ class MetadataInfoComponent {
24001
24275
  this.keyword.emit(keyword);
24002
24276
  }
24003
24277
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24004
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24278
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24005
24279
  }
24006
24280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24007
24281
  type: Component,
24008
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24282
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24009
24283
  }], propDecorators: { metadata: [{
24010
24284
  type: Input
24011
24285
  }], incomplete: [{
@@ -24045,23 +24319,23 @@ class ButtonComponent {
24045
24319
  this.extraClass = '';
24046
24320
  this.buttonClick = new EventEmitter();
24047
24321
  }
24048
- // btn-classes are explicited to allow tailwind recognize them and add it in css.
24049
24322
  set type(value) {
24323
+ // btn-classes are written in full to be picked up by tailwind
24050
24324
  switch (value) {
24051
24325
  case 'primary':
24052
- this.btnClass = 'btn-primary';
24326
+ this.btnClass = 'gn-ui-btn-primary';
24053
24327
  break;
24054
24328
  case 'secondary':
24055
- this.btnClass = 'btn-secondary';
24329
+ this.btnClass = 'gn-ui-btn-secondary';
24056
24330
  break;
24057
24331
  case 'outline':
24058
- this.btnClass = 'btn-outline';
24332
+ this.btnClass = 'gn-ui-btn-outline';
24059
24333
  break;
24060
24334
  case 'light':
24061
- this.btnClass = 'btn-light';
24335
+ this.btnClass = 'gn-ui-btn-light';
24062
24336
  break;
24063
24337
  default:
24064
- this.btnClass = 'btn-default';
24338
+ this.btnClass = 'gn-ui-btn-default';
24065
24339
  break;
24066
24340
  }
24067
24341
  }
@@ -24074,11 +24348,11 @@ class ButtonComponent {
24074
24348
  propagateToDocumentOnly(event);
24075
24349
  }
24076
24350
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24077
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24351
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, isStandalone: true, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24078
24352
  }
24079
24353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24080
24354
  type: Component,
24081
- args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24355
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<button\n type=\"button\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n" }]
24082
24356
  }], propDecorators: { type: [{
24083
24357
  type: Input
24084
24358
  }], disabled: [{
@@ -24358,11 +24632,11 @@ class CarouselComponent {
24358
24632
  this.emblaApi.scrollTo(stepIndex);
24359
24633
  }
24360
24634
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24361
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24635
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24362
24636
  }
24363
24637
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24364
24638
  type: Component,
24365
- args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24639
+ args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24366
24640
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24367
24641
  type: Input
24368
24642
  }], stepsContainerClass: [{
@@ -24514,11 +24788,11 @@ class MetadataContactComponent {
24514
24788
  this.organizationClick.emit(this.shownOrganization);
24515
24789
  }
24516
24790
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24517
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\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: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24791
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\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: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24518
24792
  }
24519
24793
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24520
24794
  type: Component,
24521
- args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24795
+ args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24522
24796
  }], propDecorators: { metadata: [{
24523
24797
  type: Input
24524
24798
  }], organizationClick: [{
@@ -24742,11 +25016,11 @@ class DropdownSelectorComponent {
24742
25016
  }
24743
25017
  }
24744
25018
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24745
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"!p-[8px] !pl-[16px] flex flex-row w-full {{ extraBtnClass }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25019
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24746
25020
  }
24747
25021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24748
25022
  type: Component,
24749
- args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"!p-[8px] !pl-[16px] flex flex-row w-full {{ extraBtnClass }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
25023
+ args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
24750
25024
  }], propDecorators: { title: [{
24751
25025
  type: Input
24752
25026
  }], showTitle: [{
@@ -24922,11 +25196,11 @@ class DropdownMultiselectComponent {
24922
25196
  this.setFocus();
24923
25197
  }
24924
25198
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$6.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
24925
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25199
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24926
25200
  }
24927
25201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24928
25202
  type: Component,
24929
- args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
25203
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
24930
25204
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24931
25205
  type: Input
24932
25206
  }], choices: [{
@@ -25080,11 +25354,11 @@ class TextAreaComponent {
25080
25354
  this.rawChange.next(value);
25081
25355
  }
25082
25356
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25083
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, 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"] }); }
25357
+ 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"] }); }
25084
25358
  }
25085
25359
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25086
25360
  type: Component,
25087
- args: [{ selector: 'gn-ui-text-area', 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"] }]
25361
+ 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"] }]
25088
25362
  }], propDecorators: { value: [{
25089
25363
  type: Input
25090
25364
  }], placeholder: [{
@@ -25354,11 +25628,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25354
25628
 
25355
25629
  class NavigationButtonComponent {
25356
25630
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25357
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25631
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25358
25632
  }
25359
25633
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25360
25634
  type: Component,
25361
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n" }]
25635
+ args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
25362
25636
  }], propDecorators: { label: [{
25363
25637
  type: Input
25364
25638
  }], icon: [{
@@ -25491,7 +25765,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25491
25765
 
25492
25766
  class FormFieldComponent {
25493
25767
  set value(v) {
25494
- this.formControl.setValue(v);
25768
+ this.formControl.setValue(v, {
25769
+ emitEvent: false,
25770
+ });
25495
25771
  }
25496
25772
  constructor() {
25497
25773
  this.formControl = new FormControl();
@@ -25672,10 +25948,8 @@ class UiInputsModule {
25672
25948
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25673
25949
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25674
25950
  AutocompleteComponent,
25675
- ButtonComponent,
25676
25951
  TextInputComponent,
25677
25952
  DragAndDropFileInputComponent,
25678
- TextAreaComponent,
25679
25953
  ChipsInputComponent,
25680
25954
  NavigationButtonComponent,
25681
25955
  StarToggleComponent,
@@ -25708,7 +25982,9 @@ class UiInputsModule {
25708
25982
  MatInputModule,
25709
25983
  MatDatepickerModule,
25710
25984
  MatNativeDateModule,
25711
- EditableLabelDirective], exports: [DropdownSelectorComponent,
25985
+ EditableLabelDirective,
25986
+ TextAreaComponent,
25987
+ ButtonComponent], exports: [DropdownSelectorComponent,
25712
25988
  AutocompleteComponent,
25713
25989
  ButtonComponent,
25714
25990
  TextInputComponent,
@@ -25750,10 +26026,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25750
26026
  declarations: [
25751
26027
  DropdownSelectorComponent,
25752
26028
  AutocompleteComponent,
25753
- ButtonComponent,
25754
26029
  TextInputComponent,
25755
26030
  DragAndDropFileInputComponent,
25756
- TextAreaComponent,
25757
26031
  ChipsInputComponent,
25758
26032
  NavigationButtonComponent,
25759
26033
  StarToggleComponent,
@@ -25792,6 +26066,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25792
26066
  MatDatepickerModule,
25793
26067
  MatNativeDateModule,
25794
26068
  EditableLabelDirective,
26069
+ TextAreaComponent,
26070
+ ButtonComponent,
25795
26071
  ],
25796
26072
  exports: [
25797
26073
  DropdownSelectorComponent,
@@ -26013,7 +26289,6 @@ class UiElementsModule {
26013
26289
  PaginationButtonsComponent,
26014
26290
  MaxLinesComponent,
26015
26291
  RecordApiFormComponent,
26016
- MarkdownParserComponent,
26017
26292
  ImageOverlayPreviewComponent], imports: [CommonModule,
26018
26293
  MatIconModule,
26019
26294
  MatTooltipModule,
@@ -26022,7 +26297,8 @@ class UiElementsModule {
26022
26297
  RouterModule,
26023
26298
  UiInputsModule,
26024
26299
  FormsModule,
26025
- NgOptimizedImage], exports: [MetadataInfoComponent,
26300
+ NgOptimizedImage,
26301
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
26026
26302
  ContentGhostComponent,
26027
26303
  DownloadItemComponent,
26028
26304
  DownloadsListComponent,
@@ -26069,6 +26345,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26069
26345
  UiInputsModule,
26070
26346
  FormsModule,
26071
26347
  NgOptimizedImage,
26348
+ MarkdownParserComponent,
26072
26349
  ],
26073
26350
  declarations: [
26074
26351
  MetadataInfoComponent,
@@ -26091,7 +26368,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26091
26368
  PaginationButtonsComponent,
26092
26369
  MaxLinesComponent,
26093
26370
  RecordApiFormComponent,
26094
- MarkdownParserComponent,
26095
26371
  ImageOverlayPreviewComponent,
26096
26372
  ],
26097
26373
  exports: [
@@ -26495,7 +26771,7 @@ const initSearch = () => {
26495
26771
  const initialState = {
26496
26772
  [DEFAULT_SEARCH_KEY]: initSearch(),
26497
26773
  };
26498
- function reducer$1(state = initialState, action) {
26774
+ function reducer$2(state = initialState, action) {
26499
26775
  const { id } = action;
26500
26776
  if (id) {
26501
26777
  let stateSearch = state[id] || initSearch();
@@ -27437,11 +27713,11 @@ class FavoriteStarComponent {
27437
27713
  });
27438
27714
  }
27439
27715
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, deps: [{ token: FavoritesService }, { token: PlatformServiceInterface }, { token: i0.ChangeDetectorRef }, { token: AuthService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
27440
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27716
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27441
27717
  }
27442
27718
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27443
27719
  type: Component,
27444
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27720
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27445
27721
  }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27446
27722
  type: Input
27447
27723
  }], record: [{
@@ -27730,10 +28006,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27730
28006
  class AbstractSearchField {
27731
28007
  }
27732
28008
  class SimpleSearchField {
27733
- constructor(esFieldName, order = 'asc', injector) {
28009
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27734
28010
  this.esFieldName = esFieldName;
27735
- this.order = order;
27736
28011
  this.injector = injector;
28012
+ this.order = order;
28013
+ this.orderType = orderType;
27737
28014
  this.repository = this.injector.get(RecordsRepositoryInterface);
27738
28015
  // FIXME: this is required to register runtime fields; abstract this as well
27739
28016
  this.esService = this.injector.get(ElasticsearchService);
@@ -27744,12 +28021,12 @@ class SimpleSearchField {
27744
28021
  type: 'terms',
27745
28022
  field: this.esFieldName,
27746
28023
  limit: 1000,
27747
- sort: [this.order, 'key'],
28024
+ sort: [this.order, this.orderType],
27748
28025
  },
27749
28026
  };
27750
28027
  }
27751
28028
  async getBucketLabel(bucket) {
27752
- return bucket.term;
28029
+ return bucket.term.toString();
27753
28030
  }
27754
28031
  getAvailableValues() {
27755
28032
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27777,9 +28054,13 @@ class SimpleSearchField {
27777
28054
  return of(values);
27778
28055
  }
27779
28056
  }
27780
- class KeySearchField extends SimpleSearchField {
27781
- constructor() {
27782
- super(...arguments);
28057
+ class TranslatedSearchField extends SimpleSearchField {
28058
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28059
+ super(esFieldName, injector, order, orderType);
28060
+ this.esFieldName = esFieldName;
28061
+ this.injector = injector;
28062
+ this.order = order;
28063
+ this.orderType = orderType;
27783
28064
  this.platformService = this.injector.get(PlatformServiceInterface);
27784
28065
  }
27785
28066
  async getTranslation(key) {
@@ -27789,26 +28070,36 @@ class KeySearchField extends SimpleSearchField {
27789
28070
  return (await this.getTranslation(bucket.term)) || bucket.term;
27790
28071
  }
27791
28072
  getAvailableValues() {
28073
+ if (this.orderType === 'count')
28074
+ return super.getAvailableValues();
27792
28075
  // sort values by alphabetical order
27793
28076
  return super
27794
28077
  .getAvailableValues()
27795
28078
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27796
28079
  }
27797
28080
  }
27798
- class ThesaurusField extends KeySearchField {
27799
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27800
- super(esFieldName, order, injector);
27801
- this.thesaurusName = thesaurusName;
28081
+ /**
28082
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
28083
+ * to the defined METADATA_LANGUAGE token
28084
+ * The provided ES field name should not include any prefix such as `.langeng`
28085
+ */
28086
+ class MultilingualSearchField extends SimpleSearchField {
28087
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28088
+ super(esFieldName, injector, order, orderType);
28089
+ this.esFieldName = esFieldName;
28090
+ this.injector = injector;
28091
+ this.order = order;
28092
+ this.orderType = orderType;
27802
28093
  this.langService = this.injector.get(LangService);
27803
- this.thesaurus$ = this.platformService
27804
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27805
- .pipe(catchError(() => {
27806
- console.warn('Error while loading thesaurus language package');
27807
- return of([]);
27808
- }), shareReplay(1));
27809
- }
27810
- async getTranslation(key) {
27811
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
28094
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
28095
+ // note: we're excluding the metadata language "current" value because that would produce
28096
+ // permalinks that might not work for different users
28097
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
28098
+ this.esFieldName += `.lang${this.searchLanguage}`;
28099
+ }
28100
+ else {
28101
+ this.esFieldName += '.default';
28102
+ }
27812
28103
  }
27813
28104
  }
27814
28105
  class FullTextSearchField {
@@ -27828,7 +28119,7 @@ marker('search.filters.isSpatial.yes');
27828
28119
  marker('search.filters.isSpatial.no');
27829
28120
  class IsSpatialSearchField extends SimpleSearchField {
27830
28121
  constructor(injector) {
27831
- super('isSpatial', 'asc', injector);
28122
+ super('isSpatial', injector, 'asc');
27832
28123
  this.translateService = this.injector.get(TranslateService);
27833
28124
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27834
28125
  String formats = doc.format.join('|').toLowerCase();
@@ -27878,7 +28169,7 @@ marker('search.filters.license.unknown');
27878
28169
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27879
28170
  class LicenseSearchField extends SimpleSearchField {
27880
28171
  constructor(injector) {
27881
- super('license', 'asc', injector);
28172
+ super('license', injector, 'asc');
27882
28173
  this.translateService = this.injector.get(TranslateService);
27883
28174
  this.esService.registerRuntimeField('license', `String raw = '';
27884
28175
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -27962,7 +28253,7 @@ class OrganizationSearchField {
27962
28253
  }
27963
28254
  class OwnerSearchField extends SimpleSearchField {
27964
28255
  constructor(injector) {
27965
- super('owner', 'asc', injector);
28256
+ super('owner', injector, 'asc');
27966
28257
  }
27967
28258
  getAvailableValues() {
27968
28259
  return of([]);
@@ -27971,6 +28262,7 @@ class OwnerSearchField extends SimpleSearchField {
27971
28262
 
27972
28263
  marker('search.filters.format');
27973
28264
  marker('search.filters.inspireKeyword');
28265
+ marker('search.filters.keyword');
27974
28266
  marker('search.filters.isSpatial');
27975
28267
  marker('search.filters.license');
27976
28268
  marker('search.filters.publicationYear');
@@ -27988,13 +28280,14 @@ class FieldsService {
27988
28280
  this.injector = injector;
27989
28281
  this.fields = {
27990
28282
  publisher: new OrganizationSearchField(this.injector),
27991
- format: new SimpleSearchField('format', 'asc', this.injector),
27992
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
27993
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
27994
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
27995
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
27996
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
27997
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28283
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28284
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28285
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28286
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28287
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28288
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28289
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28290
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
27998
28291
  isSpatial: new IsSpatialSearchField(this.injector),
27999
28292
  q: new FullTextSearchField(),
28000
28293
  license: new LicenseSearchField(this.injector),
@@ -28102,7 +28395,7 @@ class FeatureSearchModule {
28102
28395
  },
28103
28396
  ], imports: [CommonModule,
28104
28397
  TranslateModule.forChild(),
28105
- StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$1, {
28398
+ StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
28106
28399
  initialState,
28107
28400
  }),
28108
28401
  EffectsModule.forFeature([SearchEffects]),
@@ -28132,7 +28425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28132
28425
  imports: [
28133
28426
  CommonModule,
28134
28427
  TranslateModule.forChild(),
28135
- StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$1, {
28428
+ StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
28136
28429
  initialState,
28137
28430
  }),
28138
28431
  EffectsModule.forFeature([SearchEffects]),
@@ -28905,7 +29198,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28905
29198
  const { metadata, related, ...stateWithoutMd } = state;
28906
29199
  return stateWithoutMd;
28907
29200
  }));
28908
- function reducer(state, action) {
29201
+ function reducer$1(state, action) {
28909
29202
  return mdViewReducer(state, action);
28910
29203
  }
28911
29204
 
@@ -30855,11 +31148,11 @@ class LanguageSwitcherComponent {
30855
31148
  this.translate.use(value);
30856
31149
  }
30857
31150
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30858
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
31151
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
30859
31152
  }
30860
31153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30861
31154
  type: Component,
30862
- args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
31155
+ args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n" }]
30863
31156
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30864
31157
  type: Optional
30865
31158
  }, {
@@ -31186,18 +31479,18 @@ class DataViewPermalinkComponent {
31186
31479
  if (config) {
31187
31480
  const { aggregation, xProperty, yProperty, chartType } = config;
31188
31481
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
31189
- url.search = `?v=${this.version}
31190
- &e=gn-dataset-view-chart
31191
- &a=api-url=${this.config.basePath}
31192
- &a=dataset-id=${metadata.uniqueIdentifier}
31193
- &a=primary-color=%230f4395
31194
- &a=secondary-color=%238bc832
31195
- &a=main-color=%23555
31196
- &a=background-color=%23fdfbff
31197
- &a=aggregation=${aggregation}
31198
- &a=x-property=${xProperty}
31199
- &a=y-property=${yProperty}
31200
- &a=chart-type=${chartType}`;
31482
+ url.searchParams.set('v', `${this.version}`);
31483
+ url.searchParams.append('e', `gn-dataset-view-chart`);
31484
+ url.searchParams.append('a', `api-url=${this.config.basePath}`);
31485
+ url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
31486
+ url.searchParams.append('a', `primary-color=#0f4395`);
31487
+ url.searchParams.append('a', `secondary-color=#8bc832`);
31488
+ url.searchParams.append('a', `main-color=#555`);
31489
+ url.searchParams.append('a', `background-color=#fdfbff`);
31490
+ url.searchParams.append('a', `aggregation=${aggregation}`);
31491
+ url.searchParams.append('a', `x-property=${xProperty}`);
31492
+ url.searchParams.append('a', `y-property=${yProperty}`);
31493
+ url.searchParams.append('a', `chart-type=${chartType}`);
31201
31494
  return url.toString();
31202
31495
  }
31203
31496
  return '';
@@ -31304,7 +31597,7 @@ class FeatureRecordModule {
31304
31597
  DataViewWebComponentComponent,
31305
31598
  DataViewShareComponent] }); }
31306
31599
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureRecordModule, providers: [MdViewFacade], imports: [CommonModule,
31307
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
31600
+ StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
31308
31601
  EffectsModule.forFeature([MdViewEffects]),
31309
31602
  UiLayoutModule,
31310
31603
  FeatureMapModule,
@@ -31332,7 +31625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31332
31625
  ],
31333
31626
  imports: [
31334
31627
  CommonModule,
31335
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
31628
+ StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
31336
31629
  EffectsModule.forFeature([MdViewEffects]),
31337
31630
  UiLayoutModule,
31338
31631
  FeatureMapModule,
@@ -31358,6 +31651,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31358
31651
  }]
31359
31652
  }] });
31360
31653
 
31654
+ const openRecord = createAction('[Editor] Open record', props());
31655
+ const updateRecordField = createAction('[Editor] Update record field', props());
31656
+ const markRecordAsChanged = createAction('[Editor] Mark record as changed');
31657
+ const saveRecord = createAction('[Editor] Save record');
31658
+ const saveRecordSuccess = createAction('[Editor] Save record success');
31659
+ const saveRecordFailure = createAction('[Editor] Save record failure', props());
31660
+
31661
+ const DEFAULT_FIELDS = [
31662
+ {
31663
+ model: 'title',
31664
+ formFieldConfig: {
31665
+ labelKey: 'Metadata title',
31666
+ type: 'text',
31667
+ },
31668
+ },
31669
+ {
31670
+ model: 'abstract',
31671
+ formFieldConfig: {
31672
+ labelKey: 'Abstract',
31673
+ type: 'rich',
31674
+ },
31675
+ },
31676
+ {
31677
+ model: 'uniqueIdentifier',
31678
+ formFieldConfig: {
31679
+ labelKey: 'Unique identifier',
31680
+ type: 'text',
31681
+ locked: true,
31682
+ },
31683
+ },
31684
+ {
31685
+ model: 'recordUpdated',
31686
+ formFieldConfig: {
31687
+ labelKey: 'Record Updated',
31688
+ type: 'text',
31689
+ locked: true,
31690
+ },
31691
+ onSaveProcess: '${dateNow()}',
31692
+ },
31693
+ ];
31694
+
31695
+ const EDITOR_FEATURE_KEY = 'editor';
31696
+ const initialEditorState = {
31697
+ record: null,
31698
+ saving: false,
31699
+ saveError: null,
31700
+ changedSinceSave: false,
31701
+ fieldsConfig: DEFAULT_FIELDS,
31702
+ };
31703
+ const reducer = createReducer(initialEditorState, on(openRecord, (state, { record }) => ({
31704
+ ...state,
31705
+ changedSinceSave: false,
31706
+ record,
31707
+ })), on(saveRecord, (state) => ({
31708
+ ...state,
31709
+ saving: true,
31710
+ saveError: null,
31711
+ })), on(saveRecordSuccess, (state) => ({
31712
+ ...state,
31713
+ saving: false,
31714
+ saveError: null,
31715
+ changedSinceSave: false,
31716
+ })), on(saveRecordFailure, (state, { error }) => ({
31717
+ ...state,
31718
+ saving: false,
31719
+ saveError: error,
31720
+ })), on(updateRecordField, (state, { field, value }) => ({
31721
+ ...state,
31722
+ record: {
31723
+ ...state.record,
31724
+ [field]: value,
31725
+ },
31726
+ })), on(markRecordAsChanged, (state) => ({
31727
+ ...state,
31728
+ changedSinceSave: true,
31729
+ })));
31730
+ function editorReducer(state, action) {
31731
+ return reducer(state, action);
31732
+ }
31733
+
31734
+ const selectEditorState = createFeatureSelector(EDITOR_FEATURE_KEY);
31735
+ const selectRecord = createSelector(selectEditorState, (state) => state.record);
31736
+ const selectRecordSaving = createSelector(selectEditorState, (state) => state.saving);
31737
+ const selectRecordSaveError = createSelector(selectEditorState, (state) => state.saveError);
31738
+ const selectRecordChangedSinceSave = createSelector(selectEditorState, (state) => state.changedSinceSave);
31739
+ const selectRecordFieldsConfig = createSelector(selectEditorState, (state) => state.fieldsConfig);
31740
+ const selectRecordFields = createSelector(selectEditorState, (state) => state.fieldsConfig.map((fieldConfig) => ({
31741
+ config: fieldConfig,
31742
+ value: state.record?.[fieldConfig.model] || null,
31743
+ })));
31744
+
31745
+ class EditorFacade {
31746
+ constructor() {
31747
+ this.store = inject(Store);
31748
+ this.record$ = this.store.pipe(select(selectRecord));
31749
+ this.saving$ = this.store.pipe(select(selectRecordSaving));
31750
+ this.saveError$ = this.store.pipe(select(selectRecordSaveError));
31751
+ this.changedSinceSave$ = this.store.pipe(select(selectRecordChangedSinceSave));
31752
+ this.recordFields$ = this.store.pipe(select(selectRecordFields));
31753
+ }
31754
+ openRecord(record) {
31755
+ this.store.dispatch(openRecord({ record }));
31756
+ }
31757
+ saveRecord() {
31758
+ this.store.dispatch(saveRecord());
31759
+ }
31760
+ updateRecordField(field, value) {
31761
+ this.store.dispatch(updateRecordField({ field, value }));
31762
+ }
31763
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31764
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorFacade }); }
31765
+ }
31766
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorFacade, decorators: [{
31767
+ type: Injectable
31768
+ }] });
31769
+
31361
31770
  class WizardService {
31362
31771
  constructor(translateService) {
31363
31772
  this.translateService = translateService;
@@ -31719,6 +32128,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31719
32128
  args: [{ selector: 'gn-ui-wizard-summarize', template: "<div>\n <div class=\"text-2xl font-bold title\">\n {{ title | uppercase }}\n </div>\n <div class=\"text-lg font-bold pt-2 abstract\">\n {{ abstract }}\n </div>\n <div class=\"text-lg font-normal\">\n <span translate>datafeeder.wizardSummarize.createdAt</span>\n &nbsp;<span class=\"date\">{{ createdDate }}</span> -\n <span translate>datafeeder.wizardSummarize.scale</span>\n &nbsp;<span class=\"scale\">{{ scale }}</span>\n </div>\n <div class=\"text-lg italic font-normal description\">\n {{ description }}\n </div>\n <div class=\"text-sm font-medium pt-4 tags\">\n <span class=\"icon-tag pr-2\"></span>\n {{ tags }}\n </div>\n</div>\n", styles: [".icon-tag:before{font-size:18px}\n"] }]
31720
32129
  }], ctorParameters: function () { return [{ type: WizardService }, { type: i1$1.TranslateService }]; } });
31721
32130
 
32131
+ function evaluate(expression) {
32132
+ if (expression.match(/^\${.*}$/)) {
32133
+ return evaluate(expression.slice(2, -1));
32134
+ }
32135
+ const operator = expression.split('(')[0];
32136
+ switch (operator) {
32137
+ case 'dateNow':
32138
+ return () => new Date();
32139
+ default:
32140
+ throw new Error(`Unknown operator: ${operator}`);
32141
+ }
32142
+ }
32143
+
32144
+ class EditorService {
32145
+ constructor(http, apiConfiguration) {
32146
+ this.http = http;
32147
+ this.apiConfiguration = apiConfiguration;
32148
+ this.apiUrl = `${this.apiConfiguration?.basePath || '/geonetwork/srv/api'}`;
32149
+ }
32150
+ // TODO: use the catalog repository instead
32151
+ loadRecordByUuid(uuid) {
32152
+ return this.http
32153
+ .get(`${this.apiUrl}/records/${uuid}/formatters/xml`, {
32154
+ responseType: 'text',
32155
+ headers: {
32156
+ Accept: 'application/xml',
32157
+ },
32158
+ })
32159
+ .pipe(map$1((response) => toModel(response.toString())));
32160
+ }
32161
+ // returns the record as it was when saved
32162
+ saveRecord(record, fieldsConfig) {
32163
+ const savedRecord = { ...record };
32164
+ // run onSave processes
32165
+ for (const field of fieldsConfig) {
32166
+ if (field.onSaveProcess && field.model) {
32167
+ const evaluator = evaluate(field.onSaveProcess);
32168
+ savedRecord[field.model] = evaluator({
32169
+ config: field,
32170
+ value: record[field.model],
32171
+ });
32172
+ }
32173
+ }
32174
+ // TODO: use the catalog repository instead
32175
+ return this.http
32176
+ .put(`${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`, toXml(savedRecord), {
32177
+ headers: {
32178
+ 'Content-Type': 'application/xml',
32179
+ },
32180
+ withCredentials: true,
32181
+ })
32182
+ .pipe(map$1(() => savedRecord));
32183
+ }
32184
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, deps: [{ token: i1.HttpClient }, { token: Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
32185
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, providedIn: 'root' }); }
32186
+ }
32187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, decorators: [{
32188
+ type: Injectable,
32189
+ args: [{
32190
+ providedIn: 'root',
32191
+ }]
32192
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: Configuration, decorators: [{
32193
+ type: Optional
32194
+ }, {
32195
+ type: Inject,
32196
+ args: [Configuration]
32197
+ }] }]; } });
32198
+
32199
+ class EditorEffects {
32200
+ constructor() {
32201
+ this.actions$ = inject(Actions);
32202
+ this.editorService = inject(EditorService);
32203
+ this.store = inject(Store);
32204
+ this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordFieldsConfig)), switchMap$1(([, record, fieldsConfig]) => this.editorService.saveRecord(record, fieldsConfig).pipe(switchMap$1((newRecord) => of(saveRecordSuccess(), openRecord({ record: newRecord }))), catchError((error) => of(saveRecordFailure({
32205
+ error: error.message,
32206
+ })))))));
32207
+ this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField), map$1(() => markRecordAsChanged())));
32208
+ }
32209
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
32210
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects }); }
32211
+ }
32212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, decorators: [{
32213
+ type: Injectable
32214
+ }] });
32215
+
31722
32216
  class FeatureEditorModule {
31723
32217
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31724
32218
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, declarations: [WizardComponent,
@@ -31729,8 +32223,8 @@ class FeatureEditorModule {
31729
32223
  MatNativeDateModule,
31730
32224
  MatFormFieldModule,
31731
32225
  HttpClientModule,
31732
- HttpClientXsrfModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
31733
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, imports: [CommonModule,
32226
+ HttpClientXsrfModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
32227
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade], imports: [CommonModule,
31734
32228
  UiInputsModule,
31735
32229
  UiWidgetsModule,
31736
32230
  TranslateModule.forChild(),
@@ -31738,7 +32232,9 @@ class FeatureEditorModule {
31738
32232
  MatNativeDateModule,
31739
32233
  MatFormFieldModule,
31740
32234
  HttpClientModule,
31741
- HttpClientXsrfModule] }); }
32235
+ HttpClientXsrfModule,
32236
+ StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
32237
+ EffectsModule.forFeature([EditorEffects])] }); }
31742
32238
  }
31743
32239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, decorators: [{
31744
32240
  type: NgModule,
@@ -31758,105 +32254,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31758
32254
  MatFormFieldModule,
31759
32255
  HttpClientModule,
31760
32256
  HttpClientXsrfModule,
32257
+ StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
32258
+ EffectsModule.forFeature([EditorEffects]),
31761
32259
  ],
31762
32260
  exports: [WizardComponent, WizardSummarizeComponent],
32261
+ providers: [EditorFacade],
31763
32262
  }]
31764
32263
  }] });
31765
32264
 
31766
- class EditorService {
31767
- constructor(http, apiConfiguration) {
31768
- this.http = http;
31769
- this.apiConfiguration = apiConfiguration;
31770
- this.record$ = new BehaviorSubject(null);
31771
- this.fieldsConfig = [
31772
- {
31773
- model: 'title',
31774
- labelKey: 'Metadata title',
31775
- type: 'text',
31776
- },
31777
- {
31778
- model: 'abstract',
31779
- labelKey: 'Abstract',
31780
- type: 'rich',
31781
- },
31782
- {
31783
- model: 'uniqueIdentifier',
31784
- labelKey: 'Unique identifier',
31785
- type: 'text',
31786
- locked: true,
31787
- },
31788
- ];
31789
- this.apiUrl = `${this.apiConfiguration?.basePath || '/geonetwork/srv/api'}`;
31790
- this.fields$ = this.record$.pipe(map$1((record) => this.fieldsConfig.map((fieldConfig) => ({
31791
- config: fieldConfig,
31792
- value: record?.[fieldConfig.model] || null,
31793
- }))));
31794
- this.saving$ = new BehaviorSubject(false);
31795
- }
31796
- loadRecordByUuid(uuid) {
31797
- return this.http
31798
- .get(`${this.apiUrl}/records/${uuid}/formatters/xml`, {
31799
- responseType: 'text',
31800
- headers: {
31801
- Accept: 'application/xml',
31802
- },
31803
- })
31804
- .pipe(map$1((response) => toModel(response.toString())));
31805
- }
31806
- saveCurrentRecord() {
31807
- return this.record$.pipe(take(1), tap$1((record) => {
31808
- if (!record)
31809
- throw new Error('Save record failed: no record currently open');
31810
- this.saving$.next(true);
31811
- }), switchMap$1((record) => this.http.put(`${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`, toXml(record), {
31812
- headers: {
31813
- 'Content-Type': 'application/xml',
31814
- },
31815
- withCredentials: true,
31816
- })), map$1(() => undefined), finalize(() => {
31817
- this.saving$.next(false);
31818
- }));
31819
- }
31820
- setCurrentRecord(record) {
31821
- this.record$.next(record);
31822
- }
31823
- updateRecordField(fieldName, value) {
31824
- this.record$
31825
- .pipe(take(1), map$1((record) => ({ ...record, [fieldName]: value })))
31826
- .subscribe((record) => this.record$.next(record));
31827
- }
31828
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, deps: [{ token: i1.HttpClient }, { token: Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
31829
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, providedIn: 'root' }); }
31830
- }
31831
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, decorators: [{
31832
- type: Injectable,
31833
- args: [{
31834
- providedIn: 'root',
31835
- }]
31836
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: Configuration, decorators: [{
31837
- type: Optional
31838
- }, {
31839
- type: Inject,
31840
- args: [Configuration]
31841
- }] }]; } });
31842
-
31843
32265
  class RecordFormComponent {
31844
- constructor(editorService) {
31845
- this.editorService = editorService;
32266
+ constructor(facade) {
32267
+ this.facade = facade;
32268
+ this.fields$ = this.facade.recordFields$;
31846
32269
  }
31847
- handleFieldValueChange(fieldName, value) {
31848
- this.editorService.updateRecordField(fieldName, value);
32270
+ handleFieldValueChange(field, newValue) {
32271
+ if (!field.config.model) {
32272
+ return;
32273
+ }
32274
+ this.facade.updateRecordField(field.config.model, newValue);
31849
32275
  }
31850
32276
  fieldTracker(index, field) {
31851
32277
  return field.config.model;
31852
32278
  }
31853
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31854
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32279
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
32280
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, 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 [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\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: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31855
32281
  }
31856
32282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31857
32283
  type: Component,
31858
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n" }]
31859
- }], ctorParameters: function () { return [{ type: EditorService }]; } });
32284
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], 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 [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n" }]
32285
+ }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
31860
32286
 
31861
32287
  const ROUTER_STATE_KEY = 'router';
31862
32288
  const ROUTER_ROUTE_SEARCH = 'search';
@@ -32223,5 +32649,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32223
32649
  * Generated bundle index. Do not edit.
32224
32650
  */
32225
32651
 
32226
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32652
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, editorReducer, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer, updateRecordField };
32227
32653
  //# sourceMappingURL=geonetwork-ui.mjs.map