geonetwork-ui 2.2.0-dev.cbcafed5 → 2.2.0-dev.da2c1f8f

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 (222) 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 +64 -61
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +7 -4
  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 +25 -17
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +55 -23
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +52 -32
  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 +47 -22
  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/ui/widgets/src/lib/badge/badge.component.mjs +3 -3
  52. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +18 -1
  53. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  54. package/esm2022/libs/util/shared/src/lib/utils/temporal-extent-union.mjs +32 -0
  55. package/esm2022/translations/de.json +37 -27
  56. package/esm2022/translations/en.json +32 -22
  57. package/esm2022/translations/es.json +27 -17
  58. package/esm2022/translations/fr.json +50 -40
  59. package/esm2022/translations/it.json +44 -34
  60. package/esm2022/translations/nl.json +28 -18
  61. package/esm2022/translations/pt.json +27 -17
  62. package/fesm2022/geonetwork-ui.mjs +972 -527
  63. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  64. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +2 -0
  65. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  67. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  68. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  69. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +4 -5
  70. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  71. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  72. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  73. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  74. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +7 -6
  75. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  76. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +4 -3
  77. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  78. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  79. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  80. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  81. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  82. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  83. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  84. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +21 -12
  85. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  86. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  87. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  88. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  89. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  90. package/libs/feature/editor/src/index.d.ts +5 -0
  91. package/libs/feature/editor/src/index.d.ts.map +1 -1
  92. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +23 -0
  93. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -0
  94. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +15 -0
  95. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -0
  96. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +19 -0
  97. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -0
  98. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +2 -0
  99. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -0
  100. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +18 -0
  101. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -0
  102. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +15 -0
  103. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -0
  104. package/libs/feature/editor/src/lib/expressions.d.ts +4 -0
  105. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -0
  106. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +3 -1
  107. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  108. package/libs/feature/editor/src/lib/fields.config.d.ts +3 -0
  109. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -0
  110. package/libs/feature/editor/src/lib/models/fields.model.d.ts +15 -0
  111. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +1 -0
  112. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts +10 -5
  113. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  114. package/libs/feature/editor/src/lib/services/editor.service.d.ts +3 -13
  115. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  116. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  117. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  118. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  119. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  120. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  121. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  122. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  123. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +1 -1
  124. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +16 -6
  125. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  126. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  127. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  128. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  129. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  130. package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +1 -1
  131. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts +0 -1
  132. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +1 -1
  133. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  134. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  135. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -40
  136. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +1 -1
  137. package/libs/util/i18n/src/lib/i18n.constants.d.ts +17 -0
  138. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  139. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  140. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  141. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +5 -0
  142. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -0
  143. package/package.json +1 -1
  144. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +63 -8
  145. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +57 -9
  146. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +229 -24
  147. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +29 -0
  148. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +99 -76
  149. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +6 -3
  150. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +4 -5
  151. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  152. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +30 -21
  153. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +120 -63
  154. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +177 -97
  155. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -1
  156. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  157. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  158. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  159. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +25 -14
  160. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  161. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  162. package/src/libs/common/fixtures/src/lib/elasticsearch/full-response.ts +1 -1
  163. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  164. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +52 -10
  165. package/src/libs/feature/editor/src/index.ts +5 -0
  166. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +24 -0
  167. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +49 -0
  168. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +30 -0
  169. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +1 -0
  170. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +68 -0
  171. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +39 -0
  172. package/src/libs/feature/editor/src/lib/expressions.ts +16 -0
  173. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +11 -0
  174. package/src/libs/feature/editor/src/lib/fields.config.ts +35 -0
  175. package/src/libs/feature/editor/src/lib/models/fields.model.ts +29 -0
  176. package/src/libs/feature/editor/src/lib/record-form/record-form.component.html +9 -7
  177. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +11 -5
  178. package/src/libs/feature/editor/src/lib/services/editor.service.ts +34 -73
  179. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  180. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +12 -12
  181. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  182. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  183. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  184. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  185. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  186. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  187. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  188. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  189. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  190. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.html +5 -1
  191. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.ts +1 -0
  192. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  193. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +169 -52
  194. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +51 -15
  195. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  196. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  197. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  198. package/src/libs/ui/inputs/src/lib/button/button.component.css +0 -5
  199. package/src/libs/ui/inputs/src/lib/button/button.component.html +0 -1
  200. package/src/libs/ui/inputs/src/lib/button/button.component.ts +7 -6
  201. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  202. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +3 -1
  203. package/src/libs/ui/inputs/src/lib/form-field/form-field.component.ts +3 -1
  204. package/src/libs/ui/inputs/src/lib/form-field/form-field.model.ts +0 -1
  205. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  206. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  207. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  208. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  209. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -0
  210. package/src/libs/ui/widgets/src/lib/badge/badge.component.html +3 -1
  211. package/src/libs/util/i18n/src/lib/i18n.constants.ts +18 -0
  212. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  213. package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +32 -0
  214. package/tailwind.base.css +44 -15
  215. package/translations/de.json +37 -27
  216. package/translations/en.json +32 -22
  217. package/translations/es.json +27 -17
  218. package/translations/fr.json +50 -40
  219. package/translations/it.json +44 -34
  220. package/translations/nl.json +28 -18
  221. package/translations/pt.json +27 -17
  222. 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
  }
@@ -649,28 +663,32 @@ function extractStatus() {
649
663
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
650
664
  }
651
665
  // from gmd:resourceConstraints
652
- function extractAccessConstraints() {
653
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
654
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
666
+ function extractLegalConstraints() {
667
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
655
669
  text,
656
- type: 'other',
657
670
  })));
658
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
671
+ }
672
+ // from gmd:resourceConstraints
673
+ function extractSecurityConstraints() {
674
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
675
+ ...(url && { url }),
659
676
  text,
660
- type: 'security',
661
677
  })));
662
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
663
678
  }
664
679
  // from gmd:resourceConstraints
665
- function extractUseLimitations() {
666
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
680
+ function extractOtherConstraints() {
681
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
682
+ ...(url && { url }),
683
+ text,
684
+ })));
667
685
  }
668
686
  // from gmd:resourceConstraints
669
687
  function extractLicenses() {
670
- return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(pipe(findChildElement('gmd:otherConstraints'), combine(extractCharacterString(), extractUrl()), map(([text, url]) => ({
688
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
671
689
  ...(url && { url }),
672
690
  text,
673
- })))));
691
+ })));
674
692
  }
675
693
  // from gmd:MD_Distribution
676
694
  function extractDatasetDistributions() {
@@ -814,6 +832,9 @@ function readOwnerOrganization(rootEl) {
814
832
  function readRecordUpdated(rootEl) {
815
833
  return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
816
834
  }
835
+ function readRecordPublished(rootEl) {
836
+ return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
837
+ }
817
838
  function readTitle(rootEl) {
818
839
  return pipe(findIdentification(), findNestedElement('gmd:citation', 'gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
819
840
  }
@@ -829,31 +850,55 @@ function readDatasetUpdated(rootEl) {
829
850
  function readContacts(rootEl) {
830
851
  return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
831
852
  }
832
- function readKeywordsOfType(isTheme) {
833
- 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
+ };
866
+ }
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);
834
879
  }
835
880
  function readKeywords(rootEl) {
836
- return readKeywordsOfType(false)(rootEl);
837
- }
838
- function readThemes(rootEl) {
839
- return readKeywordsOfType(true)(rootEl);
881
+ return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), mapArray(readKeywordGroup), flattenArray())(rootEl);
840
882
  }
841
883
  function readStatus(rootEl) {
842
884
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
843
885
  }
844
886
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
845
- function readAccessConstraints(rootEl) {
846
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
887
+ function readLegalConstraints(rootEl) {
888
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
847
889
  }
848
- function readUseLimitations(rootEl) {
849
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
890
+ function readSecurityConstraints(rootEl) {
891
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
892
+ }
893
+ function readOtherConstraints(rootEl) {
894
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
850
895
  }
851
896
  function readLicenses(rootEl) {
852
897
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
853
898
  }
854
899
  // not used yet
855
900
  function readIsoTopics(rootEl) {
856
- return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', false), mapArray(readText()))(rootEl);
901
+ return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', true), mapArray(readText()))(rootEl);
857
902
  }
858
903
  function readSpatialRepresentation(rootEl) {
859
904
  return pipe(findIdentification(), findNestedElement('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), readAttribute('codeListValue'), map(getSpatialRepresentationFromCode))(rootEl);
@@ -1069,33 +1114,50 @@ function updateCitationDate(date, type) {
1069
1114
  function appendCitationDate(date, type) {
1070
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)))));
1071
1116
  }
1072
- function removeKeywords(type) {
1073
- return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords'), filterArray(pipe(findNestedElement('gmd:MD_Keywords', 'gmd:type', 'gmd:MD_KeywordTypeCode'), readAttribute('codeListValue'),
1074
- // if a specific type is targeted, compare with it; otherwise remove keywords if they have no type defined
1075
- map((typeValue) => (type !== null ? type === typeValue : true))))));
1076
- }
1077
- function appendKeywords(keywords, type) {
1078
- return appendChildren(pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), type !== null
1079
- ? 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)))
1080
- : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1081
- }
1082
- function removeAccessConstraints() {
1083
- const securityConstraintsFilter = pipe(findChildrenElement('gmd:MD_SecurityConstraints'), (array) => array.length > 0);
1084
- // remove legal constraints that *only* have 'otherRestrictions'
1085
- const otherConstraintsFilter = pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code === 'otherRestrictions'));
1086
- return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray((el) => securityConstraintsFilter(el) || otherConstraintsFilter(el))));
1087
- }
1088
- function createAccessConstraint(constraint) {
1089
- if (constraint.type === 'security') {
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)))))));
1143
+ }
1144
+ function createConstraint(constraint, type) {
1145
+ if (type === 'security') {
1090
1146
  return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_SecurityConstraints'), appendChildren(pipe(createElement('gmd:classification'), createChild('gmd:MD_ClassificationCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode'), addAttribute('codeListValue', 'restricted')), pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1091
1147
  }
1092
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1148
+ else if (type === 'legal') {
1149
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1150
+ }
1151
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1093
1152
  }
1094
- function removeUseLimitations() {
1153
+ function removeOtherConstraints() {
1095
1154
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1096
1155
  }
1097
- function createUseLimitation(useLimitation) {
1098
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1156
+ function removeSecurityConstraints() {
1157
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1158
+ }
1159
+ function removeLegalConstraints() {
1160
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code !== 'license')))));
1099
1161
  }
1100
1162
  function removeLicenses() {
1101
1163
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.some((code) => code === 'license')))));
@@ -1194,19 +1256,22 @@ function writeContacts(record, rootEl) {
1194
1256
  pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact)))))(rootEl);
1195
1257
  }
1196
1258
  function writeKeywords(record, rootEl) {
1197
- pipe(findOrCreateIdentification(), removeKeywords(null), appendKeywords(record.keywords, null))(rootEl);
1259
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1198
1260
  }
1199
- function writeThemes(record, rootEl) {
1200
- pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1201
- }
1202
- function writeAccessConstraints(record, rootEl) {
1203
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(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);
1204
1263
  }
1205
1264
  function writeLicenses(record, rootEl) {
1206
1265
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1207
1266
  }
1208
- function writeUseLimitations(record, rootEl) {
1209
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1267
+ function writeLegalConstraints(record, rootEl) {
1268
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1269
+ }
1270
+ function writeSecurityConstraints(record, rootEl) {
1271
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1272
+ }
1273
+ function writeOtherConstraints(record, rootEl) {
1274
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1210
1275
  }
1211
1276
  function writeUpdateFrequency(record, rootEl) {
1212
1277
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1302,14 +1367,14 @@ function toModel(xml) {
1302
1367
  const contacts = readContacts(rootEl);
1303
1368
  const recordUpdated = readRecordUpdated(rootEl);
1304
1369
  const recordCreated = recordUpdated;
1370
+ const recordPublished = readRecordPublished(rootEl);
1305
1371
  const keywords = readKeywords(rootEl);
1306
- const themes = readThemes(rootEl);
1307
- const accessConstraints = readAccessConstraints(rootEl);
1308
- const useLimitations = readUseLimitations(rootEl);
1372
+ const topics = readIsoTopics(rootEl);
1373
+ const legalConstraints = readLegalConstraints(rootEl);
1374
+ const otherConstraints = readOtherConstraints(rootEl);
1375
+ const securityConstraints = readSecurityConstraints(rootEl);
1309
1376
  const licenses = readLicenses(rootEl);
1310
1377
  const overviews = readOverviews(rootEl);
1311
- // not used yet
1312
- const isoTopics = readIsoTopics(rootEl);
1313
1378
  if (kind === 'dataset') {
1314
1379
  const status = readStatus(rootEl);
1315
1380
  const datasetCreated = readDatasetCreated(rootEl);
@@ -1323,8 +1388,10 @@ function toModel(xml) {
1323
1388
  return {
1324
1389
  uniqueIdentifier,
1325
1390
  kind,
1391
+ languages: [],
1326
1392
  recordCreated,
1327
1393
  recordUpdated,
1394
+ recordPublished,
1328
1395
  status,
1329
1396
  title,
1330
1397
  abstract,
@@ -1332,10 +1399,11 @@ function toModel(xml) {
1332
1399
  contacts,
1333
1400
  contactsForResource: [],
1334
1401
  keywords,
1335
- themes,
1336
- accessConstraints,
1337
- useLimitations,
1402
+ topics,
1338
1403
  licenses,
1404
+ legalConstraints,
1405
+ securityConstraints,
1406
+ otherConstraints,
1339
1407
  ...(datasetCreated && { datasetCreated }),
1340
1408
  ...(datasetUpdated && { datasetUpdated }),
1341
1409
  lineage,
@@ -1352,17 +1420,20 @@ function toModel(xml) {
1352
1420
  return {
1353
1421
  uniqueIdentifier,
1354
1422
  kind,
1423
+ languages: [],
1355
1424
  recordCreated,
1356
1425
  recordUpdated,
1426
+ recordPublished,
1357
1427
  title,
1358
1428
  abstract,
1359
1429
  ownerOrganization,
1360
1430
  contacts,
1361
1431
  keywords,
1362
- themes,
1363
- accessConstraints,
1364
- useLimitations,
1432
+ topics,
1365
1433
  licenses,
1434
+ legalConstraints,
1435
+ securityConstraints,
1436
+ otherConstraints,
1366
1437
  overviews,
1367
1438
  onlineResources,
1368
1439
  };
@@ -1387,10 +1458,12 @@ function toXml(record, originalXml) {
1387
1458
  writeAbstract(record, rootEl);
1388
1459
  fieldChanged('contacts') && writeContacts(record, rootEl);
1389
1460
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1390
- fieldChanged('themes') && writeThemes(record, rootEl);
1391
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1461
+ fieldChanged('topics') && writeTopics(record, rootEl);
1462
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1463
+ fieldChanged('securityConstraints') &&
1464
+ writeSecurityConstraints(record, rootEl);
1392
1465
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1393
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1466
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1394
1467
  if (record.kind === 'dataset') {
1395
1468
  writeStatus(record, rootEl);
1396
1469
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1457,6 +1530,31 @@ const mapContact = (sourceContact, lang3) => {
1457
1530
  ...(phone && { phone }),
1458
1531
  };
1459
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
+ };
1460
1558
 
1461
1559
  /**
1462
1560
  * Custom HttpParameterCodec
@@ -16443,6 +16541,23 @@ const LANG_3_TO_2_MAPPER = {
16443
16541
  chi: 'zh',
16444
16542
  slo: 'sk',
16445
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
+ };
16446
16561
  // Caution: changing this can break language selection from third parties!
16447
16562
  const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language';
16448
16563
  const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce((mapperObject, langEntry) => {
@@ -16565,7 +16680,7 @@ var de = {
16565
16680
  "chart.type.line": "Liniendiagramm",
16566
16681
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16567
16682
  "chart.type.pie": "Kreisdiagramm",
16568
- "dashboard.createRecord": "",
16683
+ "dashboard.createRecord": "Neuer Eintrag",
16569
16684
  "dashboard.labels.mySpace": "Mein Bereich",
16570
16685
  "dashboard.records.all": "Katalog",
16571
16686
  "dashboard.records.myDraft": "Meine Entwürfe",
@@ -16578,8 +16693,8 @@ var de = {
16578
16693
  "dashboard.records.userEmail": "E-Mail",
16579
16694
  "dashboard.records.username": "Benutzername",
16580
16695
  "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16581
- "dashboard.results.listMetadata": "",
16582
- "dashboard.results.listResources": "",
16696
+ "dashboard.results.listMetadata": "Metadaten anzeigen",
16697
+ "dashboard.results.listResources": "Ressourcen anzeigen",
16583
16698
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16584
16699
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16585
16700
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16693,6 +16808,8 @@ var de = {
16693
16808
  "downloads.format.unknown": "unbekannt",
16694
16809
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16695
16810
  dropFile: dropFile$6,
16811
+ "editor.record.publish": "",
16812
+ "editor.record.upToDate": "",
16696
16813
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16697
16814
  "facets.block.title.OrgForResource": "Organisation",
16698
16815
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -16706,28 +16823,28 @@ var de = {
16706
16823
  "facets.block.title.tag.default": "Stichwort",
16707
16824
  "facets.block.title.th_regions_tree.default": "Regionen",
16708
16825
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Anmelden</a>, um auf diese Funktion zuzugreifen</div>",
16709
- "language.ca": "Català",
16710
- "language.cs": "Čeština",
16826
+ "language.ca": "Katalanisch",
16827
+ "language.cs": "Tschechisch",
16711
16828
  "language.de": "Deutsch",
16712
- "language.en": "English",
16713
- "language.es": "Español",
16714
- "language.fi": "Suomi",
16715
- "language.fr": "Français",
16716
- "language.is": "Íslenska",
16717
- "language.it": "Italiano",
16718
- "language.ko": "한국어",
16719
- "language.nl": "Nederlands",
16720
- "language.pt": "Português",
16721
- "language.ru": "Русский",
16722
- "language.sk": "Slovenčina",
16723
- "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",
16724
16841
  "map.add.layer": "Eine Ebene hinzufügen",
16725
16842
  "map.add.layer.catalog": "Aus dem Katalog",
16726
16843
  "map.add.layer.file": "Aus einer Datei",
16727
16844
  "map.add.layer.wfs": "Aus WFS",
16728
16845
  "map.add.layer.wms": "Aus WMS",
16729
16846
  "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16730
- "map.geocoding.placeholder": "",
16847
+ "map.geocoding.placeholder": "Nach einem Ort suchen",
16731
16848
  "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16732
16849
  "map.layer.add": "Hinzufügen",
16733
16850
  "map.layers.available": "Verfügbare Layer",
@@ -16771,17 +16888,20 @@ var de = {
16771
16888
  "record.metadata.author": "Autor",
16772
16889
  "record.metadata.catalog": "Katalog",
16773
16890
  "record.metadata.contact": "Kontakt",
16774
- "record.metadata.details": "Technische Informationen",
16891
+ "record.metadata.creation": "Erstellungsdatum",
16892
+ "record.metadata.details": "Über die Daten",
16775
16893
  "record.metadata.download": "Downloads",
16776
16894
  "record.metadata.formats": "Formate",
16777
- "record.metadata.isOpenData": "Open Data",
16778
16895
  "record.metadata.keywords": "Stichworte",
16779
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16896
+ "record.metadata.languages": "Sprachen",
16897
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
16780
16898
  "record.metadata.links": "Links",
16781
16899
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16782
- "record.metadata.origin": "Über die Daten",
16783
- "record.metadata.owner": "",
16900
+ "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
16901
+ "record.metadata.owner": "Herkunftskatalog",
16784
16902
  "record.metadata.preview": "Vorschau",
16903
+ "record.metadata.producer": "Datenproduzent",
16904
+ "record.metadata.publication": "Veröffentlichungsdatum",
16785
16905
  "record.metadata.publications": "Veröffentlichungen",
16786
16906
  "record.metadata.quality": "Metadatenqualität",
16787
16907
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
@@ -16803,13 +16923,17 @@ var de = {
16803
16923
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16804
16924
  "record.metadata.related": "Ähnliche Datensätze",
16805
16925
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16806
- "record.metadata.status": "",
16807
- "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}",
16808
16932
  "record.metadata.title": "Titel",
16933
+ "record.metadata.topics": "Kategorien",
16809
16934
  "record.metadata.type": "Geographischer Datensatz",
16810
16935
  "record.metadata.uniqueId": "Eindeutige Kennung",
16811
16936
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16812
- "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16813
16937
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
16814
16938
  "record.metadata.usage": "Nutzung und Einschränkungen",
16815
16939
  "record.more.details": "Weitere Details",
@@ -16841,6 +16965,7 @@ var de = {
16841
16965
  "search.filters.isSpatial": "Ist räumliche Daten",
16842
16966
  "search.filters.isSpatial.no": "nicht räumlich",
16843
16967
  "search.filters.isSpatial.yes": "räumlich",
16968
+ "search.filters.keyword": "Schlüsselwort",
16844
16969
  "search.filters.license": "Lizenz",
16845
16970
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16846
16971
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16871,7 +16996,7 @@ var de = {
16871
16996
  "table.object.count": "Objekte in diesem Datensatz",
16872
16997
  "table.select.data": "Datenquelle",
16873
16998
  "tooltip.html.copy": "HTML kopieren",
16874
- "tooltip.id.copy": "",
16999
+ "tooltip.id.copy": "Eindeutige Kennung kopieren",
16875
17000
  "tooltip.url.copy": "URL kopieren",
16876
17001
  "tooltip.url.open": "URL öffnen",
16877
17002
  "ui.readLess": "Weniger lesen",
@@ -17033,6 +17158,8 @@ var en = {
17033
17158
  "downloads.format.unknown": "unknown",
17034
17159
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17035
17160
  dropFile: dropFile$5,
17161
+ "editor.record.publish": "Publish this record",
17162
+ "editor.record.upToDate": "This record is up to date",
17036
17163
  "externalviewer.dataset.unnamed": "Datahub layer",
17037
17164
  "facets.block.title.OrgForResource": "Organisation",
17038
17165
  "facets.block.title.availableInServices": "Available for",
@@ -17046,21 +17173,21 @@ var en = {
17046
17173
  "facets.block.title.tag.default": "Tag",
17047
17174
  "facets.block.title.th_regions_tree.default": "Regions",
17048
17175
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
17049
- "language.ca": "Català",
17050
- "language.cs": "Čeština",
17051
- "language.de": "Deutsch",
17176
+ "language.ca": "Catalan",
17177
+ "language.cs": "Czech",
17178
+ "language.de": "German",
17052
17179
  "language.en": "English",
17053
- "language.es": "Español",
17054
- "language.fi": "Suomi",
17055
- "language.fr": "Français",
17056
- "language.is": "Íslenska",
17057
- "language.it": "Italiano",
17058
- "language.ko": "한국어",
17059
- "language.nl": "Nederlands",
17060
- "language.pt": "Português",
17061
- "language.ru": "Русский",
17062
- "language.sk": "Slovenčina",
17063
- "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",
17064
17191
  "map.add.layer": "Add a layer",
17065
17192
  "map.add.layer.catalog": "From the catalog",
17066
17193
  "map.add.layer.file": "From a file",
@@ -17111,17 +17238,20 @@ var en = {
17111
17238
  "record.metadata.author": "Author",
17112
17239
  "record.metadata.catalog": "Catalog",
17113
17240
  "record.metadata.contact": "Contact",
17114
- "record.metadata.details": "Technical information",
17241
+ "record.metadata.creation": "Date of creation",
17242
+ "record.metadata.details": "About the data",
17115
17243
  "record.metadata.download": "Downloads",
17116
17244
  "record.metadata.formats": "Formats",
17117
- "record.metadata.isOpenData": "Open Data",
17118
17245
  "record.metadata.keywords": "Keywords",
17119
- "record.metadata.lastUpdate": "Last updated on",
17246
+ "record.metadata.languages": "Languages",
17247
+ "record.metadata.lastUpdate": "Last updated on {date}",
17120
17248
  "record.metadata.links": "Links",
17121
17249
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17122
- "record.metadata.origin": "About the data",
17250
+ "record.metadata.otherConstraints": "Additional Conditions",
17123
17251
  "record.metadata.owner": "Catalog of origin",
17124
17252
  "record.metadata.preview": "Preview",
17253
+ "record.metadata.producer": "Data producer",
17254
+ "record.metadata.publication": "Date of publication",
17125
17255
  "record.metadata.publications": "publications",
17126
17256
  "record.metadata.quality": "Metadata Quality",
17127
17257
  "record.metadata.quality.contact.failed": "Contact is not specified",
@@ -17144,14 +17274,18 @@ var en = {
17144
17274
  "record.metadata.related": "Related records",
17145
17275
  "record.metadata.sheet": "Original metadata",
17146
17276
  "record.metadata.status": "Status",
17147
- "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 }",
17148
17282
  "record.metadata.title": "Title",
17283
+ "record.metadata.topics": "Categories",
17149
17284
  "record.metadata.type": "Geographical dataset",
17150
17285
  "record.metadata.uniqueId": "Unique Identifier",
17151
17286
  "record.metadata.updateFrequency": "Data Update Frequency",
17152
- "record.metadata.updateStatus": "Data Update Status",
17153
- "record.metadata.updatedOn": "Metadata's last update",
17154
- "record.metadata.usage": "Usage & constraints",
17287
+ "record.metadata.updatedOn": "Last Data Information Update",
17288
+ "record.metadata.usage": "License and Conditions",
17155
17289
  "record.more.details": "Read more",
17156
17290
  "record.tab.chart": "Chart",
17157
17291
  "record.tab.data": "Table",
@@ -17181,6 +17315,7 @@ var en = {
17181
17315
  "search.filters.isSpatial": "Is spatial data",
17182
17316
  "search.filters.isSpatial.no": "non spatial",
17183
17317
  "search.filters.isSpatial.yes": "spatial",
17318
+ "search.filters.keyword": "Keyword",
17184
17319
  "search.filters.license": "License",
17185
17320
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17186
17321
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17373,6 +17508,8 @@ var es = {
17373
17508
  "downloads.format.unknown": "",
17374
17509
  "downloads.wfs.featuretype.not.found": "",
17375
17510
  dropFile: dropFile$4,
17511
+ "editor.record.publish": "",
17512
+ "editor.record.upToDate": "",
17376
17513
  "externalviewer.dataset.unnamed": "",
17377
17514
  "facets.block.title.OrgForResource": "",
17378
17515
  "facets.block.title.availableInServices": "",
@@ -17386,21 +17523,21 @@ var es = {
17386
17523
  "facets.block.title.tag.default": "",
17387
17524
  "facets.block.title.th_regions_tree.default": "",
17388
17525
  "favorite.not.authenticated.tooltip": "",
17389
- "language.ca": "Català",
17390
- "language.cs": "Čeština",
17391
- "language.de": "Deutsch",
17392
- "language.en": "English",
17526
+ "language.ca": "Catalán",
17527
+ "language.cs": "Checo",
17528
+ "language.de": "Alemán",
17529
+ "language.en": "Inglés",
17393
17530
  "language.es": "Español",
17394
- "language.fi": "Suomi",
17395
- "language.fr": "Français",
17396
- "language.is": "Íslenska",
17531
+ "language.fi": "Finlandés",
17532
+ "language.fr": "Francés",
17533
+ "language.is": "Islandés",
17397
17534
  "language.it": "Italiano",
17398
- "language.ko": "한국어",
17399
- "language.nl": "Nederlands",
17400
- "language.pt": "Português",
17401
- "language.ru": "Русский",
17402
- "language.sk": "Slovenčina",
17403
- "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",
17404
17541
  "map.add.layer": "",
17405
17542
  "map.add.layer.catalog": "",
17406
17543
  "map.add.layer.file": "",
@@ -17451,17 +17588,20 @@ var es = {
17451
17588
  "record.metadata.author": "",
17452
17589
  "record.metadata.catalog": "",
17453
17590
  "record.metadata.contact": "",
17591
+ "record.metadata.creation": "",
17454
17592
  "record.metadata.details": "",
17455
17593
  "record.metadata.download": "",
17456
17594
  "record.metadata.formats": "",
17457
- "record.metadata.isOpenData": "",
17458
17595
  "record.metadata.keywords": "",
17596
+ "record.metadata.languages": "",
17459
17597
  "record.metadata.lastUpdate": "",
17460
17598
  "record.metadata.links": "",
17461
17599
  "record.metadata.noUsage": "",
17462
- "record.metadata.origin": "",
17600
+ "record.metadata.otherConstraints": "",
17463
17601
  "record.metadata.owner": "",
17464
17602
  "record.metadata.preview": "",
17603
+ "record.metadata.producer": "",
17604
+ "record.metadata.publication": "",
17465
17605
  "record.metadata.publications": "",
17466
17606
  "record.metadata.quality": "",
17467
17607
  "record.metadata.quality.contact.failed": "",
@@ -17484,12 +17624,16 @@ var es = {
17484
17624
  "record.metadata.related": "",
17485
17625
  "record.metadata.sheet": "",
17486
17626
  "record.metadata.status": "",
17487
- "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": "",
17488
17632
  "record.metadata.title": "",
17633
+ "record.metadata.topics": "",
17489
17634
  "record.metadata.type": "",
17490
17635
  "record.metadata.uniqueId": "",
17491
17636
  "record.metadata.updateFrequency": "",
17492
- "record.metadata.updateStatus": "",
17493
17637
  "record.metadata.updatedOn": "",
17494
17638
  "record.metadata.usage": "",
17495
17639
  "record.more.details": "",
@@ -17521,6 +17665,7 @@ var es = {
17521
17665
  "search.filters.isSpatial": "",
17522
17666
  "search.filters.isSpatial.no": "",
17523
17667
  "search.filters.isSpatial.yes": "",
17668
+ "search.filters.keyword": "",
17524
17669
  "search.filters.license": "",
17525
17670
  "search.filters.license.cc-by": "",
17526
17671
  "search.filters.license.cc-by-sa": "",
@@ -17585,7 +17730,7 @@ var fr = {
17585
17730
  "chart.type.line": "ligne",
17586
17731
  "chart.type.lineSmooth": "ligne lisse",
17587
17732
  "chart.type.pie": "camembert",
17588
- "dashboard.createRecord": "",
17733
+ "dashboard.createRecord": "Nouvel enregistrement",
17589
17734
  "dashboard.labels.mySpace": "Mon espace",
17590
17735
  "dashboard.records.all": "Catalogue",
17591
17736
  "dashboard.records.myDraft": "Mes brouillons",
@@ -17598,8 +17743,8 @@ var fr = {
17598
17743
  "dashboard.records.userEmail": "Email",
17599
17744
  "dashboard.records.username": "Nom d'utilisateur",
17600
17745
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17601
- "dashboard.results.listMetadata": "",
17602
- "dashboard.results.listResources": "",
17746
+ "dashboard.results.listMetadata": "Afficher les métadonnées",
17747
+ "dashboard.results.listResources": "Afficher les ressources",
17603
17748
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17604
17749
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17605
17750
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17713,6 +17858,8 @@ var fr = {
17713
17858
  "downloads.format.unknown": "inconnu",
17714
17859
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
17715
17860
  dropFile: dropFile$3,
17861
+ "editor.record.publish": "",
17862
+ "editor.record.upToDate": "",
17716
17863
  "externalviewer.dataset.unnamed": "Couche du datahub",
17717
17864
  "facets.block.title.OrgForResource": "Organisation",
17718
17865
  "facets.block.title.availableInServices": "Disponible pour",
@@ -17726,38 +17873,38 @@ var fr = {
17726
17873
  "facets.block.title.tag.default": "Tag",
17727
17874
  "facets.block.title.th_regions_tree.default": "Régions",
17728
17875
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
17729
- "language.ca": "Català",
17730
- "language.cs": "Čeština",
17731
- "language.de": "Deutsch",
17732
- "language.en": "English",
17733
- "language.es": "Español",
17734
- "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",
17735
17882
  "language.fr": "Français",
17736
- "language.is": "Íslenska",
17737
- "language.it": "Italiano",
17738
- "language.ko": "한국어",
17739
- "language.nl": "Nederlands",
17740
- "language.pt": "Português",
17741
- "language.ru": "Русский",
17742
- "language.sk": "Slovenčina",
17743
- "language.zh": "中文",
17744
- "map.add.layer": "",
17745
- "map.add.layer.catalog": "",
17746
- "map.add.layer.file": "",
17747
- "map.add.layer.wfs": "",
17748
- "map.add.layer.wms": "",
17749
- "map.addFromFile.placeholder": "",
17750
- "map.geocoding.placeholder": "",
17751
- "map.help.addFromFile": "",
17752
- "map.layer.add": "",
17753
- "map.layers.available": "",
17754
- "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",
17755
17902
  "map.loading.data": "Chargement des données...",
17756
- "map.loading.service": "",
17903
+ "map.loading.service": "Chargement du service...",
17757
17904
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17758
17905
  "map.select.layer": "Source de données",
17759
- "map.wfs.urlInput.hint": "",
17760
- "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",
17761
17908
  "multiselect.filter.placeholder": "Rechercher",
17762
17909
  "nav.back": "Retour",
17763
17910
  next: next$3,
@@ -17791,17 +17938,20 @@ var fr = {
17791
17938
  "record.metadata.author": "Auteur",
17792
17939
  "record.metadata.catalog": "Catalogue",
17793
17940
  "record.metadata.contact": "Contact",
17794
- "record.metadata.details": "Informations techniques",
17941
+ "record.metadata.creation": "Date de création",
17942
+ "record.metadata.details": "A propos de la donnée",
17795
17943
  "record.metadata.download": "Téléchargements",
17796
17944
  "record.metadata.formats": "Formats",
17797
- "record.metadata.isOpenData": "Donnée Ouverte",
17798
17945
  "record.metadata.keywords": "Mots clés",
17799
- "record.metadata.lastUpdate": "Mis à jour le",
17946
+ "record.metadata.languages": "Langues",
17947
+ "record.metadata.lastUpdate": "Mis à jour le {date}",
17800
17948
  "record.metadata.links": "Liens",
17801
17949
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17802
- "record.metadata.origin": "À propos des données",
17950
+ "record.metadata.otherConstraints": "Limitations d'usage",
17803
17951
  "record.metadata.owner": "Catalogue d'origine",
17804
17952
  "record.metadata.preview": "Aperçu",
17953
+ "record.metadata.producer": "Producteur de la donnée",
17954
+ "record.metadata.publication": "Date de publication",
17805
17955
  "record.metadata.publications": "données",
17806
17956
  "record.metadata.quality": "Qualité des métadonnées",
17807
17957
  "record.metadata.quality.contact.failed": "Contact n'est pas renseigné",
@@ -17823,15 +17973,19 @@ var fr = {
17823
17973
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17824
17974
  "record.metadata.related": "Voir aussi",
17825
17975
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17826
- "record.metadata.status": "",
17827
- "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 }",
17828
17982
  "record.metadata.title": "Titre",
17983
+ "record.metadata.topics": "Catégories",
17829
17984
  "record.metadata.type": "Donnée géographique",
17830
17985
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17831
17986
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17832
- "record.metadata.updateStatus": "Statut de mise à jour des données",
17833
- "record.metadata.updatedOn": "Mise à jour de la fiche de métadonnée",
17834
- "record.metadata.usage": "Conditions d'utilisation",
17987
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17988
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17835
17989
  "record.more.details": "Détails",
17836
17990
  "record.tab.chart": "Graphique",
17837
17991
  "record.tab.data": "Tableau",
@@ -17861,6 +18015,7 @@ var fr = {
17861
18015
  "search.filters.isSpatial": "Données spatiales",
17862
18016
  "search.filters.isSpatial.no": "non-géolocalisées",
17863
18017
  "search.filters.isSpatial.yes": "géolocalisées",
18018
+ "search.filters.keyword": "Mot-clé",
17864
18019
  "search.filters.license": "Licence",
17865
18020
  "search.filters.license.cc-by": "cc-by",
17866
18021
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -17925,7 +18080,7 @@ var it = {
17925
18080
  "chart.type.line": "grafico a linee",
17926
18081
  "chart.type.lineSmooth": "grafico a linea liscia",
17927
18082
  "chart.type.pie": "grafico a torta",
17928
- "dashboard.createRecord": "",
18083
+ "dashboard.createRecord": "Crea un record",
17929
18084
  "dashboard.labels.mySpace": "Il mio spazio",
17930
18085
  "dashboard.records.all": "Catalogo",
17931
18086
  "dashboard.records.myDraft": "Le mie bozze",
@@ -17938,8 +18093,8 @@ var it = {
17938
18093
  "dashboard.records.userEmail": "Email",
17939
18094
  "dashboard.records.username": "Nome utente",
17940
18095
  "dashboard.records.users": "utenti",
17941
- "dashboard.results.listMetadata": "",
17942
- "dashboard.results.listResources": "",
18096
+ "dashboard.results.listMetadata": "Elenco dei metadati",
18097
+ "dashboard.results.listResources": "Elenco delle risorse",
17943
18098
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
17944
18099
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
17945
18100
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18053,6 +18208,8 @@ var it = {
18053
18208
  "downloads.format.unknown": "sconosciuto",
18054
18209
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18055
18210
  dropFile: dropFile$2,
18211
+ "editor.record.publish": "",
18212
+ "editor.record.upToDate": "",
18056
18213
  "externalviewer.dataset.unnamed": "Layer del datahub",
18057
18214
  "facets.block.title.OrgForResource": "Organizzazione",
18058
18215
  "facets.block.title.availableInServices": "Disponibile per",
@@ -18066,38 +18223,38 @@ var it = {
18066
18223
  "facets.block.title.tag.default": "Tag",
18067
18224
  "facets.block.title.th_regions_tree.default": "Regioni",
18068
18225
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> per accedere a questa funzionalità</div>",
18069
- "language.ca": "Català",
18070
- "language.cs": "Čeština",
18071
- "language.de": "Deutsch",
18072
- "language.en": "English",
18073
- "language.es": "Español",
18074
- "language.fi": "Suomi",
18075
- "language.fr": "Français",
18076
- "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",
18077
18234
  "language.it": "Italiano",
18078
- "language.ko": "한국어",
18079
- "language.nl": "Nederlands",
18080
- "language.pt": "Português",
18081
- "language.ru": "Русский",
18082
- "language.sk": "Slovenčina",
18083
- "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",
18084
18241
  "map.add.layer": "Aggiungere un layer",
18085
18242
  "map.add.layer.catalog": "Dal catalogo",
18086
18243
  "map.add.layer.file": "Da un file",
18087
18244
  "map.add.layer.wfs": "Da un WFS",
18088
18245
  "map.add.layer.wms": "Da un WMS",
18089
- "map.addFromFile.placeholder": "",
18090
- "map.geocoding.placeholder": "",
18091
- "map.help.addFromFile": "",
18092
- "map.layer.add": "",
18093
- "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",
18094
18251
  "map.layers.list": "Layers",
18095
18252
  "map.loading.data": "Caricamento dati...",
18096
- "map.loading.service": "",
18253
+ "map.loading.service": "Caricamento del servizio...",
18097
18254
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18098
18255
  "map.select.layer": "Sorgente dati",
18099
- "map.wfs.urlInput.hint": "",
18100
- "map.wms.urlInput.hint": "",
18256
+ "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
18257
+ "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
18101
18258
  "multiselect.filter.placeholder": "Cerca",
18102
18259
  "nav.back": "Indietro",
18103
18260
  next: next$2,
@@ -18131,17 +18288,20 @@ var it = {
18131
18288
  "record.metadata.author": "Autore",
18132
18289
  "record.metadata.catalog": "Catalogo",
18133
18290
  "record.metadata.contact": "Contatto",
18134
- "record.metadata.details": "Informazioni tecniche",
18291
+ "record.metadata.creation": "Data di creazione",
18292
+ "record.metadata.details": "A proposito del dati",
18135
18293
  "record.metadata.download": "Download",
18136
18294
  "record.metadata.formats": "Formati",
18137
- "record.metadata.isOpenData": "Data aperta",
18138
18295
  "record.metadata.keywords": "Parole chiave",
18139
- "record.metadata.lastUpdate": "Ultimo aggiornamento",
18296
+ "record.metadata.languages": "Lingue",
18297
+ "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
18140
18298
  "record.metadata.links": "Collegamenti",
18141
18299
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18142
- "record.metadata.origin": "Informazioni sui dati",
18300
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18143
18301
  "record.metadata.owner": "Catalogo originale",
18144
18302
  "record.metadata.preview": "Anteprima",
18303
+ "record.metadata.producer": "Produttore dei dati",
18304
+ "record.metadata.publication": "Data di pubblicazione",
18145
18305
  "record.metadata.publications": "pubblicazioni",
18146
18306
  "record.metadata.quality": "Qualità dei metadati",
18147
18307
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
@@ -18163,15 +18323,19 @@ var it = {
18163
18323
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18164
18324
  "record.metadata.related": "Vedi anche",
18165
18325
  "record.metadata.sheet": "Origine del metadata",
18166
- "record.metadata.status": "",
18167
- "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}",
18168
18332
  "record.metadata.title": "Titolo",
18333
+ "record.metadata.topics": "Categorie",
18169
18334
  "record.metadata.type": "Dati geografici",
18170
18335
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18171
18336
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18172
- "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18173
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18174
- "record.metadata.usage": "Condizioni d'uso",
18337
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18338
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18175
18339
  "record.more.details": "Dettagli",
18176
18340
  "record.tab.chart": "Grafico",
18177
18341
  "record.tab.data": "Tabella",
@@ -18201,6 +18365,7 @@ var it = {
18201
18365
  "search.filters.isSpatial": "Dati spaziali",
18202
18366
  "search.filters.isSpatial.no": "Non geolocalizzati",
18203
18367
  "search.filters.isSpatial.yes": "Geolocalizzati",
18368
+ "search.filters.keyword": "Parola chiave",
18204
18369
  "search.filters.license": "Licenza",
18205
18370
  "search.filters.license.cc-by": "cc-by",
18206
18371
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18393,6 +18558,8 @@ var nl = {
18393
18558
  "downloads.format.unknown": "",
18394
18559
  "downloads.wfs.featuretype.not.found": "",
18395
18560
  dropFile: dropFile$1,
18561
+ "editor.record.publish": "",
18562
+ "editor.record.upToDate": "",
18396
18563
  "externalviewer.dataset.unnamed": "",
18397
18564
  "facets.block.title.OrgForResource": "",
18398
18565
  "facets.block.title.availableInServices": "",
@@ -18406,21 +18573,21 @@ var nl = {
18406
18573
  "facets.block.title.tag.default": "",
18407
18574
  "facets.block.title.th_regions_tree.default": "",
18408
18575
  "favorite.not.authenticated.tooltip": "",
18409
- "language.ca": "Català",
18410
- "language.cs": "Čeština",
18411
- "language.de": "Deutsch",
18412
- "language.en": "English",
18413
- "language.es": "Español",
18414
- "language.fi": "Suomi",
18415
- "language.fr": "Français",
18416
- "language.is": "Íslenska",
18417
- "language.it": "Italiano",
18418
- "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",
18419
18586
  "language.nl": "Nederlands",
18420
- "language.pt": "Português",
18421
- "language.ru": "Русский",
18422
- "language.sk": "Slovenčina",
18423
- "language.zh": "中文",
18587
+ "language.pt": "Portugees",
18588
+ "language.ru": "Russisch",
18589
+ "language.sk": "Slowaaks",
18590
+ "language.zh": "Chinees",
18424
18591
  "map.add.layer": "",
18425
18592
  "map.add.layer.catalog": "",
18426
18593
  "map.add.layer.file": "",
@@ -18471,17 +18638,20 @@ var nl = {
18471
18638
  "record.metadata.author": "",
18472
18639
  "record.metadata.catalog": "",
18473
18640
  "record.metadata.contact": "",
18641
+ "record.metadata.creation": "",
18474
18642
  "record.metadata.details": "",
18475
18643
  "record.metadata.download": "",
18476
18644
  "record.metadata.formats": "",
18477
- "record.metadata.isOpenData": "",
18478
18645
  "record.metadata.keywords": "",
18646
+ "record.metadata.languages": "",
18479
18647
  "record.metadata.lastUpdate": "",
18480
18648
  "record.metadata.links": "",
18481
18649
  "record.metadata.noUsage": "",
18482
- "record.metadata.origin": "",
18650
+ "record.metadata.otherConstraints": "",
18483
18651
  "record.metadata.owner": "",
18484
18652
  "record.metadata.preview": "",
18653
+ "record.metadata.producer": "",
18654
+ "record.metadata.publication": "",
18485
18655
  "record.metadata.publications": "",
18486
18656
  "record.metadata.quality": "",
18487
18657
  "record.metadata.quality.contact.failed": "",
@@ -18504,12 +18674,16 @@ var nl = {
18504
18674
  "record.metadata.related": "",
18505
18675
  "record.metadata.sheet": "",
18506
18676
  "record.metadata.status": "",
18507
- "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": "",
18508
18682
  "record.metadata.title": "",
18683
+ "record.metadata.topics": "",
18509
18684
  "record.metadata.type": "",
18510
18685
  "record.metadata.uniqueId": "",
18511
18686
  "record.metadata.updateFrequency": "",
18512
- "record.metadata.updateStatus": "",
18513
18687
  "record.metadata.updatedOn": "",
18514
18688
  "record.metadata.usage": "",
18515
18689
  "record.more.details": "",
@@ -18541,6 +18715,7 @@ var nl = {
18541
18715
  "search.filters.isSpatial": "",
18542
18716
  "search.filters.isSpatial.no": "",
18543
18717
  "search.filters.isSpatial.yes": "",
18718
+ "search.filters.keyword": "",
18544
18719
  "search.filters.license": "",
18545
18720
  "search.filters.license.cc-by": "",
18546
18721
  "search.filters.license.cc-by-sa": "",
@@ -18733,6 +18908,8 @@ var pt = {
18733
18908
  "downloads.format.unknown": "",
18734
18909
  "downloads.wfs.featuretype.not.found": "",
18735
18910
  dropFile: dropFile,
18911
+ "editor.record.publish": "",
18912
+ "editor.record.upToDate": "",
18736
18913
  "externalviewer.dataset.unnamed": "",
18737
18914
  "facets.block.title.OrgForResource": "",
18738
18915
  "facets.block.title.availableInServices": "",
@@ -18746,21 +18923,21 @@ var pt = {
18746
18923
  "facets.block.title.tag.default": "",
18747
18924
  "facets.block.title.th_regions_tree.default": "",
18748
18925
  "favorite.not.authenticated.tooltip": "",
18749
- "language.ca": "Català",
18750
- "language.cs": "Čeština",
18751
- "language.de": "Deutsch",
18752
- "language.en": "English",
18753
- "language.es": "Español",
18754
- "language.fi": "Suomi",
18755
- "language.fr": "Français",
18756
- "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",
18757
18934
  "language.it": "Italiano",
18758
- "language.ko": "한국어",
18759
- "language.nl": "Nederlands",
18935
+ "language.ko": "Coreano",
18936
+ "language.nl": "Holandês",
18760
18937
  "language.pt": "Português",
18761
- "language.ru": "Русский",
18762
- "language.sk": "Slovenčina",
18763
- "language.zh": "中文",
18938
+ "language.ru": "Russo",
18939
+ "language.sk": "Eslovaco",
18940
+ "language.zh": "Chinês",
18764
18941
  "map.add.layer": "",
18765
18942
  "map.add.layer.catalog": "",
18766
18943
  "map.add.layer.file": "",
@@ -18811,17 +18988,20 @@ var pt = {
18811
18988
  "record.metadata.author": "",
18812
18989
  "record.metadata.catalog": "",
18813
18990
  "record.metadata.contact": "",
18991
+ "record.metadata.creation": "",
18814
18992
  "record.metadata.details": "",
18815
18993
  "record.metadata.download": "",
18816
18994
  "record.metadata.formats": "",
18817
- "record.metadata.isOpenData": "",
18818
18995
  "record.metadata.keywords": "",
18996
+ "record.metadata.languages": "",
18819
18997
  "record.metadata.lastUpdate": "",
18820
18998
  "record.metadata.links": "",
18821
18999
  "record.metadata.noUsage": "",
18822
- "record.metadata.origin": "",
19000
+ "record.metadata.otherConstraints": "",
18823
19001
  "record.metadata.owner": "",
18824
19002
  "record.metadata.preview": "",
19003
+ "record.metadata.producer": "",
19004
+ "record.metadata.publication": "",
18825
19005
  "record.metadata.publications": "",
18826
19006
  "record.metadata.quality": "",
18827
19007
  "record.metadata.quality.contact.failed": "",
@@ -18844,12 +19024,16 @@ var pt = {
18844
19024
  "record.metadata.related": "",
18845
19025
  "record.metadata.sheet": "",
18846
19026
  "record.metadata.status": "",
18847
- "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": "",
18848
19032
  "record.metadata.title": "",
19033
+ "record.metadata.topics": "",
18849
19034
  "record.metadata.type": "",
18850
19035
  "record.metadata.uniqueId": "",
18851
19036
  "record.metadata.updateFrequency": "",
18852
- "record.metadata.updateStatus": "",
18853
19037
  "record.metadata.updatedOn": "",
18854
19038
  "record.metadata.usage": "",
18855
19039
  "record.more.details": "",
@@ -18881,6 +19065,7 @@ var pt = {
18881
19065
  "search.filters.isSpatial": "",
18882
19066
  "search.filters.isSpatial.no": "",
18883
19067
  "search.filters.isSpatial.yes": "",
19068
+ "search.filters.keyword": "",
18884
19069
  "search.filters.license": "",
18885
19070
  "search.filters.license.cc-by": "",
18886
19071
  "search.filters.license.cc-by-sa": "",
@@ -18989,8 +19174,8 @@ class Gn4FieldMapper {
18989
19174
  },
18990
19175
  cl_topic: (output, source) => ({
18991
19176
  ...output,
18992
- themes: [
18993
- ...(output.themes || []),
19177
+ topics: [
19178
+ ...(output.topics || []),
18994
19179
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
18995
19180
  ],
18996
19181
  }),
@@ -19014,6 +19199,18 @@ class Gn4FieldMapper {
19014
19199
  ...output,
19015
19200
  recordUpdated: toDate(selectField(source, 'changeDate')),
19016
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
+ },
19017
19214
  link: (output, source) => {
19018
19215
  const rawLinks = getAsArray(selectField(source, 'link'));
19019
19216
  const distributions = rawLinks
@@ -19045,31 +19242,22 @@ class Gn4FieldMapper {
19045
19242
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19046
19243
  }, output);
19047
19244
  },
19048
- tag: (output, source) => ({
19245
+ allKeywords: (output, source) => ({
19049
19246
  ...output,
19050
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19247
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19051
19248
  }),
19052
19249
  inspireTheme: (output, source) => ({
19053
19250
  ...output,
19054
- themes: [
19055
- ...(output.themes || []),
19251
+ topics: [
19252
+ ...(output.topics || []),
19056
19253
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19057
19254
  ],
19058
19255
  }),
19059
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19060
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19061
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19062
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19063
- licenseObject: (output, source) => ({
19064
- ...output,
19065
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19066
- const link = getAsUrl(selectField(license, 'link'));
19067
- return {
19068
- text: selectTranslatedValue(license, this.lang3),
19069
- ...(link ? { link } : {}),
19070
- };
19071
- }),
19072
- }),
19256
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19257
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19258
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19259
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19260
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19073
19261
  lineageObject: (output, source) => ({
19074
19262
  ...output,
19075
19263
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19115,8 +19303,8 @@ class Gn4FieldMapper {
19115
19303
  ],
19116
19304
  };
19117
19305
  },
19118
- resourceTemporalDateRange: (output, source) => {
19119
- const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19306
+ resourceTemporalExtentDateRange: (output, source) => {
19307
+ const ranges = getAsArray(selectField(source, 'resourceTemporalExtentDateRange'));
19120
19308
  return {
19121
19309
  ...output,
19122
19310
  temporalExtents: ranges.map((range) => {
@@ -19131,31 +19319,42 @@ class Gn4FieldMapper {
19131
19319
  },
19132
19320
  };
19133
19321
  this.genericField = (output) => output;
19134
- this.constraintField = (fieldName, output, source) => ({
19135
- ...output,
19136
- ...(fieldName.endsWith('UseLimitationObject')
19137
- ? {
19138
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19139
- ? [
19140
- ...(output.legalConstraints || []),
19141
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19142
- ]
19143
- : output.legalConstraints || [],
19144
- useLimitations: [
19145
- ...(output.useLimitations || []),
19146
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19147
- ],
19148
- }
19149
- : {
19150
- accessConstraints: [
19151
- ...(output.accessConstraints || []),
19152
- ...selectField(source, fieldName).map((field) => ({
19153
- text: selectTranslatedValue(field, this.lang3),
19154
- type: this.getConstraintsType(fieldName),
19155
- })),
19156
- ],
19157
- }),
19158
- });
19322
+ this.constraintField = (type, output, constraintArray) => {
19323
+ let outputField;
19324
+ switch (type) {
19325
+ case 'license':
19326
+ outputField = 'licenses';
19327
+ break;
19328
+ case 'legal':
19329
+ outputField = 'legalConstraints';
19330
+ break;
19331
+ case 'security':
19332
+ outputField = 'securityConstraints';
19333
+ break;
19334
+ case 'other':
19335
+ outputField = 'otherConstraints';
19336
+ break;
19337
+ }
19338
+ const outputArray = outputField in output ? output[outputField] : [];
19339
+ outputArray.push(...constraintArray.map((item) => {
19340
+ const text = selectTranslatedValue(item, this.lang3);
19341
+ const url = getAsUrl(selectField(item, 'link'));
19342
+ return {
19343
+ text,
19344
+ ...(url ? { url } : {}),
19345
+ };
19346
+ }));
19347
+ const result = {
19348
+ ...output,
19349
+ [outputField]: outputArray,
19350
+ };
19351
+ // avoid legal constraints being duplicates of licenses
19352
+ if ('legalConstraints' in result &&
19353
+ (type === 'legal' || type === 'license')) {
19354
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19355
+ }
19356
+ return result;
19357
+ };
19159
19358
  this.mapLink = (sourceLink) => {
19160
19359
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19161
19360
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19203,17 +19402,6 @@ class Gn4FieldMapper {
19203
19402
  extras: { ...(output.extras || {}), ...value },
19204
19403
  });
19205
19404
  }
19206
- getConstraintsType(indexField) {
19207
- switch (indexField) {
19208
- case 'MD_LegalConstraintsUseLimitationObject':
19209
- return 'legal';
19210
- case 'MD_SecurityConstraintsUseLimitationObject':
19211
- return 'security';
19212
- case 'MD_ConstraintsUseLimitationObject':
19213
- default:
19214
- return 'other';
19215
- }
19216
- }
19217
19405
  getMappingFn(fieldName) {
19218
19406
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19219
19407
  }
@@ -19273,17 +19461,20 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19273
19461
  status: null,
19274
19462
  lineage: null,
19275
19463
  recordUpdated: null,
19464
+ recordPublished: null,
19276
19465
  ownerOrganization: null,
19277
19466
  licenses: [],
19467
+ legalConstraints: [],
19468
+ securityConstraints: [],
19469
+ otherConstraints: [],
19278
19470
  contacts: [],
19279
19471
  contactsForResource: [],
19280
- accessConstraints: [],
19281
19472
  keywords: [],
19282
- themes: [],
19283
- useLimitations: [],
19473
+ topics: [],
19284
19474
  spatialExtents: [],
19285
19475
  temporalExtents: [],
19286
19476
  overviews: [],
19477
+ languages: [],
19287
19478
  };
19288
19479
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19289
19480
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -19443,7 +19634,7 @@ class ElasticsearchService {
19443
19634
  },
19444
19635
  };
19445
19636
  }
19446
- getRelatedRecordPayload(title, uuid, size = 6, _source = ES_SOURCE_SUMMARY) {
19637
+ getRelatedRecordPayload(title, uuid, size = 6, _source = [...ES_SOURCE_SUMMARY, 'allKeywords', 'createDate']) {
19447
19638
  return {
19448
19639
  query: {
19449
19640
  bool: {
@@ -20048,11 +20239,18 @@ class OrganizationsFromMetadataService {
20048
20239
  if (!allContactOrgs.length)
20049
20240
  return of(record);
20050
20241
  const ownerOrganization = allContactOrgs[0];
20051
- 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]) => {
20052
20248
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20249
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20053
20250
  return {
20054
20251
  ...record,
20055
20252
  ownerOrganization: {
20253
+ logoUrl,
20056
20254
  ...ownerOrganization,
20057
20255
  ...recordOrganisation,
20058
20256
  },
@@ -20363,12 +20561,21 @@ class Gn4PlatformMapper {
20363
20561
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20364
20562
  return { ...apiUser, id: id.toString() };
20365
20563
  }
20366
- thesaurusFromApi(thesaurus) {
20564
+ thesaurusFromApi(thesaurus, lang3) {
20367
20565
  return thesaurus.map((keyword) => {
20368
- 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;
20369
20575
  return {
20370
- key: uri,
20371
- label: value,
20576
+ key,
20577
+ label,
20578
+ description,
20372
20579
  };
20373
20580
  });
20374
20581
  }
@@ -20381,13 +20588,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20381
20588
 
20382
20589
  const minApiVersion = '4.2.2';
20383
20590
  class Gn4PlatformService {
20384
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20591
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20385
20592
  this.siteApiService = siteApiService;
20386
20593
  this.meApi = meApi;
20387
20594
  this.usersApi = usersApi;
20388
20595
  this.mapper = mapper;
20389
20596
  this.toolsApiService = toolsApiService;
20390
20597
  this.registriesApiService = registriesApiService;
20598
+ this.langService = langService;
20391
20599
  this.type = 'GeoNetwork';
20392
20600
  this.keyTranslations$ = this.toolsApiService
20393
20601
  .getTranslationsPackage1('gnui')
@@ -20401,6 +20609,11 @@ class Gn4PlatformService {
20401
20609
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20402
20610
  }
20403
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 = {};
20404
20617
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20405
20618
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20406
20619
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20427,19 +20640,36 @@ class Gn4PlatformService {
20427
20640
  return this.users$;
20428
20641
  }
20429
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
+ }
20430
20656
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20431
20657
  }
20432
- getThesaurusByLang(thesaurusName, lang) {
20433
- return this.registriesApiService
20434
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20435
- .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];
20436
20666
  }
20437
- 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 }); }
20438
20668
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20439
20669
  }
20440
20670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20441
20671
  type: Injectable
20442
- }], 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 }]; } });
20443
20673
 
20444
20674
  function provideGn4() {
20445
20675
  return [
@@ -20475,7 +20705,7 @@ const MAP_FEATURE_KEY = 'map';
20475
20705
  const initialMapState = {
20476
20706
  layers: [],
20477
20707
  };
20478
- const reducer$2 = createReducer(initialMapState, on(addLayer, (state, action) => {
20708
+ const reducer$3 = createReducer(initialMapState, on(addLayer, (state, action) => {
20479
20709
  const layers = [...state.layers];
20480
20710
  const layerWithInfo = { ...action.layer, loading: false, error: null };
20481
20711
  if (!('atIndex' in action))
@@ -20524,7 +20754,7 @@ const reducer$2 = createReducer(initialMapState, on(addLayer, (state, action) =>
20524
20754
  : layer),
20525
20755
  })));
20526
20756
  function mapReducer(state, action) {
20527
- return reducer$2(state, action);
20757
+ return reducer$3(state, action);
20528
20758
  }
20529
20759
 
20530
20760
  // Lookup the 'Map' feature state managed by NgRx
@@ -20987,6 +21217,38 @@ function createFuzzyFilter(pattern) {
20987
21217
  };
20988
21218
  }
20989
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
+
20990
21252
  marker('downloads.wfs.featuretype.not.found');
20991
21253
  const FORMATS = {
20992
21254
  csv: {
@@ -22517,6 +22779,9 @@ class MapContextService {
22517
22779
  if (mapConfig) {
22518
22780
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22519
22781
  }
22782
+ else {
22783
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22784
+ }
22520
22785
  if (!mapContext.view?.extent &&
22521
22786
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22522
22787
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22627,6 +22892,11 @@ class MapContextService {
22627
22892
  }
22628
22893
  return view;
22629
22894
  }
22895
+ addDefaultBaselayerContext(layers) {
22896
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22897
+ ? layers
22898
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22899
+ }
22630
22900
  mergeMapConfigWithContext(mapContext, mapConfig) {
22631
22901
  return {
22632
22902
  ...mapContext,
@@ -23173,11 +23443,11 @@ class ThumbnailComponent {
23173
23443
  }
23174
23444
  }
23175
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 }); }
23176
- 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 }); }
23177
23447
  }
23178
23448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23179
23449
  type: Component,
23180
- 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" }]
23181
23451
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23182
23452
  type: Optional
23183
23453
  }, {
@@ -23305,8 +23575,7 @@ class MetadataQualityComponent {
23305
23575
  : this.calculatedQualityScore;
23306
23576
  }
23307
23577
  get calculatedQualityScore() {
23308
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23309
- this.items.length);
23578
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23310
23579
  }
23311
23580
  showMenu() {
23312
23581
  this.isMenuShown = true;
@@ -23324,7 +23593,7 @@ class MetadataQualityComponent {
23324
23593
  this.items = [];
23325
23594
  this.add('title', !!this.metadata?.title);
23326
23595
  this.add('description', !!this.metadata?.abstract);
23327
- this.add('topic', this.metadata?.themes?.length > 0);
23596
+ this.add('topic', this.metadata?.topics?.length > 0);
23328
23597
  this.add('keywords', this.metadata?.keywords?.length > 0);
23329
23598
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23330
23599
  this.add('organisation', !!contact?.organization);
@@ -23638,11 +23907,11 @@ class BadgeComponent {
23638
23907
  this.clickable = false;
23639
23908
  }
23640
23909
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23641
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: BadgeComponent, selector: "gn-ui-badge", inputs: { clickable: "clickable" }, ngImport: i0, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable ? 'hover:bg-gray-800 cursor-pointer transition-colors' : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23910
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: BadgeComponent, selector: "gn-ui-badge", inputs: { clickable: "clickable" }, ngImport: i0, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable\n ? 'hover:bg-primary cursor-pointer transition-colors duration-100'\n : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23642
23911
  }
23643
23912
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BadgeComponent, decorators: [{
23644
23913
  type: Component,
23645
- args: [{ selector: 'gn-ui-badge', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable ? 'hover:bg-gray-800 cursor-pointer transition-colors' : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n" }]
23914
+ args: [{ selector: 'gn-ui-badge', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable\n ? 'hover:bg-primary cursor-pointer transition-colors duration-100'\n : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n" }]
23646
23915
  }], propDecorators: { clickable: [{
23647
23916
  type: Input
23648
23917
  }] } });
@@ -23772,6 +24041,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23772
24041
  type: Input
23773
24042
  }] } });
23774
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
+
23775
24058
  class ContentGhostComponent {
23776
24059
  constructor() {
23777
24060
  this.ghostClass = '';
@@ -23911,14 +24194,16 @@ class MaxLinesComponent {
23911
24194
  return result;
23912
24195
  }
23913
24196
  ngOnDestroy() {
24197
+ if (!this.observer)
24198
+ return;
23914
24199
  this.observer.unobserve(this.container.nativeElement.children[0]);
23915
24200
  }
23916
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 }); }
23917
- 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 }); }
23918
24203
  }
23919
24204
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, decorators: [{
23920
24205
  type: Component,
23921
- 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" }]
23922
24207
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
23923
24208
  type: Input
23924
24209
  }], container: [{
@@ -23926,36 +24211,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23926
24211
  args: ['container']
23927
24212
  }] } });
23928
24213
 
23929
- class MarkdownParserComponent {
23930
- get parsedMarkdown() {
23931
- return marked.parse(this.textContent);
23932
- }
23933
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23934
- 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!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}: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 }); }
23935
- }
23936
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23937
- type: Component,
23938
- 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!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}: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"] }]
23939
- }], propDecorators: { textContent: [{
23940
- type: Input
23941
- }] } });
23942
-
23943
24214
  class MetadataInfoComponent {
23944
24215
  constructor() {
23945
24216
  this.keyword = new EventEmitter();
23946
24217
  }
23947
24218
  get hasUsage() {
23948
24219
  return (this.metadata.extras?.isOpenData === true ||
23949
- this.metadata.useLimitations?.length ||
23950
- this.metadata.accessConstraints?.length);
24220
+ (this.metadata.legalConstraints?.length > 0 &&
24221
+ this.legalConstraints.length > 0) ||
24222
+ (this.metadata.otherConstraints?.length > 0 &&
24223
+ this.otherConstraints.length > 0) ||
24224
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24225
+ }
24226
+ get legalConstraints() {
24227
+ let array = [];
24228
+ if (this.metadata.legalConstraints?.length) {
24229
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24230
+ }
24231
+ return array;
23951
24232
  }
23952
- get usages() {
24233
+ get otherConstraints() {
23953
24234
  let array = [];
23954
- if (this.metadata.useLimitations?.length) {
23955
- array = array.concat(this.metadata.useLimitations);
24235
+ if (this.metadata.otherConstraints?.length) {
24236
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
23956
24237
  }
23957
- if (this.metadata.accessConstraints?.length) {
23958
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24238
+ return array;
24239
+ }
24240
+ get licenses() {
24241
+ let array = [];
24242
+ if (this.metadata.licenses?.length) {
24243
+ array = array.concat(this.metadata.licenses
24244
+ .filter((c) => c.text)
24245
+ .map((c) => ({ text: c.text, url: c.url })));
23959
24246
  }
23960
24247
  return array;
23961
24248
  }
@@ -23971,22 +24258,28 @@ class MetadataInfoComponent {
23971
24258
  return undefined;
23972
24259
  }
23973
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
+ }
23974
24271
  fieldReady(propName) {
23975
24272
  return !this.incomplete || propName in this.metadata;
23976
24273
  }
23977
24274
  onKeywordClick(keyword) {
23978
24275
  this.keyword.emit(keyword);
23979
24276
  }
23980
- copyText() {
23981
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
23982
- event.target.blur();
23983
- }
23984
24277
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23985
- 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\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\"\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 [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\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: 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 <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block 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 </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>\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 }); }
23986
24279
  }
23987
24280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
23988
24281
  type: Component,
23989
- 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\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\"\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 [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\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 <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block 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 </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>\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"] }]
23990
24283
  }], propDecorators: { metadata: [{
23991
24284
  type: Input
23992
24285
  }], incomplete: [{
@@ -24026,23 +24319,23 @@ class ButtonComponent {
24026
24319
  this.extraClass = '';
24027
24320
  this.buttonClick = new EventEmitter();
24028
24321
  }
24029
- // btn-classes are explicited to allow tailwind recognize them and add it in css.
24030
24322
  set type(value) {
24323
+ // btn-classes are written in full to be picked up by tailwind
24031
24324
  switch (value) {
24032
24325
  case 'primary':
24033
- this.btnClass = 'btn-primary';
24326
+ this.btnClass = 'gn-ui-btn-primary';
24034
24327
  break;
24035
24328
  case 'secondary':
24036
- this.btnClass = 'btn-secondary';
24329
+ this.btnClass = 'gn-ui-btn-secondary';
24037
24330
  break;
24038
24331
  case 'outline':
24039
- this.btnClass = 'btn-outline';
24332
+ this.btnClass = 'gn-ui-btn-outline';
24040
24333
  break;
24041
24334
  case 'light':
24042
- this.btnClass = 'btn-light';
24335
+ this.btnClass = 'gn-ui-btn-light';
24043
24336
  break;
24044
24337
  default:
24045
- this.btnClass = 'btn-default';
24338
+ this.btnClass = 'gn-ui-btn-default';
24046
24339
  break;
24047
24340
  }
24048
24341
  }
@@ -24055,11 +24348,11 @@ class ButtonComponent {
24055
24348
  propagateToDocumentOnly(event);
24056
24349
  }
24057
24350
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24058
- 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 }); }
24059
24352
  }
24060
24353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24061
24354
  type: Component,
24062
- 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" }]
24063
24356
  }], propDecorators: { type: [{
24064
24357
  type: Input
24065
24358
  }], disabled: [{
@@ -24339,11 +24632,11 @@ class CarouselComponent {
24339
24632
  this.emblaApi.scrollTo(stepIndex);
24340
24633
  }
24341
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 }); }
24342
- 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 }); }
24343
24636
  }
24344
24637
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24345
24638
  type: Component,
24346
- 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"] }]
24347
24640
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24348
24641
  type: Input
24349
24642
  }], stepsContainerClass: [{
@@ -24495,11 +24788,11 @@ class MetadataContactComponent {
24495
24788
  this.organizationClick.emit(this.shownOrganization);
24496
24789
  }
24497
24790
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24498
- 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 }); }
24499
24792
  }
24500
24793
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24501
24794
  type: Component,
24502
- 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" }]
24503
24796
  }], propDecorators: { metadata: [{
24504
24797
  type: Input
24505
24798
  }], organizationClick: [{
@@ -24723,11 +25016,11 @@ class DropdownSelectorComponent {
24723
25016
  }
24724
25017
  }
24725
25018
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24726
- 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 }); }
24727
25020
  }
24728
25021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24729
25022
  type: Component,
24730
- 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" }]
24731
25024
  }], propDecorators: { title: [{
24732
25025
  type: Input
24733
25026
  }], showTitle: [{
@@ -24903,11 +25196,11 @@ class DropdownMultiselectComponent {
24903
25196
  this.setFocus();
24904
25197
  }
24905
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 }); }
24906
- 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 }); }
24907
25200
  }
24908
25201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24909
25202
  type: Component,
24910
- 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" }]
24911
25204
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24912
25205
  type: Input
24913
25206
  }], choices: [{
@@ -25061,11 +25354,11 @@ class TextAreaComponent {
25061
25354
  this.rawChange.next(value);
25062
25355
  }
25063
25356
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25064
- 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"] }); }
25065
25358
  }
25066
25359
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25067
25360
  type: Component,
25068
- 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"] }]
25069
25362
  }], propDecorators: { value: [{
25070
25363
  type: Input
25071
25364
  }], placeholder: [{
@@ -25335,11 +25628,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25335
25628
 
25336
25629
  class NavigationButtonComponent {
25337
25630
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25338
- 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 }); }
25339
25632
  }
25340
25633
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25341
25634
  type: Component,
25342
- 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"] }]
25343
25636
  }], propDecorators: { label: [{
25344
25637
  type: Input
25345
25638
  }], icon: [{
@@ -25472,7 +25765,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25472
25765
 
25473
25766
  class FormFieldComponent {
25474
25767
  set value(v) {
25475
- this.formControl.setValue(v);
25768
+ this.formControl.setValue(v, {
25769
+ emitEvent: false,
25770
+ });
25476
25771
  }
25477
25772
  constructor() {
25478
25773
  this.formControl = new FormControl();
@@ -25653,10 +25948,8 @@ class UiInputsModule {
25653
25948
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25654
25949
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25655
25950
  AutocompleteComponent,
25656
- ButtonComponent,
25657
25951
  TextInputComponent,
25658
25952
  DragAndDropFileInputComponent,
25659
- TextAreaComponent,
25660
25953
  ChipsInputComponent,
25661
25954
  NavigationButtonComponent,
25662
25955
  StarToggleComponent,
@@ -25689,7 +25982,9 @@ class UiInputsModule {
25689
25982
  MatInputModule,
25690
25983
  MatDatepickerModule,
25691
25984
  MatNativeDateModule,
25692
- EditableLabelDirective], exports: [DropdownSelectorComponent,
25985
+ EditableLabelDirective,
25986
+ TextAreaComponent,
25987
+ ButtonComponent], exports: [DropdownSelectorComponent,
25693
25988
  AutocompleteComponent,
25694
25989
  ButtonComponent,
25695
25990
  TextInputComponent,
@@ -25731,10 +26026,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25731
26026
  declarations: [
25732
26027
  DropdownSelectorComponent,
25733
26028
  AutocompleteComponent,
25734
- ButtonComponent,
25735
26029
  TextInputComponent,
25736
26030
  DragAndDropFileInputComponent,
25737
- TextAreaComponent,
25738
26031
  ChipsInputComponent,
25739
26032
  NavigationButtonComponent,
25740
26033
  StarToggleComponent,
@@ -25773,6 +26066,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25773
26066
  MatDatepickerModule,
25774
26067
  MatNativeDateModule,
25775
26068
  EditableLabelDirective,
26069
+ TextAreaComponent,
26070
+ ButtonComponent,
25776
26071
  ],
25777
26072
  exports: [
25778
26073
  DropdownSelectorComponent,
@@ -25994,7 +26289,6 @@ class UiElementsModule {
25994
26289
  PaginationButtonsComponent,
25995
26290
  MaxLinesComponent,
25996
26291
  RecordApiFormComponent,
25997
- MarkdownParserComponent,
25998
26292
  ImageOverlayPreviewComponent], imports: [CommonModule,
25999
26293
  MatIconModule,
26000
26294
  MatTooltipModule,
@@ -26003,7 +26297,8 @@ class UiElementsModule {
26003
26297
  RouterModule,
26004
26298
  UiInputsModule,
26005
26299
  FormsModule,
26006
- NgOptimizedImage], exports: [MetadataInfoComponent,
26300
+ NgOptimizedImage,
26301
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
26007
26302
  ContentGhostComponent,
26008
26303
  DownloadItemComponent,
26009
26304
  DownloadsListComponent,
@@ -26050,6 +26345,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26050
26345
  UiInputsModule,
26051
26346
  FormsModule,
26052
26347
  NgOptimizedImage,
26348
+ MarkdownParserComponent,
26053
26349
  ],
26054
26350
  declarations: [
26055
26351
  MetadataInfoComponent,
@@ -26072,7 +26368,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26072
26368
  PaginationButtonsComponent,
26073
26369
  MaxLinesComponent,
26074
26370
  RecordApiFormComponent,
26075
- MarkdownParserComponent,
26076
26371
  ImageOverlayPreviewComponent,
26077
26372
  ],
26078
26373
  exports: [
@@ -26476,7 +26771,7 @@ const initSearch = () => {
26476
26771
  const initialState = {
26477
26772
  [DEFAULT_SEARCH_KEY]: initSearch(),
26478
26773
  };
26479
- function reducer$1(state = initialState, action) {
26774
+ function reducer$2(state = initialState, action) {
26480
26775
  const { id } = action;
26481
26776
  if (id) {
26482
26777
  let stateSearch = state[id] || initSearch();
@@ -27418,11 +27713,11 @@ class FavoriteStarComponent {
27418
27713
  });
27419
27714
  }
27420
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 }); }
27421
- 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 }); }
27422
27717
  }
27423
27718
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27424
27719
  type: Component,
27425
- 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" }]
27426
27721
  }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27427
27722
  type: Input
27428
27723
  }], record: [{
@@ -27711,10 +28006,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27711
28006
  class AbstractSearchField {
27712
28007
  }
27713
28008
  class SimpleSearchField {
27714
- constructor(esFieldName, order = 'asc', injector) {
28009
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27715
28010
  this.esFieldName = esFieldName;
27716
- this.order = order;
27717
28011
  this.injector = injector;
28012
+ this.order = order;
28013
+ this.orderType = orderType;
27718
28014
  this.repository = this.injector.get(RecordsRepositoryInterface);
27719
28015
  // FIXME: this is required to register runtime fields; abstract this as well
27720
28016
  this.esService = this.injector.get(ElasticsearchService);
@@ -27725,12 +28021,12 @@ class SimpleSearchField {
27725
28021
  type: 'terms',
27726
28022
  field: this.esFieldName,
27727
28023
  limit: 1000,
27728
- sort: [this.order, 'key'],
28024
+ sort: [this.order, this.orderType],
27729
28025
  },
27730
28026
  };
27731
28027
  }
27732
28028
  async getBucketLabel(bucket) {
27733
- return bucket.term;
28029
+ return bucket.term.toString();
27734
28030
  }
27735
28031
  getAvailableValues() {
27736
28032
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27758,9 +28054,13 @@ class SimpleSearchField {
27758
28054
  return of(values);
27759
28055
  }
27760
28056
  }
27761
- class KeySearchField extends SimpleSearchField {
27762
- constructor() {
27763
- 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;
27764
28064
  this.platformService = this.injector.get(PlatformServiceInterface);
27765
28065
  }
27766
28066
  async getTranslation(key) {
@@ -27770,26 +28070,36 @@ class KeySearchField extends SimpleSearchField {
27770
28070
  return (await this.getTranslation(bucket.term)) || bucket.term;
27771
28071
  }
27772
28072
  getAvailableValues() {
28073
+ if (this.orderType === 'count')
28074
+ return super.getAvailableValues();
27773
28075
  // sort values by alphabetical order
27774
28076
  return super
27775
28077
  .getAvailableValues()
27776
28078
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27777
28079
  }
27778
28080
  }
27779
- class ThesaurusField extends KeySearchField {
27780
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27781
- super(esFieldName, order, injector);
27782
- 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;
27783
28093
  this.langService = this.injector.get(LangService);
27784
- this.thesaurus$ = this.platformService
27785
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27786
- .pipe(catchError(() => {
27787
- console.warn('Error while loading thesaurus language package');
27788
- return of([]);
27789
- }), shareReplay(1));
27790
- }
27791
- async getTranslation(key) {
27792
- 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
+ }
27793
28103
  }
27794
28104
  }
27795
28105
  class FullTextSearchField {
@@ -27809,7 +28119,7 @@ marker('search.filters.isSpatial.yes');
27809
28119
  marker('search.filters.isSpatial.no');
27810
28120
  class IsSpatialSearchField extends SimpleSearchField {
27811
28121
  constructor(injector) {
27812
- super('isSpatial', 'asc', injector);
28122
+ super('isSpatial', injector, 'asc');
27813
28123
  this.translateService = this.injector.get(TranslateService);
27814
28124
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27815
28125
  String formats = doc.format.join('|').toLowerCase();
@@ -27859,7 +28169,7 @@ marker('search.filters.license.unknown');
27859
28169
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27860
28170
  class LicenseSearchField extends SimpleSearchField {
27861
28171
  constructor(injector) {
27862
- super('license', 'asc', injector);
28172
+ super('license', injector, 'asc');
27863
28173
  this.translateService = this.injector.get(TranslateService);
27864
28174
  this.esService.registerRuntimeField('license', `String raw = '';
27865
28175
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -27943,7 +28253,7 @@ class OrganizationSearchField {
27943
28253
  }
27944
28254
  class OwnerSearchField extends SimpleSearchField {
27945
28255
  constructor(injector) {
27946
- super('owner', 'asc', injector);
28256
+ super('owner', injector, 'asc');
27947
28257
  }
27948
28258
  getAvailableValues() {
27949
28259
  return of([]);
@@ -27952,6 +28262,7 @@ class OwnerSearchField extends SimpleSearchField {
27952
28262
 
27953
28263
  marker('search.filters.format');
27954
28264
  marker('search.filters.inspireKeyword');
28265
+ marker('search.filters.keyword');
27955
28266
  marker('search.filters.isSpatial');
27956
28267
  marker('search.filters.license');
27957
28268
  marker('search.filters.publicationYear');
@@ -27969,13 +28280,14 @@ class FieldsService {
27969
28280
  this.injector = injector;
27970
28281
  this.fields = {
27971
28282
  publisher: new OrganizationSearchField(this.injector),
27972
- format: new SimpleSearchField('format', 'asc', this.injector),
27973
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
27974
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
27975
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
27976
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
27977
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
27978
- 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'),
27979
28291
  isSpatial: new IsSpatialSearchField(this.injector),
27980
28292
  q: new FullTextSearchField(),
27981
28293
  license: new LicenseSearchField(this.injector),
@@ -28083,7 +28395,7 @@ class FeatureSearchModule {
28083
28395
  },
28084
28396
  ], imports: [CommonModule,
28085
28397
  TranslateModule.forChild(),
28086
- StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$1, {
28398
+ StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
28087
28399
  initialState,
28088
28400
  }),
28089
28401
  EffectsModule.forFeature([SearchEffects]),
@@ -28113,7 +28425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28113
28425
  imports: [
28114
28426
  CommonModule,
28115
28427
  TranslateModule.forChild(),
28116
- StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$1, {
28428
+ StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
28117
28429
  initialState,
28118
28430
  }),
28119
28431
  EffectsModule.forFeature([SearchEffects]),
@@ -28886,7 +29198,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28886
29198
  const { metadata, related, ...stateWithoutMd } = state;
28887
29199
  return stateWithoutMd;
28888
29200
  }));
28889
- function reducer(state, action) {
29201
+ function reducer$1(state, action) {
28890
29202
  return mdViewReducer(state, action);
28891
29203
  }
28892
29204
 
@@ -30836,11 +31148,11 @@ class LanguageSwitcherComponent {
30836
31148
  this.translate.use(value);
30837
31149
  }
30838
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 }); }
30839
- 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"] }] }); }
30840
31152
  }
30841
31153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30842
31154
  type: Component,
30843
- 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" }]
30844
31156
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30845
31157
  type: Optional
30846
31158
  }, {
@@ -31167,18 +31479,18 @@ class DataViewPermalinkComponent {
31167
31479
  if (config) {
31168
31480
  const { aggregation, xProperty, yProperty, chartType } = config;
31169
31481
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
31170
- url.search = `?v=${this.version}
31171
- &e=gn-dataset-view-chart
31172
- &a=api-url=${this.config.basePath}
31173
- &a=dataset-id=${metadata.uniqueIdentifier}
31174
- &a=primary-color=%230f4395
31175
- &a=secondary-color=%238bc832
31176
- &a=main-color=%23555
31177
- &a=background-color=%23fdfbff
31178
- &a=aggregation=${aggregation}
31179
- &a=x-property=${xProperty}
31180
- &a=y-property=${yProperty}
31181
- &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}`);
31182
31494
  return url.toString();
31183
31495
  }
31184
31496
  return '';
@@ -31285,7 +31597,7 @@ class FeatureRecordModule {
31285
31597
  DataViewWebComponentComponent,
31286
31598
  DataViewShareComponent] }); }
31287
31599
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureRecordModule, providers: [MdViewFacade], imports: [CommonModule,
31288
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
31600
+ StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
31289
31601
  EffectsModule.forFeature([MdViewEffects]),
31290
31602
  UiLayoutModule,
31291
31603
  FeatureMapModule,
@@ -31313,7 +31625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31313
31625
  ],
31314
31626
  imports: [
31315
31627
  CommonModule,
31316
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
31628
+ StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
31317
31629
  EffectsModule.forFeature([MdViewEffects]),
31318
31630
  UiLayoutModule,
31319
31631
  FeatureMapModule,
@@ -31339,6 +31651,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31339
31651
  }]
31340
31652
  }] });
31341
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
+
31342
31770
  class WizardService {
31343
31771
  constructor(translateService) {
31344
31772
  this.translateService = translateService;
@@ -31700,6 +32128,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31700
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"] }]
31701
32129
  }], ctorParameters: function () { return [{ type: WizardService }, { type: i1$1.TranslateService }]; } });
31702
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
+
31703
32216
  class FeatureEditorModule {
31704
32217
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31705
32218
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, declarations: [WizardComponent,
@@ -31710,8 +32223,8 @@ class FeatureEditorModule {
31710
32223
  MatNativeDateModule,
31711
32224
  MatFormFieldModule,
31712
32225
  HttpClientModule,
31713
- HttpClientXsrfModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
31714
- 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,
31715
32228
  UiInputsModule,
31716
32229
  UiWidgetsModule,
31717
32230
  TranslateModule.forChild(),
@@ -31719,7 +32232,9 @@ class FeatureEditorModule {
31719
32232
  MatNativeDateModule,
31720
32233
  MatFormFieldModule,
31721
32234
  HttpClientModule,
31722
- HttpClientXsrfModule] }); }
32235
+ HttpClientXsrfModule,
32236
+ StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
32237
+ EffectsModule.forFeature([EditorEffects])] }); }
31723
32238
  }
31724
32239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, decorators: [{
31725
32240
  type: NgModule,
@@ -31739,105 +32254,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31739
32254
  MatFormFieldModule,
31740
32255
  HttpClientModule,
31741
32256
  HttpClientXsrfModule,
32257
+ StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
32258
+ EffectsModule.forFeature([EditorEffects]),
31742
32259
  ],
31743
32260
  exports: [WizardComponent, WizardSummarizeComponent],
32261
+ providers: [EditorFacade],
31744
32262
  }]
31745
32263
  }] });
31746
32264
 
31747
- class EditorService {
31748
- constructor(http, apiConfiguration) {
31749
- this.http = http;
31750
- this.apiConfiguration = apiConfiguration;
31751
- this.record$ = new BehaviorSubject(null);
31752
- this.fieldsConfig = [
31753
- {
31754
- model: 'title',
31755
- labelKey: 'Metadata title',
31756
- type: 'text',
31757
- },
31758
- {
31759
- model: 'abstract',
31760
- labelKey: 'Abstract',
31761
- type: 'rich',
31762
- },
31763
- {
31764
- model: 'uniqueIdentifier',
31765
- labelKey: 'Unique identifier',
31766
- type: 'text',
31767
- locked: true,
31768
- },
31769
- ];
31770
- this.apiUrl = `${this.apiConfiguration?.basePath || '/geonetwork/srv/api'}`;
31771
- this.fields$ = this.record$.pipe(map$1((record) => this.fieldsConfig.map((fieldConfig) => ({
31772
- config: fieldConfig,
31773
- value: record?.[fieldConfig.model] || null,
31774
- }))));
31775
- this.saving$ = new BehaviorSubject(false);
31776
- }
31777
- loadRecordByUuid(uuid) {
31778
- return this.http
31779
- .get(`${this.apiUrl}/records/${uuid}/formatters/xml`, {
31780
- responseType: 'text',
31781
- headers: {
31782
- Accept: 'application/xml',
31783
- },
31784
- })
31785
- .pipe(map$1((response) => toModel(response.toString())));
31786
- }
31787
- saveCurrentRecord() {
31788
- return this.record$.pipe(take(1), tap$1((record) => {
31789
- if (!record)
31790
- throw new Error('Save record failed: no record currently open');
31791
- this.saving$.next(true);
31792
- }), switchMap$1((record) => this.http.put(`${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`, toXml(record), {
31793
- headers: {
31794
- 'Content-Type': 'application/xml',
31795
- },
31796
- withCredentials: true,
31797
- })), map$1(() => undefined), finalize(() => {
31798
- this.saving$.next(false);
31799
- }));
31800
- }
31801
- setCurrentRecord(record) {
31802
- this.record$.next(record);
31803
- }
31804
- updateRecordField(fieldName, value) {
31805
- this.record$
31806
- .pipe(take(1), map$1((record) => ({ ...record, [fieldName]: value })))
31807
- .subscribe((record) => this.record$.next(record));
31808
- }
31809
- 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 }); }
31810
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, providedIn: 'root' }); }
31811
- }
31812
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, decorators: [{
31813
- type: Injectable,
31814
- args: [{
31815
- providedIn: 'root',
31816
- }]
31817
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: Configuration, decorators: [{
31818
- type: Optional
31819
- }, {
31820
- type: Inject,
31821
- args: [Configuration]
31822
- }] }]; } });
31823
-
31824
32265
  class RecordFormComponent {
31825
- constructor(editorService) {
31826
- this.editorService = editorService;
32266
+ constructor(facade) {
32267
+ this.facade = facade;
32268
+ this.fields$ = this.facade.recordFields$;
31827
32269
  }
31828
- handleFieldValueChange(fieldName, value) {
31829
- 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);
31830
32275
  }
31831
32276
  fieldTracker(index, field) {
31832
32277
  return field.config.model;
31833
32278
  }
31834
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31835
- 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 }); }
31836
32281
  }
31837
32282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31838
32283
  type: Component,
31839
- 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" }]
31840
- }], 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 }]; } });
31841
32286
 
31842
32287
  const ROUTER_STATE_KEY = 'router';
31843
32288
  const ROUTER_ROUTE_SEARCH = 'search';
@@ -32204,5 +32649,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32204
32649
  * Generated bundle index. Do not edit.
32205
32650
  */
32206
32651
 
32207
- 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 };
32208
32653
  //# sourceMappingURL=geonetwork-ui.mjs.map