geonetwork-ui 2.2.0-dev.e3947702 → 2.2.0-dev.e441b922

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 (359) 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/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  14. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  16. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  17. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  18. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  19. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  20. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  21. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  22. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  23. package/esm2022/libs/feature/editor/src/index.mjs +6 -1
  24. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +8 -0
  25. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +26 -0
  26. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +30 -0
  27. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +2 -0
  28. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +42 -0
  29. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +13 -0
  30. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +13 -0
  31. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +16 -4
  32. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +34 -0
  33. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +2 -0
  34. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +15 -11
  35. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +22 -44
  36. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  37. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +13 -13
  38. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  39. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  40. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +3 -3
  41. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  42. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  43. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  44. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  45. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  46. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  47. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  48. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  49. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  50. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  51. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  52. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  53. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  54. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -3
  55. package/esm2022/libs/ui/elements/src/lib/max-lines/max-lines.component.mjs +5 -3
  56. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  57. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +47 -22
  58. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -4
  59. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  60. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +3 -3
  61. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +4 -4
  62. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  63. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  64. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +9 -9
  65. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  66. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  67. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +3 -3
  68. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +3 -2
  69. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.component.mjs +4 -2
  70. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.model.mjs +1 -1
  71. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  72. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  73. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +9 -9
  74. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  75. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  76. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  77. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  78. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  79. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  80. package/esm2022/libs/ui/widgets/src/lib/badge/badge.component.mjs +3 -3
  81. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  82. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +18 -1
  83. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  84. package/esm2022/libs/util/shared/src/lib/utils/temporal-extent-union.mjs +32 -0
  85. package/esm2022/translations/de.json +37 -26
  86. package/esm2022/translations/en.json +37 -26
  87. package/esm2022/translations/es.json +31 -20
  88. package/esm2022/translations/fr.json +51 -40
  89. package/esm2022/translations/it.json +44 -33
  90. package/esm2022/translations/nl.json +32 -21
  91. package/esm2022/translations/pt.json +31 -20
  92. package/fesm2022/geonetwork-ui.mjs +1221 -871
  93. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  94. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +2 -0
  95. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  96. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  97. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  98. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  99. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +4 -5
  100. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  101. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  102. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  103. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  104. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +7 -6
  105. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  106. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +4 -3
  107. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  108. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  109. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  110. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  111. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  112. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  113. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  114. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  115. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  116. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +21 -12
  117. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  118. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  119. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  120. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  121. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  122. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  123. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  124. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  125. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  126. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  127. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  128. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  129. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  130. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  131. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  132. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  133. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  134. package/libs/feature/editor/src/index.d.ts +5 -0
  135. package/libs/feature/editor/src/index.d.ts.map +1 -1
  136. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +23 -0
  137. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -0
  138. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +15 -0
  139. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -0
  140. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +19 -0
  141. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -0
  142. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +2 -0
  143. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -0
  144. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +18 -0
  145. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -0
  146. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +15 -0
  147. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -0
  148. package/libs/feature/editor/src/lib/expressions.d.ts +4 -0
  149. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -0
  150. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +3 -1
  151. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  152. package/libs/feature/editor/src/lib/fields.config.d.ts +3 -0
  153. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -0
  154. package/libs/feature/editor/src/lib/models/fields.model.d.ts +15 -0
  155. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +1 -0
  156. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts +10 -5
  157. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  158. package/libs/feature/editor/src/lib/services/editor.service.d.ts +3 -13
  159. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  160. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  161. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  162. package/libs/feature/search/src/index.d.ts +3 -0
  163. package/libs/feature/search/src/index.d.ts.map +1 -1
  164. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  165. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  166. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  167. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  168. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  169. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  170. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  171. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  172. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  173. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  174. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  175. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  176. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  177. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  178. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  179. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  180. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  181. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  182. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  183. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  184. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  185. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  186. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +1 -1
  187. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +16 -6
  188. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  189. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  190. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  191. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  192. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  193. package/libs/ui/inputs/src/index.d.ts +1 -0
  194. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  195. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  196. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  197. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +1 -1
  198. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -1
  199. package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +1 -1
  200. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts +0 -1
  201. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +1 -1
  202. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  203. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  204. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -40
  205. package/libs/ui/layout/src/index.d.ts +2 -0
  206. package/libs/ui/layout/src/index.d.ts.map +1 -1
  207. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  208. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  209. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  210. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  211. package/libs/ui/search/src/index.d.ts +0 -1
  212. package/libs/ui/search/src/index.d.ts.map +1 -1
  213. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  214. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  215. package/libs/util/i18n/src/index.d.ts +0 -1
  216. package/libs/util/i18n/src/index.d.ts.map +1 -1
  217. package/libs/util/i18n/src/lib/i18n.constants.d.ts +17 -0
  218. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  219. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  220. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  221. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +5 -0
  222. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -0
  223. package/package.json +2 -2
  224. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +63 -8
  225. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +57 -9
  226. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +229 -24
  227. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +29 -0
  228. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +99 -76
  229. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +6 -3
  230. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +4 -5
  231. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  232. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +30 -21
  233. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +120 -63
  234. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +177 -97
  235. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -1
  236. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  237. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  238. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  239. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  240. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +25 -14
  241. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  242. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  243. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  244. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  245. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  246. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  247. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  248. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  249. package/src/libs/common/fixtures/src/lib/elasticsearch/full-response.ts +1 -1
  250. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  251. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +52 -10
  252. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  253. package/src/libs/feature/editor/src/index.ts +5 -0
  254. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +24 -0
  255. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +49 -0
  256. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +30 -0
  257. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +1 -0
  258. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +68 -0
  259. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +39 -0
  260. package/src/libs/feature/editor/src/lib/expressions.ts +16 -0
  261. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +11 -0
  262. package/src/libs/feature/editor/src/lib/fields.config.ts +35 -0
  263. package/src/libs/feature/editor/src/lib/models/fields.model.ts +29 -0
  264. package/src/libs/feature/editor/src/lib/record-form/record-form.component.html +9 -7
  265. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +11 -5
  266. package/src/libs/feature/editor/src/lib/services/editor.service.ts +34 -73
  267. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  268. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +12 -12
  269. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  270. package/src/libs/feature/search/src/index.ts +3 -0
  271. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  272. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  273. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  274. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  275. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  276. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  277. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  278. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  279. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  280. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  281. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  282. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  283. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  284. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  285. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  286. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  287. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
  288. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  289. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  290. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  291. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  292. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  293. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.html +5 -1
  294. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.ts +1 -0
  295. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +2 -2
  296. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +169 -52
  297. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +51 -15
  298. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  299. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  300. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  301. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  302. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  303. package/src/libs/ui/inputs/src/index.ts +1 -0
  304. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  305. package/src/libs/ui/inputs/src/lib/button/button.component.css +0 -5
  306. package/src/libs/ui/inputs/src/lib/button/button.component.html +0 -1
  307. package/src/libs/ui/inputs/src/lib/button/button.component.ts +7 -6
  308. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  309. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +2 -2
  310. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +3 -1
  311. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +1 -0
  312. package/src/libs/ui/inputs/src/lib/form-field/form-field.component.ts +3 -1
  313. package/src/libs/ui/inputs/src/lib/form-field/form-field.model.ts +0 -1
  314. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  315. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  316. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  317. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -3
  318. package/src/libs/ui/layout/src/index.ts +2 -0
  319. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -0
  320. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  321. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  322. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  323. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  324. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  325. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  326. package/src/libs/ui/search/src/index.ts +0 -1
  327. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  328. package/src/libs/ui/widgets/src/lib/badge/badge.component.html +3 -1
  329. package/src/libs/util/i18n/src/index.ts +0 -1
  330. package/src/libs/util/i18n/src/lib/i18n.constants.ts +18 -0
  331. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  332. package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +32 -0
  333. package/tailwind.base.css +44 -15
  334. package/translations/de.json +37 -26
  335. package/translations/en.json +37 -26
  336. package/translations/es.json +31 -20
  337. package/translations/fr.json +51 -40
  338. package/translations/it.json +44 -33
  339. package/translations/nl.json +32 -21
  340. package/translations/pt.json +31 -20
  341. package/translations/sk.json +119 -108
  342. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  343. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  344. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  345. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  346. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  347. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  348. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  349. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  350. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  351. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  352. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  353. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  354. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  355. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  356. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  357. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  358. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  359. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
@@ -1,21 +1,21 @@
1
1
  import { parseXml, XmlDocument, XmlElement, XmlText } from '@rgrove/parse-xml';
2
2
  import format from 'date-fns/format';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ElementRef, ViewChildren } from '@angular/core';
4
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Component, ChangeDetectionStrategy, Input, ViewChild, Directive, HostListener, EventEmitter, Output, ViewContainerRef, TemplateRef, Host, ContentChild, HostBinding, ContentChildren, ElementRef, ViewChildren, inject } from '@angular/core';
5
5
  import * as i1 from '@angular/common/http';
6
6
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpClientXsrfModule } from '@angular/common/http';
7
7
  import * as i1$1 from '@ngx-translate/core';
8
- 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';
15
- import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, tap as tap$2, fromEvent, timer, from, Subscription, animationFrameScheduler, firstValueFrom, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
15
+ import { of, map as map$2, lastValueFrom, switchMap, combineLatest, takeLast, forkJoin, Subject, merge, throwError, BehaviorSubject, firstValueFrom, fromEvent, timer, from, Subscription, animationFrameScheduler, ReplaySubject, distinctUntilChanged as distinctUntilChanged$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, withLatestFrom as withLatestFrom$1, startWith as startWith$1, pairwise as pairwise$1 } from 'rxjs';
16
16
  import { valid, coerce, satisfies, ltr } from 'semver';
17
17
  import * as i1$2 from '@ngrx/store';
18
- import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
18
+ import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule, Store } from '@ngrx/store';
19
19
  import Map$1 from 'ol/Map';
20
20
  import * as i2 from '@angular/material/icon';
21
21
  import { MatIconModule } from '@angular/material/icon';
@@ -75,7 +75,7 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
75
75
  import { MatInputModule } from '@angular/material/input';
76
76
  import * as basicLightbox from 'basiclightbox';
77
77
  import * as i1$8 from '@ngrx/effects';
78
- import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
78
+ import { createEffect, ofType, EffectsModule, Actions } from '@ngrx/effects';
79
79
  import tippy from 'tippy.js';
80
80
  import { valid as valid$1 } from 'geojson-validation';
81
81
  import { Polygon } from 'ol/geom';
@@ -587,6 +587,20 @@ function matchMimeType(format) {
587
587
  return format || null;
588
588
  }
589
589
 
590
+ function getKeywordTypeFromKeywordTypeCode(typeCode) {
591
+ if (!typeCode)
592
+ return 'other';
593
+ switch (typeCode) {
594
+ case 'theme':
595
+ case 'place':
596
+ case 'temporal':
597
+ case 'other':
598
+ return typeCode;
599
+ default:
600
+ return 'other';
601
+ }
602
+ }
603
+
590
604
  function extractCharacterString() {
591
605
  return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
592
606
  }
@@ -649,28 +663,32 @@ function extractStatus() {
649
663
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
650
664
  }
651
665
  // from gmd:resourceConstraints
652
- function extractAccessConstraints() {
653
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
654
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
666
+ function extractLegalConstraints() {
667
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
655
669
  text,
656
- type: 'other',
657
670
  })));
658
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
671
+ }
672
+ // from gmd:resourceConstraints
673
+ function extractSecurityConstraints() {
674
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
675
+ ...(url && { url }),
659
676
  text,
660
- type: 'security',
661
677
  })));
662
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
663
678
  }
664
679
  // from gmd:resourceConstraints
665
- function extractUseLimitations() {
666
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
680
+ function extractOtherConstraints() {
681
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
682
+ ...(url && { url }),
683
+ text,
684
+ })));
667
685
  }
668
686
  // from gmd:resourceConstraints
669
687
  function extractLicenses() {
670
- return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(pipe(findChildElement('gmd:otherConstraints'), combine(extractCharacterString(), extractUrl()), map(([text, url]) => ({
688
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
671
689
  ...(url && { url }),
672
690
  text,
673
- })))));
691
+ })));
674
692
  }
675
693
  // from gmd:MD_Distribution
676
694
  function extractDatasetDistributions() {
@@ -814,6 +832,9 @@ function readOwnerOrganization(rootEl) {
814
832
  function readRecordUpdated(rootEl) {
815
833
  return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
816
834
  }
835
+ function readRecordPublished(rootEl) {
836
+ return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
837
+ }
817
838
  function readTitle(rootEl) {
818
839
  return pipe(findIdentification(), findNestedElement('gmd:citation', 'gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
819
840
  }
@@ -829,31 +850,55 @@ function readDatasetUpdated(rootEl) {
829
850
  function readContacts(rootEl) {
830
851
  return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
831
852
  }
832
- function readKeywordsOfType(isTheme) {
833
- return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), filterArray(pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => isTheme === values.indexOf('theme') > -1))), mapArray(findChildrenElement('gmd:keyword')), flattenArray(), mapArray(extractCharacterString()));
853
+ // from gmd:thesaurusName
854
+ function readThesaurus(rootEl) {
855
+ if (!rootEl)
856
+ return null;
857
+ const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
858
+ const id = pipe(findIdentifier, extractCharacterString())(rootEl);
859
+ const url = pipe(findIdentifier, extractUrl())(rootEl);
860
+ const name = pipe(findNestedElement('gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
861
+ return {
862
+ id,
863
+ ...(name && { name }),
864
+ ...(url && { url }),
865
+ };
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);
1259
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1198
1260
  }
1199
- function writeThemes(record, rootEl) {
1200
- pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1201
- }
1202
- function writeAccessConstraints(record, rootEl) {
1203
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1261
+ function writeTopics(record, rootEl) {
1262
+ pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(createElement('gmd:topicCategory'), createChild('gmd:MD_TopicCategoryCode'), setTextContent(topic)))))(rootEl);
1204
1263
  }
1205
1264
  function writeLicenses(record, rootEl) {
1206
1265
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1207
1266
  }
1208
- function writeUseLimitations(record, rootEl) {
1209
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1267
+ function writeLegalConstraints(record, rootEl) {
1268
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1269
+ }
1270
+ function writeSecurityConstraints(record, rootEl) {
1271
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1272
+ }
1273
+ function writeOtherConstraints(record, rootEl) {
1274
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1210
1275
  }
1211
1276
  function writeUpdateFrequency(record, rootEl) {
1212
1277
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1302,14 +1367,14 @@ function toModel(xml) {
1302
1367
  const contacts = readContacts(rootEl);
1303
1368
  const recordUpdated = readRecordUpdated(rootEl);
1304
1369
  const recordCreated = recordUpdated;
1370
+ const recordPublished = readRecordPublished(rootEl);
1305
1371
  const keywords = readKeywords(rootEl);
1306
- const themes = readThemes(rootEl);
1307
- const accessConstraints = readAccessConstraints(rootEl);
1308
- const useLimitations = readUseLimitations(rootEl);
1372
+ const topics = readIsoTopics(rootEl);
1373
+ const legalConstraints = readLegalConstraints(rootEl);
1374
+ const otherConstraints = readOtherConstraints(rootEl);
1375
+ const securityConstraints = readSecurityConstraints(rootEl);
1309
1376
  const licenses = readLicenses(rootEl);
1310
1377
  const overviews = readOverviews(rootEl);
1311
- // not used yet
1312
- const isoTopics = readIsoTopics(rootEl);
1313
1378
  if (kind === 'dataset') {
1314
1379
  const status = readStatus(rootEl);
1315
1380
  const datasetCreated = readDatasetCreated(rootEl);
@@ -1323,8 +1388,10 @@ function toModel(xml) {
1323
1388
  return {
1324
1389
  uniqueIdentifier,
1325
1390
  kind,
1391
+ languages: [],
1326
1392
  recordCreated,
1327
1393
  recordUpdated,
1394
+ recordPublished,
1328
1395
  status,
1329
1396
  title,
1330
1397
  abstract,
@@ -1332,10 +1399,11 @@ function toModel(xml) {
1332
1399
  contacts,
1333
1400
  contactsForResource: [],
1334
1401
  keywords,
1335
- themes,
1336
- accessConstraints,
1337
- useLimitations,
1402
+ topics,
1338
1403
  licenses,
1404
+ legalConstraints,
1405
+ securityConstraints,
1406
+ otherConstraints,
1339
1407
  ...(datasetCreated && { datasetCreated }),
1340
1408
  ...(datasetUpdated && { datasetUpdated }),
1341
1409
  lineage,
@@ -1352,17 +1420,20 @@ function toModel(xml) {
1352
1420
  return {
1353
1421
  uniqueIdentifier,
1354
1422
  kind,
1423
+ languages: [],
1355
1424
  recordCreated,
1356
1425
  recordUpdated,
1426
+ recordPublished,
1357
1427
  title,
1358
1428
  abstract,
1359
1429
  ownerOrganization,
1360
1430
  contacts,
1361
1431
  keywords,
1362
- themes,
1363
- accessConstraints,
1364
- useLimitations,
1432
+ topics,
1365
1433
  licenses,
1434
+ legalConstraints,
1435
+ securityConstraints,
1436
+ otherConstraints,
1366
1437
  overviews,
1367
1438
  onlineResources,
1368
1439
  };
@@ -1387,10 +1458,12 @@ function toXml(record, originalXml) {
1387
1458
  writeAbstract(record, rootEl);
1388
1459
  fieldChanged('contacts') && writeContacts(record, rootEl);
1389
1460
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1390
- fieldChanged('themes') && writeThemes(record, rootEl);
1391
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1461
+ fieldChanged('topics') && writeTopics(record, rootEl);
1462
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1463
+ fieldChanged('securityConstraints') &&
1464
+ writeSecurityConstraints(record, rootEl);
1392
1465
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1393
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1466
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1394
1467
  if (record.kind === 'dataset') {
1395
1468
  writeStatus(record, rootEl);
1396
1469
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1457,6 +1530,31 @@ const mapContact = (sourceContact, lang3) => {
1457
1530
  ...(phone && { phone }),
1458
1531
  };
1459
1532
  };
1533
+ const mapKeywords = (thesauri, language) => {
1534
+ const keywords = [];
1535
+ for (const thesaurusId in thesauri) {
1536
+ const rawThesaurus = thesauri[thesaurusId];
1537
+ let thesaurus = null;
1538
+ if (rawThesaurus.id) {
1539
+ const thesaurusSource = { ...rawThesaurus };
1540
+ const url = getAsUrl(selectField(thesaurusSource, 'link'));
1541
+ const name = selectField(thesaurusSource, 'title');
1542
+ thesaurus = {
1543
+ id: rawThesaurus.id,
1544
+ ...(name && { name }),
1545
+ ...(url && { url }),
1546
+ };
1547
+ }
1548
+ for (const keyword of rawThesaurus.keywords) {
1549
+ keywords.push({
1550
+ label: selectTranslatedValue(keyword, language),
1551
+ type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
1552
+ ...(thesaurus && { thesaurus }),
1553
+ });
1554
+ }
1555
+ }
1556
+ return keywords;
1557
+ };
1460
1558
 
1461
1559
  /**
1462
1560
  * Custom HttpParameterCodec
@@ -16443,6 +16541,23 @@ const LANG_3_TO_2_MAPPER = {
16443
16541
  chi: 'zh',
16444
16542
  slo: 'sk',
16445
16543
  };
16544
+ const LANGUAGE_NAMES = {
16545
+ en: 'English',
16546
+ nl: 'Nederlands',
16547
+ fr: 'Français',
16548
+ de: 'Deutsch',
16549
+ ko: '한국어',
16550
+ es: 'Español',
16551
+ cs: 'Čeština',
16552
+ ca: 'Català',
16553
+ fi: 'Suomi',
16554
+ is: 'Íslenska',
16555
+ it: 'Italiano',
16556
+ pt: 'Português',
16557
+ ru: 'Русский',
16558
+ zh: '中文',
16559
+ sk: 'Slovenčina',
16560
+ };
16446
16561
  // Caution: changing this can break language selection from third parties!
16447
16562
  const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language';
16448
16563
  const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce((mapperObject, langEntry) => {
@@ -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",
@@ -16819,6 +16808,8 @@ var de = {
16819
16808
  "downloads.format.unknown": "unbekannt",
16820
16809
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
16821
16810
  dropFile: dropFile$6,
16811
+ "editor.record.publish": "",
16812
+ "editor.record.upToDate": "",
16822
16813
  "externalviewer.dataset.unnamed": "Datensatz aus dem Datahub",
16823
16814
  "facets.block.title.OrgForResource": "Organisation",
16824
16815
  "facets.block.title.availableInServices": "Verfügbar für",
@@ -16832,28 +16823,28 @@ var de = {
16832
16823
  "facets.block.title.tag.default": "Stichwort",
16833
16824
  "facets.block.title.th_regions_tree.default": "Regionen",
16834
16825
  "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",
16826
+ "language.ca": "Katalanisch",
16827
+ "language.cs": "Tschechisch",
16837
16828
  "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": "中文",
16829
+ "language.en": "Englisch",
16830
+ "language.es": "Spanisch",
16831
+ "language.fi": "Finnisch",
16832
+ "language.fr": "Französisch",
16833
+ "language.is": "Isländisch",
16834
+ "language.it": "Italienisch",
16835
+ "language.ko": "Koreanisch",
16836
+ "language.nl": "Niederländisch",
16837
+ "language.pt": "Portugiesisch",
16838
+ "language.ru": "Russisch",
16839
+ "language.sk": "Slowakisch",
16840
+ "language.zh": "Chinesisch",
16850
16841
  "map.add.layer": "Eine Ebene hinzufügen",
16851
16842
  "map.add.layer.catalog": "Aus dem Katalog",
16852
16843
  "map.add.layer.file": "Aus einer Datei",
16853
16844
  "map.add.layer.wfs": "Aus WFS",
16854
16845
  "map.add.layer.wms": "Aus WMS",
16855
16846
  "map.addFromFile.placeholder": "Klicke hier oder ziehe eine Datei herein",
16856
- "map.geocoding.placeholder": "",
16847
+ "map.geocoding.placeholder": "Nach einem Ort suchen",
16857
16848
  "map.help.addFromFile": "Klicke oder ziehe eine Datei herein um eine Karte hinzuzufügen (momentan wird nur das GeoJSON-Format unterstützt).",
16858
16849
  "map.layer.add": "Hinzufügen",
16859
16850
  "map.layers.available": "Verfügbare Layer",
@@ -16897,18 +16888,20 @@ var de = {
16897
16888
  "record.metadata.author": "Autor",
16898
16889
  "record.metadata.catalog": "Katalog",
16899
16890
  "record.metadata.contact": "Kontakt",
16900
- "record.metadata.createdOn": "Erstellt am",
16901
- "record.metadata.details": "Technische Informationen",
16891
+ "record.metadata.creation": "Erstellungsdatum",
16892
+ "record.metadata.details": "Über die Daten",
16902
16893
  "record.metadata.download": "Downloads",
16903
16894
  "record.metadata.formats": "Formate",
16904
- "record.metadata.isOpenData": "Open Data",
16905
16895
  "record.metadata.keywords": "Stichworte",
16906
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16896
+ "record.metadata.languages": "Sprachen",
16897
+ "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
16907
16898
  "record.metadata.links": "Links",
16908
16899
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16909
- "record.metadata.origin": "Über die Daten",
16910
- "record.metadata.owner": "",
16900
+ "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
16901
+ "record.metadata.owner": "Herkunftskatalog",
16911
16902
  "record.metadata.preview": "Vorschau",
16903
+ "record.metadata.producer": "Datenproduzent",
16904
+ "record.metadata.publication": "Veröffentlichungsdatum",
16912
16905
  "record.metadata.publications": "Veröffentlichungen",
16913
16906
  "record.metadata.quality": "Metadatenqualität",
16914
16907
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
@@ -16930,12 +16923,17 @@ var de = {
16930
16923
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
16931
16924
  "record.metadata.related": "Ähnliche Datensätze",
16932
16925
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16933
- "record.metadata.themes": "Kategorien",
16926
+ "record.metadata.status": "Status",
16927
+ "record.metadata.technical": "Technische Informationen",
16928
+ "record.metadata.temporalExtent": "Zeitlicher Umfang",
16929
+ "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
16930
+ "record.metadata.temporalExtent.sinceDate": "Seit {start}",
16931
+ "record.metadata.temporalExtent.untilDate": "Bis {end}",
16934
16932
  "record.metadata.title": "Titel",
16933
+ "record.metadata.topics": "Kategorien",
16935
16934
  "record.metadata.type": "Geographischer Datensatz",
16936
16935
  "record.metadata.uniqueId": "Eindeutige Kennung",
16937
16936
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
16938
- "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
16939
16937
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
16940
16938
  "record.metadata.usage": "Nutzung und Einschränkungen",
16941
16939
  "record.more.details": "Weitere Details",
@@ -16967,6 +16965,7 @@ var de = {
16967
16965
  "search.filters.isSpatial": "Ist räumliche Daten",
16968
16966
  "search.filters.isSpatial.no": "nicht räumlich",
16969
16967
  "search.filters.isSpatial.yes": "räumlich",
16968
+ "search.filters.keyword": "Schlüsselwort",
16970
16969
  "search.filters.license": "Lizenz",
16971
16970
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16972
16971
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -16997,7 +16996,7 @@ var de = {
16997
16996
  "table.object.count": "Objekte in diesem Datensatz",
16998
16997
  "table.select.data": "Datenquelle",
16999
16998
  "tooltip.html.copy": "HTML kopieren",
17000
- "tooltip.id.copy": "",
16999
+ "tooltip.id.copy": "Eindeutige Kennung kopieren",
17001
17000
  "tooltip.url.copy": "URL kopieren",
17002
17001
  "tooltip.url.open": "URL öffnen",
17003
17002
  "ui.readLess": "Weniger lesen",
@@ -17031,20 +17030,21 @@ var en = {
17031
17030
  "chart.type.line": "line chart",
17032
17031
  "chart.type.lineSmooth": "smooth line chart",
17033
17032
  "chart.type.pie": "pie chart",
17033
+ "dashboard.createRecord": "New record",
17034
17034
  "dashboard.labels.mySpace": "My space",
17035
- "dashboard.records.all": "Catalog",
17035
+ "dashboard.records.all": "Metadata records",
17036
17036
  "dashboard.records.myDraft": "My drafts",
17037
17037
  "dashboard.records.myLibrary": "My library",
17038
17038
  "dashboard.records.myOrg": "Organization",
17039
17039
  "dashboard.records.myRecords": "My Records",
17040
- "dashboard.records.noRecord": "No record for this organization",
17041
- "dashboard.records.noUser": "No users for this organization",
17042
17040
  "dashboard.records.publishedRecords": "{count, plural, =1{published record} other{published records}}",
17043
17041
  "dashboard.records.search": "Search for \"{searchText}\"",
17044
17042
  "dashboard.records.userDetail": "Name",
17045
17043
  "dashboard.records.userEmail": "Email",
17046
17044
  "dashboard.records.username": "Username",
17047
17045
  "dashboard.records.users": "{count, plural, =1{user} other{users}}",
17046
+ "dashboard.results.listMetadata": "Show metadata",
17047
+ "dashboard.results.listResources": "Show resources",
17048
17048
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "File format \n detection",
17049
17049
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Gathering dataset \n information",
17050
17050
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n data",
@@ -17158,6 +17158,8 @@ var en = {
17158
17158
  "downloads.format.unknown": "unknown",
17159
17159
  "downloads.wfs.featuretype.not.found": "The layer was not found",
17160
17160
  dropFile: dropFile$5,
17161
+ "editor.record.publish": "Publish this record",
17162
+ "editor.record.upToDate": "This record is up to date",
17161
17163
  "externalviewer.dataset.unnamed": "Datahub layer",
17162
17164
  "facets.block.title.OrgForResource": "Organisation",
17163
17165
  "facets.block.title.availableInServices": "Available for",
@@ -17171,21 +17173,21 @@ var en = {
17171
17173
  "facets.block.title.tag.default": "Tag",
17172
17174
  "facets.block.title.th_regions_tree.default": "Regions",
17173
17175
  "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",
17176
+ "language.ca": "Catalan",
17177
+ "language.cs": "Czech",
17178
+ "language.de": "German",
17177
17179
  "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": "中文",
17180
+ "language.es": "Spanish",
17181
+ "language.fi": "Finnish",
17182
+ "language.fr": "French",
17183
+ "language.is": "Icelandic",
17184
+ "language.it": "Italian",
17185
+ "language.ko": "Korean",
17186
+ "language.nl": "Dutch",
17187
+ "language.pt": "Portuguese",
17188
+ "language.ru": "Russian",
17189
+ "language.sk": "Slovak",
17190
+ "language.zh": "Chinese",
17189
17191
  "map.add.layer": "Add a layer",
17190
17192
  "map.add.layer.catalog": "From the catalog",
17191
17193
  "map.add.layer.file": "From a file",
@@ -17236,18 +17238,20 @@ var en = {
17236
17238
  "record.metadata.author": "Author",
17237
17239
  "record.metadata.catalog": "Catalog",
17238
17240
  "record.metadata.contact": "Contact",
17239
- "record.metadata.createdOn": "Created on",
17240
- "record.metadata.details": "Technical information",
17241
+ "record.metadata.creation": "Date of creation",
17242
+ "record.metadata.details": "About the data",
17241
17243
  "record.metadata.download": "Downloads",
17242
17244
  "record.metadata.formats": "Formats",
17243
- "record.metadata.isOpenData": "Open Data",
17244
17245
  "record.metadata.keywords": "Keywords",
17245
- "record.metadata.lastUpdate": "Last updated on",
17246
+ "record.metadata.languages": "Languages",
17247
+ "record.metadata.lastUpdate": "Last updated on {date}",
17246
17248
  "record.metadata.links": "Links",
17247
17249
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17248
- "record.metadata.origin": "About the data",
17250
+ "record.metadata.otherConstraints": "Additional Conditions",
17249
17251
  "record.metadata.owner": "Catalog of origin",
17250
17252
  "record.metadata.preview": "Preview",
17253
+ "record.metadata.producer": "Data producer",
17254
+ "record.metadata.publication": "Date of publication",
17251
17255
  "record.metadata.publications": "publications",
17252
17256
  "record.metadata.quality": "Metadata Quality",
17253
17257
  "record.metadata.quality.contact.failed": "Contact is not specified",
@@ -17269,14 +17273,19 @@ var en = {
17269
17273
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
17270
17274
  "record.metadata.related": "Related records",
17271
17275
  "record.metadata.sheet": "Original metadata",
17272
- "record.metadata.themes": "Categories",
17276
+ "record.metadata.status": "Status",
17277
+ "record.metadata.technical": "Technical information",
17278
+ "record.metadata.temporalExtent": "Temporal extent",
17279
+ "record.metadata.temporalExtent.fromDateToDate": "From { start } to { end }",
17280
+ "record.metadata.temporalExtent.sinceDate": "Since { start }",
17281
+ "record.metadata.temporalExtent.untilDate": "Until { end }",
17273
17282
  "record.metadata.title": "Title",
17283
+ "record.metadata.topics": "Categories",
17274
17284
  "record.metadata.type": "Geographical dataset",
17275
17285
  "record.metadata.uniqueId": "Unique Identifier",
17276
17286
  "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",
17287
+ "record.metadata.updatedOn": "Last Data Information Update",
17288
+ "record.metadata.usage": "License and Conditions",
17280
17289
  "record.more.details": "Read more",
17281
17290
  "record.tab.chart": "Chart",
17282
17291
  "record.tab.data": "Table",
@@ -17306,6 +17315,7 @@ var en = {
17306
17315
  "search.filters.isSpatial": "Is spatial data",
17307
17316
  "search.filters.isSpatial.no": "non spatial",
17308
17317
  "search.filters.isSpatial.yes": "spatial",
17318
+ "search.filters.keyword": "Keyword",
17309
17319
  "search.filters.license": "License",
17310
17320
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17311
17321
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17370,20 +17380,21 @@ var es = {
17370
17380
  "chart.type.line": "gráfico de líneas",
17371
17381
  "chart.type.lineSmooth": "gráfico de líneas suave",
17372
17382
  "chart.type.pie": "gráfico circular",
17383
+ "dashboard.createRecord": "",
17373
17384
  "dashboard.labels.mySpace": "Mi espacio",
17374
17385
  "dashboard.records.all": "Catálogo",
17375
17386
  "dashboard.records.myDraft": "Mis borradores",
17376
17387
  "dashboard.records.myLibrary": "Mi biblioteca",
17377
17388
  "dashboard.records.myOrg": "Organización",
17378
17389
  "dashboard.records.myRecords": "Mis Registros",
17379
- "dashboard.records.noRecord": "",
17380
- "dashboard.records.noUser": "",
17381
17390
  "dashboard.records.publishedRecords": "",
17382
17391
  "dashboard.records.search": "Buscar \"{searchText}\"",
17383
17392
  "dashboard.records.userDetail": "",
17384
17393
  "dashboard.records.userEmail": "",
17385
17394
  "dashboard.records.username": "",
17386
17395
  "dashboard.records.users": "",
17396
+ "dashboard.results.listMetadata": "",
17397
+ "dashboard.results.listResources": "",
17387
17398
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
17388
17399
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
17389
17400
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -17497,6 +17508,8 @@ var es = {
17497
17508
  "downloads.format.unknown": "",
17498
17509
  "downloads.wfs.featuretype.not.found": "",
17499
17510
  dropFile: dropFile$4,
17511
+ "editor.record.publish": "",
17512
+ "editor.record.upToDate": "",
17500
17513
  "externalviewer.dataset.unnamed": "",
17501
17514
  "facets.block.title.OrgForResource": "",
17502
17515
  "facets.block.title.availableInServices": "",
@@ -17510,21 +17523,21 @@ var es = {
17510
17523
  "facets.block.title.tag.default": "",
17511
17524
  "facets.block.title.th_regions_tree.default": "",
17512
17525
  "favorite.not.authenticated.tooltip": "",
17513
- "language.ca": "Català",
17514
- "language.cs": "Čeština",
17515
- "language.de": "Deutsch",
17516
- "language.en": "English",
17526
+ "language.ca": "Catalán",
17527
+ "language.cs": "Checo",
17528
+ "language.de": "Alemán",
17529
+ "language.en": "Inglés",
17517
17530
  "language.es": "Español",
17518
- "language.fi": "Suomi",
17519
- "language.fr": "Français",
17520
- "language.is": "Íslenska",
17531
+ "language.fi": "Finlandés",
17532
+ "language.fr": "Francés",
17533
+ "language.is": "Islandés",
17521
17534
  "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": "中文",
17535
+ "language.ko": "Coreano",
17536
+ "language.nl": "Neerlandés",
17537
+ "language.pt": "Portugués",
17538
+ "language.ru": "Ruso",
17539
+ "language.sk": "Eslovaco",
17540
+ "language.zh": "Chino",
17528
17541
  "map.add.layer": "",
17529
17542
  "map.add.layer.catalog": "",
17530
17543
  "map.add.layer.file": "",
@@ -17575,18 +17588,20 @@ var es = {
17575
17588
  "record.metadata.author": "",
17576
17589
  "record.metadata.catalog": "",
17577
17590
  "record.metadata.contact": "",
17578
- "record.metadata.createdOn": "",
17591
+ "record.metadata.creation": "",
17579
17592
  "record.metadata.details": "",
17580
17593
  "record.metadata.download": "",
17581
17594
  "record.metadata.formats": "",
17582
- "record.metadata.isOpenData": "",
17583
17595
  "record.metadata.keywords": "",
17596
+ "record.metadata.languages": "",
17584
17597
  "record.metadata.lastUpdate": "",
17585
17598
  "record.metadata.links": "",
17586
17599
  "record.metadata.noUsage": "",
17587
- "record.metadata.origin": "",
17600
+ "record.metadata.otherConstraints": "",
17588
17601
  "record.metadata.owner": "",
17589
17602
  "record.metadata.preview": "",
17603
+ "record.metadata.producer": "",
17604
+ "record.metadata.publication": "",
17590
17605
  "record.metadata.publications": "",
17591
17606
  "record.metadata.quality": "",
17592
17607
  "record.metadata.quality.contact.failed": "",
@@ -17608,12 +17623,17 @@ var es = {
17608
17623
  "record.metadata.quality.updateFrequency.success": "",
17609
17624
  "record.metadata.related": "",
17610
17625
  "record.metadata.sheet": "",
17611
- "record.metadata.themes": "",
17626
+ "record.metadata.status": "",
17627
+ "record.metadata.technical": "",
17628
+ "record.metadata.temporalExtent": "",
17629
+ "record.metadata.temporalExtent.fromDateToDate": "",
17630
+ "record.metadata.temporalExtent.sinceDate": "",
17631
+ "record.metadata.temporalExtent.untilDate": "",
17612
17632
  "record.metadata.title": "",
17633
+ "record.metadata.topics": "",
17613
17634
  "record.metadata.type": "",
17614
17635
  "record.metadata.uniqueId": "",
17615
17636
  "record.metadata.updateFrequency": "",
17616
- "record.metadata.updateStatus": "",
17617
17637
  "record.metadata.updatedOn": "",
17618
17638
  "record.metadata.usage": "",
17619
17639
  "record.more.details": "",
@@ -17645,6 +17665,7 @@ var es = {
17645
17665
  "search.filters.isSpatial": "",
17646
17666
  "search.filters.isSpatial.no": "",
17647
17667
  "search.filters.isSpatial.yes": "",
17668
+ "search.filters.keyword": "",
17648
17669
  "search.filters.license": "",
17649
17670
  "search.filters.license.cc-by": "",
17650
17671
  "search.filters.license.cc-by-sa": "",
@@ -17709,20 +17730,21 @@ var fr = {
17709
17730
  "chart.type.line": "ligne",
17710
17731
  "chart.type.lineSmooth": "ligne lisse",
17711
17732
  "chart.type.pie": "camembert",
17733
+ "dashboard.createRecord": "Nouvel enregistrement",
17712
17734
  "dashboard.labels.mySpace": "Mon espace",
17713
17735
  "dashboard.records.all": "Catalogue",
17714
17736
  "dashboard.records.myDraft": "Mes brouillons",
17715
17737
  "dashboard.records.myLibrary": "Ma bibliothèque",
17716
17738
  "dashboard.records.myOrg": "Mon organisation",
17717
17739
  "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
17740
  "dashboard.records.publishedRecords": "{count, plural, =1{donnée publiée} other{données publiées}}",
17721
17741
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
17722
17742
  "dashboard.records.userDetail": "Nom",
17723
17743
  "dashboard.records.userEmail": "Email",
17724
17744
  "dashboard.records.username": "Nom d'utilisateur",
17725
17745
  "dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
17746
+ "dashboard.results.listMetadata": "Afficher les métadonnées",
17747
+ "dashboard.results.listResources": "Afficher les ressources",
17726
17748
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Détection du \n format de fichier",
17727
17749
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Récupération des informations \n sur le jeu de données",
17728
17750
  "datafeeder.analysisProgressBar.illustration.samplingData": "Sampling \n des données",
@@ -17804,7 +17826,7 @@ var fr = {
17804
17826
  "datahub.header.popularRecords": "Les plus appréciées",
17805
17827
  "datahub.header.title.html": "<div class=\"text-white\">Toutes les données<br>publiques de mon organisation</div>",
17806
17828
  "datahub.news.contact.contactus": "Contactez-nous",
17807
- "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont la pour vous répondre.</p>",
17829
+ "datahub.news.contact.html": "<p>Vous avez besoin de données qui ne sont pas présentes sur la plateforme actuellement ? </p><p> Nos équipes sont pour vous répondre.</p>",
17808
17830
  "datahub.news.contact.title": "Un besoin spécifique ?",
17809
17831
  "datahub.news.feed": "Fil d'activité",
17810
17832
  "datahub.news.figures": "Quelques chiffres",
@@ -17836,6 +17858,8 @@ var fr = {
17836
17858
  "downloads.format.unknown": "inconnu",
17837
17859
  "downloads.wfs.featuretype.not.found": "La couche n'a pas été retrouvée",
17838
17860
  dropFile: dropFile$3,
17861
+ "editor.record.publish": "",
17862
+ "editor.record.upToDate": "",
17839
17863
  "externalviewer.dataset.unnamed": "Couche du datahub",
17840
17864
  "facets.block.title.OrgForResource": "Organisation",
17841
17865
  "facets.block.title.availableInServices": "Disponible pour",
@@ -17849,38 +17873,38 @@ var fr = {
17849
17873
  "facets.block.title.tag.default": "Tag",
17850
17874
  "facets.block.title.th_regions_tree.default": "Régions",
17851
17875
  "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",
17876
+ "language.ca": "Catalan",
17877
+ "language.cs": "Tchèque",
17878
+ "language.de": "Allemand",
17879
+ "language.en": "Anglais",
17880
+ "language.es": "Espagnol",
17881
+ "language.fi": "Finnois",
17858
17882
  "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": "",
17883
+ "language.is": "Islandais",
17884
+ "language.it": "Italien",
17885
+ "language.ko": "Coréen",
17886
+ "language.nl": "Néerlandais",
17887
+ "language.pt": "Portugais",
17888
+ "language.ru": "Russe",
17889
+ "language.sk": "Slovaque",
17890
+ "language.zh": "Chinois",
17891
+ "map.add.layer": "Ajouter une couche",
17892
+ "map.add.layer.catalog": "Du catalogue",
17893
+ "map.add.layer.file": "À partir d'un fichier",
17894
+ "map.add.layer.wfs": "Depuis un service WFS",
17895
+ "map.add.layer.wms": "Depuis un service WMS",
17896
+ "map.addFromFile.placeholder": "Cliquez ou déposez un fichier ici",
17897
+ "map.geocoding.placeholder": "Rechercher un lieu",
17898
+ "map.help.addFromFile": "Cliquez ou glissez-déposez un fichier pour l'ajouter à la carte (supporte actuellement uniquement le format GeoJSON).",
17899
+ "map.layer.add": "Ajouter",
17900
+ "map.layers.available": "Couches disponibles",
17901
+ "map.layers.list": "Couches",
17878
17902
  "map.loading.data": "Chargement des données...",
17879
- "map.loading.service": "",
17903
+ "map.loading.service": "Chargement du service...",
17880
17904
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
17881
17905
  "map.select.layer": "Source de données",
17882
- "map.wfs.urlInput.hint": "",
17883
- "map.wms.urlInput.hint": "",
17906
+ "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
17907
+ "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
17884
17908
  "multiselect.filter.placeholder": "Rechercher",
17885
17909
  "nav.back": "Retour",
17886
17910
  next: next$3,
@@ -17914,18 +17938,20 @@ var fr = {
17914
17938
  "record.metadata.author": "Auteur",
17915
17939
  "record.metadata.catalog": "Catalogue",
17916
17940
  "record.metadata.contact": "Contact",
17917
- "record.metadata.createdOn": "Créé le",
17918
- "record.metadata.details": "Informations techniques",
17941
+ "record.metadata.creation": "Date de création",
17942
+ "record.metadata.details": "A propos de la donnée",
17919
17943
  "record.metadata.download": "Téléchargements",
17920
17944
  "record.metadata.formats": "Formats",
17921
- "record.metadata.isOpenData": "Donnée Ouverte",
17922
17945
  "record.metadata.keywords": "Mots clés",
17923
- "record.metadata.lastUpdate": "Mis à jour le",
17946
+ "record.metadata.languages": "Langues",
17947
+ "record.metadata.lastUpdate": "Mis à jour le {date}",
17924
17948
  "record.metadata.links": "Liens",
17925
17949
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17926
- "record.metadata.origin": "À propos des données",
17950
+ "record.metadata.otherConstraints": "Limitations d'usage",
17927
17951
  "record.metadata.owner": "Catalogue d'origine",
17928
17952
  "record.metadata.preview": "Aperçu",
17953
+ "record.metadata.producer": "Producteur de la donnée",
17954
+ "record.metadata.publication": "Date de publication",
17929
17955
  "record.metadata.publications": "données",
17930
17956
  "record.metadata.quality": "Qualité des métadonnées",
17931
17957
  "record.metadata.quality.contact.failed": "Contact n'est pas renseigné",
@@ -17947,14 +17973,19 @@ var fr = {
17947
17973
  "record.metadata.quality.updateFrequency.success": "Fréquence de mise à jour est renseignée",
17948
17974
  "record.metadata.related": "Voir aussi",
17949
17975
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17950
- "record.metadata.themes": "Catégories",
17976
+ "record.metadata.status": "Statut",
17977
+ "record.metadata.technical": "Informations techniques",
17978
+ "record.metadata.temporalExtent": "Etendue temporelle",
17979
+ "record.metadata.temporalExtent.fromDateToDate": "Du { start } au { end }",
17980
+ "record.metadata.temporalExtent.sinceDate": "Depuis le { start }",
17981
+ "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
17951
17982
  "record.metadata.title": "Titre",
17983
+ "record.metadata.topics": "Catégories",
17952
17984
  "record.metadata.type": "Donnée géographique",
17953
17985
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17954
17986
  "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",
17987
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17988
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17958
17989
  "record.more.details": "Détails",
17959
17990
  "record.tab.chart": "Graphique",
17960
17991
  "record.tab.data": "Tableau",
@@ -17984,6 +18015,7 @@ var fr = {
17984
18015
  "search.filters.isSpatial": "Données spatiales",
17985
18016
  "search.filters.isSpatial.no": "non-géolocalisées",
17986
18017
  "search.filters.isSpatial.yes": "géolocalisées",
18018
+ "search.filters.keyword": "Mot-clé",
17987
18019
  "search.filters.license": "Licence",
17988
18020
  "search.filters.license.cc-by": "cc-by",
17989
18021
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18048,20 +18080,21 @@ var it = {
18048
18080
  "chart.type.line": "grafico a linee",
18049
18081
  "chart.type.lineSmooth": "grafico a linea liscia",
18050
18082
  "chart.type.pie": "grafico a torta",
18083
+ "dashboard.createRecord": "Crea un record",
18051
18084
  "dashboard.labels.mySpace": "Il mio spazio",
18052
18085
  "dashboard.records.all": "Catalogo",
18053
18086
  "dashboard.records.myDraft": "Le mie bozze",
18054
18087
  "dashboard.records.myLibrary": "La mia biblioteca",
18055
18088
  "dashboard.records.myOrg": "La mia organizzazione",
18056
18089
  "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
18090
  "dashboard.records.publishedRecords": "dati pubblicati",
18060
18091
  "dashboard.records.search": "Risultati per \"{searchText}\"",
18061
18092
  "dashboard.records.userDetail": "Nome",
18062
18093
  "dashboard.records.userEmail": "Email",
18063
18094
  "dashboard.records.username": "Nome utente",
18064
18095
  "dashboard.records.users": "utenti",
18096
+ "dashboard.results.listMetadata": "Elenco dei metadati",
18097
+ "dashboard.results.listResources": "Elenco delle risorse",
18065
18098
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "Rilevamento del formato dei file",
18066
18099
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "Recupero delle informazioni dal dataset",
18067
18100
  "datafeeder.analysisProgressBar.illustration.samplingData": "Campionatura dei dati",
@@ -18175,6 +18208,8 @@ var it = {
18175
18208
  "downloads.format.unknown": "sconosciuto",
18176
18209
  "downloads.wfs.featuretype.not.found": "Il layer non è stato trovato",
18177
18210
  dropFile: dropFile$2,
18211
+ "editor.record.publish": "",
18212
+ "editor.record.upToDate": "",
18178
18213
  "externalviewer.dataset.unnamed": "Layer del datahub",
18179
18214
  "facets.block.title.OrgForResource": "Organizzazione",
18180
18215
  "facets.block.title.availableInServices": "Disponibile per",
@@ -18188,38 +18223,38 @@ var it = {
18188
18223
  "facets.block.title.tag.default": "Tag",
18189
18224
  "facets.block.title.th_regions_tree.default": "Regioni",
18190
18225
  "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",
18226
+ "language.ca": "Catalano",
18227
+ "language.cs": "Ceco",
18228
+ "language.de": "Tedesco",
18229
+ "language.en": "Inglese",
18230
+ "language.es": "Spagnolo",
18231
+ "language.fi": "Finlandese",
18232
+ "language.fr": "Francese",
18233
+ "language.is": "Islandese",
18199
18234
  "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": "中文",
18235
+ "language.ko": "Coreano",
18236
+ "language.nl": "Olandese",
18237
+ "language.pt": "Portoghese",
18238
+ "language.ru": "Russo",
18239
+ "language.sk": "Slovacco",
18240
+ "language.zh": "Cinese",
18206
18241
  "map.add.layer": "Aggiungere un layer",
18207
18242
  "map.add.layer.catalog": "Dal catalogo",
18208
18243
  "map.add.layer.file": "Da un file",
18209
18244
  "map.add.layer.wfs": "Da un WFS",
18210
18245
  "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": "",
18246
+ "map.addFromFile.placeholder": "Clicca o trascina un file qui",
18247
+ "map.geocoding.placeholder": "Cerca un luogo",
18248
+ "map.help.addFromFile": "Clicca o trascina un file per aggiungerlo alla mappa (attualmente supporta solo il formato GeoJSON)",
18249
+ "map.layer.add": "Aggiungi",
18250
+ "map.layers.available": "Layer disponibili",
18216
18251
  "map.layers.list": "Layers",
18217
18252
  "map.loading.data": "Caricamento dati...",
18218
- "map.loading.service": "",
18253
+ "map.loading.service": "Caricamento del servizio...",
18219
18254
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
18220
18255
  "map.select.layer": "Sorgente dati",
18221
- "map.wfs.urlInput.hint": "",
18222
- "map.wms.urlInput.hint": "",
18256
+ "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
18257
+ "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
18223
18258
  "multiselect.filter.placeholder": "Cerca",
18224
18259
  "nav.back": "Indietro",
18225
18260
  next: next$2,
@@ -18253,18 +18288,20 @@ var it = {
18253
18288
  "record.metadata.author": "Autore",
18254
18289
  "record.metadata.catalog": "Catalogo",
18255
18290
  "record.metadata.contact": "Contatto",
18256
- "record.metadata.createdOn": "Creato il",
18257
- "record.metadata.details": "Informazioni tecniche",
18291
+ "record.metadata.creation": "Data di creazione",
18292
+ "record.metadata.details": "A proposito del dati",
18258
18293
  "record.metadata.download": "Download",
18259
18294
  "record.metadata.formats": "Formati",
18260
- "record.metadata.isOpenData": "Data aperta",
18261
18295
  "record.metadata.keywords": "Parole chiave",
18262
- "record.metadata.lastUpdate": "Ultimo aggiornamento",
18296
+ "record.metadata.languages": "Lingue",
18297
+ "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
18263
18298
  "record.metadata.links": "Collegamenti",
18264
18299
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18265
- "record.metadata.origin": "Informazioni sui dati",
18300
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18266
18301
  "record.metadata.owner": "Catalogo originale",
18267
18302
  "record.metadata.preview": "Anteprima",
18303
+ "record.metadata.producer": "Produttore dei dati",
18304
+ "record.metadata.publication": "Data di pubblicazione",
18268
18305
  "record.metadata.publications": "pubblicazioni",
18269
18306
  "record.metadata.quality": "Qualità dei metadati",
18270
18307
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
@@ -18286,14 +18323,19 @@ var it = {
18286
18323
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
18287
18324
  "record.metadata.related": "Vedi anche",
18288
18325
  "record.metadata.sheet": "Origine del metadata",
18289
- "record.metadata.themes": "Categorie",
18326
+ "record.metadata.status": "Stato",
18327
+ "record.metadata.technical": "Informazioni tecniche",
18328
+ "record.metadata.temporalExtent": "Periodo di tempo",
18329
+ "record.metadata.temporalExtent.fromDateToDate": "Da {start} a {end}",
18330
+ "record.metadata.temporalExtent.sinceDate": "Dal {start}",
18331
+ "record.metadata.temporalExtent.untilDate": "Fino a {end}",
18290
18332
  "record.metadata.title": "Titolo",
18333
+ "record.metadata.topics": "Categorie",
18291
18334
  "record.metadata.type": "Dati geografici",
18292
18335
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18293
18336
  "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",
18337
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18338
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18297
18339
  "record.more.details": "Dettagli",
18298
18340
  "record.tab.chart": "Grafico",
18299
18341
  "record.tab.data": "Tabella",
@@ -18323,6 +18365,7 @@ var it = {
18323
18365
  "search.filters.isSpatial": "Dati spaziali",
18324
18366
  "search.filters.isSpatial.no": "Non geolocalizzati",
18325
18367
  "search.filters.isSpatial.yes": "Geolocalizzati",
18368
+ "search.filters.keyword": "Parola chiave",
18326
18369
  "search.filters.license": "Licenza",
18327
18370
  "search.filters.license.cc-by": "cc-by",
18328
18371
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18387,20 +18430,21 @@ var nl = {
18387
18430
  "chart.type.line": "lijndiagram",
18388
18431
  "chart.type.lineSmooth": "glad lijndiagram",
18389
18432
  "chart.type.pie": "cirkeldiagram",
18433
+ "dashboard.createRecord": "",
18390
18434
  "dashboard.labels.mySpace": "Mijn ruimte",
18391
18435
  "dashboard.records.all": "Catalogus",
18392
18436
  "dashboard.records.myDraft": "Mijn concepten",
18393
18437
  "dashboard.records.myLibrary": "Mijn bibliotheek",
18394
18438
  "dashboard.records.myOrg": "Organisatie",
18395
18439
  "dashboard.records.myRecords": "Mijn Records",
18396
- "dashboard.records.noRecord": "",
18397
- "dashboard.records.noUser": "",
18398
18440
  "dashboard.records.publishedRecords": "",
18399
18441
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
18400
18442
  "dashboard.records.userDetail": "",
18401
18443
  "dashboard.records.userEmail": "",
18402
18444
  "dashboard.records.username": "",
18403
18445
  "dashboard.records.users": "",
18446
+ "dashboard.results.listMetadata": "",
18447
+ "dashboard.results.listResources": "",
18404
18448
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18405
18449
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18406
18450
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18514,6 +18558,8 @@ var nl = {
18514
18558
  "downloads.format.unknown": "",
18515
18559
  "downloads.wfs.featuretype.not.found": "",
18516
18560
  dropFile: dropFile$1,
18561
+ "editor.record.publish": "",
18562
+ "editor.record.upToDate": "",
18517
18563
  "externalviewer.dataset.unnamed": "",
18518
18564
  "facets.block.title.OrgForResource": "",
18519
18565
  "facets.block.title.availableInServices": "",
@@ -18527,21 +18573,21 @@ var nl = {
18527
18573
  "facets.block.title.tag.default": "",
18528
18574
  "facets.block.title.th_regions_tree.default": "",
18529
18575
  "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": "한국어",
18576
+ "language.ca": "Catalaans",
18577
+ "language.cs": "Tsjechisch",
18578
+ "language.de": "Duits",
18579
+ "language.en": "Engels",
18580
+ "language.es": "Spaans",
18581
+ "language.fi": "Fins",
18582
+ "language.fr": "Frans",
18583
+ "language.is": "IJslands",
18584
+ "language.it": "Italiaans",
18585
+ "language.ko": "Koreaans",
18540
18586
  "language.nl": "Nederlands",
18541
- "language.pt": "Português",
18542
- "language.ru": "Русский",
18543
- "language.sk": "Slovenčina",
18544
- "language.zh": "中文",
18587
+ "language.pt": "Portugees",
18588
+ "language.ru": "Russisch",
18589
+ "language.sk": "Slowaaks",
18590
+ "language.zh": "Chinees",
18545
18591
  "map.add.layer": "",
18546
18592
  "map.add.layer.catalog": "",
18547
18593
  "map.add.layer.file": "",
@@ -18592,18 +18638,20 @@ var nl = {
18592
18638
  "record.metadata.author": "",
18593
18639
  "record.metadata.catalog": "",
18594
18640
  "record.metadata.contact": "",
18595
- "record.metadata.createdOn": "",
18641
+ "record.metadata.creation": "",
18596
18642
  "record.metadata.details": "",
18597
18643
  "record.metadata.download": "",
18598
18644
  "record.metadata.formats": "",
18599
- "record.metadata.isOpenData": "",
18600
18645
  "record.metadata.keywords": "",
18646
+ "record.metadata.languages": "",
18601
18647
  "record.metadata.lastUpdate": "",
18602
18648
  "record.metadata.links": "",
18603
18649
  "record.metadata.noUsage": "",
18604
- "record.metadata.origin": "",
18650
+ "record.metadata.otherConstraints": "",
18605
18651
  "record.metadata.owner": "",
18606
18652
  "record.metadata.preview": "",
18653
+ "record.metadata.producer": "",
18654
+ "record.metadata.publication": "",
18607
18655
  "record.metadata.publications": "",
18608
18656
  "record.metadata.quality": "",
18609
18657
  "record.metadata.quality.contact.failed": "",
@@ -18625,12 +18673,17 @@ var nl = {
18625
18673
  "record.metadata.quality.updateFrequency.success": "",
18626
18674
  "record.metadata.related": "",
18627
18675
  "record.metadata.sheet": "",
18628
- "record.metadata.themes": "",
18676
+ "record.metadata.status": "",
18677
+ "record.metadata.technical": "",
18678
+ "record.metadata.temporalExtent": "",
18679
+ "record.metadata.temporalExtent.fromDateToDate": "",
18680
+ "record.metadata.temporalExtent.sinceDate": "",
18681
+ "record.metadata.temporalExtent.untilDate": "",
18629
18682
  "record.metadata.title": "",
18683
+ "record.metadata.topics": "",
18630
18684
  "record.metadata.type": "",
18631
18685
  "record.metadata.uniqueId": "",
18632
18686
  "record.metadata.updateFrequency": "",
18633
- "record.metadata.updateStatus": "",
18634
18687
  "record.metadata.updatedOn": "",
18635
18688
  "record.metadata.usage": "",
18636
18689
  "record.more.details": "",
@@ -18662,6 +18715,7 @@ var nl = {
18662
18715
  "search.filters.isSpatial": "",
18663
18716
  "search.filters.isSpatial.no": "",
18664
18717
  "search.filters.isSpatial.yes": "",
18718
+ "search.filters.keyword": "",
18665
18719
  "search.filters.license": "",
18666
18720
  "search.filters.license.cc-by": "",
18667
18721
  "search.filters.license.cc-by-sa": "",
@@ -18726,20 +18780,21 @@ var pt = {
18726
18780
  "chart.type.line": "gráfico de linha",
18727
18781
  "chart.type.lineSmooth": "gráfico de linha suave",
18728
18782
  "chart.type.pie": "gráfico de pizza",
18783
+ "dashboard.createRecord": "",
18729
18784
  "dashboard.labels.mySpace": "Meu espaço",
18730
18785
  "dashboard.records.all": "Catálogo",
18731
18786
  "dashboard.records.myDraft": "Meus rascunhos",
18732
18787
  "dashboard.records.myLibrary": "Minha biblioteca",
18733
18788
  "dashboard.records.myOrg": "Organização",
18734
18789
  "dashboard.records.myRecords": "Meus Registros",
18735
- "dashboard.records.noRecord": "",
18736
- "dashboard.records.noUser": "",
18737
18790
  "dashboard.records.publishedRecords": "",
18738
18791
  "dashboard.records.search": "Buscar por \"{searchText}\"",
18739
18792
  "dashboard.records.userDetail": "",
18740
18793
  "dashboard.records.userEmail": "",
18741
18794
  "dashboard.records.username": "",
18742
18795
  "dashboard.records.users": "",
18796
+ "dashboard.results.listMetadata": "",
18797
+ "dashboard.results.listResources": "",
18743
18798
  "datafeeder.analysisProgressBar.illustration.fileFormatDetection": "",
18744
18799
  "datafeeder.analysisProgressBar.illustration.gatheringDatasetInformation": "",
18745
18800
  "datafeeder.analysisProgressBar.illustration.samplingData": "",
@@ -18853,6 +18908,8 @@ var pt = {
18853
18908
  "downloads.format.unknown": "",
18854
18909
  "downloads.wfs.featuretype.not.found": "",
18855
18910
  dropFile: dropFile,
18911
+ "editor.record.publish": "",
18912
+ "editor.record.upToDate": "",
18856
18913
  "externalviewer.dataset.unnamed": "",
18857
18914
  "facets.block.title.OrgForResource": "",
18858
18915
  "facets.block.title.availableInServices": "",
@@ -18866,21 +18923,21 @@ var pt = {
18866
18923
  "facets.block.title.tag.default": "",
18867
18924
  "facets.block.title.th_regions_tree.default": "",
18868
18925
  "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",
18926
+ "language.ca": "Catalão",
18927
+ "language.cs": "Tcheco",
18928
+ "language.de": "Alemão",
18929
+ "language.en": "Inglês",
18930
+ "language.es": "Espanhol",
18931
+ "language.fi": "Finlandês",
18932
+ "language.fr": "Francês",
18933
+ "language.is": "Islandês",
18877
18934
  "language.it": "Italiano",
18878
- "language.ko": "한국어",
18879
- "language.nl": "Nederlands",
18935
+ "language.ko": "Coreano",
18936
+ "language.nl": "Holandês",
18880
18937
  "language.pt": "Português",
18881
- "language.ru": "Русский",
18882
- "language.sk": "Slovenčina",
18883
- "language.zh": "中文",
18938
+ "language.ru": "Russo",
18939
+ "language.sk": "Eslovaco",
18940
+ "language.zh": "Chinês",
18884
18941
  "map.add.layer": "",
18885
18942
  "map.add.layer.catalog": "",
18886
18943
  "map.add.layer.file": "",
@@ -18931,18 +18988,20 @@ var pt = {
18931
18988
  "record.metadata.author": "",
18932
18989
  "record.metadata.catalog": "",
18933
18990
  "record.metadata.contact": "",
18934
- "record.metadata.createdOn": "",
18991
+ "record.metadata.creation": "",
18935
18992
  "record.metadata.details": "",
18936
18993
  "record.metadata.download": "",
18937
18994
  "record.metadata.formats": "",
18938
- "record.metadata.isOpenData": "",
18939
18995
  "record.metadata.keywords": "",
18996
+ "record.metadata.languages": "",
18940
18997
  "record.metadata.lastUpdate": "",
18941
18998
  "record.metadata.links": "",
18942
18999
  "record.metadata.noUsage": "",
18943
- "record.metadata.origin": "",
19000
+ "record.metadata.otherConstraints": "",
18944
19001
  "record.metadata.owner": "",
18945
19002
  "record.metadata.preview": "",
19003
+ "record.metadata.producer": "",
19004
+ "record.metadata.publication": "",
18946
19005
  "record.metadata.publications": "",
18947
19006
  "record.metadata.quality": "",
18948
19007
  "record.metadata.quality.contact.failed": "",
@@ -18964,12 +19023,17 @@ var pt = {
18964
19023
  "record.metadata.quality.updateFrequency.success": "",
18965
19024
  "record.metadata.related": "",
18966
19025
  "record.metadata.sheet": "",
18967
- "record.metadata.themes": "",
19026
+ "record.metadata.status": "",
19027
+ "record.metadata.technical": "",
19028
+ "record.metadata.temporalExtent": "",
19029
+ "record.metadata.temporalExtent.fromDateToDate": "",
19030
+ "record.metadata.temporalExtent.sinceDate": "",
19031
+ "record.metadata.temporalExtent.untilDate": "",
18968
19032
  "record.metadata.title": "",
19033
+ "record.metadata.topics": "",
18969
19034
  "record.metadata.type": "",
18970
19035
  "record.metadata.uniqueId": "",
18971
19036
  "record.metadata.updateFrequency": "",
18972
- "record.metadata.updateStatus": "",
18973
19037
  "record.metadata.updatedOn": "",
18974
19038
  "record.metadata.usage": "",
18975
19039
  "record.more.details": "",
@@ -19001,6 +19065,7 @@ var pt = {
19001
19065
  "search.filters.isSpatial": "",
19002
19066
  "search.filters.isSpatial.no": "",
19003
19067
  "search.filters.isSpatial.yes": "",
19068
+ "search.filters.keyword": "",
19004
19069
  "search.filters.license": "",
19005
19070
  "search.filters.license.cc-by": "",
19006
19071
  "search.filters.license.cc-by-sa": "",
@@ -19109,8 +19174,8 @@ class Gn4FieldMapper {
19109
19174
  },
19110
19175
  cl_topic: (output, source) => ({
19111
19176
  ...output,
19112
- themes: [
19113
- ...(output.themes || []),
19177
+ topics: [
19178
+ ...(output.topics || []),
19114
19179
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
19115
19180
  ],
19116
19181
  }),
@@ -19134,6 +19199,18 @@ class Gn4FieldMapper {
19134
19199
  ...output,
19135
19200
  recordUpdated: toDate(selectField(source, 'changeDate')),
19136
19201
  }),
19202
+ publicationDateForResource: (output, source) => ({
19203
+ ...output,
19204
+ recordPublished: toDate(selectField(source, 'publicationDateForResource')),
19205
+ }),
19206
+ resourceLanguage: (output, source) => {
19207
+ const langList = getAsArray(selectField(source, 'resourceLanguage'));
19208
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
19209
+ return {
19210
+ ...output,
19211
+ languages,
19212
+ };
19213
+ },
19137
19214
  link: (output, source) => {
19138
19215
  const rawLinks = getAsArray(selectField(source, 'link'));
19139
19216
  const distributions = rawLinks
@@ -19165,31 +19242,22 @@ class Gn4FieldMapper {
19165
19242
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19166
19243
  }, output);
19167
19244
  },
19168
- tag: (output, source) => ({
19245
+ allKeywords: (output, source) => ({
19169
19246
  ...output,
19170
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19247
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19171
19248
  }),
19172
19249
  inspireTheme: (output, source) => ({
19173
19250
  ...output,
19174
- themes: [
19175
- ...(output.themes || []),
19251
+ topics: [
19252
+ ...(output.topics || []),
19176
19253
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19177
19254
  ],
19178
19255
  }),
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
- }),
19256
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19257
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19258
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19259
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19260
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19193
19261
  lineageObject: (output, source) => ({
19194
19262
  ...output,
19195
19263
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19235,8 +19303,8 @@ class Gn4FieldMapper {
19235
19303
  ],
19236
19304
  };
19237
19305
  },
19238
- resourceTemporalDateRange: (output, source) => {
19239
- const ranges = getAsArray(selectField(source, 'resourceTemporalDateRange'));
19306
+ resourceTemporalExtentDateRange: (output, source) => {
19307
+ const ranges = getAsArray(selectField(source, 'resourceTemporalExtentDateRange'));
19240
19308
  return {
19241
19309
  ...output,
19242
19310
  temporalExtents: ranges.map((range) => {
@@ -19251,31 +19319,42 @@ class Gn4FieldMapper {
19251
19319
  },
19252
19320
  };
19253
19321
  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
- });
19322
+ this.constraintField = (type, output, constraintArray) => {
19323
+ let outputField;
19324
+ switch (type) {
19325
+ case 'license':
19326
+ outputField = 'licenses';
19327
+ break;
19328
+ case 'legal':
19329
+ outputField = 'legalConstraints';
19330
+ break;
19331
+ case 'security':
19332
+ outputField = 'securityConstraints';
19333
+ break;
19334
+ case 'other':
19335
+ outputField = 'otherConstraints';
19336
+ break;
19337
+ }
19338
+ const outputArray = outputField in output ? output[outputField] : [];
19339
+ outputArray.push(...constraintArray.map((item) => {
19340
+ const text = selectTranslatedValue(item, this.lang3);
19341
+ const url = getAsUrl(selectField(item, 'link'));
19342
+ return {
19343
+ text,
19344
+ ...(url ? { url } : {}),
19345
+ };
19346
+ }));
19347
+ const result = {
19348
+ ...output,
19349
+ [outputField]: outputArray,
19350
+ };
19351
+ // avoid legal constraints being duplicates of licenses
19352
+ if ('legalConstraints' in result &&
19353
+ (type === 'legal' || type === 'license')) {
19354
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19355
+ }
19356
+ return result;
19357
+ };
19279
19358
  this.mapLink = (sourceLink) => {
19280
19359
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19281
19360
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19323,17 +19402,6 @@ class Gn4FieldMapper {
19323
19402
  extras: { ...(output.extras || {}), ...value },
19324
19403
  });
19325
19404
  }
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
19405
  getMappingFn(fieldName) {
19338
19406
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19339
19407
  }
@@ -19393,17 +19461,20 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19393
19461
  status: null,
19394
19462
  lineage: null,
19395
19463
  recordUpdated: null,
19464
+ recordPublished: null,
19396
19465
  ownerOrganization: null,
19397
19466
  licenses: [],
19467
+ legalConstraints: [],
19468
+ securityConstraints: [],
19469
+ otherConstraints: [],
19398
19470
  contacts: [],
19399
19471
  contactsForResource: [],
19400
- accessConstraints: [],
19401
19472
  keywords: [],
19402
- themes: [],
19403
- useLimitations: [],
19473
+ topics: [],
19404
19474
  spatialExtents: [],
19405
19475
  temporalExtents: [],
19406
19476
  overviews: [],
19477
+ languages: [],
19407
19478
  };
19408
19479
  const record = Object.keys(_source).reduce((prev, fieldName) => this.fieldMapper.getMappingFn(fieldName)(prev, _source), emptyRecord);
19409
19480
  return lastValueFrom(this.orgsService.addOrganizationToRecordFromSource(_source, record));
@@ -19563,7 +19634,7 @@ class ElasticsearchService {
19563
19634
  },
19564
19635
  };
19565
19636
  }
19566
- getRelatedRecordPayload(title, uuid, size = 6, _source = ES_SOURCE_SUMMARY) {
19637
+ getRelatedRecordPayload(title, uuid, size = 6, _source = [...ES_SOURCE_SUMMARY, 'allKeywords', 'createDate']) {
19567
19638
  return {
19568
19639
  query: {
19569
19640
  bool: {
@@ -20168,11 +20239,18 @@ class OrganizationsFromMetadataService {
20168
20239
  if (!allContactOrgs.length)
20169
20240
  return of(record);
20170
20241
  const ownerOrganization = allContactOrgs[0];
20171
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20242
+ // read the owner group as well to have a fallback logo
20243
+ const groupId = selectField(source, 'groupOwner');
20244
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20245
+ return group.id === Number(groupId);
20246
+ })));
20247
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20172
20248
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20249
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20173
20250
  return {
20174
20251
  ...record,
20175
20252
  ownerOrganization: {
20253
+ logoUrl,
20176
20254
  ...ownerOrganization,
20177
20255
  ...recordOrganisation,
20178
20256
  },
@@ -20437,36 +20515,23 @@ class SelectionService {
20437
20515
  this.selectedRecordsIdentifiers$.next(filtered);
20438
20516
  }
20439
20517
  selectRecords(records) {
20440
- const newIds = [];
20441
- records.map((record) => {
20442
- newIds.push(record.uniqueIdentifier);
20443
- });
20444
- const apiResponse = this.selectionsApi.add(BUCKET_ID, newIds);
20445
- return apiResponse.pipe(tap$2(() => {
20518
+ const newIds = records.map((record) => record.uniqueIdentifier);
20519
+ this.selectionsApi.add(BUCKET_ID, newIds).subscribe(() => {
20446
20520
  this.addIdsToSelected(newIds);
20447
- }), map$2(() => undefined));
20521
+ });
20448
20522
  }
20449
20523
  deselectRecords(records) {
20450
- const idsToBeRemoved = [];
20451
- records.map((record) => {
20452
- idsToBeRemoved.push(record.uniqueIdentifier);
20453
- });
20454
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved);
20455
- return apiResponse.pipe(tap$2(() => {
20524
+ const idsToBeRemoved = records.map((record) => record.uniqueIdentifier);
20525
+ this.selectionsApi.clear(BUCKET_ID, idsToBeRemoved).subscribe(() => {
20456
20526
  this.removeIdsFromSelected(idsToBeRemoved);
20457
- }), map$2(() => undefined));
20458
- }
20459
- clearSelection() {
20460
- const currentSelectedResponse = this.selectionsApi.get(BUCKET_ID);
20461
- let currentSelection;
20462
- this.subscription = currentSelectedResponse.subscribe((value) => {
20463
- currentSelection = [...value];
20464
20527
  });
20465
- this.selectionsApi.clear(BUCKET_ID, currentSelection);
20466
- const apiResponse = this.selectionsApi.clear(BUCKET_ID, currentSelection);
20467
- return apiResponse.pipe(tap$2(() => {
20528
+ }
20529
+ async clearSelection() {
20530
+ const response = await firstValueFrom(this.selectionsApi.get(BUCKET_ID));
20531
+ const currentSelection = Array.from(response);
20532
+ this.selectionsApi.clear(BUCKET_ID, currentSelection).subscribe(() => {
20468
20533
  this.removeIdsFromSelected(currentSelection);
20469
- }), map$2(() => undefined));
20534
+ });
20470
20535
  }
20471
20536
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, deps: [{ token: SelectionsApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20472
20537
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SelectionService, providedIn: 'root' }); }
@@ -20496,12 +20561,21 @@ class Gn4PlatformMapper {
20496
20561
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20497
20562
  return { ...apiUser, id: id.toString() };
20498
20563
  }
20499
- thesaurusFromApi(thesaurus) {
20564
+ thesaurusFromApi(thesaurus, lang3) {
20500
20565
  return thesaurus.map((keyword) => {
20501
- const { uri, value } = keyword;
20566
+ let key = keyword.uri;
20567
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20568
+ if (key.indexOf('@@@') > -1) {
20569
+ key = key.split('@@@')[1];
20570
+ }
20571
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20572
+ const description = lang3 && lang3 in keyword.definitions
20573
+ ? keyword.definitions[lang3]
20574
+ : keyword.definition;
20502
20575
  return {
20503
- key: uri,
20504
- label: value,
20576
+ key,
20577
+ label,
20578
+ description,
20505
20579
  };
20506
20580
  });
20507
20581
  }
@@ -20514,13 +20588,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20514
20588
 
20515
20589
  const minApiVersion = '4.2.2';
20516
20590
  class Gn4PlatformService {
20517
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20591
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20518
20592
  this.siteApiService = siteApiService;
20519
20593
  this.meApi = meApi;
20520
20594
  this.usersApi = usersApi;
20521
20595
  this.mapper = mapper;
20522
20596
  this.toolsApiService = toolsApiService;
20523
20597
  this.registriesApiService = registriesApiService;
20598
+ this.langService = langService;
20524
20599
  this.type = 'GeoNetwork';
20525
20600
  this.keyTranslations$ = this.toolsApiService
20526
20601
  .getTranslationsPackage1('gnui')
@@ -20534,6 +20609,11 @@ class Gn4PlatformService {
20534
20609
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20535
20610
  }
20536
20611
  }), shareReplay(1));
20612
+ /**
20613
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20614
+ * @private
20615
+ */
20616
+ this.thesauri = {};
20537
20617
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20538
20618
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20539
20619
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20560,19 +20640,36 @@ class Gn4PlatformService {
20560
20640
  return this.users$;
20561
20641
  }
20562
20642
  translateKey(key) {
20643
+ // if the key is a URI, use the registries API to look for the translation
20644
+ if (key.match(/^https?:\/\//)) {
20645
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20646
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20647
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20648
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20649
+ for (const item of thesaurus) {
20650
+ if (item.key === key)
20651
+ return item.label;
20652
+ }
20653
+ return key;
20654
+ }));
20655
+ }
20563
20656
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20564
20657
  }
20565
- getThesaurusByLang(thesaurusName, lang) {
20566
- return this.registriesApiService
20567
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20568
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20658
+ getThesaurusByUri(uri) {
20659
+ if (this.thesauri[uri]) {
20660
+ return this.thesauri[uri];
20661
+ }
20662
+ this.thesauri[uri] = this.registriesApiService
20663
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20664
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20665
+ return this.thesauri[uri];
20569
20666
  }
20570
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20667
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20571
20668
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20572
20669
  }
20573
20670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20574
20671
  type: Injectable
20575
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20672
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20576
20673
 
20577
20674
  function provideGn4() {
20578
20675
  return [
@@ -20608,7 +20705,7 @@ const MAP_FEATURE_KEY = 'map';
20608
20705
  const initialMapState = {
20609
20706
  layers: [],
20610
20707
  };
20611
- const reducer$2 = createReducer(initialMapState, on(addLayer, (state, action) => {
20708
+ const reducer$3 = createReducer(initialMapState, on(addLayer, (state, action) => {
20612
20709
  const layers = [...state.layers];
20613
20710
  const layerWithInfo = { ...action.layer, loading: false, error: null };
20614
20711
  if (!('atIndex' in action))
@@ -20657,7 +20754,7 @@ const reducer$2 = createReducer(initialMapState, on(addLayer, (state, action) =>
20657
20754
  : layer),
20658
20755
  })));
20659
20756
  function mapReducer(state, action) {
20660
- return reducer$2(state, action);
20757
+ return reducer$3(state, action);
20661
20758
  }
20662
20759
 
20663
20760
  // Lookup the 'Map' feature state managed by NgRx
@@ -21120,6 +21217,38 @@ function createFuzzyFilter(pattern) {
21120
21217
  };
21121
21218
  }
21122
21219
 
21220
+ function getTemporalRangeUnion(ranges) {
21221
+ let earliestStartDate = Infinity;
21222
+ let latestEndDate = -Infinity;
21223
+ if (ranges.length) {
21224
+ for (let i = 0; i < ranges.length; i++) {
21225
+ const rangeStart = ranges[i].start
21226
+ ? new Date(ranges[i].start).getTime()
21227
+ : -Infinity;
21228
+ const rangeEnd = ranges[i].end
21229
+ ? new Date(ranges[i].end).getTime()
21230
+ : Infinity;
21231
+ if (rangeStart < earliestStartDate) {
21232
+ earliestStartDate = rangeStart;
21233
+ }
21234
+ if (rangeEnd > latestEndDate) {
21235
+ latestEndDate = rangeEnd;
21236
+ }
21237
+ }
21238
+ return {
21239
+ start: earliestStartDate !== -Infinity
21240
+ ? new Date(earliestStartDate).toLocaleDateString()
21241
+ : undefined,
21242
+ end: latestEndDate !== Infinity
21243
+ ? new Date(latestEndDate).toLocaleDateString()
21244
+ : undefined,
21245
+ };
21246
+ }
21247
+ else {
21248
+ return undefined;
21249
+ }
21250
+ }
21251
+
21123
21252
  marker('downloads.wfs.featuretype.not.found');
21124
21253
  const FORMATS = {
21125
21254
  csv: {
@@ -22650,6 +22779,9 @@ class MapContextService {
22650
22779
  if (mapConfig) {
22651
22780
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22652
22781
  }
22782
+ else {
22783
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22784
+ }
22653
22785
  if (!mapContext.view?.extent &&
22654
22786
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22655
22787
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22760,6 +22892,11 @@ class MapContextService {
22760
22892
  }
22761
22893
  return view;
22762
22894
  }
22895
+ addDefaultBaselayerContext(layers) {
22896
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22897
+ ? layers
22898
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22899
+ }
22763
22900
  mergeMapConfigWithContext(mapContext, mapConfig) {
22764
22901
  return {
22765
22902
  ...mapContext,
@@ -23306,11 +23443,11 @@ class ThumbnailComponent {
23306
23443
  }
23307
23444
  }
23308
23445
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, deps: [{ token: THUMBNAIL_PLACEHOLDER, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
23309
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23446
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: { thumbnailUrl: "thumbnailUrl", fit: "fit" }, outputs: { placeholderShown: "placeholderShown" }, viewQueries: [{ propertyName: "imgElement", first: true, predicate: ["imageElement"], descendants: true }, { propertyName: "containerElement", first: true, predicate: ["containerElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23310
23447
  }
23311
23448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ThumbnailComponent, decorators: [{
23312
23449
  type: Component,
23313
- args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23450
+ args: [{ selector: 'gn-ui-thumbnail', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #containerElement\n class=\"h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center\"\n [ngClass]=\"isPlaceholder ? 'bg-gray-100' : 'bg-white'\"\n [attr.data-cy-is-placeholder]=\"isPlaceholder.toString()\"\n>\n <img\n #imageElement\n class=\"relative w-full object-center\"\n [ngClass]=\"imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'\"\n [ngStyle]=\"{ objectFit: imgFit }\"\n alt=\"thumbnail\"\n loading=\"lazy\"\n (load)=\"setObjectFit()\"\n [src]=\"imgUrl\"\n (error)=\"useFallback()\"\n />\n</div>\n" }]
23314
23451
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
23315
23452
  type: Optional
23316
23453
  }, {
@@ -23438,8 +23575,7 @@ class MetadataQualityComponent {
23438
23575
  : this.calculatedQualityScore;
23439
23576
  }
23440
23577
  get calculatedQualityScore() {
23441
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23442
- this.items.length);
23578
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23443
23579
  }
23444
23580
  showMenu() {
23445
23581
  this.isMenuShown = true;
@@ -23457,7 +23593,7 @@ class MetadataQualityComponent {
23457
23593
  this.items = [];
23458
23594
  this.add('title', !!this.metadata?.title);
23459
23595
  this.add('description', !!this.metadata?.abstract);
23460
- this.add('topic', this.metadata?.themes?.length > 0);
23596
+ this.add('topic', this.metadata?.topics?.length > 0);
23461
23597
  this.add('keywords', this.metadata?.keywords?.length > 0);
23462
23598
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23463
23599
  this.add('organisation', !!contact?.organization);
@@ -23771,11 +23907,11 @@ class BadgeComponent {
23771
23907
  this.clickable = false;
23772
23908
  }
23773
23909
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23774
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: BadgeComponent, selector: "gn-ui-badge", inputs: { clickable: "clickable" }, ngImport: i0, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable ? 'hover:bg-gray-800 cursor-pointer transition-colors' : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23910
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: BadgeComponent, selector: "gn-ui-badge", inputs: { clickable: "clickable" }, ngImport: i0, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable\n ? 'hover:bg-primary cursor-pointer transition-colors duration-100'\n : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23775
23911
  }
23776
23912
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: BadgeComponent, decorators: [{
23777
23913
  type: Component,
23778
- args: [{ selector: 'gn-ui-badge', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable ? 'hover:bg-gray-800 cursor-pointer transition-colors' : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n" }]
23914
+ args: [{ selector: 'gn-ui-badge', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none\"\n [ngClass]=\"\n clickable\n ? 'hover:bg-primary cursor-pointer transition-colors duration-100'\n : ''\n \"\n>\n <ng-content></ng-content>\n</div>\n" }]
23779
23915
  }], propDecorators: { clickable: [{
23780
23916
  type: Input
23781
23917
  }] } });
@@ -23905,6 +24041,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23905
24041
  type: Input
23906
24042
  }] } });
23907
24043
 
24044
+ class MarkdownParserComponent {
24045
+ get parsedMarkdown() {
24046
+ return marked.parse(this.textContent);
24047
+ }
24048
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24049
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24050
+ }
24051
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24052
+ type: Component,
24053
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
24054
+ }], propDecorators: { textContent: [{
24055
+ type: Input
24056
+ }] } });
24057
+
23908
24058
  class ContentGhostComponent {
23909
24059
  constructor() {
23910
24060
  this.ghostClass = '';
@@ -24044,14 +24194,16 @@ class MaxLinesComponent {
24044
24194
  return result;
24045
24195
  }
24046
24196
  ngOnDestroy() {
24197
+ if (!this.observer)
24198
+ return;
24047
24199
  this.observer.unobserve(this.container.nativeElement.children[0]);
24048
24200
  }
24049
24201
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24050
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24202
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24051
24203
  }
24052
24204
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MaxLinesComponent, decorators: [{
24053
24205
  type: Component,
24054
- args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
24206
+ args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-secondary cursor-pointer pt-2.5\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
24055
24207
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { maxLines: [{
24056
24208
  type: Input
24057
24209
  }], container: [{
@@ -24059,36 +24211,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24059
24211
  args: ['container']
24060
24212
  }] } });
24061
24213
 
24062
- class MarkdownParserComponent {
24063
- get parsedMarkdown() {
24064
- return marked.parse(this.textContent);
24065
- }
24066
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24067
- 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 }); }
24068
- }
24069
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
24070
- type: Component,
24071
- 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"] }]
24072
- }], propDecorators: { textContent: [{
24073
- type: Input
24074
- }] } });
24075
-
24076
24214
  class MetadataInfoComponent {
24077
24215
  constructor() {
24078
24216
  this.keyword = new EventEmitter();
24079
24217
  }
24080
24218
  get hasUsage() {
24081
24219
  return (this.metadata.extras?.isOpenData === true ||
24082
- this.metadata.useLimitations?.length ||
24083
- this.metadata.accessConstraints?.length);
24220
+ (this.metadata.legalConstraints?.length > 0 &&
24221
+ this.legalConstraints.length > 0) ||
24222
+ (this.metadata.otherConstraints?.length > 0 &&
24223
+ this.otherConstraints.length > 0) ||
24224
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24225
+ }
24226
+ get legalConstraints() {
24227
+ let array = [];
24228
+ if (this.metadata.legalConstraints?.length) {
24229
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24230
+ }
24231
+ return array;
24084
24232
  }
24085
- get usages() {
24233
+ get otherConstraints() {
24086
24234
  let array = [];
24087
- if (this.metadata.useLimitations?.length) {
24088
- array = array.concat(this.metadata.useLimitations);
24235
+ if (this.metadata.otherConstraints?.length) {
24236
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
24089
24237
  }
24090
- if (this.metadata.accessConstraints?.length) {
24091
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24238
+ return array;
24239
+ }
24240
+ get licenses() {
24241
+ let array = [];
24242
+ if (this.metadata.licenses?.length) {
24243
+ array = array.concat(this.metadata.licenses
24244
+ .filter((c) => c.text)
24245
+ .map((c) => ({ text: c.text, url: c.url })));
24092
24246
  }
24093
24247
  return array;
24094
24248
  }
@@ -24104,22 +24258,28 @@ class MetadataInfoComponent {
24104
24258
  return undefined;
24105
24259
  }
24106
24260
  }
24107
- fieldReady(propName) {
24108
- return !this.incomplete || propName in this.metadata;
24261
+ get temporalExtent() {
24262
+ const temporalExtents = this.metadata.temporalExtents;
24263
+ return getTemporalRangeUnion(temporalExtents);
24109
24264
  }
24110
- onKeywordClick(keyword) {
24111
- this.keyword.emit(keyword);
24265
+ get shownOrganization() {
24266
+ return this.metadata.ownerOrganization;
24112
24267
  }
24113
- copyText() {
24114
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
24115
- event.target.blur();
24268
+ get resourceContact() {
24269
+ return this.metadata.contactsForResource?.[0];
24270
+ }
24271
+ fieldReady(propName) {
24272
+ return !this.incomplete || propName in this.metadata;
24273
+ }
24274
+ onKeywordClick(keyword) {
24275
+ this.keyword.emit(keyword);
24116
24276
  }
24117
24277
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24118
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24278
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24119
24279
  }
24120
24280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
24121
24281
  type: Component,
24122
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24282
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"mt-6 mb-3 font-medium text-primary text-sm\" translate>\n record.metadata.keywords\n </p>\n <div class=\"sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.recordCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordCreated.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.recordPublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordPublished.toLocaleDateString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.languages\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.languages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.technical' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24123
24283
  }], propDecorators: { metadata: [{
24124
24284
  type: Input
24125
24285
  }], incomplete: [{
@@ -24159,23 +24319,23 @@ class ButtonComponent {
24159
24319
  this.extraClass = '';
24160
24320
  this.buttonClick = new EventEmitter();
24161
24321
  }
24162
- // btn-classes are explicited to allow tailwind recognize them and add it in css.
24163
24322
  set type(value) {
24323
+ // btn-classes are written in full to be picked up by tailwind
24164
24324
  switch (value) {
24165
24325
  case 'primary':
24166
- this.btnClass = 'btn-primary';
24326
+ this.btnClass = 'gn-ui-btn-primary';
24167
24327
  break;
24168
24328
  case 'secondary':
24169
- this.btnClass = 'btn-secondary';
24329
+ this.btnClass = 'gn-ui-btn-secondary';
24170
24330
  break;
24171
24331
  case 'outline':
24172
- this.btnClass = 'btn-outline';
24332
+ this.btnClass = 'gn-ui-btn-outline';
24173
24333
  break;
24174
24334
  case 'light':
24175
- this.btnClass = 'btn-light';
24335
+ this.btnClass = 'gn-ui-btn-light';
24176
24336
  break;
24177
24337
  default:
24178
- this.btnClass = 'btn-default';
24338
+ this.btnClass = 'gn-ui-btn-default';
24179
24339
  break;
24180
24340
  }
24181
24341
  }
@@ -24188,11 +24348,11 @@ class ButtonComponent {
24188
24348
  propagateToDocumentOnly(event);
24189
24349
  }
24190
24350
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24191
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24351
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, isStandalone: true, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24192
24352
  }
24193
24353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24194
24354
  type: Component,
24195
- args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24355
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<button\n type=\"button\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n" }]
24196
24356
  }], propDecorators: { type: [{
24197
24357
  type: Input
24198
24358
  }], disabled: [{
@@ -24472,11 +24632,11 @@ class CarouselComponent {
24472
24632
  this.emblaApi.scrollTo(stepIndex);
24473
24633
  }
24474
24634
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
24475
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24635
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CarouselComponent, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24476
24636
  }
24477
24637
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CarouselComponent, decorators: [{
24478
24638
  type: Component,
24479
- args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24639
+ args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #carouselOverflowContainer class=\"overflow-hidden h-full w-full\">\n <div class=\"carousel-container flex flex-row\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<div\n *ngIf=\"steps.length > 1\"\n class=\"absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1\"\n [ngClass]=\"stepsContainerClass\"\n>\n <button\n *ngFor=\"let step of steps; let i = index\"\n class=\"carousel-step-dot\"\n (click)=\"scrollToStep(i)\"\n [ngClass]=\"selectedStep === i ? 'bg-secondary' : 'bg-gray-400'\"\n ></button>\n</div>\n", styles: [":host .carousel-container ::ng-deep>*{flex-shrink:0}:host{position:relative}.carousel-step-dot{width:6px;height:6px;border-radius:6px;position:relative}.carousel-step-dot:after{content:\"\";position:absolute;left:-4px;top:-4px;width:14px;height:14px}\n"] }]
24480
24640
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClass: [{
24481
24641
  type: Input
24482
24642
  }], stepsContainerClass: [{
@@ -24520,6 +24680,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
24520
24680
  }]
24521
24681
  }] });
24522
24682
 
24683
+ class InteractiveTableColumnComponent {
24684
+ constructor() {
24685
+ this.grow = false;
24686
+ this.sortable = false;
24687
+ this.activeSort = null;
24688
+ this.sortChange = new EventEmitter();
24689
+ }
24690
+ handleSortChange() {
24691
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
24692
+ this.sortChange.emit(this.activeSort);
24693
+ }
24694
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24695
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: InteractiveTableColumnComponent, isStandalone: true, selector: "gn-ui-interactive-table-column", inputs: { grow: "grow", sortable: "sortable", activeSort: "activeSort" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "cell", first: true, predicate: ["cell"], descendants: true }], ngImport: i0, template: "<span>empty</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24696
+ }
24697
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
24698
+ type: Component,
24699
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
24700
+ }], propDecorators: { header: [{
24701
+ type: ContentChild,
24702
+ args: ['header']
24703
+ }], cell: [{
24704
+ type: ContentChild,
24705
+ args: ['cell']
24706
+ }], grow: [{
24707
+ type: Input
24708
+ }], sortable: [{
24709
+ type: Input
24710
+ }], activeSort: [{
24711
+ type: Input
24712
+ }], sortChange: [{
24713
+ type: Output
24714
+ }] } });
24715
+
24716
+ class InteractiveTableComponent {
24717
+ constructor() {
24718
+ this.items = [];
24719
+ this.itemClick = new EventEmitter();
24720
+ }
24721
+ get gridStyle() {
24722
+ return {
24723
+ 'grid-template-columns': this.columns
24724
+ .map((column) => column.grow ? `minmax(0px,1fr)` : `minmax(0px,max-content)`)
24725
+ .join(' '),
24726
+ };
24727
+ }
24728
+ handleRowClick(item) {
24729
+ this.itemClick.emit(item);
24730
+ }
24731
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24732
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items" }, outputs: { itemClick: "itemClick" }, queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24733
+ }
24734
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: InteractiveTableComponent, decorators: [{
24735
+ type: Component,
24736
+ args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, InteractiveTableColumnComponent, MatIconModule], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n >expand_less</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n >expand_more</mat-icon\n >\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-4 py-3 flex items-center bg-white transition-colors duration-75 truncate group-hover:text-main group-hover:bg-gray-50 border-b border-gray-200\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sort-button mat-icon{padding:0;margin:0;height:8px;line-height:8px;font-size:18px}.table-header-cell{@apply text-gray-700 px-4 py-5 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}\n"] }]
24737
+ }], propDecorators: { columns: [{
24738
+ type: ContentChildren,
24739
+ args: [InteractiveTableColumnComponent]
24740
+ }], items: [{
24741
+ type: Input
24742
+ }], itemClick: [{
24743
+ type: Output
24744
+ }] } });
24745
+
24523
24746
  class LinkCardComponent {
24524
24747
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LinkCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24525
24748
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LinkCardComponent, selector: "gn-ui-link-card", inputs: { link: "link" }, ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"flex flex-col justify-between group h-40 grow py-5 px-5 bg-white rounded border-gray-300 filter card-shadow overflow-hidden lg:w-80\"\n>\n <div class=\"max-h-24 overflow-hidden text-ellipsis\">\n <p\n class=\"font-title font-medium text-21 text-black break-words mb-1 line-clamp-2\"\n >\n {{ link.name }}\n </p>\n <p class=\"font-medium text-sm break-words\">\n {{ link.description }}\n </p>\n <p\n *ngIf=\"!link.name && !link.description\"\n class=\"font-medium text-sm break-words truncate\"\n >\n {{ link.url }}\n </p>\n </div>\n <div>\n <mat-icon class=\"material-symbols-outlined card-icon\">open_in_new</mat-icon>\n </div>\n</a>\n", styles: [""], dependencies: [{ 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -24565,11 +24788,11 @@ class MetadataContactComponent {
24565
24788
  this.organizationClick.emit(this.shownOrganization);
24566
24789
  }
24567
24790
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24568
- 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 sm:mb-12\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24791
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataContactComponent, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24569
24792
  }
24570
24793
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataContactComponent, decorators: [{
24571
24794
  type: Component,
24572
- args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6 sm:mb-12\">\n <div class=\"grid gap-3\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24795
+ args: [{ selector: 'gn-ui-metadata-contact', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"py-5 px-5 rounded bg-gray-100 text-black mb-6\">\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-sm font-medium\" translate>record.metadata.contact</p>\n </div>\n <div\n *ngIf=\"shownOrganization?.logoUrl?.href\"\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grid gap-1\">\n <div class=\"flex\">\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n <div *ngIf=\"shownOrganization?.website\">\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ shownOrganization.website }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n </div>\n <div class=\"grid gap-5 py-3 overflow-hidden\">\n <div *ngIf=\"contacts[0]?.phone\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >call_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.email\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n mail_outline</mat-icon\n >\n <a\n *ngIf=\"contacts.length\"\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.firstName || contacts[0]?.lastName\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >person_outline</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"contacts[0]?.address\">\n <div class=\"flex\">\n <mat-icon\n class=\"material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n >\n location_on</mat-icon\n >\n <div class=\"flex flex-col ml-2\">\n <p *ngFor=\"let addressPart of address\" class=\"text-sm\">\n {{ addressPart }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
24573
24796
  }], propDecorators: { metadata: [{
24574
24797
  type: Input
24575
24798
  }], organizationClick: [{
@@ -24793,11 +25016,11 @@ class DropdownSelectorComponent {
24793
25016
  }
24794
25017
  }
24795
25018
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24796
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"!p-[8px] !pl-[16px] flex flex-row w-full {{ extraBtnClass }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25019
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: { title: "title", showTitle: "showTitle", ariaName: "ariaName", choices: "choices", selected: "selected", maxRows: "maxRows", extraBtnClass: "extraBtnClass", minWidth: "minWidth" }, outputs: { selectValue: "selectValue" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "choiceInputs", predicate: ["choiceInputs"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24797
25020
  }
24798
25021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownSelectorComponent, decorators: [{
24799
25022
  type: Component,
24800
- args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"!p-[8px] !pl-[16px] flex flex-row w-full {{ extraBtnClass }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
25023
+ args: [{ selector: 'gn-ui-dropdown-selector', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col sm:flex-row sm:items-center relative w-full\">\n <span\n *ngIf=\"showTitle\"\n class=\"tracking-wide text-sm mb-2 sm:mb-0 sm:mr-2 whitespace-nowrap\"\n [attr.for]=\"id\"\n >\n {{ title }}\n </span>\n <gn-ui-button\n type=\"outline\"\n class=\"grow min-w-0\"\n extraClass=\"bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{\n extraBtnClass\n }}\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <div class=\"grow font-medium truncate py-1 mr-2 text-left\">\n {{ getChoiceLabel() | translate }}\n </div>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n </gn-ui-button>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n >\n <button\n #choiceInputs\n type=\"button\"\n *ngFor=\"let choice of choices\"\n [title]=\"choice.label | translate\"\n class=\"flex px-5 py-1 w-full text-start cursor-pointer transition-colors\"\n [ngClass]=\"\n isSelected(choice)\n ? 'text-white bg-primary hover:text-white hover:bg-primary-darker focus:text-white focus:bg-primary-darker'\n : 'text-gray-900 hover:text-primary-darkest hover:bg-gray-50 focus:text-primary-darkest focus:bg-gray-50'\n \"\n (click)=\"onSelectValue(choice)\"\n (keydown)=\"selectIfEnter($event, choice)\"\n [attr.data-cy-value]=\"choice.value.toString()\"\n [attr.data-cy-active]=\"isSelected(choice) ? 'true' : undefined\"\n >\n <span class=\"text-[14px]\">\n {{ choice.label | translate }}\n </span>\n </button>\n </div>\n</ng-template>\n" }]
24801
25024
  }], propDecorators: { title: [{
24802
25025
  type: Input
24803
25026
  }], showTitle: [{
@@ -24973,11 +25196,11 @@ class DropdownMultiselectComponent {
24973
25196
  this.setFocus();
24974
25197
  }
24975
25198
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, deps: [{ token: i1$6.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
24976
- 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, $event.target.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25199
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: { title: "title", choices: "choices", selected: "selected", allowSearch: "allowSearch", maxRows: "maxRows", searchInputValue: "searchInputValue" }, outputs: { selectValues: "selectValues" }, viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1$6.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24977
25200
  }
24978
25201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
24979
25202
  type: Component,
24980
- 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, $event.target.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
25203
+ args: [{ selector: 'gn-ui-dropdown-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n <div\n *ngIf=\"hasSelectedChoices\"\n class=\"shrink-0 rounded-full text-primary bg-primary-opacity-25 text-white font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n </div>\n <button class=\"h-6 w-6\" data-cy=\"clearSelection\">\n <mat-icon\n class=\"material-symbols-outlined shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n *ngIf=\"hasSelectedChoices && !overlayOpen\"\n (click)=\"clearSelection($event)\"\n >\n close\n </mat-icon>\n </button>\n <mat-icon class=\"material-symbols-outlined shrink-0 opacity-40\">\n <ng-container *ngIf=\"overlayOpen\">expand_less</ng-container>\n <ng-container *ngIf=\"!overlayOpen\">expand_more</ng-container>\n </mat-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.width]=\"overlayWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n <button\n type=\"button\"\n *ngFor=\"let selected of selectedChoices\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity mb-1\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[12px] !w-[12px] text-[12px]\"\n >\n close</mat-icon\n >\n </div>\n </button>\n\n <div *ngIf=\"allowSearch\" class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n <button\n *ngIf=\"!!searchInputValue\"\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <mat-icon\n class=\"material-symbols-outlined !h-[10px] !w-[12px] text-[12px]\"\n >\n close\n </mat-icon>\n </button>\n </div>\n </div>\n\n <label\n *ngFor=\"let choice of filteredChoicesByText\"\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n </div>\n</ng-template>\n" }]
24981
25204
  }], ctorParameters: function () { return [{ type: i1$6.ScrollStrategyOptions }]; }, propDecorators: { title: [{
24982
25205
  type: Input
24983
25206
  }], choices: [{
@@ -25131,11 +25354,11 @@ class TextAreaComponent {
25131
25354
  this.rawChange.next(value);
25132
25355
  }
25133
25356
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25134
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25357
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25135
25358
  }
25136
25359
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25137
25360
  type: Component,
25138
- args: [{ selector: 'gn-ui-text-area', template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25361
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25139
25362
  }], propDecorators: { value: [{
25140
25363
  type: Input
25141
25364
  }], placeholder: [{
@@ -25236,11 +25459,11 @@ class AutocompleteComponent {
25236
25459
  }
25237
25460
  }
25238
25461
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
25239
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter($event.target.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25462
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", action: "action", value: "value", clearOnSelection: "clearOnSelection", autoFocus: "autoFocus", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared" }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25240
25463
  }
25241
25464
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: AutocompleteComponent, decorators: [{
25242
25465
  type: Component,
25243
- args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter($event.target.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
25466
+ args: [{ selector: 'gn-ui-autocomplete', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\">\n <input\n #searchInput\n type=\"text\"\n class=\"appearance-none focus:outline-white focus:outline-2 focus:outline-dotted focus:outline-offset-2 leading-tight rounded w-full text-black shadow-xl focus:shadow-[0_0_24px_0_rgba(21,40,184,0.09)]\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n />\n <button\n type=\"button\"\n class=\"text-primary-lightest hover:text-primary hover:bg-gray-50 absolute transition-all duration-100 clear-btn inset-y-0\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (click)=\"clear()\"\n >\n <mat-icon class=\"material-symbols-outlined\">close</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"text-primary bg-white hover:text-primary-darkest hover:bg-gray-100 border-gray-300 hover:border-gray-500 absolute transition-all duration-100 search-btn rounded-r inset-y-0 right-0\"\n aria-label=\"Trigger search\"\n (click)=\"handleClickSearch()\"\n >\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n </button>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"error_outline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</div>\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFn\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFn(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: [":host{--input-height: 3.5em}.clear-btn{width:var(--input-height);right:var(--input-height);height:100%}.search-btn{width:var(--input-height);height:100%;border-left-width:.1em}mat-icon{width:100%;height:100%;padding:.65em;font-size:1.5em}input{height:var(--input-height);padding:1.05em;padding-right:calc(2 * var(--input-height))}input:placeholder-shown{text-overflow:ellipsis}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
25244
25467
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { placeholder: [{
25245
25468
  type: Input
25246
25469
  }], action: [{
@@ -25405,11 +25628,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25405
25628
 
25406
25629
  class NavigationButtonComponent {
25407
25630
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25408
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25631
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25409
25632
  }
25410
25633
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25411
25634
  type: Component,
25412
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n" }]
25635
+ args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
25413
25636
  }], propDecorators: { label: [{
25414
25637
  type: Input
25415
25638
  }], icon: [{
@@ -25542,7 +25765,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25542
25765
 
25543
25766
  class FormFieldComponent {
25544
25767
  set value(v) {
25545
- this.formControl.setValue(v);
25768
+ this.formControl.setValue(v, {
25769
+ emitEvent: false,
25770
+ });
25546
25771
  }
25547
25772
  constructor() {
25548
25773
  this.formControl = new FormControl();
@@ -25616,11 +25841,11 @@ class CheckboxComponent {
25616
25841
  this.changed.emit(this.checked);
25617
25842
  }
25618
25843
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25619
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n type=\"checkbox\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25844
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: { type: "type", checked: "checked", indeterminate: "indeterminate" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"], dependencies: [{ kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25620
25845
  }
25621
25846
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CheckboxComponent, decorators: [{
25622
25847
  type: Component,
25623
- args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n type=\"checkbox\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25848
+ args: [{ selector: 'gn-ui-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-checkbox\n class=\"cursor-pointer\"\n [class]=\"classList\"\n [checked]=\"checked\"\n [indeterminate]=\"indeterminate\"\n (click)=\"handleClick($event)\"\n></mat-checkbox>\n", styles: [".default{--gn-ui-checkbox-color: var(--color-main)}.secondary{--gn-ui-checkbox-color: var(--color-secondary)}.primary{--gn-ui-checkbox-color: var(--color-primary)}mat-checkbox{--mdc-checkbox-selected-focus-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-icon-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-focus-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-hover-state-layer-color: var(--gn-ui-checkbox-color);--mdc-checkbox-selected-pressed-state-layer-color: var( --gn-ui-checkbox-color )}\n"] }]
25624
25849
  }], propDecorators: { type: [{
25625
25850
  type: Input
25626
25851
  }], checked: [{
@@ -25705,12 +25930,13 @@ class EditableLabelDirective {
25705
25930
  }
25706
25931
  }
25707
25932
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
25708
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: EditableLabelDirective, selector: "[gnUiEditableLabel]", inputs: { gnUiEditableLabel: "gnUiEditableLabel" }, outputs: { editableLabelChanged: "editableLabelChanged" }, ngImport: i0 }); }
25933
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: EditableLabelDirective, isStandalone: true, selector: "[gnUiEditableLabel]", inputs: { gnUiEditableLabel: "gnUiEditableLabel" }, outputs: { editableLabelChanged: "editableLabelChanged" }, ngImport: i0 }); }
25709
25934
  }
25710
25935
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditableLabelDirective, decorators: [{
25711
25936
  type: Directive,
25712
25937
  args: [{
25713
25938
  selector: '[gnUiEditableLabel]',
25939
+ standalone: true,
25714
25940
  }]
25715
25941
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { editableLabelChanged: [{
25716
25942
  type: Output
@@ -25722,10 +25948,8 @@ class UiInputsModule {
25722
25948
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25723
25949
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25724
25950
  AutocompleteComponent,
25725
- ButtonComponent,
25726
25951
  TextInputComponent,
25727
25952
  DragAndDropFileInputComponent,
25728
- TextAreaComponent,
25729
25953
  ChipsInputComponent,
25730
25954
  NavigationButtonComponent,
25731
25955
  StarToggleComponent,
@@ -25743,8 +25967,7 @@ class UiInputsModule {
25743
25967
  CopyTextButtonComponent,
25744
25968
  CheckboxComponent,
25745
25969
  SearchInputComponent,
25746
- DateRangePickerComponent,
25747
- EditableLabelDirective], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
25970
+ DateRangePickerComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
25748
25971
  FormsModule,
25749
25972
  ReactiveFormsModule,
25750
25973
  TagInputModule,
@@ -25758,7 +25981,10 @@ class UiInputsModule {
25758
25981
  MatFormFieldModule,
25759
25982
  MatInputModule,
25760
25983
  MatDatepickerModule,
25761
- MatNativeDateModule], exports: [DropdownSelectorComponent,
25984
+ MatNativeDateModule,
25985
+ EditableLabelDirective,
25986
+ TextAreaComponent,
25987
+ ButtonComponent], exports: [DropdownSelectorComponent,
25762
25988
  AutocompleteComponent,
25763
25989
  ButtonComponent,
25764
25990
  TextInputComponent,
@@ -25800,10 +26026,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25800
26026
  declarations: [
25801
26027
  DropdownSelectorComponent,
25802
26028
  AutocompleteComponent,
25803
- ButtonComponent,
25804
26029
  TextInputComponent,
25805
26030
  DragAndDropFileInputComponent,
25806
- TextAreaComponent,
25807
26031
  ChipsInputComponent,
25808
26032
  NavigationButtonComponent,
25809
26033
  StarToggleComponent,
@@ -25822,7 +26046,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25822
26046
  CheckboxComponent,
25823
26047
  SearchInputComponent,
25824
26048
  DateRangePickerComponent,
25825
- EditableLabelDirective,
25826
26049
  ],
25827
26050
  imports: [
25828
26051
  CommonModule,
@@ -25842,6 +26065,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25842
26065
  MatInputModule,
25843
26066
  MatDatepickerModule,
25844
26067
  MatNativeDateModule,
26068
+ EditableLabelDirective,
26069
+ TextAreaComponent,
26070
+ ButtonComponent,
25845
26071
  ],
25846
26072
  exports: [
25847
26073
  DropdownSelectorComponent,
@@ -25961,7 +26187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25961
26187
 
25962
26188
  const DEFAULT_PARAMS = {
25963
26189
  OFFSET: '',
25964
- LIMIT: '',
26190
+ LIMIT: '-1',
25965
26191
  FORMAT: 'json',
25966
26192
  };
25967
26193
  class RecordApiFormComponent {
@@ -25990,6 +26216,8 @@ class RecordApiFormComponent {
25990
26216
  }
25991
26217
  return outputUrl;
25992
26218
  }));
26219
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26220
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25993
26221
  }
25994
26222
  set apiLink(value) {
25995
26223
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25999,10 +26227,11 @@ class RecordApiFormComponent {
25999
26227
  this.offset$.next(value);
26000
26228
  }
26001
26229
  setLimit(value) {
26002
- this.limit$.next(value);
26230
+ const newLimit = value === '' ? '-1' : value;
26231
+ this.limit$.next(newLimit);
26003
26232
  }
26004
26233
  setFormat(value) {
26005
- this.format$.next(value);
26234
+ this.format$.next(String(value));
26006
26235
  }
26007
26236
  resetUrl() {
26008
26237
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -26010,11 +26239,11 @@ class RecordApiFormComponent {
26010
26239
  this.format$.next(DEFAULT_PARAMS.FORMAT);
26011
26240
  }
26012
26241
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26013
- 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 }); }
26242
+ 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 }); }
26014
26243
  }
26015
26244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
26016
26245
  type: Component,
26017
- 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"] }]
26246
+ 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"] }]
26018
26247
  }], propDecorators: { apiLink: [{
26019
26248
  type: Input
26020
26249
  }] } });
@@ -26027,11 +26256,11 @@ class ImageOverlayPreviewComponent {
26027
26256
  basicLightbox.create(`<img src="${src}"/>`).show();
26028
26257
  }
26029
26258
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26030
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: { imageUrl: "imageUrl" }, outputs: { isPlaceholderShown: "isPlaceholderShown" }, ngImport: i0, template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-36 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36 group-hover:shadow-xl group-hover:border-0 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n", styles: [""], dependencies: [{ 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: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { 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"] }] }); }
26259
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: { imageUrl: "imageUrl" }, outputs: { isPlaceholderShown: "isPlaceholderShown" }, ngImport: i0, template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n", styles: [""], dependencies: [{ 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: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { 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"] }] }); }
26031
26260
  }
26032
26261
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ImageOverlayPreviewComponent, decorators: [{
26033
26262
  type: Component,
26034
- args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-36 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36 group-hover:shadow-xl group-hover:border-0 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n" }]
26263
+ args: [{ selector: 'gn-ui-image-overlay-preview', template: "<gn-ui-content-ghost\n [showContent]=\"imageUrl !== undefined\"\n ghostClass=\"h-48 mb-3\"\n>\n <div\n *ngIf=\"imageUrl\"\n [showContent]=\"imageUrl !== undefined\"\n data-cy=\"record-thumbnail\"\n class=\"flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"imageUrl\"\n fit=\"cover\"\n (placeholderShown)=\"isPlaceholderShown.emit($event)\"\n ></gn-ui-thumbnail>\n <div class=\"relative\">\n <gn-ui-button\n class=\"absolute bottom-0 right-0 z-10 mr-2 mb-2\"\n [type]=\"'outline'\"\n [extraClass]=\"'!py-2 !px-0'\"\n (buttonClick)=\"openLightbox(imageUrl)\"\n >\n <mat-icon class=\"material-symbols-outlined font-extralight\"\n >zoom_out_map</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n</gn-ui-content-ghost>\n" }]
26035
26264
  }], propDecorators: { imageUrl: [{
26036
26265
  type: Input
26037
26266
  }], isPlaceholderShown: [{
@@ -26060,7 +26289,6 @@ class UiElementsModule {
26060
26289
  PaginationButtonsComponent,
26061
26290
  MaxLinesComponent,
26062
26291
  RecordApiFormComponent,
26063
- MarkdownParserComponent,
26064
26292
  ImageOverlayPreviewComponent], imports: [CommonModule,
26065
26293
  MatIconModule,
26066
26294
  MatTooltipModule,
@@ -26069,7 +26297,8 @@ class UiElementsModule {
26069
26297
  RouterModule,
26070
26298
  UiInputsModule,
26071
26299
  FormsModule,
26072
- NgOptimizedImage], exports: [MetadataInfoComponent,
26300
+ NgOptimizedImage,
26301
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
26073
26302
  ContentGhostComponent,
26074
26303
  DownloadItemComponent,
26075
26304
  DownloadsListComponent,
@@ -26116,6 +26345,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26116
26345
  UiInputsModule,
26117
26346
  FormsModule,
26118
26347
  NgOptimizedImage,
26348
+ MarkdownParserComponent,
26119
26349
  ],
26120
26350
  declarations: [
26121
26351
  MetadataInfoComponent,
@@ -26138,7 +26368,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26138
26368
  PaginationButtonsComponent,
26139
26369
  MaxLinesComponent,
26140
26370
  RecordApiFormComponent,
26141
- MarkdownParserComponent,
26142
26371
  ImageOverlayPreviewComponent,
26143
26372
  ],
26144
26373
  exports: [
@@ -26167,143 +26396,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26167
26396
  }]
26168
26397
  }] });
26169
26398
 
26170
- class RecordTableComponent {
26171
- constructor() {
26172
- this.selectedRecords = [];
26173
- this.records = [];
26174
- this.recordClick = new EventEmitter();
26175
- this.recordsSelect = new EventEmitter();
26176
- this.recordsDeselect = new EventEmitter();
26177
- this.sortByChange = new EventEmitter();
26178
- }
26179
- dateToString(date) {
26180
- return date?.toLocaleDateString(undefined, {
26181
- year: 'numeric',
26182
- month: 'long',
26183
- day: 'numeric',
26184
- timeZone: 'UTC',
26185
- });
26186
- }
26187
- getStatus(isPublishedToAll) {
26188
- return isPublishedToAll ? 'published' : 'not published';
26189
- }
26190
- formatUserInfo(userInfo) {
26191
- const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
26192
- if (infos && infos.length === 4) {
26193
- return `${infos[2]} ${infos[1]}`;
26194
- }
26195
- return undefined;
26196
- }
26197
- getRecordFormats(record) {
26198
- if (record.kind === 'service' || !('distributions' in record)) {
26199
- return [];
26200
- }
26201
- const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
26202
- formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
26203
- return formats;
26204
- }
26205
- getBadgeColor(format) {
26206
- return getBadgeColor(format);
26207
- }
26208
- getOrderForColumn(col) {
26209
- if (!this.sortBy) {
26210
- return null;
26211
- }
26212
- let order = null;
26213
- const sortedArray = Array.isArray(this.sortBy[0])
26214
- ? this.sortBy
26215
- : [this.sortBy];
26216
- sortedArray.forEach((sortedCol) => {
26217
- if (sortedCol[1] === col) {
26218
- order = sortedCol[0];
26219
- }
26220
- });
26221
- return order;
26222
- }
26223
- setSortBy(col) {
26224
- const sortOrder = this.getOrderForColumn(col);
26225
- let newOrder;
26226
- if (sortOrder) {
26227
- newOrder = sortOrder === 'asc' ? 'desc' : 'asc';
26228
- }
26229
- else {
26230
- newOrder = 'asc';
26231
- }
26232
- this.sortByChange.emit([newOrder, col]);
26233
- this.sortBy = [newOrder, col];
26234
- }
26235
- isSortedBy(col, order) {
26236
- const sortOrder = this.getOrderForColumn(col);
26237
- return sortOrder === order;
26238
- }
26239
- isChecked(record) {
26240
- if (this.selectedRecords.includes(record.uniqueIdentifier)) {
26241
- return true;
26242
- }
26243
- return false;
26244
- }
26245
- handleRecordSelectedChange(selected, record) {
26246
- if (!selected) {
26247
- this.recordsDeselect.emit([record]);
26248
- this.selectedRecords = this.selectedRecords.filter((val) => val !== record.uniqueIdentifier);
26249
- }
26250
- else {
26251
- this.recordsSelect.emit([record]);
26252
- this.selectedRecords.push(record.uniqueIdentifier);
26253
- }
26254
- }
26255
- selectAll() {
26256
- if (this.isAllSelected()) {
26257
- this.recordsDeselect.emit(this.records);
26258
- this.selectedRecords = [];
26259
- }
26260
- else {
26261
- this.recordsSelect.emit(this.records);
26262
- this.selectedRecords = this.records.map((record) => {
26263
- return record.uniqueIdentifier;
26264
- });
26265
- }
26266
- }
26267
- isAllSelected() {
26268
- if (this.selectedRecords.length === this.records.length) {
26269
- const allRecords = this.records.filter((record) => this.selectedRecords.includes(record.uniqueIdentifier));
26270
- if (allRecords.length === this.records.length) {
26271
- return true;
26272
- }
26273
- }
26274
- return false;
26275
- }
26276
- isSomeSelected() {
26277
- if (this.selectedRecords.length > 0 &&
26278
- this.selectedRecords.length < this.records.length) {
26279
- return true;
26280
- }
26281
- return false;
26282
- }
26283
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26284
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordTableComponent, selector: "gn-ui-record-table", inputs: { selectedRecords: "selectedRecords", records: "records", totalHits: "totalHits", sortBy: "sortBy" }, outputs: { recordClick: "recordClick", recordsSelect: "recordsSelect", recordsDeselect: "recordsDeselect", sortByChange: "sortByChange" }, ngImport: i0, template: "<div>\n <div *ngIf=\"totalHits\" class=\"\">\n <div class=\"flex records-information\">\n <div\n translate\n class=\"my-8 ml-4 block text-gray-800\"\n [translateParams]=\"{\n displayed: records.length,\n hits: totalHits\n }\"\n >\n results.records.hits.displayedOn\n </div>\n <div\n *ngIf=\"selectedRecords.length > 0\"\n class=\"my-8 ml-6 block text-gray-400 selected-records\"\n translate\n [translateParams]=\"{ amount: selectedRecords.length }\"\n >\n results.records.hits.selected\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(3,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userDetail</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.username</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userEmail</span>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordsSelect.emit([record])\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col text-16\">\n {{ record.name }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.username }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.emailAddresses[0] }}\n </div>\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(6,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"!records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"flex justify-center items-center\">\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"selectAll()\"\n type=\"default\"\n >\n </gn-ui-checkbox>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1 text-left\"\n (buttonClick)=\"setSortBy('resourceTitleObject.default.keyword')\"\n >\n <span translate>record.metadata.title</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div translate=\"\" class=\"record-table-header text-gray-400 flex gap-1\">\n record.metadata.formats\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('recordOwner')\"\n >\n <span translate>record.metadata.author</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('changeDate')\"\n >\n <span translate>record.metadata.updatedOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('createDate')\"\n >\n <span translate>record.metadata.createdOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordsSelect.emit([record])\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col\">\n <gn-ui-checkbox\n [checked]=\"isChecked(record)\"\n (changed)=\"handleRecordSelectedChange($event, record)\"\n type=\"default\"\n ></gn-ui-checkbox>\n </div>\n <div\n [title]=\"record.title\"\n class=\"record-table-col text-16 self-center\"\n >\n {{ record.title }}\n </div>\n <div\n class=\"record-table-col flex justify-start items-center gap-2 text-16\"\n [title]=\"formats.join(', ')\"\n *ngIf=\"getRecordFormats(record) as formats\"\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\n class=\"flex-shrink-0\"\n *ngIf=\"!record.name && formats.slice(2).length > 0\"\n >\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div class=\"record-table-col flex items-center gap-2 text-16\">\n <mat-icon class=\"material-symbols-outlined\"> person </mat-icon>\n <span class=\"\">{{ formatUserInfo(record.extras?.ownerInfo) }}</span>\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordUpdated) }}\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordCreated) }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".record-table-col{@apply px-5 py-3 items-center truncate;}.record-table-header{@apply record-table-col capitalize;}\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: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
26285
- }
26286
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordTableComponent, decorators: [{
26287
- type: Component,
26288
- args: [{ selector: 'gn-ui-record-table', template: "<div>\n <div *ngIf=\"totalHits\" class=\"\">\n <div class=\"flex records-information\">\n <div\n translate\n class=\"my-8 ml-4 block text-gray-800\"\n [translateParams]=\"{\n displayed: records.length,\n hits: totalHits\n }\"\n >\n results.records.hits.displayedOn\n </div>\n <div\n *ngIf=\"selectedRecords.length > 0\"\n class=\"my-8 ml-6 block text-gray-400 selected-records\"\n translate\n [translateParams]=\"{ amount: selectedRecords.length }\"\n >\n results.records.hits.selected\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(3,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userDetail</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.username</span>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <span translate>dashboard.records.userEmail</span>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordsSelect.emit([record])\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col text-16\">\n {{ record.name }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.username }}\n </div>\n <div class=\"record-table-col text-16\">\n {{ record.emailAddresses[0] }}\n </div>\n </div>\n </div>\n\n <div\n class=\"grid grid-cols-[repeat(6,minmax(0,max-content))] gap-x-4 gap-y-1\"\n *ngIf=\"!records[0].name\"\n >\n <div class=\"contents text-sm\">\n <div class=\"flex justify-center items-center\">\n <gn-ui-checkbox\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"isSomeSelected()\"\n (changed)=\"selectAll()\"\n type=\"default\"\n >\n </gn-ui-checkbox>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1 text-left\"\n (buttonClick)=\"setSortBy('resourceTitleObject.default.keyword')\"\n >\n <span translate>record.metadata.title</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('resourceTitleObject.default.keyword', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div translate=\"\" class=\"record-table-header text-gray-400 flex gap-1\">\n record.metadata.formats\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('recordOwner')\"\n >\n <span translate>record.metadata.author</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('recordOwner', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('changeDate')\"\n >\n <span translate>record.metadata.updatedOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('changeDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n <div class=\"record-table-header text-gray-400 flex gap-1\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"px-3 pl-0 space-x-1\"\n (buttonClick)=\"setSortBy('createDate')\"\n >\n <span translate>record.metadata.createdOn</span>\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'desc')\"\n >\n expand_more</mat-icon\n >\n <mat-icon\n class=\"material-symbols-outlined\"\n *ngIf=\"isSortedBy('createDate', 'asc')\"\n >\n expand_less</mat-icon\n >\n </gn-ui-button>\n </div>\n </div>\n <div\n class=\"contents hover:text-gray-900 text-gray-800 cursor-pointer\"\n (click)=\"recordsSelect.emit([record])\"\n *ngFor=\"let record of records\"\n >\n <div class=\"record-table-col\">\n <gn-ui-checkbox\n [checked]=\"isChecked(record)\"\n (changed)=\"handleRecordSelectedChange($event, record)\"\n type=\"default\"\n ></gn-ui-checkbox>\n </div>\n <div\n [title]=\"record.title\"\n class=\"record-table-col text-16 self-center\"\n >\n {{ record.title }}\n </div>\n <div\n class=\"record-table-col flex justify-start items-center gap-2 text-16\"\n [title]=\"formats.join(', ')\"\n *ngIf=\"getRecordFormats(record) as formats\"\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\n class=\"flex-shrink-0\"\n *ngIf=\"!record.name && formats.slice(2).length > 0\"\n >\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div class=\"record-table-col flex items-center gap-2 text-16\">\n <mat-icon class=\"material-symbols-outlined\"> person </mat-icon>\n <span class=\"\">{{ formatUserInfo(record.extras?.ownerInfo) }}</span>\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordUpdated) }}\n </div>\n <div class=\"record-table-col text-16 self-center\">\n {{ dateToString(record.recordCreated) }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".record-table-col{@apply px-5 py-3 items-center truncate;}.record-table-header{@apply record-table-col capitalize;}\n"] }]
26289
- }], propDecorators: { selectedRecords: [{
26290
- type: Input
26291
- }], records: [{
26292
- type: Input
26293
- }], totalHits: [{
26294
- type: Input
26295
- }], sortBy: [{
26296
- type: Input
26297
- }], recordClick: [{
26298
- type: Output
26299
- }], recordsSelect: [{
26300
- type: Output
26301
- }], recordsDeselect: [{
26302
- type: Output
26303
- }], sortByChange: [{
26304
- type: Output
26305
- }] } });
26306
-
26307
26399
  class UiSearchModule {
26308
26400
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26309
26401
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -26316,8 +26408,7 @@ class UiSearchModule {
26316
26408
  ResultsHitsNumberComponent,
26317
26409
  ResultsListItemComponent,
26318
26410
  RecordPreviewFeedComponent,
26319
- RecordPreviewRowComponent,
26320
- RecordTableComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26411
+ RecordPreviewRowComponent], imports: [CommonModule, i1$1.TranslateModule, NgxDropzoneModule,
26321
26412
  FacetsModule$1,
26322
26413
  FormsModule,
26323
26414
  ReactiveFormsModule,
@@ -26328,7 +26419,8 @@ class UiSearchModule {
26328
26419
  UiElementsModule,
26329
26420
  MatIconModule,
26330
26421
  MatCheckboxModule,
26331
- RouterLink], exports: [RecordPreviewListComponent,
26422
+ RouterLink,
26423
+ InteractiveTableComponent], exports: [RecordPreviewListComponent,
26332
26424
  RecordPreviewCardComponent,
26333
26425
  RecordPreviewTextComponent,
26334
26426
  RecordPreviewTitleComponent,
@@ -26338,8 +26430,7 @@ class UiSearchModule {
26338
26430
  RecordPreviewComponent,
26339
26431
  ResultsHitsNumberComponent,
26340
26432
  RecordPreviewFeedComponent,
26341
- RecordPreviewRowComponent,
26342
- RecordTableComponent] }); }
26433
+ RecordPreviewRowComponent] }); }
26343
26434
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, providers: [
26344
26435
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
26345
26436
  ], imports: [CommonModule,
@@ -26354,7 +26445,8 @@ class UiSearchModule {
26354
26445
  UiInputsModule,
26355
26446
  UiElementsModule,
26356
26447
  MatIconModule,
26357
- MatCheckboxModule, FacetsModule$1] }); }
26448
+ MatCheckboxModule,
26449
+ InteractiveTableComponent, FacetsModule$1] }); }
26358
26450
  }
26359
26451
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiSearchModule, decorators: [{
26360
26452
  type: NgModule,
@@ -26371,7 +26463,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26371
26463
  ResultsListItemComponent,
26372
26464
  RecordPreviewFeedComponent,
26373
26465
  RecordPreviewRowComponent,
26374
- RecordTableComponent,
26375
26466
  ],
26376
26467
  imports: [
26377
26468
  CommonModule,
@@ -26388,6 +26479,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26388
26479
  MatIconModule,
26389
26480
  MatCheckboxModule,
26390
26481
  RouterLink,
26482
+ InteractiveTableComponent,
26391
26483
  ],
26392
26484
  exports: [
26393
26485
  RecordPreviewListComponent,
@@ -26401,7 +26493,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26401
26493
  ResultsHitsNumberComponent,
26402
26494
  RecordPreviewFeedComponent,
26403
26495
  RecordPreviewRowComponent,
26404
- RecordTableComponent,
26405
26496
  ],
26406
26497
  providers: [
26407
26498
  { provide: RESULTS_LAYOUT_CONFIG, useValue: DEFAULT_RESULTS_LAYOUT_CONFIG },
@@ -26680,7 +26771,7 @@ const initSearch = () => {
26680
26771
  const initialState = {
26681
26772
  [DEFAULT_SEARCH_KEY]: initSearch(),
26682
26773
  };
26683
- function reducer$1(state = initialState, action) {
26774
+ function reducer$2(state = initialState, action) {
26684
26775
  const { id } = action;
26685
26776
  if (id) {
26686
26777
  let stateSearch = state[id] || initSearch();
@@ -26960,6 +27051,9 @@ const getFavoritesOnly = createSelector(getSearchStateSearch, (state) => state.p
26960
27051
  const getError = createSelector(getSearchStateSearch, (state) => state.error);
26961
27052
  const getSpatialFilterEnabled = createSelector(getSearchStateSearch, (state) => state.params.useSpatialFilter);
26962
27053
 
27054
+ // this geometry will be used to filter & boost results accordingly
27055
+ const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
27056
+
26963
27057
  class SearchFacade {
26964
27058
  constructor(store, filterGeometry) {
26965
27059
  this.store = store;
@@ -27064,6 +27158,7 @@ class SearchFacade {
27064
27158
  this.store.dispatch(new SetFilters({}, this.searchId));
27065
27159
  this.store.dispatch(new SetSortBy([], this.searchId));
27066
27160
  this.store.dispatch(new SetFavoritesOnly(false, this.searchId));
27161
+ return this;
27067
27162
  }
27068
27163
  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 }); }
27069
27164
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SearchFacade }); }
@@ -27448,8 +27543,11 @@ class FuzzySearchComponent {
27448
27543
  this.searchService.updateFilters({ any });
27449
27544
  }
27450
27545
  }
27451
- handleInputCleared() {
27452
- this.searchService.updateFilters({ any: '' });
27546
+ async handleInputCleared() {
27547
+ const currentSearchFilters = await firstValueFrom(this.searchFacade.searchFilters$);
27548
+ if (currentSearchFilters.any) {
27549
+ this.searchService.updateFilters({ any: '' });
27550
+ }
27453
27551
  }
27454
27552
  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 }); }
27455
27553
  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 }); }
@@ -27529,6 +27627,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27529
27627
  args: [RESULTS_LAYOUT_CONFIG]
27530
27628
  }] }]; } });
27531
27629
 
27630
+ // expects the replacement key ${uuid}
27631
+ const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
27632
+
27532
27633
  class FavoriteStarComponent {
27533
27634
  set record(value) {
27534
27635
  this.record_ = value;
@@ -27612,11 +27713,11 @@ class FavoriteStarComponent {
27612
27713
  });
27613
27714
  }
27614
27715
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, deps: [{ token: FavoritesService }, { token: PlatformServiceInterface }, { token: i0.ChangeDetectorRef }, { token: AuthService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
27615
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27716
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: FavoriteStarComponent, selector: "gn-ui-favorite-star", inputs: { displayCount: "displayCount", record: "record" }, viewQueries: [{ propertyName: "starToggleRef", first: true, predicate: StarToggleComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: StarToggleComponent, selector: "gn-ui-star-toggle", inputs: ["toggled", "disabled"], outputs: ["newValue"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27616
27717
  }
27617
27718
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FavoriteStarComponent, decorators: [{
27618
27719
  type: Component,
27619
- args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row content-center\">\n <span\n class=\"align-text-top mr-1.5 mt-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n class=\"mt-1\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count mt-1.5\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27720
+ args: [{ selector: 'gn-ui-favorite-star', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-row items-center\">\n <span\n class=\"align-text-top mr-1.5 favorite-count\"\n *ngIf=\"hasFavoriteCount && displayCount\"\n >{{ favoriteCount }}</span\n >\n <gn-ui-star-toggle\n [toggled]=\"isFavorite$ | async\"\n (newValue)=\"toggleFavorite($event)\"\n [disabled]=\"loading || (isAnonymous$ | async)\"\n ></gn-ui-star-toggle>\n <span\n class=\"align-text-top ml-1.5 favorite-count\"\n *ngIf=\"!displayCount\"\n translate=\"datahub.record.addToFavorites\"\n ></span>\n</div>\n" }]
27620
27721
  }], ctorParameters: function () { return [{ type: FavoritesService }, { type: PlatformServiceInterface }, { type: i0.ChangeDetectorRef }, { type: AuthService }, { type: i1$1.TranslateService }]; }, propDecorators: { displayCount: [{
27621
27722
  type: Input
27622
27723
  }], record: [{
@@ -27790,9 +27891,11 @@ class SearchEffects {
27790
27891
  // I could not get this to work (maybe a bug in rxjs?)
27791
27892
  switchMap$1(([, state]) => this.favoritesService.myFavoritesUuid$.pipe(take(1), map$1((favorites) => [state, favorites]))), switchMap$1(([state, favorites]) => {
27792
27893
  if (!state.params.useSpatialFilter || !this.filterGeometry$) {
27793
- return of([state, favorites, null]);
27894
+ return of([state, favorites, undefined]);
27794
27895
  }
27795
27896
  return this.filterGeometry$.pipe(tap$2((geom) => {
27897
+ if (!geom)
27898
+ return;
27796
27899
  try {
27797
27900
  const trace = valid$1(geom, true);
27798
27901
  if (trace?.length > 0) {
@@ -27804,7 +27907,7 @@ class SearchEffects {
27804
27907
  throw new Error();
27805
27908
  }
27806
27909
  }), map$1((geom) => [state, favorites, geom]), catchError((e) => {
27807
- return of([state, favorites, null]);
27910
+ return of([state, favorites, undefined]);
27808
27911
  }));
27809
27912
  }), switchMap$1(([state, favorites, geometry]) => {
27810
27913
  const { currentPage, pageSize, sort } = state.params;
@@ -27903,10 +28006,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27903
28006
  class AbstractSearchField {
27904
28007
  }
27905
28008
  class SimpleSearchField {
27906
- constructor(esFieldName, order = 'asc', injector) {
28009
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27907
28010
  this.esFieldName = esFieldName;
27908
- this.order = order;
27909
28011
  this.injector = injector;
28012
+ this.order = order;
28013
+ this.orderType = orderType;
27910
28014
  this.repository = this.injector.get(RecordsRepositoryInterface);
27911
28015
  // FIXME: this is required to register runtime fields; abstract this as well
27912
28016
  this.esService = this.injector.get(ElasticsearchService);
@@ -27917,12 +28021,12 @@ class SimpleSearchField {
27917
28021
  type: 'terms',
27918
28022
  field: this.esFieldName,
27919
28023
  limit: 1000,
27920
- sort: [this.order, 'key'],
28024
+ sort: [this.order, this.orderType],
27921
28025
  },
27922
28026
  };
27923
28027
  }
27924
28028
  async getBucketLabel(bucket) {
27925
- return bucket.term;
28029
+ return bucket.term.toString();
27926
28030
  }
27927
28031
  getAvailableValues() {
27928
28032
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27950,9 +28054,13 @@ class SimpleSearchField {
27950
28054
  return of(values);
27951
28055
  }
27952
28056
  }
27953
- class KeySearchField extends SimpleSearchField {
27954
- constructor() {
27955
- super(...arguments);
28057
+ class TranslatedSearchField extends SimpleSearchField {
28058
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28059
+ super(esFieldName, injector, order, orderType);
28060
+ this.esFieldName = esFieldName;
28061
+ this.injector = injector;
28062
+ this.order = order;
28063
+ this.orderType = orderType;
27956
28064
  this.platformService = this.injector.get(PlatformServiceInterface);
27957
28065
  }
27958
28066
  async getTranslation(key) {
@@ -27962,26 +28070,36 @@ class KeySearchField extends SimpleSearchField {
27962
28070
  return (await this.getTranslation(bucket.term)) || bucket.term;
27963
28071
  }
27964
28072
  getAvailableValues() {
28073
+ if (this.orderType === 'count')
28074
+ return super.getAvailableValues();
27965
28075
  // sort values by alphabetical order
27966
28076
  return super
27967
28077
  .getAvailableValues()
27968
28078
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27969
28079
  }
27970
28080
  }
27971
- class ThesaurusField extends KeySearchField {
27972
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27973
- super(esFieldName, order, injector);
27974
- this.thesaurusName = thesaurusName;
28081
+ /**
28082
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
28083
+ * to the defined METADATA_LANGUAGE token
28084
+ * The provided ES field name should not include any prefix such as `.langeng`
28085
+ */
28086
+ class MultilingualSearchField extends SimpleSearchField {
28087
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
28088
+ super(esFieldName, injector, order, orderType);
28089
+ this.esFieldName = esFieldName;
28090
+ this.injector = injector;
28091
+ this.order = order;
28092
+ this.orderType = orderType;
27975
28093
  this.langService = this.injector.get(LangService);
27976
- this.thesaurus$ = this.platformService
27977
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27978
- .pipe(catchError(() => {
27979
- console.warn('Error while loading thesaurus language package');
27980
- return of([]);
27981
- }), shareReplay(1));
27982
- }
27983
- async getTranslation(key) {
27984
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
28094
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
28095
+ // note: we're excluding the metadata language "current" value because that would produce
28096
+ // permalinks that might not work for different users
28097
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
28098
+ this.esFieldName += `.lang${this.searchLanguage}`;
28099
+ }
28100
+ else {
28101
+ this.esFieldName += '.default';
28102
+ }
27985
28103
  }
27986
28104
  }
27987
28105
  class FullTextSearchField {
@@ -28001,7 +28119,7 @@ marker('search.filters.isSpatial.yes');
28001
28119
  marker('search.filters.isSpatial.no');
28002
28120
  class IsSpatialSearchField extends SimpleSearchField {
28003
28121
  constructor(injector) {
28004
- super('isSpatial', 'asc', injector);
28122
+ super('isSpatial', injector, 'asc');
28005
28123
  this.translateService = this.injector.get(TranslateService);
28006
28124
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
28007
28125
  String formats = doc.format.join('|').toLowerCase();
@@ -28051,7 +28169,7 @@ marker('search.filters.license.unknown');
28051
28169
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
28052
28170
  class LicenseSearchField extends SimpleSearchField {
28053
28171
  constructor(injector) {
28054
- super('license', 'asc', injector);
28172
+ super('license', injector, 'asc');
28055
28173
  this.translateService = this.injector.get(TranslateService);
28056
28174
  this.esService.registerRuntimeField('license', `String raw = '';
28057
28175
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -28135,7 +28253,7 @@ class OrganizationSearchField {
28135
28253
  }
28136
28254
  class OwnerSearchField extends SimpleSearchField {
28137
28255
  constructor(injector) {
28138
- super('owner', 'asc', injector);
28256
+ super('owner', injector, 'asc');
28139
28257
  }
28140
28258
  getAvailableValues() {
28141
28259
  return of([]);
@@ -28144,6 +28262,7 @@ class OwnerSearchField extends SimpleSearchField {
28144
28262
 
28145
28263
  marker('search.filters.format');
28146
28264
  marker('search.filters.inspireKeyword');
28265
+ marker('search.filters.keyword');
28147
28266
  marker('search.filters.isSpatial');
28148
28267
  marker('search.filters.license');
28149
28268
  marker('search.filters.publicationYear');
@@ -28161,13 +28280,14 @@ class FieldsService {
28161
28280
  this.injector = injector;
28162
28281
  this.fields = {
28163
28282
  publisher: new OrganizationSearchField(this.injector),
28164
- format: new SimpleSearchField('format', 'asc', this.injector),
28165
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
28166
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
28167
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
28168
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
28169
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
28170
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28283
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28284
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28285
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28286
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28287
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28288
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28289
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28290
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
28171
28291
  isSpatial: new IsSpatialSearchField(this.injector),
28172
28292
  q: new FullTextSearchField(),
28173
28293
  license: new LicenseSearchField(this.injector),
@@ -28241,10 +28361,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28241
28361
  type: Input
28242
28362
  }] } });
28243
28363
 
28244
- // this geometry will be used to filter & boost results accordingly
28245
- const FILTER_GEOMETRY = new InjectionToken('filter-geometry');
28246
- // expects the replacement key ${uuid}
28247
- const RECORD_URL_TOKEN = new InjectionToken('record-url-token');
28248
28364
  class FeatureSearchModule {
28249
28365
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
28250
28366
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureSearchModule, declarations: [SortByComponent,
@@ -28279,7 +28395,7 @@ class FeatureSearchModule {
28279
28395
  },
28280
28396
  ], imports: [CommonModule,
28281
28397
  TranslateModule.forChild(),
28282
- StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$1, {
28398
+ StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
28283
28399
  initialState,
28284
28400
  }),
28285
28401
  EffectsModule.forFeature([SearchEffects]),
@@ -28309,7 +28425,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28309
28425
  imports: [
28310
28426
  CommonModule,
28311
28427
  TranslateModule.forChild(),
28312
- StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$1, {
28428
+ StoreModule.forFeature(SEARCH_FEATURE_KEY, reducer$2, {
28313
28429
  initialState,
28314
28430
  }),
28315
28431
  EffectsModule.forFeature([SearchEffects]),
@@ -28343,6 +28459,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
28343
28459
  }]
28344
28460
  }] });
28345
28461
 
28462
+ class ResultsTableComponent {
28463
+ constructor(searchFacade, searchService, selectionService) {
28464
+ this.searchFacade = searchFacade;
28465
+ this.searchService = searchService;
28466
+ this.selectionService = selectionService;
28467
+ this.recordClick = new EventEmitter();
28468
+ this.records$ = this.searchFacade.results$;
28469
+ this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
28470
+ }
28471
+ dateToString(date) {
28472
+ return date?.toLocaleDateString(undefined, {
28473
+ year: 'numeric',
28474
+ month: 'long',
28475
+ day: 'numeric',
28476
+ timeZone: 'UTC',
28477
+ });
28478
+ }
28479
+ getStatus(isPublishedToAll) {
28480
+ return isPublishedToAll ? 'published' : 'not published';
28481
+ }
28482
+ getRecordFormats(record) {
28483
+ if (record.kind === 'service' || !('distributions' in record)) {
28484
+ return [];
28485
+ }
28486
+ const formats = Array.from(new Set(record.distributions.map((distribution) => getFileFormat(distribution)))).filter((format) => !!format);
28487
+ formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a));
28488
+ return formats;
28489
+ }
28490
+ formatUserInfo(userInfo) {
28491
+ const infos = (typeof userInfo === 'string' ? userInfo : '').split('|');
28492
+ if (infos && infos.length === 4) {
28493
+ return `${infos[2]} ${infos[1]}`;
28494
+ }
28495
+ return undefined;
28496
+ }
28497
+ getBadgeColor(format) {
28498
+ return getBadgeColor(format);
28499
+ }
28500
+ handleRecordClick(item) {
28501
+ this.recordClick.emit(item);
28502
+ }
28503
+ setSortBy(col, order) {
28504
+ this.searchService.setSortBy([order, col]);
28505
+ }
28506
+ isSortedBy(col) {
28507
+ return this.searchFacade.sortBy$.pipe(take(1), map$1((sortOrder) => {
28508
+ const sortArray = Array.isArray(sortOrder[0])
28509
+ ? sortOrder
28510
+ : [sortOrder];
28511
+ for (const sort of sortArray) {
28512
+ if (sort[1] === col) {
28513
+ return sort[0];
28514
+ }
28515
+ }
28516
+ return null;
28517
+ }));
28518
+ }
28519
+ isChecked(record) {
28520
+ return this.selectedRecords$.pipe(take(1), map$1((selectedRecords) => {
28521
+ return selectedRecords.includes(record.uniqueIdentifier);
28522
+ }));
28523
+ }
28524
+ handleRecordSelectedChange(selected, record) {
28525
+ if (!selected) {
28526
+ this.selectionService.deselectRecords([record]);
28527
+ }
28528
+ else {
28529
+ this.selectionService.selectRecords([record]);
28530
+ }
28531
+ }
28532
+ async toggleSelectAll() {
28533
+ const records = await firstValueFrom(this.records$);
28534
+ if (await firstValueFrom(this.isAllSelected())) {
28535
+ this.selectionService.deselectRecords(records);
28536
+ }
28537
+ else {
28538
+ this.selectionService.selectRecords(records);
28539
+ }
28540
+ }
28541
+ isAllSelected() {
28542
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28543
+ return records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28544
+ }));
28545
+ }
28546
+ isSomeSelected() {
28547
+ return combineLatest([this.records$, this.selectedRecords$]).pipe(take(1), map$1(([records, selectedRecords]) => {
28548
+ const allSelected = records.every((record) => selectedRecords.includes(record.uniqueIdentifier));
28549
+ const someSelected = records.some((record) => selectedRecords.includes(record.uniqueIdentifier));
28550
+ return !allSelected && someSelected;
28551
+ }));
28552
+ }
28553
+ 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 }); }
28554
+ 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"] }] }); }
28555
+ }
28556
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ResultsTableComponent, decorators: [{
28557
+ type: Component,
28558
+ args: [{ selector: 'gn-ui-results-table', standalone: true, imports: [
28559
+ CommonModule,
28560
+ UiInputsModule,
28561
+ InteractiveTableComponent,
28562
+ InteractiveTableColumnComponent,
28563
+ MatIconModule,
28564
+ TranslateModule,
28565
+ ], 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" }]
28566
+ }], ctorParameters: function () { return [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }]; }, propDecorators: { recordClick: [{
28567
+ type: Output
28568
+ }] } });
28569
+
28346
28570
  class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
28347
28571
  get mapLinks() {
28348
28572
  return this.record.distributions.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.MAP_API));
@@ -28970,11 +29194,11 @@ const mdViewReducer = createReducer(initialMdviewState, on(loadFullMetadata, (st
28970
29194
  ...state,
28971
29195
  chartConfig,
28972
29196
  })), on(close, (state) => {
28973
- // eslint-disable-next-line
29197
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
28974
29198
  const { metadata, related, ...stateWithoutMd } = state;
28975
29199
  return stateWithoutMd;
28976
29200
  }));
28977
- function reducer(state, action) {
29201
+ function reducer$1(state, action) {
28978
29202
  return mdViewReducer(state, action);
28979
29203
  }
28980
29204
 
@@ -30924,11 +31148,11 @@ class LanguageSwitcherComponent {
30924
31148
  this.translate.use(value);
30925
31149
  }
30926
31150
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30927
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
31151
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
30928
31152
  }
30929
31153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30930
31154
  type: Component,
30931
- args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
31155
+ args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n extraBtnClass=\"bg-transparent flex justify-items-center !pl-2 !py-1\"\n>\n</gn-ui-dropdown-selector>\n" }]
30932
31156
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30933
31157
  type: Optional
30934
31158
  }, {
@@ -31209,13 +31433,6 @@ class MyOrgService {
31209
31433
  constructor(platformService, orgService) {
31210
31434
  this.platformService = platformService;
31211
31435
  this.orgService = orgService;
31212
- this.myOrgDataSubject = new BehaviorSubject({
31213
- orgName: '',
31214
- logoUrl: '',
31215
- recordCount: 0,
31216
- userCount: 0,
31217
- userList: [],
31218
- });
31219
31436
  this.myOrgData$ = combineLatest([
31220
31437
  this.platformService.getMe(),
31221
31438
  this.platformService.getUsers(),
@@ -31234,7 +31451,7 @@ class MyOrgService {
31234
31451
  userList,
31235
31452
  userCount,
31236
31453
  };
31237
- }));
31454
+ }), shareReplay(1));
31238
31455
  }
31239
31456
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, deps: [{ token: PlatformServiceInterface }, { token: OrganizationsServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
31240
31457
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MyOrgService, providedIn: 'root' }); }
@@ -31262,18 +31479,18 @@ class DataViewPermalinkComponent {
31262
31479
  if (config) {
31263
31480
  const { aggregation, xProperty, yProperty, chartType } = config;
31264
31481
  const url = new URL(`${this.wcEmbedderBaseUrl}`, window.location.origin);
31265
- url.search = `?v=${this.version}
31266
- &e=gn-dataset-view-chart
31267
- &a=api-url=${this.config.basePath}
31268
- &a=dataset-id=${metadata.uniqueIdentifier}
31269
- &a=primary-color=%230f4395
31270
- &a=secondary-color=%238bc832
31271
- &a=main-color=%23555
31272
- &a=background-color=%23fdfbff
31273
- &a=aggregation=${aggregation}
31274
- &a=x-property=${xProperty}
31275
- &a=y-property=${yProperty}
31276
- &a=chart-type=${chartType}`;
31482
+ url.searchParams.set('v', `${this.version}`);
31483
+ url.searchParams.append('e', `gn-dataset-view-chart`);
31484
+ url.searchParams.append('a', `api-url=${this.config.basePath}`);
31485
+ url.searchParams.append('a', `dataset-id=${metadata.uniqueIdentifier}`);
31486
+ url.searchParams.append('a', `primary-color=#0f4395`);
31487
+ url.searchParams.append('a', `secondary-color=#8bc832`);
31488
+ url.searchParams.append('a', `main-color=#555`);
31489
+ url.searchParams.append('a', `background-color=#fdfbff`);
31490
+ url.searchParams.append('a', `aggregation=${aggregation}`);
31491
+ url.searchParams.append('a', `x-property=${xProperty}`);
31492
+ url.searchParams.append('a', `y-property=${yProperty}`);
31493
+ url.searchParams.append('a', `chart-type=${chartType}`);
31277
31494
  return url.toString();
31278
31495
  }
31279
31496
  return '';
@@ -31380,7 +31597,7 @@ class FeatureRecordModule {
31380
31597
  DataViewWebComponentComponent,
31381
31598
  DataViewShareComponent] }); }
31382
31599
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureRecordModule, providers: [MdViewFacade], imports: [CommonModule,
31383
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
31600
+ StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
31384
31601
  EffectsModule.forFeature([MdViewEffects]),
31385
31602
  UiLayoutModule,
31386
31603
  FeatureMapModule,
@@ -31408,7 +31625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31408
31625
  ],
31409
31626
  imports: [
31410
31627
  CommonModule,
31411
- StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer),
31628
+ StoreModule.forFeature(MD_VIEW_FEATURE_STATE_KEY, reducer$1),
31412
31629
  EffectsModule.forFeature([MdViewEffects]),
31413
31630
  UiLayoutModule,
31414
31631
  FeatureMapModule,
@@ -31434,6 +31651,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31434
31651
  }]
31435
31652
  }] });
31436
31653
 
31654
+ const openRecord = createAction('[Editor] Open record', props());
31655
+ const updateRecordField = createAction('[Editor] Update record field', props());
31656
+ const markRecordAsChanged = createAction('[Editor] Mark record as changed');
31657
+ const saveRecord = createAction('[Editor] Save record');
31658
+ const saveRecordSuccess = createAction('[Editor] Save record success');
31659
+ const saveRecordFailure = createAction('[Editor] Save record failure', props());
31660
+
31661
+ const DEFAULT_FIELDS = [
31662
+ {
31663
+ model: 'title',
31664
+ formFieldConfig: {
31665
+ labelKey: 'Metadata title',
31666
+ type: 'text',
31667
+ },
31668
+ },
31669
+ {
31670
+ model: 'abstract',
31671
+ formFieldConfig: {
31672
+ labelKey: 'Abstract',
31673
+ type: 'rich',
31674
+ },
31675
+ },
31676
+ {
31677
+ model: 'uniqueIdentifier',
31678
+ formFieldConfig: {
31679
+ labelKey: 'Unique identifier',
31680
+ type: 'text',
31681
+ locked: true,
31682
+ },
31683
+ },
31684
+ {
31685
+ model: 'recordUpdated',
31686
+ formFieldConfig: {
31687
+ labelKey: 'Record Updated',
31688
+ type: 'text',
31689
+ locked: true,
31690
+ },
31691
+ onSaveProcess: '${dateNow()}',
31692
+ },
31693
+ ];
31694
+
31695
+ const EDITOR_FEATURE_KEY = 'editor';
31696
+ const initialEditorState = {
31697
+ record: null,
31698
+ saving: false,
31699
+ saveError: null,
31700
+ changedSinceSave: false,
31701
+ fieldsConfig: DEFAULT_FIELDS,
31702
+ };
31703
+ const reducer = createReducer(initialEditorState, on(openRecord, (state, { record }) => ({
31704
+ ...state,
31705
+ changedSinceSave: false,
31706
+ record,
31707
+ })), on(saveRecord, (state) => ({
31708
+ ...state,
31709
+ saving: true,
31710
+ saveError: null,
31711
+ })), on(saveRecordSuccess, (state) => ({
31712
+ ...state,
31713
+ saving: false,
31714
+ saveError: null,
31715
+ changedSinceSave: false,
31716
+ })), on(saveRecordFailure, (state, { error }) => ({
31717
+ ...state,
31718
+ saving: false,
31719
+ saveError: error,
31720
+ })), on(updateRecordField, (state, { field, value }) => ({
31721
+ ...state,
31722
+ record: {
31723
+ ...state.record,
31724
+ [field]: value,
31725
+ },
31726
+ })), on(markRecordAsChanged, (state) => ({
31727
+ ...state,
31728
+ changedSinceSave: true,
31729
+ })));
31730
+ function editorReducer(state, action) {
31731
+ return reducer(state, action);
31732
+ }
31733
+
31734
+ const selectEditorState = createFeatureSelector(EDITOR_FEATURE_KEY);
31735
+ const selectRecord = createSelector(selectEditorState, (state) => state.record);
31736
+ const selectRecordSaving = createSelector(selectEditorState, (state) => state.saving);
31737
+ const selectRecordSaveError = createSelector(selectEditorState, (state) => state.saveError);
31738
+ const selectRecordChangedSinceSave = createSelector(selectEditorState, (state) => state.changedSinceSave);
31739
+ const selectRecordFieldsConfig = createSelector(selectEditorState, (state) => state.fieldsConfig);
31740
+ const selectRecordFields = createSelector(selectEditorState, (state) => state.fieldsConfig.map((fieldConfig) => ({
31741
+ config: fieldConfig,
31742
+ value: state.record?.[fieldConfig.model] || null,
31743
+ })));
31744
+
31745
+ class EditorFacade {
31746
+ constructor() {
31747
+ this.store = inject(Store);
31748
+ this.record$ = this.store.pipe(select(selectRecord));
31749
+ this.saving$ = this.store.pipe(select(selectRecordSaving));
31750
+ this.saveError$ = this.store.pipe(select(selectRecordSaveError));
31751
+ this.changedSinceSave$ = this.store.pipe(select(selectRecordChangedSinceSave));
31752
+ this.recordFields$ = this.store.pipe(select(selectRecordFields));
31753
+ }
31754
+ openRecord(record) {
31755
+ this.store.dispatch(openRecord({ record }));
31756
+ }
31757
+ saveRecord() {
31758
+ this.store.dispatch(saveRecord());
31759
+ }
31760
+ updateRecordField(field, value) {
31761
+ this.store.dispatch(updateRecordField({ field, value }));
31762
+ }
31763
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31764
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorFacade }); }
31765
+ }
31766
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorFacade, decorators: [{
31767
+ type: Injectable
31768
+ }] });
31769
+
31437
31770
  class WizardService {
31438
31771
  constructor(translateService) {
31439
31772
  this.translateService = translateService;
@@ -31795,6 +32128,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31795
32128
  args: [{ selector: 'gn-ui-wizard-summarize', template: "<div>\n <div class=\"text-2xl font-bold title\">\n {{ title | uppercase }}\n </div>\n <div class=\"text-lg font-bold pt-2 abstract\">\n {{ abstract }}\n </div>\n <div class=\"text-lg font-normal\">\n <span translate>datafeeder.wizardSummarize.createdAt</span>\n &nbsp;<span class=\"date\">{{ createdDate }}</span> -\n <span translate>datafeeder.wizardSummarize.scale</span>\n &nbsp;<span class=\"scale\">{{ scale }}</span>\n </div>\n <div class=\"text-lg italic font-normal description\">\n {{ description }}\n </div>\n <div class=\"text-sm font-medium pt-4 tags\">\n <span class=\"icon-tag pr-2\"></span>\n {{ tags }}\n </div>\n</div>\n", styles: [".icon-tag:before{font-size:18px}\n"] }]
31796
32129
  }], ctorParameters: function () { return [{ type: WizardService }, { type: i1$1.TranslateService }]; } });
31797
32130
 
32131
+ function evaluate(expression) {
32132
+ if (expression.match(/^\${.*}$/)) {
32133
+ return evaluate(expression.slice(2, -1));
32134
+ }
32135
+ const operator = expression.split('(')[0];
32136
+ switch (operator) {
32137
+ case 'dateNow':
32138
+ return () => new Date();
32139
+ default:
32140
+ throw new Error(`Unknown operator: ${operator}`);
32141
+ }
32142
+ }
32143
+
32144
+ class EditorService {
32145
+ constructor(http, apiConfiguration) {
32146
+ this.http = http;
32147
+ this.apiConfiguration = apiConfiguration;
32148
+ this.apiUrl = `${this.apiConfiguration?.basePath || '/geonetwork/srv/api'}`;
32149
+ }
32150
+ // TODO: use the catalog repository instead
32151
+ loadRecordByUuid(uuid) {
32152
+ return this.http
32153
+ .get(`${this.apiUrl}/records/${uuid}/formatters/xml`, {
32154
+ responseType: 'text',
32155
+ headers: {
32156
+ Accept: 'application/xml',
32157
+ },
32158
+ })
32159
+ .pipe(map$1((response) => toModel(response.toString())));
32160
+ }
32161
+ // returns the record as it was when saved
32162
+ saveRecord(record, fieldsConfig) {
32163
+ const savedRecord = { ...record };
32164
+ // run onSave processes
32165
+ for (const field of fieldsConfig) {
32166
+ if (field.onSaveProcess && field.model) {
32167
+ const evaluator = evaluate(field.onSaveProcess);
32168
+ savedRecord[field.model] = evaluator({
32169
+ config: field,
32170
+ value: record[field.model],
32171
+ });
32172
+ }
32173
+ }
32174
+ // TODO: use the catalog repository instead
32175
+ return this.http
32176
+ .put(`${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`, toXml(savedRecord), {
32177
+ headers: {
32178
+ 'Content-Type': 'application/xml',
32179
+ },
32180
+ withCredentials: true,
32181
+ })
32182
+ .pipe(map$1(() => savedRecord));
32183
+ }
32184
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, deps: [{ token: i1.HttpClient }, { token: Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
32185
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, providedIn: 'root' }); }
32186
+ }
32187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, decorators: [{
32188
+ type: Injectable,
32189
+ args: [{
32190
+ providedIn: 'root',
32191
+ }]
32192
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: Configuration, decorators: [{
32193
+ type: Optional
32194
+ }, {
32195
+ type: Inject,
32196
+ args: [Configuration]
32197
+ }] }]; } });
32198
+
32199
+ class EditorEffects {
32200
+ constructor() {
32201
+ this.actions$ = inject(Actions);
32202
+ this.editorService = inject(EditorService);
32203
+ this.store = inject(Store);
32204
+ this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordFieldsConfig)), switchMap$1(([, record, fieldsConfig]) => this.editorService.saveRecord(record, fieldsConfig).pipe(switchMap$1((newRecord) => of(saveRecordSuccess(), openRecord({ record: newRecord }))), catchError((error) => of(saveRecordFailure({
32205
+ error: error.message,
32206
+ })))))));
32207
+ this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField), map$1(() => markRecordAsChanged())));
32208
+ }
32209
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
32210
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects }); }
32211
+ }
32212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorEffects, decorators: [{
32213
+ type: Injectable
32214
+ }] });
32215
+
31798
32216
  class FeatureEditorModule {
31799
32217
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31800
32218
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, declarations: [WizardComponent,
@@ -31805,8 +32223,8 @@ class FeatureEditorModule {
31805
32223
  MatNativeDateModule,
31806
32224
  MatFormFieldModule,
31807
32225
  HttpClientModule,
31808
- HttpClientXsrfModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
31809
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, imports: [CommonModule,
32226
+ HttpClientXsrfModule, i1$2.StoreFeatureModule, i1$8.EffectsFeatureModule], exports: [WizardComponent, WizardSummarizeComponent] }); }
32227
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade], imports: [CommonModule,
31810
32228
  UiInputsModule,
31811
32229
  UiWidgetsModule,
31812
32230
  TranslateModule.forChild(),
@@ -31814,7 +32232,9 @@ class FeatureEditorModule {
31814
32232
  MatNativeDateModule,
31815
32233
  MatFormFieldModule,
31816
32234
  HttpClientModule,
31817
- HttpClientXsrfModule] }); }
32235
+ HttpClientXsrfModule,
32236
+ StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
32237
+ EffectsModule.forFeature([EditorEffects])] }); }
31818
32238
  }
31819
32239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: FeatureEditorModule, decorators: [{
31820
32240
  type: NgModule,
@@ -31834,105 +32254,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
31834
32254
  MatFormFieldModule,
31835
32255
  HttpClientModule,
31836
32256
  HttpClientXsrfModule,
32257
+ StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
32258
+ EffectsModule.forFeature([EditorEffects]),
31837
32259
  ],
31838
32260
  exports: [WizardComponent, WizardSummarizeComponent],
32261
+ providers: [EditorFacade],
31839
32262
  }]
31840
32263
  }] });
31841
32264
 
31842
- class EditorService {
31843
- constructor(http, apiConfiguration) {
31844
- this.http = http;
31845
- this.apiConfiguration = apiConfiguration;
31846
- this.record$ = new BehaviorSubject(null);
31847
- this.fieldsConfig = [
31848
- {
31849
- model: 'title',
31850
- labelKey: 'Metadata title',
31851
- type: 'text',
31852
- },
31853
- {
31854
- model: 'abstract',
31855
- labelKey: 'Abstract',
31856
- type: 'rich',
31857
- },
31858
- {
31859
- model: 'uniqueIdentifier',
31860
- labelKey: 'Unique identifier',
31861
- type: 'text',
31862
- locked: true,
31863
- },
31864
- ];
31865
- this.apiUrl = `${this.apiConfiguration?.basePath || '/geonetwork/srv/api'}`;
31866
- this.fields$ = this.record$.pipe(map$1((record) => this.fieldsConfig.map((fieldConfig) => ({
31867
- config: fieldConfig,
31868
- value: record?.[fieldConfig.model] || null,
31869
- }))));
31870
- this.saving$ = new BehaviorSubject(false);
31871
- }
31872
- loadRecordByUuid(uuid) {
31873
- return this.http
31874
- .get(`${this.apiUrl}/records/${uuid}/formatters/xml`, {
31875
- responseType: 'text',
31876
- headers: {
31877
- Accept: 'application/xml',
31878
- },
31879
- })
31880
- .pipe(map$1((response) => toModel(response.toString())));
31881
- }
31882
- saveCurrentRecord() {
31883
- return this.record$.pipe(take(1), tap$1((record) => {
31884
- if (!record)
31885
- throw new Error('Save record failed: no record currently open');
31886
- this.saving$.next(true);
31887
- }), switchMap$1((record) => this.http.put(`${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`, toXml(record), {
31888
- headers: {
31889
- 'Content-Type': 'application/xml',
31890
- },
31891
- withCredentials: true,
31892
- })), map$1(() => undefined), finalize(() => {
31893
- this.saving$.next(false);
31894
- }));
31895
- }
31896
- setCurrentRecord(record) {
31897
- this.record$.next(record);
31898
- }
31899
- updateRecordField(fieldName, value) {
31900
- this.record$
31901
- .pipe(take(1), map$1((record) => ({ ...record, [fieldName]: value })))
31902
- .subscribe((record) => this.record$.next(record));
31903
- }
31904
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, deps: [{ token: i1.HttpClient }, { token: Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
31905
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, providedIn: 'root' }); }
31906
- }
31907
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EditorService, decorators: [{
31908
- type: Injectable,
31909
- args: [{
31910
- providedIn: 'root',
31911
- }]
31912
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: Configuration, decorators: [{
31913
- type: Optional
31914
- }, {
31915
- type: Inject,
31916
- args: [Configuration]
31917
- }] }]; } });
31918
-
31919
32265
  class RecordFormComponent {
31920
- constructor(editorService) {
31921
- this.editorService = editorService;
32266
+ constructor(facade) {
32267
+ this.facade = facade;
32268
+ this.fields$ = this.facade.recordFields$;
31922
32269
  }
31923
- handleFieldValueChange(fieldName, value) {
31924
- this.editorService.updateRecordField(fieldName, value);
32270
+ handleFieldValueChange(field, newValue) {
32271
+ if (!field.config.model) {
32272
+ return;
32273
+ }
32274
+ this.facade.updateRecordField(field.config.model, newValue);
31925
32275
  }
31926
32276
  fieldTracker(index, field) {
31927
32277
  return field.config.model;
31928
32278
  }
31929
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorService }], target: i0.ɵɵFactoryTarget.Component }); }
31930
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32279
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, deps: [{ token: EditorFacade }], target: i0.ɵɵFactoryTarget.Component }); }
32280
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordFormComponent, isStandalone: true, selector: "gn-ui-record-form", ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: FormFieldComponent, selector: "gn-ui-form-field", inputs: ["config", "value"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31931
32281
  }
31932
32282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordFormComponent, decorators: [{
31933
32283
  type: Component,
31934
- args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], template: "<div class=\"flex flex-col gap-6\">\n <gn-ui-form-field\n *ngFor=\"let field of editorService.fields$ | async; trackBy: fieldTracker\"\n [config]=\"field.config\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field.config.model, $event)\"\n ></gn-ui-form-field>\n</div>\n" }]
31935
- }], ctorParameters: function () { return [{ type: EditorService }]; } });
32284
+ args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UiInputsModule], template: "<div class=\"flex flex-col gap-6 p-6\">\n <ng-container *ngFor=\"let field of fields$ | async; trackBy: fieldTracker\">\n <gn-ui-form-field\n *ngIf=\"field.config.formFieldConfig && !field.config.hidden\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n (valueChange)=\"handleFieldValueChange(field, $event)\"\n ></gn-ui-form-field>\n </ng-container>\n</div>\n" }]
32285
+ }], ctorParameters: function () { return [{ type: EditorFacade }]; } });
31936
32286
 
31937
32287
  const ROUTER_STATE_KEY = 'router';
31938
32288
  const ROUTER_ROUTE_SEARCH = 'search';
@@ -32299,5 +32649,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32299
32649
  * Generated bundle index. Do not edit.
32300
32650
  */
32301
32651
 
32302
- 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, 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, 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, RecordTableComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, 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 };
32652
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, editorReducer, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, openRecord, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$2 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, saveRecord, saveRecordFailure, saveRecordSuccess, selectEditorState, selectFallback, selectFallbackFields, selectField, selectRecord, selectRecordChangedSinceSave, selectRecordFields, selectRecordFieldsConfig, selectRecordSaveError, selectRecordSaving, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer, updateRecordField };
32303
32653
  //# sourceMappingURL=geonetwork-ui.mjs.map