geonetwork-ui 2.2.0-dev.5b8d393f → 2.2.0-dev.6332307a

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 (232) 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/search/aggregation.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  16. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  17. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  18. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  19. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  20. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  21. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  22. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  23. package/esm2022/libs/feature/search/src/index.mjs +3 -1
  24. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +3 -3
  25. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  26. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  27. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  28. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  29. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  30. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +3 -4
  31. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +2 -2
  32. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  33. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  34. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  35. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  36. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -3
  37. package/esm2022/libs/ui/elements/src/lib/max-lines/max-lines.component.mjs +5 -3
  38. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  39. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +47 -22
  40. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -4
  41. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  42. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +3 -3
  43. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +4 -4
  44. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +3 -3
  45. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  46. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +3 -3
  47. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  48. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  49. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +6 -6
  50. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  51. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  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 +35 -26
  56. package/esm2022/translations/en.json +35 -26
  57. package/esm2022/translations/es.json +29 -20
  58. package/esm2022/translations/fr.json +48 -39
  59. package/esm2022/translations/it.json +42 -33
  60. package/esm2022/translations/nl.json +30 -21
  61. package/esm2022/translations/pt.json +29 -20
  62. package/fesm2022/geonetwork-ui.mjs +744 -560
  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/search/aggregation.model.d.ts +1 -1
  87. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  88. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  89. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  90. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  91. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  92. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  93. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  94. package/libs/common/domain/src/lib/model/search/search.model.d.ts +1 -1
  95. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  96. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  97. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  98. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  99. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  100. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  101. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  102. package/libs/feature/search/src/index.d.ts +2 -0
  103. package/libs/feature/search/src/index.d.ts.map +1 -1
  104. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  105. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  106. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  107. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  108. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  109. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  110. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  111. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  112. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +0 -1
  113. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  114. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  115. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  116. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  117. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  118. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  119. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  120. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  121. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +1 -1
  122. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +16 -6
  123. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  124. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  125. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  126. package/libs/ui/elements/src/lib/record-api-form/record-api-form.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/text-area/text-area.component.d.ts +1 -1
  131. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  132. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -40
  133. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +1 -1
  134. package/libs/util/i18n/src/index.d.ts +0 -1
  135. package/libs/util/i18n/src/index.d.ts.map +1 -1
  136. package/libs/util/i18n/src/lib/i18n.constants.d.ts +17 -0
  137. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  138. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  139. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  140. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +5 -0
  141. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -0
  142. package/package.json +2 -2
  143. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +63 -8
  144. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +57 -9
  145. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +229 -24
  146. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +29 -0
  147. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +99 -76
  148. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +6 -3
  149. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +4 -5
  150. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  151. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +30 -21
  152. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +120 -63
  153. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +177 -97
  154. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -1
  155. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  156. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  157. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  158. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +25 -14
  159. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  160. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  161. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  162. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  163. package/src/libs/common/domain/src/lib/model/search/search.model.ts +1 -1
  164. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  165. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  166. package/src/libs/common/fixtures/src/lib/elasticsearch/full-response.ts +1 -1
  167. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  168. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +52 -10
  169. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  170. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  171. package/src/libs/feature/search/src/index.ts +2 -0
  172. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  173. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  174. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  175. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  176. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  177. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  178. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +104 -127
  179. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +0 -1
  180. package/src/libs/feature/search/src/lib/state/effects.ts +1 -1
  181. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  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 +157 -42
  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/record-api-form/record-api-form.component.html +5 -5
  197. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  198. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  199. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  200. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -0
  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/navigation-button/navigation-button.component.css +3 -0
  204. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  205. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  206. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  207. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -0
  208. package/src/libs/util/i18n/src/index.ts +0 -1
  209. package/src/libs/util/i18n/src/lib/i18n.constants.ts +18 -0
  210. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  211. package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +32 -0
  212. package/tailwind.base.css +2 -2
  213. package/translations/de.json +35 -26
  214. package/translations/en.json +35 -26
  215. package/translations/es.json +29 -20
  216. package/translations/fr.json +48 -39
  217. package/translations/it.json +42 -33
  218. package/translations/nl.json +30 -21
  219. package/translations/pt.json +29 -20
  220. package/translations/sk.json +30 -21
  221. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  222. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  223. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  224. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  225. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  226. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  227. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  228. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  229. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  230. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  231. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  232. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
@@ -5,10 +5,10 @@ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Compo
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
- import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService, TranslateFakeCompiler, TranslateDefaultParser, FakeMissingTranslationHandler } from '@ngx-translate/core';
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';
@@ -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
+ };
834
866
  }
835
- function readKeywords(rootEl) {
836
- return readKeywordsOfType(false)(rootEl);
867
+ // from gmd:MD_Keywords
868
+ function readKeywordGroup(rootEl) {
869
+ const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
870
+ const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
871
+ return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
872
+ const label = extractCharacterString()(el);
873
+ return {
874
+ ...(thesaurus ? { thesaurus } : {}),
875
+ label,
876
+ type,
877
+ };
878
+ }))(rootEl);
837
879
  }
838
- function readThemes(rootEl) {
839
- return readKeywordsOfType(true)(rootEl);
880
+ function readKeywords(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);
1198
- }
1199
- function writeThemes(record, rootEl) {
1200
- pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1259
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1201
1260
  }
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) => {
@@ -16543,133 +16658,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16543
16658
  }]
16544
16659
  }], ctorParameters: function () { return [{ type: i1$1.TranslateService }]; } });
16545
16660
 
16546
- // IMPORTANT:
16547
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/test-translate-loader.service.ts
16548
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16549
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16550
- class TestTranslateLoader extends TranslateLoader {
16551
- constructor(_translations = {}) {
16552
- super();
16553
- this._translations = _translations;
16554
- }
16555
- /**
16556
- * Returns an {Observable} of translations for the specified language. If the
16557
- * language is not recognized, an empty translations object will be returned.
16558
- *
16559
- * @param language the language for which the translations should be retrieved.
16560
- * @returns the translations for the specified
16561
- * language or an empty set of translations if the language is not recognized.
16562
- */
16563
- getTranslation(language) {
16564
- return of(this._translations[language] || {});
16565
- }
16566
- }
16567
-
16568
- // IMPORTANT:
16569
- // This was copy-pasted from https://github.com/mwootendev/ngx-translate-plugins/blob/7c6c73c7d16c9519a7bafff939d29fd8ea5e574a/projects/testing/src/lib/testing.module.ts
16570
- // because the original package was expecting rxjs 7+ as a peer dep and that was conflicting with many other dependencies
16571
- // FIXME: when rxjs 7 can be used in the project, remove this and do `npm install ngx-translate-testing --save-dev`
16572
- /**
16573
- * The TranslateTestingModule provides the {TranslateModule} as well as a
16574
- * {TranslateService} configured to return translations specific for the
16575
- * test environment.
16576
- *
16577
- * @export
16578
- */
16579
- class TranslateTestingModule {
16580
- constructor() {
16581
- this._translations = {};
16582
- }
16583
- static withTranslations(languageOrTranslations, translations) {
16584
- const translateTestingModule = new TranslateTestingModule();
16585
- if (typeof languageOrTranslations === 'string') {
16586
- return translateTestingModule.withTranslations(languageOrTranslations, translations);
16587
- }
16588
- return translateTestingModule.withTranslations(languageOrTranslations);
16589
- }
16590
- get ngModule() {
16591
- return TranslateTestingModule;
16592
- }
16593
- get providers() {
16594
- const translateService = new TranslateService(null, new TestTranslateLoader(this._translations), this._compiler || new TranslateFakeCompiler(), new TranslateDefaultParser(), new FakeMissingTranslationHandler(), true, true, false, this._defaultLanguage);
16595
- return [
16596
- {
16597
- provide: TranslateService,
16598
- useValue: translateService,
16599
- },
16600
- ];
16601
- }
16602
- withTranslations(languageOrTranslations, translations) {
16603
- if (typeof languageOrTranslations === 'string' && translations) {
16604
- this.addTranslations(languageOrTranslations, translations);
16605
- this._defaultLanguage = languageOrTranslations;
16606
- }
16607
- else if (languageOrTranslations) {
16608
- Object.keys(languageOrTranslations).forEach((language) => this.addTranslations(language, languageOrTranslations[language]));
16609
- }
16610
- return this;
16611
- }
16612
- /**
16613
- * Updates the {TranslationTestingModule} to provide a {TranslateService} that will
16614
- * use the provided {TranslateCompiler} to translate the test translations.
16615
- *
16616
- * @example
16617
- *
16618
- * TranslateTestingModule.withTranslations('en', {people: '{gender, select, male{He is} female{She is} other{They are}} {how})'})
16619
- * .withCompiler(new TranslateMessageFormatCompiler());
16620
- *
16621
- * @param compiler the compiler to use to compile the test translations.
16622
- * @returns the instance that can be used to chain additional configuration.
16623
- * @memberof TranslateTestingModule
16624
- */
16625
- withCompiler(compiler) {
16626
- this._compiler = compiler;
16627
- return this;
16628
- }
16629
- /**
16630
- * Updates the {TranslateTestingModule} to use the provided language as the default language.
16631
- * By default, the default language will be set to the first language provided.
16632
- *
16633
- * @example
16634
- *
16635
- * TranslateTestingModule.withTranslations('es', SPANISH_TRANSLATIONS)
16636
- * .withTranslations('en', ENGLISH_TRANSLATIONS)
16637
- * .withDefaultLanguage('en');
16638
- *
16639
- * @param language the new default language for translations.
16640
- * @returns the instance that can be used to chain additional configuration.
16641
- * @memberof TranslateTestingModule
16642
- */
16643
- withDefaultLanguage(language) {
16644
- this._defaultLanguage = language || this._defaultLanguage;
16645
- return this;
16646
- }
16647
- addTranslations(language, translations) {
16648
- if (!this._defaultLanguage) {
16649
- this._defaultLanguage = language;
16650
- }
16651
- if (this._translations[language]) {
16652
- this._translations[language] = {
16653
- ...this._translations[language],
16654
- ...translations,
16655
- };
16656
- }
16657
- else {
16658
- this._translations[language] = translations;
16659
- }
16660
- }
16661
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
16662
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule], exports: [TranslateModule] }); }
16663
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, imports: [TranslateModule, TranslateModule] }); }
16664
- }
16665
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TranslateTestingModule, decorators: [{
16666
- type: NgModule,
16667
- args: [{
16668
- imports: [TranslateModule],
16669
- exports: [TranslateModule],
16670
- }]
16671
- }] });
16672
-
16673
16661
  var dropFile$6 = "Datei ablegen";
16674
16662
  var next$6 = "weiter";
16675
16663
  var previous$6 = "zurück";
@@ -16692,20 +16680,21 @@ var de = {
16692
16680
  "chart.type.line": "Liniendiagramm",
16693
16681
  "chart.type.lineSmooth": "Geglättes Liniendiagramm",
16694
16682
  "chart.type.pie": "Kreisdiagramm",
16683
+ "dashboard.createRecord": "Neuer Eintrag",
16695
16684
  "dashboard.labels.mySpace": "Mein Bereich",
16696
16685
  "dashboard.records.all": "Katalog",
16697
16686
  "dashboard.records.myDraft": "Meine Entwürfe",
16698
16687
  "dashboard.records.myLibrary": "Meine Bibliothek",
16699
16688
  "dashboard.records.myOrg": "Meine Organisation",
16700
16689
  "dashboard.records.myRecords": "Meine Datensätze",
16701
- "dashboard.records.noRecord": "Kein Datensatz für diese Organisation",
16702
- "dashboard.records.noUser": "Keine Benutzer für diese Organisation",
16703
16690
  "dashboard.records.publishedRecords": "{count, plural, =1{veröffentlichter Datensatz} other{veröffentlichte Datensätze}}",
16704
16691
  "dashboard.records.search": "Suche nach \"{searchText}\"",
16705
16692
  "dashboard.records.userDetail": "Name",
16706
16693
  "dashboard.records.userEmail": "E-Mail",
16707
16694
  "dashboard.records.username": "Benutzername",
16708
16695
  "dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
16696
+ "dashboard.results.listMetadata": "Metadaten anzeigen",
16697
+ "dashboard.results.listResources": "Ressourcen anzeigen",
16709
16698
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Dateiformat-Erkennung",
16710
16699
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Sammeln von Datensatzinformationen",
16711
16700
  "datafeeder.analysisProgressBar.illustration.samplingData": "Datenauswahl",
@@ -16832,28 +16821,28 @@ var de = {
16832
16821
  "facets.block.title.tag.default": "Stichwort",
16833
16822
  "facets.block.title.th_regions_tree.default": "Regionen",
16834
16823
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Anmelden</a>, um auf diese Funktion zuzugreifen</div>",
16835
- "language.ca": "Català",
16836
- "language.cs": "Čeština",
16824
+ "language.ca": "Katalanisch",
16825
+ "language.cs": "Tschechisch",
16837
16826
  "language.de": "Deutsch",
16838
- "language.en": "English",
16839
- "language.es": "Español",
16840
- "language.fi": "Suomi",
16841
- "language.fr": "Français",
16842
- "language.is": "Íslenska",
16843
- "language.it": "Italiano",
16844
- "language.ko": "한국어",
16845
- "language.nl": "Nederlands",
16846
- "language.pt": "Português",
16847
- "language.ru": "Русский",
16848
- "language.sk": "Slovenčina",
16849
- "language.zh": "中文",
16827
+ "language.en": "Englisch",
16828
+ "language.es": "Spanisch",
16829
+ "language.fi": "Finnisch",
16830
+ "language.fr": "Französisch",
16831
+ "language.is": "Isländisch",
16832
+ "language.it": "Italienisch",
16833
+ "language.ko": "Koreanisch",
16834
+ "language.nl": "Niederländisch",
16835
+ "language.pt": "Portugiesisch",
16836
+ "language.ru": "Russisch",
16837
+ "language.sk": "Slowakisch",
16838
+ "language.zh": "Chinesisch",
16850
16839
  "map.add.layer": "Eine Ebene hinzufügen",
16851
16840
  "map.add.layer.catalog": "Aus dem Katalog",
16852
16841
  "map.add.layer.file": "Aus einer Datei",
16853
16842
  "map.add.layer.wfs": "Aus WFS",
16854
16843
  "map.add.layer.wms": "Aus WMS",
16855
16844
  "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16856
- "map.geocoding.placeholder": "",
16845
+ "map.geocoding.placeholder": "Nach einem Ort suchen",
16857
16846
  "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16858
16847
  "map.layer.add": "Hinzufügen",
16859
16848
  "map.layers.available": "Verfügbare Layer",
@@ -16897,18 +16886,20 @@ var de = {
16897
16886
  "record.metadata.author": "Autor",
16898
16887
  "record.metadata.catalog": "Katalog",
16899
16888
  "record.metadata.contact": "Kontakt",
16900
- "record.metadata.createdOn": "Erstellt am",
16901
- "record.metadata.details": "Technische Informationen",
16889
+ "record.metadata.creation": "Erstellungsdatum",
16890
+ "record.metadata.details": "Über die Daten",
16902
16891
  "record.metadata.download": "Downloads",
16903
16892
  "record.metadata.formats": "Formate",
16904
- "record.metadata.isOpenData": "Open Data",
16905
16893
  "record.metadata.keywords": "Stichworte",
16906
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16894
+ "record.metadata.languages": "Sprachen",
16895
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
16907
16896
  "record.metadata.links": "Links",
16908
16897
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16909
- "record.metadata.origin": "Über die Daten",
16910
- "record.metadata.owner": "",
16898
+ "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
16899
+ "record.metadata.owner": "Herkunftskatalog",
16911
16900
  "record.metadata.preview": "Vorschau",
16901
+ "record.metadata.producer": "Datenproduzent",
16902
+ "record.metadata.publication": "Veröffentlichungsdatum",
16912
16903
  "record.metadata.publications": "Veröffentlichungen",
16913
16904
  "record.metadata.quality": "Metadatenqualität",
16914
16905
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
@@ -16930,12 +16921,17 @@ var de = {
16930
16921
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16931
16922
  "record.metadata.related": "Ähnliche Datensätze",
16932
16923
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16933
- "record.metadata.themes": "Kategorien",
16924
+ "record.metadata.status": "Status",
16925
+ "record.metadata.technical": "Technische Informationen",
16926
+ "record.metadata.temporalExtent": "Zeitlicher Umfang",
16927
+ "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
16928
+ "record.metadata.temporalExtent.sinceDate": "Seit {start}",
16929
+ "record.metadata.temporalExtent.untilDate": "Bis {end}",
16934
16930
  "record.metadata.title": "Titel",
16931
+ "record.metadata.topics": "Kategorien",
16935
16932
  "record.metadata.type": "Geographischer Datensatz",
16936
16933
  "record.metadata.uniqueId": "Eindeutige Kennung",
16937
16934
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16938
- "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16939
16935
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
16940
16936
  "record.metadata.usage": "Nutzung und Einschränkungen",
16941
16937
  "record.more.details": "Weitere Details",
@@ -16967,6 +16963,7 @@ var de = {
16967
16963
  "search.filters.isSpatial": "Ist räumliche Daten",
16968
16964
  "search.filters.isSpatial.no": "nicht räumlich",
16969
16965
  "search.filters.isSpatial.yes": "räumlich",
16966
+ "search.filters.keyword": "Schlüsselwort",
16970
16967
  "search.filters.license": "Lizenz",
16971
16968
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16972
16969
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16997,7 +16994,7 @@ var de = {
16997
16994
  "table.object.count": "Objekte in diesem Datensatz",
16998
16995
  "table.select.data": "Datenquelle",
16999
16996
  "tooltip.html.copy": "HTML kopieren",
17000
- "tooltip.id.copy": "",
16997
+ "tooltip.id.copy": "Eindeutige Kennung kopieren",
17001
16998
  "tooltip.url.copy": "URL kopieren",
17002
16999
  "tooltip.url.open": "URL öffnen",
17003
17000
  "ui.readLess": "Weniger lesen",
@@ -17031,20 +17028,21 @@ var en = {
17031
17028
  "chart.type.line": "line chart",
17032
17029
  "chart.type.lineSmooth": "smooth line chart",
17033
17030
  "chart.type.pie": "pie chart",
17031
+ "dashboard.createRecord": "New record",
17034
17032
  "dashboard.labels.mySpace": "My space",
17035
- "dashboard.records.all": "Catalog",
17033
+ "dashboard.records.all": "Metadata records",
17036
17034
  "dashboard.records.myDraft": "My drafts",
17037
17035
  "dashboard.records.myLibrary": "My library",
17038
17036
  "dashboard.records.myOrg": "Organization",
17039
17037
  "dashboard.records.myRecords": "My Records",
17040
- "dashboard.records.noRecord": "No record for this organization",
17041
- "dashboard.records.noUser": "No users for this organization",
17042
17038
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17043
17039
  "dashboard.records.search": "Search for \"{searchText}\"",
17044
17040
  "dashboard.records.userDetail": "Name",
17045
17041
  "dashboard.records.userEmail": "Email",
17046
17042
  "dashboard.records.username": "Username",
17047
17043
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
17044
+ "dashboard.results.listMetadata": "Show metadata",
17045
+ "dashboard.results.listResources": "Show resources",
17048
17046
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17049
17047
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17050
17048
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17171,21 +17169,21 @@ var en = {
17171
17169
  "facets.block.title.tag.default": "Tag",
17172
17170
  "facets.block.title.th_regions_tree.default": "Regions",
17173
17171
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
17174
- "language.ca": "Català",
17175
- "language.cs": "Čeština",
17176
- "language.de": "Deutsch",
17172
+ "language.ca": "Catalan",
17173
+ "language.cs": "Czech",
17174
+ "language.de": "German",
17177
17175
  "language.en": "English",
17178
- "language.es": "Español",
17179
- "language.fi": "Suomi",
17180
- "language.fr": "Français",
17181
- "language.is": "Íslenska",
17182
- "language.it": "Italiano",
17183
- "language.ko": "한국어",
17184
- "language.nl": "Nederlands",
17185
- "language.pt": "Português",
17186
- "language.ru": "Русский",
17187
- "language.sk": "Slovenčina",
17188
- "language.zh": "中文",
17176
+ "language.es": "Spanish",
17177
+ "language.fi": "Finnish",
17178
+ "language.fr": "French",
17179
+ "language.is": "Icelandic",
17180
+ "language.it": "Italian",
17181
+ "language.ko": "Korean",
17182
+ "language.nl": "Dutch",
17183
+ "language.pt": "Portuguese",
17184
+ "language.ru": "Russian",
17185
+ "language.sk": "Slovak",
17186
+ "language.zh": "Chinese",
17189
17187
  "map.add.layer": "Add a layer",
17190
17188
  "map.add.layer.catalog": "From the catalog",
17191
17189
  "map.add.layer.file": "From a file",
@@ -17236,18 +17234,20 @@ var en = {
17236
17234
  "record.metadata.author": "Author",
17237
17235
  "record.metadata.catalog": "Catalog",
17238
17236
  "record.metadata.contact": "Contact",
17239
- "record.metadata.createdOn": "Created on",
17240
- "record.metadata.details": "Technical information",
17237
+ "record.metadata.creation": "Date of creation",
17238
+ "record.metadata.details": "About the data",
17241
17239
  "record.metadata.download": "Downloads",
17242
17240
  "record.metadata.formats": "Formats",
17243
- "record.metadata.isOpenData": "Open Data",
17244
17241
  "record.metadata.keywords": "Keywords",
17245
- "record.metadata.lastUpdate": "Last updated on",
17242
+ "record.metadata.languages": "Languages",
17243
+ "record.metadata.lastUpdate": "Last updated on {date}",
17246
17244
  "record.metadata.links": "Links",
17247
17245
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17248
- "record.metadata.origin": "About the data",
17246
+ "record.metadata.otherConstraints": "Additional Conditions",
17249
17247
  "record.metadata.owner": "Catalog of origin",
17250
17248
  "record.metadata.preview": "Preview",
17249
+ "record.metadata.producer": "Data producer",
17250
+ "record.metadata.publication": "Date of publication",
17251
17251
  "record.metadata.publications": "publications",
17252
17252
  "record.metadata.quality": "Metadata Quality",
17253
17253
  "record.metadata.quality.contact.failed": "Contact is not specified",
@@ -17269,14 +17269,19 @@ var en = {
17269
17269
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17270
17270
  "record.metadata.related": "Related records",
17271
17271
  "record.metadata.sheet": "Original metadata",
17272
- "record.metadata.themes": "Categories",
17272
+ "record.metadata.status": "Status",
17273
+ "record.metadata.technical": "Technical information",
17274
+ "record.metadata.temporalExtent": "Temporal extent",
17275
+ "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
17276
+ "record.metadata.temporalExtent.sinceDate": "Since { start }",
17277
+ "record.metadata.temporalExtent.untilDate": "Until { end }",
17273
17278
  "record.metadata.title": "Title",
17279
+ "record.metadata.topics": "Categories",
17274
17280
  "record.metadata.type": "Geographical dataset",
17275
17281
  "record.metadata.uniqueId": "Unique Identifier",
17276
17282
  "record.metadata.updateFrequency": "Data Update Frequency",
17277
- "record.metadata.updateStatus": "Data Update Status",
17278
- "record.metadata.updatedOn": "Metadata's last update",
17279
- "record.metadata.usage": "Usage & constraints",
17283
+ "record.metadata.updatedOn": "Last Data Information Update",
17284
+ "record.metadata.usage": "License and Conditions",
17280
17285
  "record.more.details": "Read more",
17281
17286
  "record.tab.chart": "Chart",
17282
17287
  "record.tab.data": "Table",
@@ -17306,6 +17311,7 @@ var en = {
17306
17311
  "search.filters.isSpatial": "Is spatial data",
17307
17312
  "search.filters.isSpatial.no": "non spatial",
17308
17313
  "search.filters.isSpatial.yes": "spatial",
17314
+ "search.filters.keyword": "Keyword",
17309
17315
  "search.filters.license": "License",
17310
17316
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17311
17317
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17370,20 +17376,21 @@ var es = {
17370
17376
  "chart.type.line": "gráfico de líneas",
17371
17377
  "chart.type.lineSmooth": "gráfico de líneas suave",
17372
17378
  "chart.type.pie": "gráfico circular",
17379
+ "dashboard.createRecord": "",
17373
17380
  "dashboard.labels.mySpace": "Mi espacio",
17374
17381
  "dashboard.records.all": "Catálogo",
17375
17382
  "dashboard.records.myDraft": "Mis borradores",
17376
17383
  "dashboard.records.myLibrary": "Mi biblioteca",
17377
17384
  "dashboard.records.myOrg": "Organización",
17378
17385
  "dashboard.records.myRecords": "Mis Registros",
17379
- "dashboard.records.noRecord": "",
17380
- "dashboard.records.noUser": "",
17381
17386
  "dashboard.records.publishedRecords": "",
17382
17387
  "dashboard.records.search": "Buscar \"{searchText}\"",
17383
17388
  "dashboard.records.userDetail": "",
17384
17389
  "dashboard.records.userEmail": "",
17385
17390
  "dashboard.records.username": "",
17386
17391
  "dashboard.records.users": "",
17392
+ "dashboard.results.listMetadata": "",
17393
+ "dashboard.results.listResources": "",
17387
17394
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17388
17395
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17389
17396
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17510,21 +17517,21 @@ var es = {
17510
17517
  "facets.block.title.tag.default": "",
17511
17518
  "facets.block.title.th_regions_tree.default": "",
17512
17519
  "favorite.not.authenticated.tooltip": "",
17513
- "language.ca": "Català",
17514
- "language.cs": "Čeština",
17515
- "language.de": "Deutsch",
17516
- "language.en": "English",
17520
+ "language.ca": "Catalán",
17521
+ "language.cs": "Checo",
17522
+ "language.de": "Alemán",
17523
+ "language.en": "Inglés",
17517
17524
  "language.es": "Español",
17518
- "language.fi": "Suomi",
17519
- "language.fr": "Français",
17520
- "language.is": "Íslenska",
17525
+ "language.fi": "Finlandés",
17526
+ "language.fr": "Francés",
17527
+ "language.is": "Islandés",
17521
17528
  "language.it": "Italiano",
17522
- "language.ko": "한국어",
17523
- "language.nl": "Nederlands",
17524
- "language.pt": "Português",
17525
- "language.ru": "Русский",
17526
- "language.sk": "Slovenčina",
17527
- "language.zh": "中文",
17529
+ "language.ko": "Coreano",
17530
+ "language.nl": "Neerlandés",
17531
+ "language.pt": "Portugués",
17532
+ "language.ru": "Ruso",
17533
+ "language.sk": "Eslovaco",
17534
+ "language.zh": "Chino",
17528
17535
  "map.add.layer": "",
17529
17536
  "map.add.layer.catalog": "",
17530
17537
  "map.add.layer.file": "",
@@ -17575,18 +17582,20 @@ var es = {
17575
17582
  "record.metadata.author": "",
17576
17583
  "record.metadata.catalog": "",
17577
17584
  "record.metadata.contact": "",
17578
- "record.metadata.createdOn": "",
17585
+ "record.metadata.creation": "",
17579
17586
  "record.metadata.details": "",
17580
17587
  "record.metadata.download": "",
17581
17588
  "record.metadata.formats": "",
17582
- "record.metadata.isOpenData": "",
17583
17589
  "record.metadata.keywords": "",
17590
+ "record.metadata.languages": "",
17584
17591
  "record.metadata.lastUpdate": "",
17585
17592
  "record.metadata.links": "",
17586
17593
  "record.metadata.noUsage": "",
17587
- "record.metadata.origin": "",
17594
+ "record.metadata.otherConstraints": "",
17588
17595
  "record.metadata.owner": "",
17589
17596
  "record.metadata.preview": "",
17597
+ "record.metadata.producer": "",
17598
+ "record.metadata.publication": "",
17590
17599
  "record.metadata.publications": "",
17591
17600
  "record.metadata.quality": "",
17592
17601
  "record.metadata.quality.contact.failed": "",
@@ -17608,12 +17617,17 @@ var es = {
17608
17617
  "record.metadata.quality.updateFrequency.success": "",
17609
17618
  "record.metadata.related": "",
17610
17619
  "record.metadata.sheet": "",
17611
- "record.metadata.themes": "",
17620
+ "record.metadata.status": "",
17621
+ "record.metadata.technical": "",
17622
+ "record.metadata.temporalExtent": "",
17623
+ "record.metadata.temporalExtent.fromDateToDate": "",
17624
+ "record.metadata.temporalExtent.sinceDate": "",
17625
+ "record.metadata.temporalExtent.untilDate": "",
17612
17626
  "record.metadata.title": "",
17627
+ "record.metadata.topics": "",
17613
17628
  "record.metadata.type": "",
17614
17629
  "record.metadata.uniqueId": "",
17615
17630
  "record.metadata.updateFrequency": "",
17616
- "record.metadata.updateStatus": "",
17617
17631
  "record.metadata.updatedOn": "",
17618
17632
  "record.metadata.usage": "",
17619
17633
  "record.more.details": "",
@@ -17645,6 +17659,7 @@ var es = {
17645
17659
  "search.filters.isSpatial": "",
17646
17660
  "search.filters.isSpatial.no": "",
17647
17661
  "search.filters.isSpatial.yes": "",
17662
+ "search.filters.keyword": "",
17648
17663
  "search.filters.license": "",
17649
17664
  "search.filters.license.cc-by": "",
17650
17665
  "search.filters.license.cc-by-sa": "",
@@ -17709,20 +17724,21 @@ var fr = {
17709
17724
  "chart.type.line": "ligne",
17710
17725
  "chart.type.lineSmooth": "ligne lisse",
17711
17726
  "chart.type.pie": "camembert",
17727
+ "dashboard.createRecord": "Nouvel enregistrement",
17712
17728
  "dashboard.labels.mySpace": "Mon espace",
17713
17729
  "dashboard.records.all": "Catalogue",
17714
17730
  "dashboard.records.myDraft": "Mes brouillons",
17715
17731
  "dashboard.records.myLibrary": "Ma bibliothèque",
17716
17732
  "dashboard.records.myOrg": "Mon organisation",
17717
17733
  "dashboard.records.myRecords": "Mes fiches publiées",
17718
- "dashboard.records.noRecord": "Aucun jeu de données pour cette organisation",
17719
- "dashboard.records.noUser": "Aucun utilisateur pour cette organisation",
17720
17734
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17721
17735
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17722
17736
  "dashboard.records.userDetail": "Nom",
17723
17737
  "dashboard.records.userEmail": "Email",
17724
17738
  "dashboard.records.username": "Nom d'utilisateur",
17725
17739
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17740
+ "dashboard.results.listMetadata": "Afficher les métadonnées",
17741
+ "dashboard.results.listResources": "Afficher les ressources",
17726
17742
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17727
17743
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17728
17744
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17849,38 +17865,38 @@ var fr = {
17849
17865
  "facets.block.title.tag.default": "Tag",
17850
17866
  "facets.block.title.th_regions_tree.default": "Régions",
17851
17867
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
17852
- "language.ca": "Català",
17853
- "language.cs": "Čeština",
17854
- "language.de": "Deutsch",
17855
- "language.en": "English",
17856
- "language.es": "Español",
17857
- "language.fi": "Suomi",
17868
+ "language.ca": "Catalan",
17869
+ "language.cs": "Tchèque",
17870
+ "language.de": "Allemand",
17871
+ "language.en": "Anglais",
17872
+ "language.es": "Espagnol",
17873
+ "language.fi": "Finnois",
17858
17874
  "language.fr": "Français",
17859
- "language.is": "Íslenska",
17860
- "language.it": "Italiano",
17861
- "language.ko": "한국어",
17862
- "language.nl": "Nederlands",
17863
- "language.pt": "Português",
17864
- "language.ru": "Русский",
17865
- "language.sk": "Slovenčina",
17866
- "language.zh": "中文",
17867
- "map.add.layer": "",
17868
- "map.add.layer.catalog": "",
17869
- "map.add.layer.file": "",
17870
- "map.add.layer.wfs": "",
17871
- "map.add.layer.wms": "",
17872
- "map.addFromFile.placeholder": "",
17873
- "map.geocoding.placeholder": "",
17874
- "map.help.addFromFile": "",
17875
- "map.layer.add": "",
17876
- "map.layers.available": "",
17877
- "map.layers.list": "",
17875
+ "language.is": "Islandais",
17876
+ "language.it": "Italien",
17877
+ "language.ko": "Coréen",
17878
+ "language.nl": "Néerlandais",
17879
+ "language.pt": "Portugais",
17880
+ "language.ru": "Russe",
17881
+ "language.sk": "Slovaque",
17882
+ "language.zh": "Chinois",
17883
+ "map.add.layer": "Ajouter une couche",
17884
+ "map.add.layer.catalog": "Du catalogue",
17885
+ "map.add.layer.file": "À partir d'un fichier",
17886
+ "map.add.layer.wfs": "Depuis un service WFS",
17887
+ "map.add.layer.wms": "Depuis un service WMS",
17888
+ "map.addFromFile.placeholder": "Cliquez ou déposez un fichier ici",
17889
+ "map.geocoding.placeholder": "Rechercher un lieu",
17890
+ "map.help.addFromFile": "Cliquez ou glissez-déposez un fichier pour l'ajouter à la carte (supporte actuellement uniquement le format GeoJSON).",
17891
+ "map.layer.add": "Ajouter",
17892
+ "map.layers.available": "Couches disponibles",
17893
+ "map.layers.list": "Couches",
17878
17894
  "map.loading.data": "Chargement des données...",
17879
- "map.loading.service": "",
17895
+ "map.loading.service": "Chargement du service...",
17880
17896
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17881
17897
  "map.select.layer": "Source de données",
17882
- "map.wfs.urlInput.hint": "",
17883
- "map.wms.urlInput.hint": "",
17898
+ "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
17899
+ "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
17884
17900
  "multiselect.filter.placeholder": "Rechercher",
17885
17901
  "nav.back": "Retour",
17886
17902
  next: next$3,
@@ -17914,18 +17930,20 @@ var fr = {
17914
17930
  "record.metadata.author": "Auteur",
17915
17931
  "record.metadata.catalog": "Catalogue",
17916
17932
  "record.metadata.contact": "Contact",
17917
- "record.metadata.createdOn": "Créé le",
17918
- "record.metadata.details": "Informations techniques",
17933
+ "record.metadata.creation": "Date de création",
17934
+ "record.metadata.details": "A propos de la donnée",
17919
17935
  "record.metadata.download": "Téléchargements",
17920
17936
  "record.metadata.formats": "Formats",
17921
- "record.metadata.isOpenData": "Donnée Ouverte",
17922
17937
  "record.metadata.keywords": "Mots clés",
17923
- "record.metadata.lastUpdate": "Mis à jour le",
17938
+ "record.metadata.languages": "Langues",
17939
+ "record.metadata.lastUpdate": "Mis à jour le {date}",
17924
17940
  "record.metadata.links": "Liens",
17925
17941
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17926
- "record.metadata.origin": "À propos des données",
17942
+ "record.metadata.otherConstraints": "Limitations d'usage",
17927
17943
  "record.metadata.owner": "Catalogue d'origine",
17928
17944
  "record.metadata.preview": "Aperçu",
17945
+ "record.metadata.producer": "Producteur de la donnée",
17946
+ "record.metadata.publication": "Date de publication",
17929
17947
  "record.metadata.publications": "données",
17930
17948
  "record.metadata.quality": "Qualité des métadonnées",
17931
17949
  "record.metadata.quality.contact.failed": "Contact n'est pas renseigné",
@@ -17947,14 +17965,19 @@ var fr = {
17947
17965
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17948
17966
  "record.metadata.related": "Voir aussi",
17949
17967
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17950
- "record.metadata.themes": "Catégories",
17968
+ "record.metadata.status": "Statut",
17969
+ "record.metadata.technical": "Informations techniques",
17970
+ "record.metadata.temporalExtent": "Etendue temporelle",
17971
+ "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
17972
+ "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
17973
+ "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
17951
17974
  "record.metadata.title": "Titre",
17975
+ "record.metadata.topics": "Catégories",
17952
17976
  "record.metadata.type": "Donnée géographique",
17953
17977
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17954
17978
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17955
- "record.metadata.updateStatus": "Statut de mise à jour des données",
17956
- "record.metadata.updatedOn": "Mise à jour de la fiche de métadonnée",
17957
- "record.metadata.usage": "Conditions d'utilisation",
17979
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17980
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17958
17981
  "record.more.details": "Détails",
17959
17982
  "record.tab.chart": "Graphique",
17960
17983
  "record.tab.data": "Tableau",
@@ -17984,6 +18007,7 @@ var fr = {
17984
18007
  "search.filters.isSpatial": "Données spatiales",
17985
18008
  "search.filters.isSpatial.no": "non-géolocalisées",
17986
18009
  "search.filters.isSpatial.yes": "géolocalisées",
18010
+ "search.filters.keyword": "Mot-clé",
17987
18011
  "search.filters.license": "Licence",
17988
18012
  "search.filters.license.cc-by": "cc-by",
17989
18013
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18048,20 +18072,21 @@ var it = {
18048
18072
  "chart.type.line": "grafico a linee",
18049
18073
  "chart.type.lineSmooth": "grafico a linea liscia",
18050
18074
  "chart.type.pie": "grafico a torta",
18075
+ "dashboard.createRecord": "Crea un record",
18051
18076
  "dashboard.labels.mySpace": "Il mio spazio",
18052
18077
  "dashboard.records.all": "Catalogo",
18053
18078
  "dashboard.records.myDraft": "Le mie bozze",
18054
18079
  "dashboard.records.myLibrary": "La mia biblioteca",
18055
18080
  "dashboard.records.myOrg": "La mia organizzazione",
18056
18081
  "dashboard.records.myRecords": "I miei dati",
18057
- "dashboard.records.noRecord": "Nessun dati per questa organizzazione",
18058
- "dashboard.records.noUser": "Nessun utente per questa organizzazione",
18059
18082
  "dashboard.records.publishedRecords": "dati pubblicati",
18060
18083
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18061
18084
  "dashboard.records.userDetail": "Nome",
18062
18085
  "dashboard.records.userEmail": "Email",
18063
18086
  "dashboard.records.username": "Nome utente",
18064
18087
  "dashboard.records.users": "utenti",
18088
+ "dashboard.results.listMetadata": "Elenco dei metadati",
18089
+ "dashboard.results.listResources": "Elenco delle risorse",
18065
18090
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18066
18091
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18067
18092
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18188,38 +18213,38 @@ var it = {
18188
18213
  "facets.block.title.tag.default": "Tag",
18189
18214
  "facets.block.title.th_regions_tree.default": "Regioni",
18190
18215
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> per accedere a questa funzionalità</div>",
18191
- "language.ca": "Català",
18192
- "language.cs": "Čeština",
18193
- "language.de": "Deutsch",
18194
- "language.en": "English",
18195
- "language.es": "Español",
18196
- "language.fi": "Suomi",
18197
- "language.fr": "Français",
18198
- "language.is": "Íslenska",
18216
+ "language.ca": "Catalano",
18217
+ "language.cs": "Ceco",
18218
+ "language.de": "Tedesco",
18219
+ "language.en": "Inglese",
18220
+ "language.es": "Spagnolo",
18221
+ "language.fi": "Finlandese",
18222
+ "language.fr": "Francese",
18223
+ "language.is": "Islandese",
18199
18224
  "language.it": "Italiano",
18200
- "language.ko": "한국어",
18201
- "language.nl": "Nederlands",
18202
- "language.pt": "Português",
18203
- "language.ru": "Русский",
18204
- "language.sk": "Slovenčina",
18205
- "language.zh": "中文",
18225
+ "language.ko": "Coreano",
18226
+ "language.nl": "Olandese",
18227
+ "language.pt": "Portoghese",
18228
+ "language.ru": "Russo",
18229
+ "language.sk": "Slovacco",
18230
+ "language.zh": "Cinese",
18206
18231
  "map.add.layer": "Aggiungere un layer",
18207
18232
  "map.add.layer.catalog": "Dal catalogo",
18208
18233
  "map.add.layer.file": "Da un file",
18209
18234
  "map.add.layer.wfs": "Da un WFS",
18210
18235
  "map.add.layer.wms": "Da un WMS",
18211
- "map.addFromFile.placeholder": "",
18212
- "map.geocoding.placeholder": "",
18213
- "map.help.addFromFile": "",
18214
- "map.layer.add": "",
18215
- "map.layers.available": "",
18236
+ "map.addFromFile.placeholder": "Clicca o trascina un file qui",
18237
+ "map.geocoding.placeholder": "Cerca un luogo",
18238
+ "map.help.addFromFile": "Clicca o trascina un file per aggiungerlo alla mappa (attualmente supporta solo il formato GeoJSON)",
18239
+ "map.layer.add": "Aggiungi",
18240
+ "map.layers.available": "Layer disponibili",
18216
18241
  "map.layers.list": "Layers",
18217
18242
  "map.loading.data": "Caricamento dati...",
18218
- "map.loading.service": "",
18243
+ "map.loading.service": "Caricamento del servizio...",
18219
18244
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18220
18245
  "map.select.layer": "Sorgente dati",
18221
- "map.wfs.urlInput.hint": "",
18222
- "map.wms.urlInput.hint": "",
18246
+ "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
18247
+ "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
18223
18248
  "multiselect.filter.placeholder": "Cerca",
18224
18249
  "nav.back": "Indietro",
18225
18250
  next: next$2,
@@ -18253,18 +18278,20 @@ var it = {
18253
18278
  "record.metadata.author": "Autore",
18254
18279
  "record.metadata.catalog": "Catalogo",
18255
18280
  "record.metadata.contact": "Contatto",
18256
- "record.metadata.createdOn": "Creato il",
18257
- "record.metadata.details": "Informazioni tecniche",
18281
+ "record.metadata.creation": "Data di creazione",
18282
+ "record.metadata.details": "A proposito del dati",
18258
18283
  "record.metadata.download": "Download",
18259
18284
  "record.metadata.formats": "Formati",
18260
- "record.metadata.isOpenData": "Data aperta",
18261
18285
  "record.metadata.keywords": "Parole chiave",
18262
- "record.metadata.lastUpdate": "Ultimo aggiornamento",
18286
+ "record.metadata.languages": "Lingue",
18287
+ "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
18263
18288
  "record.metadata.links": "Collegamenti",
18264
18289
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18265
- "record.metadata.origin": "Informazioni sui dati",
18290
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18266
18291
  "record.metadata.owner": "Catalogo originale",
18267
18292
  "record.metadata.preview": "Anteprima",
18293
+ "record.metadata.producer": "Produttore dei dati",
18294
+ "record.metadata.publication": "Data di pubblicazione",
18268
18295
  "record.metadata.publications": "pubblicazioni",
18269
18296
  "record.metadata.quality": "Qualità dei metadati",
18270
18297
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
@@ -18286,14 +18313,19 @@ var it = {
18286
18313
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18287
18314
  "record.metadata.related": "Vedi anche",
18288
18315
  "record.metadata.sheet": "Origine del metadata",
18289
- "record.metadata.themes": "Categorie",
18316
+ "record.metadata.status": "Stato",
18317
+ "record.metadata.technical": "Informazioni tecniche",
18318
+ "record.metadata.temporalExtent": "Periodo di tempo",
18319
+ "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
18320
+ "record.metadata.temporalExtent.sinceDate": "Dal {start}",
18321
+ "record.metadata.temporalExtent.untilDate": "Fino a {end}",
18290
18322
  "record.metadata.title": "Titolo",
18323
+ "record.metadata.topics": "Categorie",
18291
18324
  "record.metadata.type": "Dati geografici",
18292
18325
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18293
18326
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18294
- "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18295
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18296
- "record.metadata.usage": "Condizioni d'uso",
18327
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18328
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18297
18329
  "record.more.details": "Dettagli",
18298
18330
  "record.tab.chart": "Grafico",
18299
18331
  "record.tab.data": "Tabella",
@@ -18323,6 +18355,7 @@ var it = {
18323
18355
  "search.filters.isSpatial": "Dati spaziali",
18324
18356
  "search.filters.isSpatial.no": "Non geolocalizzati",
18325
18357
  "search.filters.isSpatial.yes": "Geolocalizzati",
18358
+ "search.filters.keyword": "Parola chiave",
18326
18359
  "search.filters.license": "Licenza",
18327
18360
  "search.filters.license.cc-by": "cc-by",
18328
18361
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18387,20 +18420,21 @@ var nl = {
18387
18420
  "chart.type.line": "lijndiagram",
18388
18421
  "chart.type.lineSmooth": "glad lijndiagram",
18389
18422
  "chart.type.pie": "cirkeldiagram",
18423
+ "dashboard.createRecord": "",
18390
18424
  "dashboard.labels.mySpace": "Mijn ruimte",
18391
18425
  "dashboard.records.all": "Catalogus",
18392
18426
  "dashboard.records.myDraft": "Mijn concepten",
18393
18427
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18394
18428
  "dashboard.records.myOrg": "Organisatie",
18395
18429
  "dashboard.records.myRecords": "Mijn Records",
18396
- "dashboard.records.noRecord": "",
18397
- "dashboard.records.noUser": "",
18398
18430
  "dashboard.records.publishedRecords": "",
18399
18431
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18400
18432
  "dashboard.records.userDetail": "",
18401
18433
  "dashboard.records.userEmail": "",
18402
18434
  "dashboard.records.username": "",
18403
18435
  "dashboard.records.users": "",
18436
+ "dashboard.results.listMetadata": "",
18437
+ "dashboard.results.listResources": "",
18404
18438
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18405
18439
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18406
18440
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18527,21 +18561,21 @@ var nl = {
18527
18561
  "facets.block.title.tag.default": "",
18528
18562
  "facets.block.title.th_regions_tree.default": "",
18529
18563
  "favorite.not.authenticated.tooltip": "",
18530
- "language.ca": "Català",
18531
- "language.cs": "Čeština",
18532
- "language.de": "Deutsch",
18533
- "language.en": "English",
18534
- "language.es": "Español",
18535
- "language.fi": "Suomi",
18536
- "language.fr": "Français",
18537
- "language.is": "Íslenska",
18538
- "language.it": "Italiano",
18539
- "language.ko": "한국어",
18564
+ "language.ca": "Catalaans",
18565
+ "language.cs": "Tsjechisch",
18566
+ "language.de": "Duits",
18567
+ "language.en": "Engels",
18568
+ "language.es": "Spaans",
18569
+ "language.fi": "Fins",
18570
+ "language.fr": "Frans",
18571
+ "language.is": "IJslands",
18572
+ "language.it": "Italiaans",
18573
+ "language.ko": "Koreaans",
18540
18574
  "language.nl": "Nederlands",
18541
- "language.pt": "Português",
18542
- "language.ru": "Русский",
18543
- "language.sk": "Slovenčina",
18544
- "language.zh": "中文",
18575
+ "language.pt": "Portugees",
18576
+ "language.ru": "Russisch",
18577
+ "language.sk": "Slowaaks",
18578
+ "language.zh": "Chinees",
18545
18579
  "map.add.layer": "",
18546
18580
  "map.add.layer.catalog": "",
18547
18581
  "map.add.layer.file": "",
@@ -18592,18 +18626,20 @@ var nl = {
18592
18626
  "record.metadata.author": "",
18593
18627
  "record.metadata.catalog": "",
18594
18628
  "record.metadata.contact": "",
18595
- "record.metadata.createdOn": "",
18629
+ "record.metadata.creation": "",
18596
18630
  "record.metadata.details": "",
18597
18631
  "record.metadata.download": "",
18598
18632
  "record.metadata.formats": "",
18599
- "record.metadata.isOpenData": "",
18600
18633
  "record.metadata.keywords": "",
18634
+ "record.metadata.languages": "",
18601
18635
  "record.metadata.lastUpdate": "",
18602
18636
  "record.metadata.links": "",
18603
18637
  "record.metadata.noUsage": "",
18604
- "record.metadata.origin": "",
18638
+ "record.metadata.otherConstraints": "",
18605
18639
  "record.metadata.owner": "",
18606
18640
  "record.metadata.preview": "",
18641
+ "record.metadata.producer": "",
18642
+ "record.metadata.publication": "",
18607
18643
  "record.metadata.publications": "",
18608
18644
  "record.metadata.quality": "",
18609
18645
  "record.metadata.quality.contact.failed": "",
@@ -18625,12 +18661,17 @@ var nl = {
18625
18661
  "record.metadata.quality.updateFrequency.success": "",
18626
18662
  "record.metadata.related": "",
18627
18663
  "record.metadata.sheet": "",
18628
- "record.metadata.themes": "",
18664
+ "record.metadata.status": "",
18665
+ "record.metadata.technical": "",
18666
+ "record.metadata.temporalExtent": "",
18667
+ "record.metadata.temporalExtent.fromDateToDate": "",
18668
+ "record.metadata.temporalExtent.sinceDate": "",
18669
+ "record.metadata.temporalExtent.untilDate": "",
18629
18670
  "record.metadata.title": "",
18671
+ "record.metadata.topics": "",
18630
18672
  "record.metadata.type": "",
18631
18673
  "record.metadata.uniqueId": "",
18632
18674
  "record.metadata.updateFrequency": "",
18633
- "record.metadata.updateStatus": "",
18634
18675
  "record.metadata.updatedOn": "",
18635
18676
  "record.metadata.usage": "",
18636
18677
  "record.more.details": "",
@@ -18662,6 +18703,7 @@ var nl = {
18662
18703
  "search.filters.isSpatial": "",
18663
18704
  "search.filters.isSpatial.no": "",
18664
18705
  "search.filters.isSpatial.yes": "",
18706
+ "search.filters.keyword": "",
18665
18707
  "search.filters.license": "",
18666
18708
  "search.filters.license.cc-by": "",
18667
18709
  "search.filters.license.cc-by-sa": "",
@@ -18726,20 +18768,21 @@ var pt = {
18726
18768
  "chart.type.line": "gráfico de linha",
18727
18769
  "chart.type.lineSmooth": "gráfico de linha suave",
18728
18770
  "chart.type.pie": "gráfico de pizza",
18771
+ "dashboard.createRecord": "",
18729
18772
  "dashboard.labels.mySpace": "Meu espaço",
18730
18773
  "dashboard.records.all": "Catálogo",
18731
18774
  "dashboard.records.myDraft": "Meus rascunhos",
18732
18775
  "dashboard.records.myLibrary": "Minha biblioteca",
18733
18776
  "dashboard.records.myOrg": "Organização",
18734
18777
  "dashboard.records.myRecords": "Meus Registros",
18735
- "dashboard.records.noRecord": "",
18736
- "dashboard.records.noUser": "",
18737
18778
  "dashboard.records.publishedRecords": "",
18738
18779
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18739
18780
  "dashboard.records.userDetail": "",
18740
18781
  "dashboard.records.userEmail": "",
18741
18782
  "dashboard.records.username": "",
18742
18783
  "dashboard.records.users": "",
18784
+ "dashboard.results.listMetadata": "",
18785
+ "dashboard.results.listResources": "",
18743
18786
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18744
18787
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18745
18788
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18866,21 +18909,21 @@ var pt = {
18866
18909
  "facets.block.title.tag.default": "",
18867
18910
  "facets.block.title.th_regions_tree.default": "",
18868
18911
  "favorite.not.authenticated.tooltip": "",
18869
- "language.ca": "Català",
18870
- "language.cs": "Čeština",
18871
- "language.de": "Deutsch",
18872
- "language.en": "English",
18873
- "language.es": "Español",
18874
- "language.fi": "Suomi",
18875
- "language.fr": "Français",
18876
- "language.is": "Íslenska",
18912
+ "language.ca": "Catalão",
18913
+ "language.cs": "Tcheco",
18914
+ "language.de": "Alemão",
18915
+ "language.en": "Inglês",
18916
+ "language.es": "Espanhol",
18917
+ "language.fi": "Finlandês",
18918
+ "language.fr": "Francês",
18919
+ "language.is": "Islandês",
18877
18920
  "language.it": "Italiano",
18878
- "language.ko": "한국어",
18879
- "language.nl": "Nederlands",
18921
+ "language.ko": "Coreano",
18922
+ "language.nl": "Holandês",
18880
18923
  "language.pt": "Português",
18881
- "language.ru": "Русский",
18882
- "language.sk": "Slovenčina",
18883
- "language.zh": "中文",
18924
+ "language.ru": "Russo",
18925
+ "language.sk": "Eslovaco",
18926
+ "language.zh": "Chinês",
18884
18927
  "map.add.layer": "",
18885
18928
  "map.add.layer.catalog": "",
18886
18929
  "map.add.layer.file": "",
@@ -18931,18 +18974,20 @@ var pt = {
18931
18974
  "record.metadata.author": "",
18932
18975
  "record.metadata.catalog": "",
18933
18976
  "record.metadata.contact": "",
18934
- "record.metadata.createdOn": "",
18977
+ "record.metadata.creation": "",
18935
18978
  "record.metadata.details": "",
18936
18979
  "record.metadata.download": "",
18937
18980
  "record.metadata.formats": "",
18938
- "record.metadata.isOpenData": "",
18939
18981
  "record.metadata.keywords": "",
18982
+ "record.metadata.languages": "",
18940
18983
  "record.metadata.lastUpdate": "",
18941
18984
  "record.metadata.links": "",
18942
18985
  "record.metadata.noUsage": "",
18943
- "record.metadata.origin": "",
18986
+ "record.metadata.otherConstraints": "",
18944
18987
  "record.metadata.owner": "",
18945
18988
  "record.metadata.preview": "",
18989
+ "record.metadata.producer": "",
18990
+ "record.metadata.publication": "",
18946
18991
  "record.metadata.publications": "",
18947
18992
  "record.metadata.quality": "",
18948
18993
  "record.metadata.quality.contact.failed": "",
@@ -18964,12 +19009,17 @@ var pt = {
18964
19009
  "record.metadata.quality.updateFrequency.success": "",
18965
19010
  "record.metadata.related": "",
18966
19011
  "record.metadata.sheet": "",
18967
- "record.metadata.themes": "",
19012
+ "record.metadata.status": "",
19013
+ "record.metadata.technical": "",
19014
+ "record.metadata.temporalExtent": "",
19015
+ "record.metadata.temporalExtent.fromDateToDate": "",
19016
+ "record.metadata.temporalExtent.sinceDate": "",
19017
+ "record.metadata.temporalExtent.untilDate": "",
18968
19018
  "record.metadata.title": "",
19019
+ "record.metadata.topics": "",
18969
19020
  "record.metadata.type": "",
18970
19021
  "record.metadata.uniqueId": "",
18971
19022
  "record.metadata.updateFrequency": "",
18972
- "record.metadata.updateStatus": "",
18973
19023
  "record.metadata.updatedOn": "",
18974
19024
  "record.metadata.usage": "",
18975
19025
  "record.more.details": "",
@@ -19001,6 +19051,7 @@ var pt = {
19001
19051
  "search.filters.isSpatial": "",
19002
19052
  "search.filters.isSpatial.no": "",
19003
19053
  "search.filters.isSpatial.yes": "",
19054
+ "search.filters.keyword": "",
19004
19055
  "search.filters.license": "",
19005
19056
  "search.filters.license.cc-by": "",
19006
19057
  "search.filters.license.cc-by-sa": "",
@@ -19109,8 +19160,8 @@ class Gn4FieldMapper {
19109
19160
  },
19110
19161
  cl_topic: (output, source) => ({
19111
19162
  ...output,
19112
- themes: [
19113
- ...(output.themes || []),
19163
+ topics: [
19164
+ ...(output.topics || []),
19114
19165
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
19115
19166
  ],
19116
19167
  }),
@@ -19134,6 +19185,18 @@ class Gn4FieldMapper {
19134
19185
  ...output,
19135
19186
  recordUpdated: toDate(selectField(source, 'changeDate')),
19136
19187
  }),
19188
+ publicationDateForResource: (output, source) => ({
19189
+ ...output,
19190
+ recordPublished: toDate(selectField(source, 'publicationDateForResource')),
19191
+ }),
19192
+ resourceLanguage: (output, source) => {
19193
+ const langList = getAsArray(selectField(source, 'resourceLanguage'));
19194
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
19195
+ return {
19196
+ ...output,
19197
+ languages,
19198
+ };
19199
+ },
19137
19200
  link: (output, source) => {
19138
19201
  const rawLinks = getAsArray(selectField(source, 'link'));
19139
19202
  const distributions = rawLinks
@@ -19165,31 +19228,22 @@ class Gn4FieldMapper {
19165
19228
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19166
19229
  }, output);
19167
19230
  },
19168
- tag: (output, source) => ({
19231
+ allKeywords: (output, source) => ({
19169
19232
  ...output,
19170
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19233
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19171
19234
  }),
19172
19235
  inspireTheme: (output, source) => ({
19173
19236
  ...output,
19174
- themes: [
19175
- ...(output.themes || []),
19237
+ topics: [
19238
+ ...(output.topics || []),
19176
19239
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19177
19240
  ],
19178
19241
  }),
19179
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19180
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19181
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19182
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19183
- licenseObject: (output, source) => ({
19184
- ...output,
19185
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19186
- const link = getAsUrl(selectField(license, 'link'));
19187
- return {
19188
- text: selectTranslatedValue(license, this.lang3),
19189
- ...(link ? { link } : {}),
19190
- };
19191
- }),
19192
- }),
19242
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19243
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19244
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19245
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19246
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19193
19247
  lineageObject: (output, source) => ({
19194
19248
  ...output,
19195
19249
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19235,8 +19289,8 @@ class Gn4FieldMapper {
19235
19289
  ],
19236
19290
  };
19237
19291
  },
19238
- resourceTemporalDateRange: (output, source) => {
19239
- const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19292
+ resourceTemporalExtentDateRange: (output, source) => {
19293
+ const ranges = getAsArray(selectField(source, 'resourceTemporalExtentDateRange'));
19240
19294
  return {
19241
19295
  ...output,
19242
19296
  temporalExtents: ranges.map((range) => {
@@ -19251,31 +19305,42 @@ class Gn4FieldMapper {
19251
19305
  },
19252
19306
  };
19253
19307
  this.genericField = (output) => output;
19254
- this.constraintField = (fieldName, output, source) => ({
19255
- ...output,
19256
- ...(fieldName.endsWith('UseLimitationObject')
19257
- ? {
19258
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19259
- ? [
19260
- ...(output.legalConstraints || []),
19261
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19262
- ]
19263
- : output.legalConstraints || [],
19264
- useLimitations: [
19265
- ...(output.useLimitations || []),
19266
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19267
- ],
19268
- }
19269
- : {
19270
- accessConstraints: [
19271
- ...(output.accessConstraints || []),
19272
- ...selectField(source, fieldName).map((field) => ({
19273
- text: selectTranslatedValue(field, this.lang3),
19274
- type: this.getConstraintsType(fieldName),
19275
- })),
19276
- ],
19277
- }),
19278
- });
19308
+ this.constraintField = (type, output, constraintArray) => {
19309
+ let outputField;
19310
+ switch (type) {
19311
+ case 'license':
19312
+ outputField = 'licenses';
19313
+ break;
19314
+ case 'legal':
19315
+ outputField = 'legalConstraints';
19316
+ break;
19317
+ case 'security':
19318
+ outputField = 'securityConstraints';
19319
+ break;
19320
+ case 'other':
19321
+ outputField = 'otherConstraints';
19322
+ break;
19323
+ }
19324
+ const outputArray = outputField in output ? output[outputField] : [];
19325
+ outputArray.push(...constraintArray.map((item) => {
19326
+ const text = selectTranslatedValue(item, this.lang3);
19327
+ const url = getAsUrl(selectField(item, 'link'));
19328
+ return {
19329
+ text,
19330
+ ...(url ? { url } : {}),
19331
+ };
19332
+ }));
19333
+ const result = {
19334
+ ...output,
19335
+ [outputField]: outputArray,
19336
+ };
19337
+ // avoid legal constraints being duplicates of licenses
19338
+ if ('legalConstraints' in result &&
19339
+ (type === 'legal' || type === 'license')) {
19340
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19341
+ }
19342
+ return result;
19343
+ };
19279
19344
  this.mapLink = (sourceLink) => {
19280
19345
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19281
19346
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19323,17 +19388,6 @@ class Gn4FieldMapper {
19323
19388
  extras: { ...(output.extras || {}), ...value },
19324
19389
  });
19325
19390
  }
19326
- getConstraintsType(indexField) {
19327
- switch (indexField) {
19328
- case 'MD_LegalConstraintsUseLimitationObject':
19329
- return 'legal';
19330
- case 'MD_SecurityConstraintsUseLimitationObject':
19331
- return 'security';
19332
- case 'MD_ConstraintsUseLimitationObject':
19333
- default:
19334
- return 'other';
19335
- }
19336
- }
19337
19391
  getMappingFn(fieldName) {
19338
19392
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19339
19393
  }
@@ -19393,17 +19447,20 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19393
19447
  status: null,
19394
19448
  lineage: null,
19395
19449
  recordUpdated: null,
19450
+ recordPublished: null,
19396
19451
  ownerOrganization: null,
19397
19452
  licenses: [],
19453
+ legalConstraints: [],
19454
+ securityConstraints: [],
19455
+ otherConstraints: [],
19398
19456
  contacts: [],
19399
19457
  contactsForResource: [],
19400
- accessConstraints: [],
19401
19458
  keywords: [],
19402
- themes: [],
19403
- useLimitations: [],
19459
+ topics: [],
19404
19460
  spatialExtents: [],
19405
19461
  temporalExtents: [],
19406
19462
  overviews: [],
19463
+ languages: [],
19407
19464
  };
19408
19465
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19409
19466
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -19563,7 +19620,7 @@ class ElasticsearchService {
19563
19620
  },
19564
19621
  };
19565
19622
  }
19566
- getRelatedRecordPayload(title, uuid, size = 6, _source = ES_SOURCE_SUMMARY) {
19623
+ getRelatedRecordPayload(title, uuid, size = 6, _source = [...ES_SOURCE_SUMMARY, 'allKeywords', 'createDate']) {
19567
19624
  return {
19568
19625
  query: {
19569
19626
  bool: {
@@ -20168,11 +20225,18 @@ class OrganizationsFromMetadataService {
20168
20225
  if (!allContactOrgs.length)
20169
20226
  return of(record);
20170
20227
  const ownerOrganization = allContactOrgs[0];
20171
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20228
+ // read the owner group as well to have a fallback logo
20229
+ const groupId = selectField(source, 'groupOwner');
20230
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20231
+ return group.id === Number(groupId);
20232
+ })));
20233
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20172
20234
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20235
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20173
20236
  return {
20174
20237
  ...record,
20175
20238
  ownerOrganization: {
20239
+ logoUrl,
20176
20240
  ...ownerOrganization,
20177
20241
  ...recordOrganisation,
20178
20242
  },
@@ -20483,12 +20547,21 @@ class Gn4PlatformMapper {
20483
20547
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20484
20548
  return { ...apiUser, id: id.toString() };
20485
20549
  }
20486
- thesaurusFromApi(thesaurus) {
20550
+ thesaurusFromApi(thesaurus, lang3) {
20487
20551
  return thesaurus.map((keyword) => {
20488
- const { uri, value } = keyword;
20552
+ let key = keyword.uri;
20553
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20554
+ if (key.indexOf('@@@') > -1) {
20555
+ key = key.split('@@@')[1];
20556
+ }
20557
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20558
+ const description = lang3 && lang3 in keyword.definitions
20559
+ ? keyword.definitions[lang3]
20560
+ : keyword.definition;
20489
20561
  return {
20490
- key: uri,
20491
- label: value,
20562
+ key,
20563
+ label,
20564
+ description,
20492
20565
  };
20493
20566
  });
20494
20567
  }
@@ -20501,13 +20574,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20501
20574
 
20502
20575
  const minApiVersion = '4.2.2';
20503
20576
  class Gn4PlatformService {
20504
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20577
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20505
20578
  this.siteApiService = siteApiService;
20506
20579
  this.meApi = meApi;
20507
20580
  this.usersApi = usersApi;
20508
20581
  this.mapper = mapper;
20509
20582
  this.toolsApiService = toolsApiService;
20510
20583
  this.registriesApiService = registriesApiService;
20584
+ this.langService = langService;
20511
20585
  this.type = 'GeoNetwork';
20512
20586
  this.keyTranslations$ = this.toolsApiService
20513
20587
  .getTranslationsPackage1('gnui')
@@ -20521,6 +20595,11 @@ class Gn4PlatformService {
20521
20595
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20522
20596
  }
20523
20597
  }), shareReplay(1));
20598
+ /**
20599
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20600
+ * @private
20601
+ */
20602
+ this.thesauri = {};
20524
20603
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20525
20604
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20526
20605
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20547,19 +20626,36 @@ class Gn4PlatformService {
20547
20626
  return this.users$;
20548
20627
  }
20549
20628
  translateKey(key) {
20629
+ // if the key is a URI, use the registries API to look for the translation
20630
+ if (key.match(/^https?:\/\//)) {
20631
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20632
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20633
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20634
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20635
+ for (const item of thesaurus) {
20636
+ if (item.key === key)
20637
+ return item.label;
20638
+ }
20639
+ return key;
20640
+ }));
20641
+ }
20550
20642
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20551
20643
  }
20552
- getThesaurusByLang(thesaurusName, lang) {
20553
- return this.registriesApiService
20554
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20555
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20644
+ getThesaurusByUri(uri) {
20645
+ if (this.thesauri[uri]) {
20646
+ return this.thesauri[uri];
20647
+ }
20648
+ this.thesauri[uri] = this.registriesApiService
20649
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20650
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20651
+ return this.thesauri[uri];
20556
20652
  }
20557
- 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 }); }
20653
+ 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 }); }
20558
20654
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20559
20655
  }
20560
20656
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20561
20657
  type: Injectable
20562
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20658
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20563
20659
 
20564
20660
  function provideGn4() {
20565
20661
  return [
@@ -21107,6 +21203,38 @@ function createFuzzyFilter(pattern) {
21107
21203
  };
21108
21204
  }
21109
21205
 
21206
+ function getTemporalRangeUnion(ranges) {
21207
+ let earliestStartDate = Infinity;
21208
+ let latestEndDate = -Infinity;
21209
+ if (ranges.length) {
21210
+ for (let i = 0; i < ranges.length; i++) {
21211
+ const rangeStart = ranges[i].start
21212
+ ? new Date(ranges[i].start).getTime()
21213
+ : -Infinity;
21214
+ const rangeEnd = ranges[i].end
21215
+ ? new Date(ranges[i].end).getTime()
21216
+ : Infinity;
21217
+ if (rangeStart < earliestStartDate) {
21218
+ earliestStartDate = rangeStart;
21219
+ }
21220
+ if (rangeEnd > latestEndDate) {
21221
+ latestEndDate = rangeEnd;
21222
+ }
21223
+ }
21224
+ return {
21225
+ start: earliestStartDate !== -Infinity
21226
+ ? new Date(earliestStartDate).toLocaleDateString()
21227
+ : undefined,
21228
+ end: latestEndDate !== Infinity
21229
+ ? new Date(latestEndDate).toLocaleDateString()
21230
+ : undefined,
21231
+ };
21232
+ }
21233
+ else {
21234
+ return undefined;
21235
+ }
21236
+ }
21237
+
21110
21238
  marker('downloads.wfs.featuretype.not.found');
21111
21239
  const FORMATS = {
21112
21240
  csv: {
@@ -22637,6 +22765,9 @@ class MapContextService {
22637
22765
  if (mapConfig) {
22638
22766
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22639
22767
  }
22768
+ else {
22769
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22770
+ }
22640
22771
  if (!mapContext.view?.extent &&
22641
22772
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22642
22773
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22747,6 +22878,11 @@ class MapContextService {
22747
22878
  }
22748
22879
  return view;
22749
22880
  }
22881
+ addDefaultBaselayerContext(layers) {
22882
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22883
+ ? layers
22884
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22885
+ }
22750
22886
  mergeMapConfigWithContext(mapContext, mapConfig) {
22751
22887
  return {
22752
22888
  ...mapContext,
@@ -23293,11 +23429,11 @@ class ThumbnailComponent {
23293
23429
  }
23294
23430
  }
23295
23431
  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 }); }
23296
- 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 }); }
23432
+ 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 }); }
23297
23433
  }
23298
23434
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23299
23435
  type: Component,
23300
- 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" }]
23436
+ 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" }]
23301
23437
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23302
23438
  type: Optional
23303
23439
  }, {
@@ -23425,8 +23561,7 @@ class MetadataQualityComponent {
23425
23561
  : this.calculatedQualityScore;
23426
23562
  }
23427
23563
  get calculatedQualityScore() {
23428
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23429
- this.items.length);
23564
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23430
23565
  }
23431
23566
  showMenu() {
23432
23567
  this.isMenuShown = true;
@@ -23444,7 +23579,7 @@ class MetadataQualityComponent {
23444
23579
  this.items = [];
23445
23580
  this.add('title', !!this.metadata?.title);
23446
23581
  this.add('description', !!this.metadata?.abstract);
23447
- this.add('topic', this.metadata?.themes?.length > 0);
23582
+ this.add('topic', this.metadata?.topics?.length > 0);
23448
23583
  this.add('keywords', this.metadata?.keywords?.length > 0);
23449
23584
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23450
23585
  this.add('organisation', !!contact?.organization);
@@ -23892,6 +24027,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23892
24027
  type: Input
23893
24028
  }] } });
23894
24029
 
24030
+ class MarkdownParserComponent {
24031
+ get parsedMarkdown() {
24032
+ return marked.parse(this.textContent);
24033
+ }
24034
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24035
+ 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 }); }
24036
+ }
24037
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24038
+ type: Component,
24039
+ 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"] }]
24040
+ }], propDecorators: { textContent: [{
24041
+ type: Input
24042
+ }] } });
24043
+
23895
24044
  class ContentGhostComponent {
23896
24045
  constructor() {
23897
24046
  this.ghostClass = '';
@@ -24031,14 +24180,16 @@ class MaxLinesComponent {
24031
24180
  return result;
24032
24181
  }
24033
24182
  ngOnDestroy() {
24183
+ if (!this.observer)
24184
+ return;
24034
24185
  this.observer.unobserve(this.container.nativeElement.children[0]);
24035
24186
  }
24036
24187
  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 }); }
24037
- 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 }); }
24188
+ 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 }); }
24038
24189
  }
24039
24190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, decorators: [{
24040
24191
  type: Component,
24041
- 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" }]
24192
+ 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" }]
24042
24193
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
24043
24194
  type: Input
24044
24195
  }], container: [{
@@ -24046,36 +24197,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24046
24197
  args: ['container']
24047
24198
  }] } });
24048
24199
 
24049
- class MarkdownParserComponent {
24050
- get parsedMarkdown() {
24051
- return marked.parse(this.textContent);
24052
- }
24053
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24054
- 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 }); }
24055
- }
24056
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24057
- type: Component,
24058
- 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"] }]
24059
- }], propDecorators: { textContent: [{
24060
- type: Input
24061
- }] } });
24062
-
24063
24200
  class MetadataInfoComponent {
24064
24201
  constructor() {
24065
24202
  this.keyword = new EventEmitter();
24066
24203
  }
24067
24204
  get hasUsage() {
24068
24205
  return (this.metadata.extras?.isOpenData === true ||
24069
- this.metadata.useLimitations?.length ||
24070
- this.metadata.accessConstraints?.length);
24206
+ (this.metadata.legalConstraints?.length > 0 &&
24207
+ this.legalConstraints.length > 0) ||
24208
+ (this.metadata.otherConstraints?.length > 0 &&
24209
+ this.otherConstraints.length > 0) ||
24210
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24071
24211
  }
24072
- get usages() {
24212
+ get legalConstraints() {
24073
24213
  let array = [];
24074
- if (this.metadata.useLimitations?.length) {
24075
- array = array.concat(this.metadata.useLimitations);
24214
+ if (this.metadata.legalConstraints?.length) {
24215
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24076
24216
  }
24077
- if (this.metadata.accessConstraints?.length) {
24078
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24217
+ return array;
24218
+ }
24219
+ get otherConstraints() {
24220
+ let array = [];
24221
+ if (this.metadata.otherConstraints?.length) {
24222
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24223
+ }
24224
+ return array;
24225
+ }
24226
+ get licenses() {
24227
+ let array = [];
24228
+ if (this.metadata.licenses?.length) {
24229
+ array = array.concat(this.metadata.licenses
24230
+ .filter((c) => c.text)
24231
+ .map((c) => ({ text: c.text, url: c.url })));
24079
24232
  }
24080
24233
  return array;
24081
24234
  }
@@ -24091,22 +24244,28 @@ class MetadataInfoComponent {
24091
24244
  return undefined;
24092
24245
  }
24093
24246
  }
24247
+ get temporalExtent() {
24248
+ const temporalExtents = this.metadata.temporalExtents;
24249
+ return getTemporalRangeUnion(temporalExtents);
24250
+ }
24251
+ get shownOrganization() {
24252
+ return this.metadata.ownerOrganization;
24253
+ }
24254
+ get resourceContact() {
24255
+ return this.metadata.contactsForResource?.[0];
24256
+ }
24094
24257
  fieldReady(propName) {
24095
24258
  return !this.incomplete || propName in this.metadata;
24096
24259
  }
24097
24260
  onKeywordClick(keyword) {
24098
24261
  this.keyword.emit(keyword);
24099
24262
  }
24100
- copyText() {
24101
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24102
- event.target.blur();
24103
- }
24104
24263
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24105
- 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 }); }
24264
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24106
24265
  }
24107
24266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24108
24267
  type: Component,
24109
- 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"] }]
24268
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24110
24269
  }], propDecorators: { metadata: [{
24111
24270
  type: Input
24112
24271
  }], incomplete: [{
@@ -24175,11 +24334,11 @@ class ButtonComponent {
24175
24334
  propagateToDocumentOnly(event);
24176
24335
  }
24177
24336
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24178
- 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 }); }
24337
+ 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=\"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 }); }
24179
24338
  }
24180
24339
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24181
24340
  type: Component,
24182
- 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"] }]
24341
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, 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"] }]
24183
24342
  }], propDecorators: { type: [{
24184
24343
  type: Input
24185
24344
  }], disabled: [{
@@ -24459,11 +24618,11 @@ class CarouselComponent {
24459
24618
  this.emblaApi.scrollTo(stepIndex);
24460
24619
  }
24461
24620
  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 }); }
24462
- 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 }); }
24621
+ 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 }); }
24463
24622
  }
24464
24623
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24465
24624
  type: Component,
24466
- 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"] }]
24625
+ 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"] }]
24467
24626
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24468
24627
  type: Input
24469
24628
  }], stepsContainerClass: [{
@@ -24615,11 +24774,11 @@ class MetadataContactComponent {
24615
24774
  this.organizationClick.emit(this.shownOrganization);
24616
24775
  }
24617
24776
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24618
- 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 }); }
24777
+ 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 }); }
24619
24778
  }
24620
24779
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24621
24780
  type: Component,
24622
- 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" }]
24781
+ 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" }]
24623
24782
  }], propDecorators: { metadata: [{
24624
24783
  type: Input
24625
24784
  }], organizationClick: [{
@@ -24843,11 +25002,11 @@ class DropdownSelectorComponent {
24843
25002
  }
24844
25003
  }
24845
25004
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24846
- 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 }); }
25005
+ 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 }); }
24847
25006
  }
24848
25007
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24849
25008
  type: Component,
24850
- 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" }]
25009
+ 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" }]
24851
25010
  }], propDecorators: { title: [{
24852
25011
  type: Input
24853
25012
  }], showTitle: [{
@@ -25023,11 +25182,11 @@ class DropdownMultiselectComponent {
25023
25182
  this.setFocus();
25024
25183
  }
25025
25184
  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 }); }
25026
- 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 }); }
25185
+ 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 }); }
25027
25186
  }
25028
25187
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
25029
25188
  type: Component,
25030
- 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" }]
25189
+ 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" }]
25031
25190
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
25032
25191
  type: Input
25033
25192
  }], choices: [{
@@ -25181,11 +25340,11 @@ class TextAreaComponent {
25181
25340
  this.rawChange.next(value);
25182
25341
  }
25183
25342
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25184
- 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"] }); }
25343
+ 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"] }); }
25185
25344
  }
25186
25345
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25187
25346
  type: Component,
25188
- 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"] }]
25347
+ 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"] }]
25189
25348
  }], propDecorators: { value: [{
25190
25349
  type: Input
25191
25350
  }], placeholder: [{
@@ -25455,11 +25614,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25455
25614
 
25456
25615
  class NavigationButtonComponent {
25457
25616
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25458
- 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 }); }
25617
+ 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 }); }
25459
25618
  }
25460
25619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25461
25620
  type: Component,
25462
- 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" }]
25621
+ 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"] }]
25463
25622
  }], propDecorators: { label: [{
25464
25623
  type: Input
25465
25624
  }], icon: [{
@@ -25773,10 +25932,8 @@ class UiInputsModule {
25773
25932
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25774
25933
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25775
25934
  AutocompleteComponent,
25776
- ButtonComponent,
25777
25935
  TextInputComponent,
25778
25936
  DragAndDropFileInputComponent,
25779
- TextAreaComponent,
25780
25937
  ChipsInputComponent,
25781
25938
  NavigationButtonComponent,
25782
25939
  StarToggleComponent,
@@ -25809,7 +25966,9 @@ class UiInputsModule {
25809
25966
  MatInputModule,
25810
25967
  MatDatepickerModule,
25811
25968
  MatNativeDateModule,
25812
- EditableLabelDirective], exports: [DropdownSelectorComponent,
25969
+ EditableLabelDirective,
25970
+ TextAreaComponent,
25971
+ ButtonComponent], exports: [DropdownSelectorComponent,
25813
25972
  AutocompleteComponent,
25814
25973
  ButtonComponent,
25815
25974
  TextInputComponent,
@@ -25851,10 +26010,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25851
26010
  declarations: [
25852
26011
  DropdownSelectorComponent,
25853
26012
  AutocompleteComponent,
25854
- ButtonComponent,
25855
26013
  TextInputComponent,
25856
26014
  DragAndDropFileInputComponent,
25857
- TextAreaComponent,
25858
26015
  ChipsInputComponent,
25859
26016
  NavigationButtonComponent,
25860
26017
  StarToggleComponent,
@@ -25893,6 +26050,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25893
26050
  MatDatepickerModule,
25894
26051
  MatNativeDateModule,
25895
26052
  EditableLabelDirective,
26053
+ TextAreaComponent,
26054
+ ButtonComponent,
25896
26055
  ],
25897
26056
  exports: [
25898
26057
  DropdownSelectorComponent,
@@ -26012,7 +26171,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26012
26171
 
26013
26172
  const DEFAULT_PARAMS = {
26014
26173
  OFFSET: '',
26015
- LIMIT: '',
26174
+ LIMIT: '-1',
26016
26175
  FORMAT: 'json',
26017
26176
  };
26018
26177
  class RecordApiFormComponent {
@@ -26041,6 +26200,8 @@ class RecordApiFormComponent {
26041
26200
  }
26042
26201
  return outputUrl;
26043
26202
  }));
26203
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26204
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
26044
26205
  }
26045
26206
  set apiLink(value) {
26046
26207
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -26050,10 +26211,11 @@ class RecordApiFormComponent {
26050
26211
  this.offset$.next(value);
26051
26212
  }
26052
26213
  setLimit(value) {
26053
- this.limit$.next(value);
26214
+ const newLimit = value === '' ? '-1' : value;
26215
+ this.limit$.next(newLimit);
26054
26216
  }
26055
26217
  setFormat(value) {
26056
- this.format$.next(value);
26218
+ this.format$.next(String(value));
26057
26219
  }
26058
26220
  resetUrl() {
26059
26221
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -26061,11 +26223,11 @@ class RecordApiFormComponent {
26061
26223
  this.format$.next(DEFAULT_PARAMS.FORMAT);
26062
26224
  }
26063
26225
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26064
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26226
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26065
26227
  }
26066
26228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
26067
26229
  type: Component,
26068
- args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"limit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === ''\"\n (change)=\"setLimit('')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
26230
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
26069
26231
  }], propDecorators: { apiLink: [{
26070
26232
  type: Input
26071
26233
  }] } });
@@ -26111,7 +26273,6 @@ class UiElementsModule {
26111
26273
  PaginationButtonsComponent,
26112
26274
  MaxLinesComponent,
26113
26275
  RecordApiFormComponent,
26114
- MarkdownParserComponent,
26115
26276
  ImageOverlayPreviewComponent], imports: [CommonModule,
26116
26277
  MatIconModule,
26117
26278
  MatTooltipModule,
@@ -26120,7 +26281,8 @@ class UiElementsModule {
26120
26281
  RouterModule,
26121
26282
  UiInputsModule,
26122
26283
  FormsModule,
26123
- NgOptimizedImage], exports: [MetadataInfoComponent,
26284
+ NgOptimizedImage,
26285
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
26124
26286
  ContentGhostComponent,
26125
26287
  DownloadItemComponent,
26126
26288
  DownloadsListComponent,
@@ -26167,6 +26329,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26167
26329
  UiInputsModule,
26168
26330
  FormsModule,
26169
26331
  NgOptimizedImage,
26332
+ MarkdownParserComponent,
26170
26333
  ],
26171
26334
  declarations: [
26172
26335
  MetadataInfoComponent,
@@ -26189,7 +26352,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26189
26352
  PaginationButtonsComponent,
26190
26353
  MaxLinesComponent,
26191
26354
  RecordApiFormComponent,
26192
- MarkdownParserComponent,
26193
26355
  ImageOverlayPreviewComponent,
26194
26356
  ],
26195
26357
  exports: [
@@ -26873,6 +27035,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26873
27035
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26874
27036
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26875
27037
 
27038
+ // this geometry will be used to filter & boost results accordingly
27039
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
27040
+
26876
27041
  class SearchFacade {
26877
27042
  constructor(store, filterGeometry) {
26878
27043
  this.store = store;
@@ -26977,6 +27142,7 @@ class SearchFacade {
26977
27142
  this.store.dispatch(new SetFilters({}, this.searchId));
26978
27143
  this.store.dispatch(new SetSortBy([], this.searchId));
26979
27144
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
27145
+ return this;
26980
27146
  }
26981
27147
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade, deps: [{ token: i1$2.Store }, { token: FILTER_GEOMETRY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
26982
27148
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27361,8 +27527,11 @@ class FuzzySearchComponent {
27361
27527
  this.searchService.updateFilters({ any });
27362
27528
  }
27363
27529
  }
27364
- handleInputCleared() {
27365
- this.searchService.updateFilters({ any: '' });
27530
+ async handleInputCleared() {
27531
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27532
+ if (currentSearchFilters.any) {
27533
+ this.searchService.updateFilters({ any: '' });
27534
+ }
27366
27535
  }
27367
27536
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FuzzySearchComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
27368
27537
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n [value]=\"searchInputValue$ | async\"\n [clearOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "action", "value", "clearOnSelection", "autoFocus", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -27442,6 +27611,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27442
27611
  args: [RESULTS_LAYOUT_CONFIG]
27443
27612
  }] }]; } });
27444
27613
 
27614
+ // expects the replacement key ${uuid}
27615
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27616
+
27445
27617
  class FavoriteStarComponent {
27446
27618
  set record(value) {
27447
27619
  this.record_ = value;
@@ -27525,11 +27697,11 @@ class FavoriteStarComponent {
27525
27697
  });
27526
27698
  }
27527
27699
  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 }); }
27528
- 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 }); }
27700
+ 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 }); }
27529
27701
  }
27530
27702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27531
27703
  type: Component,
27532
- 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" }]
27704
+ 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" }]
27533
27705
  }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27534
27706
  type: Input
27535
27707
  }], record: [{
@@ -27818,10 +27990,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27818
27990
  class AbstractSearchField {
27819
27991
  }
27820
27992
  class SimpleSearchField {
27821
- constructor(esFieldName, order = 'asc', injector) {
27993
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27822
27994
  this.esFieldName = esFieldName;
27823
- this.order = order;
27824
27995
  this.injector = injector;
27996
+ this.order = order;
27997
+ this.orderType = orderType;
27825
27998
  this.repository = this.injector.get(RecordsRepositoryInterface);
27826
27999
  // FIXME: this is required to register runtime fields; abstract this as well
27827
28000
  this.esService = this.injector.get(ElasticsearchService);
@@ -27832,12 +28005,12 @@ class SimpleSearchField {
27832
28005
  type: 'terms',
27833
28006
  field: this.esFieldName,
27834
28007
  limit: 1000,
27835
- sort: [this.order, 'key'],
28008
+ sort: [this.order, this.orderType],
27836
28009
  },
27837
28010
  };
27838
28011
  }
27839
28012
  async getBucketLabel(bucket) {
27840
- return bucket.term;
28013
+ return bucket.term.toString();
27841
28014
  }
27842
28015
  getAvailableValues() {
27843
28016
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27865,9 +28038,13 @@ class SimpleSearchField {
27865
28038
  return of(values);
27866
28039
  }
27867
28040
  }
27868
- class KeySearchField extends SimpleSearchField {
27869
- constructor() {
27870
- super(...arguments);
28041
+ class TranslatedSearchField extends SimpleSearchField {
28042
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28043
+ super(esFieldName, injector, order, orderType);
28044
+ this.esFieldName = esFieldName;
28045
+ this.injector = injector;
28046
+ this.order = order;
28047
+ this.orderType = orderType;
27871
28048
  this.platformService = this.injector.get(PlatformServiceInterface);
27872
28049
  }
27873
28050
  async getTranslation(key) {
@@ -27877,26 +28054,36 @@ class KeySearchField extends SimpleSearchField {
27877
28054
  return (await this.getTranslation(bucket.term)) || bucket.term;
27878
28055
  }
27879
28056
  getAvailableValues() {
28057
+ if (this.orderType === 'count')
28058
+ return super.getAvailableValues();
27880
28059
  // sort values by alphabetical order
27881
28060
  return super
27882
28061
  .getAvailableValues()
27883
28062
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27884
28063
  }
27885
28064
  }
27886
- class ThesaurusField extends KeySearchField {
27887
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27888
- super(esFieldName, order, injector);
27889
- this.thesaurusName = thesaurusName;
28065
+ /**
28066
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
28067
+ * to the defined METADATA_LANGUAGE token
28068
+ * The provided ES field name should not include any prefix such as `.langeng`
28069
+ */
28070
+ class MultilingualSearchField extends SimpleSearchField {
28071
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28072
+ super(esFieldName, injector, order, orderType);
28073
+ this.esFieldName = esFieldName;
28074
+ this.injector = injector;
28075
+ this.order = order;
28076
+ this.orderType = orderType;
27890
28077
  this.langService = this.injector.get(LangService);
27891
- this.thesaurus$ = this.platformService
27892
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27893
- .pipe(catchError(() => {
27894
- console.warn('Error while loading thesaurus language package');
27895
- return of([]);
27896
- }), shareReplay(1));
27897
- }
27898
- async getTranslation(key) {
27899
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
28078
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
28079
+ // note: we're excluding the metadata language "current" value because that would produce
28080
+ // permalinks that might not work for different users
28081
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
28082
+ this.esFieldName += `.lang${this.searchLanguage}`;
28083
+ }
28084
+ else {
28085
+ this.esFieldName += '.default';
28086
+ }
27900
28087
  }
27901
28088
  }
27902
28089
  class FullTextSearchField {
@@ -27916,7 +28103,7 @@ marker('search.filters.isSpatial.yes');
27916
28103
  marker('search.filters.isSpatial.no');
27917
28104
  class IsSpatialSearchField extends SimpleSearchField {
27918
28105
  constructor(injector) {
27919
- super('isSpatial', 'asc', injector);
28106
+ super('isSpatial', injector, 'asc');
27920
28107
  this.translateService = this.injector.get(TranslateService);
27921
28108
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27922
28109
  String formats = doc.format.join('|').toLowerCase();
@@ -27966,7 +28153,7 @@ marker('search.filters.license.unknown');
27966
28153
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27967
28154
  class LicenseSearchField extends SimpleSearchField {
27968
28155
  constructor(injector) {
27969
- super('license', 'asc', injector);
28156
+ super('license', injector, 'asc');
27970
28157
  this.translateService = this.injector.get(TranslateService);
27971
28158
  this.esService.registerRuntimeField('license', `String raw = '';
27972
28159
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -28050,7 +28237,7 @@ class OrganizationSearchField {
28050
28237
  }
28051
28238
  class OwnerSearchField extends SimpleSearchField {
28052
28239
  constructor(injector) {
28053
- super('owner', 'asc', injector);
28240
+ super('owner', injector, 'asc');
28054
28241
  }
28055
28242
  getAvailableValues() {
28056
28243
  return of([]);
@@ -28059,6 +28246,7 @@ class OwnerSearchField extends SimpleSearchField {
28059
28246
 
28060
28247
  marker('search.filters.format');
28061
28248
  marker('search.filters.inspireKeyword');
28249
+ marker('search.filters.keyword');
28062
28250
  marker('search.filters.isSpatial');
28063
28251
  marker('search.filters.license');
28064
28252
  marker('search.filters.publicationYear');
@@ -28076,13 +28264,14 @@ class FieldsService {
28076
28264
  this.injector = injector;
28077
28265
  this.fields = {
28078
28266
  publisher: new OrganizationSearchField(this.injector),
28079
- format: new SimpleSearchField('format', 'asc', this.injector),
28080
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
28081
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
28082
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
28083
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
28084
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
28085
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28267
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28268
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28269
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28270
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28271
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28272
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28273
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28274
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
28086
28275
  isSpatial: new IsSpatialSearchField(this.injector),
28087
28276
  q: new FullTextSearchField(),
28088
28277
  license: new LicenseSearchField(this.injector),
@@ -28156,10 +28345,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28156
28345
  type: Input
28157
28346
  }] } });
28158
28347
 
28159
- // this geometry will be used to filter & boost results accordingly
28160
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
28161
- // expects the replacement key ${uuid}
28162
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28163
28348
  class FeatureSearchModule {
28164
28349
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28165
28350
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28265,7 +28450,6 @@ class ResultsTableComponent {
28265
28450
  this.selectionService = selectionService;
28266
28451
  this.recordClick = new EventEmitter();
28267
28452
  this.records$ = this.searchFacade.results$;
28268
- this.recordCount$ = this.searchFacade.resultsHits$;
28269
28453
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28270
28454
  }
28271
28455
  dateToString(date) {
@@ -28351,7 +28535,7 @@ class ResultsTableComponent {
28351
28535
  }));
28352
28536
  }
28353
28537
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: SelectionService }], target: i0.ɵɵFactoryTarget.Component }); }
28354
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", outputs: { recordClick: "recordClick" }, ngImport: i0, template: "<div>\n <div class=\"flex\" data-cy=\"records-information\">\n <div\n translate\n class=\"my-8 ml-4 block text-gray-800\"\n [translateParams]=\"{\n displayed: (records$ | async).length,\n hits: (recordCount$ | async)\n }\"\n >\n results.records.hits.displayedOn\n </div>\n <div\n *ngIf=\"(selectedRecords$ | async).length as selectedRecordCount\"\n class=\"my-8 ml-6 block text-gray-400 selected-records\"\n translate\n [translateParams]=\"{ amount: selectedRecordCount }\"\n >\n results.records.hits.selected\n </div>\n </div>\n\n <gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n >\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n </gn-ui-interactive-table>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
28538
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", outputs: { recordClick: "recordClick" }, ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
28355
28539
  }
28356
28540
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28357
28541
  type: Component,
@@ -28362,7 +28546,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28362
28546
  InteractiveTableColumnComponent,
28363
28547
  MatIconModule,
28364
28548
  TranslateModule,
28365
- ], template: "<div>\n <div class=\"flex\" data-cy=\"records-information\">\n <div\n translate\n class=\"my-8 ml-4 block text-gray-800\"\n [translateParams]=\"{\n displayed: (records$ | async).length,\n hits: (recordCount$ | async)\n }\"\n >\n results.records.hits.displayedOn\n </div>\n <div\n *ngIf=\"(selectedRecords$ | async).length as selectedRecordCount\"\n class=\"my-8 ml-6 block text-gray-400 selected-records\"\n translate\n [translateParams]=\"{ amount: selectedRecordCount }\"\n >\n results.records.hits.selected\n </div>\n </div>\n\n <gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n >\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n </gn-ui-interactive-table>\n</div>\n" }]
28549
+ ], template: "<gn-ui-interactive-table\n [items]=\"records$ | async\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <gn-ui-checkbox\n [checked]=\"isAllSelected() | async\"\n [indeterminate]=\"isSomeSelected() | async\"\n (changed)=\"toggleSelectAll()\"\n type=\"default\"\n class=\"-m-2 mr-3\"\n >\n </gn-ui-checkbox>\n </ng-template>\n <ng-template #cell let-item>\n <gn-ui-checkbox\n [checked]=\"isChecked(item) | async\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword') | async\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.title }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"flex-shrink-0\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner') | async\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.author</span>\n </ng-template>\n <ng-template #cell let-item>\n <mat-icon class=\"material-symbols-outlined\">person</mat-icon>\n <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ item.status }}\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate') | async\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.updatedOn</span>\n </ng-template>\n <ng-template #cell let-item>\n {{ dateToString(item.recordUpdated) }}\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
28366
28550
  }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28367
28551
  type: Output
28368
28552
  }] } });
@@ -28994,7 +29178,7 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28994
29178
  ...state,
28995
29179
  chartConfig,
28996
29180
  })), on(close, (state) => {
28997
- // eslint-disable-next-line
29181
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28998
29182
  const { metadata, related, ...stateWithoutMd } = state;
28999
29183
  return stateWithoutMd;
29000
29184
  }));
@@ -30948,11 +31132,11 @@ class LanguageSwitcherComponent {
30948
31132
  this.translate.use(value);
30949
31133
  }
30950
31134
  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 }); }
30951
- 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"] }] }); }
31135
+ 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"] }] }); }
30952
31136
  }
30953
31137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30954
31138
  type: Component,
30955
- 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" }]
31139
+ 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" }]
30956
31140
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30957
31141
  type: Optional
30958
31142
  }, {
@@ -32316,5 +32500,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32316
32500
  * Generated bundle index. Do not edit.
32317
32501
  */
32318
32502
 
32319
- 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, TranslateTestingModule, 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 };
32503
+ 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_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, 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, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, 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 };
32320
32504
  //# sourceMappingURL=geonetwork-ui.mjs.map